kibana/x-pack/plugins/canvas/i18n
Yaroslav Kuznietsov eef094bafb
[Canvas] TagCloud (#106858)
* Added `tagCloud` to canvas.

* Added `icon` to the `tagCloud` element.

* Added column name support at `tag_cloud`.

* Added condition to `vis_dimension` not to pass invalid index.

Added check of accessor index, if such column exists at vis_dimension.
Removed checks of column existance from TagCloudChart.
Added test for accessing data by column name in addition to a column number.
Updated tag_cloud element in Canvas.
Fixed types. Removed almost all `any` and `as` types.

* Added test suites for `vis_dimension` function.

* Added tests for DatatableColumn accessors at tag_cloud_fn and to_ast.

* Refactored metrics, tagcloud and tests.

Added valid functional tests to metrics and tag_cloud.
Fixed types of metrics_vis.
Added handling of empty data at tag_cloud renderer.

* Added storybook ( still doesn't work ).

* Fixed some mistakes.

* Added working storybook with mocks.

* Added clear storybook for tag_cloud_vis_renderer.

* Updated the location of vis_dimension test after movement of the function.

* Fixed unused type.

* Fixed tests and added handling of the column name at `visualizations/**/*/prepare_log_table.ts`

* Reduced the complexity of checking the accessor at `tag_cloud_chart.tsx`

* Added comments at unclear places of code.

* Added the logic for disabling elements for renderers from disabled plugins.

* removed garbage from `kibana.yml`.

* Fixed element_strings.test error.

* Made changes, based on nits.

* Fixed mistake.

* Removed `disabled` flag for `expression_*` plugins.

* recovered lost comments at the unclear places.

* removed dead code.

* fixed test errors.

* Fixed test error, I hope.

* fixed more tests.

* fixed code, based on nits.

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
2021-09-06 04:13:38 -04:00
..
elements [Canvas] TagCloud (#106858) 2021-09-06 04:13:38 -04:00
functions [Canvas] Expression progress (#104457) 2021-08-04 11:33:01 +03:00
templates
capabilities.ts
constants.ts [Canvas] Expression reveal image. Async libs and images loading. (#103399) 2021-07-19 17:10:18 +03:00
errors.ts [Canvas] Expression repeat image (#104255) 2021-07-23 11:29:06 +03:00
expression_types.ts
index.ts
lib.ts
README.md
renderers.ts [Canvas] Expression progress (#104457) 2021-08-04 11:33:01 +03:00
shortcuts.ts
tags.ts
transitions.ts
ui.ts
units.ts

Canvas and Internationalization (i18n)

Creating i18n strings in Kibana requires use of the @kbn/i18n library. The following outlines the strategy for localizing strings in Canvas

Why i18n Dictionaries

In Canvas, we prefer to use "dictionaries" of i18n strings over including translation inline. There are a number of reasons for this.

API Signature is Lengthy

A call to localize a string can look something like this:

i18n.translate('xpack.canvas.functions.alterColumn.args.columnHelpText', {
  defaultMessage: 'The name of the column to alter.',
}),

But it can also look something like this:

i18n.translate('xpack.canvas.functions.alterColumnHelpText', {
  defaultMessage:
    'Converts between core types, including {list}, and {end}, and rename columns. ' +
    'See also {mapColumnFn} and {staticColumnFn}.',
  values: {
    list: Object.values(DATATABLE_COLUMN_TYPES)
      .slice(0, -1)
      .map(type => `\`${type}\``)
      .join(', '),
    end: Object.values(DATATABLE_COLUMN_TYPES).slice(-1)[0],
    mapColumnFn: '`mapColumn`',
    staticColumnFn: '`staticColumn`',
  },
});

In either case, including all of this code inline, where the string is ultimately utilized, makes the code look very uneven, or even complicated. By externalizing the construction of localized strings, we can reduce both of these examples:

import { FunctionStrings } from './some/i18n/dictionary';
const { AlterColumn: strings } = FunctionStrings;

const help = strings.getColumnHelpText();
const moreHelp = strings.getAlterColumnHelpText();

Reducing Duplication, Auditing

By externalizing our strings into these functional dictionaries, we also make identifying duplicate strings easier... thus removing workload from translation teams. We can also deprecate functions. And Since they're written in Typescript, finding usage is easier, so we can easily remove them if a string is no longer used.

It will also make writing more advanced auditing tools easier.

Creating i18n Dictionaries

There are some Best Practices™️ to follow when localizing Canvas strings:

  • Create dictionaries in /canvas/i18n.
    • Organize first by the top-level subject or directory, (e.g. functions, renderers, components, etc).
  • Don't create too many files. Prefer to eventually split up a dictionary rather than start with many small ones.
    • Let's avoid ten files with two strings apiece, for example.
  • Create functions that produce a string, rather than properties of strings.
    • Prefer getSomeString({...values}) => i18n.translate(...);.
    • Avoid someString: i18n.translate(...);.
    • Standardizes the practice, also allows for passing dynamic values to the localized string in the future.
    • Exception to this is the dictionary for Canvas Functions, which use a more complex dictionary, influenced by data/interpreter.

Constants

In some cases, there are proper nouns or other words that should not be translated, (e.g. 'Canvas', 'JavaScript', 'momentJS', etc). We've created /canvas/i18n/constants.ts to collect these words. Use and add to these constants as necessary.