Skip to content

Commit 4a4c91c

Browse files
authored
[I18n] Add one-time binding to angularjs i18n (#23499) (#23965)
* Add one-time binding to angularjs i18n * Add watcher for values property * Watch values field only if it is provided * Fix ci
1 parent 8df9757 commit 4a4c91c

14 files changed

Lines changed: 116 additions & 42 deletions

File tree

packages/kbn-i18n/GUIDELINE.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ The following types are supported:
1818
- ToggleSwitch
1919
- LinkLabel and etc.
2020

21-
There is one more complex case, when we have to divide a single expression into different labels.
21+
There is one more complex case, when we have to divide a single expression into different labels.
2222

2323
For example the message before translation looks like:
2424

@@ -221,8 +221,8 @@ For example:
221221

222222
```js
223223
<button
224-
aria-label="{{'kbn.management.editIndexPattern.removeAriaLabel' | i18n: {defaultMessage: 'Remove index pattern'} }}"
225-
tooltip="{{'kbn.management.editIndexPattern.removeTooltip' | i18n: {defaultMessage: 'Remove index pattern'} }}"
224+
aria-label="{{ ::'kbn.management.editIndexPattern.removeAriaLabel' | i18n: {defaultMessage: 'Remove index pattern'} }}"
225+
tooltip="{{ ::'kbn.management.editIndexPattern.removeTooltip' | i18n: {defaultMessage: 'Remove index pattern'} }}"
226226
>
227227
</button>
228228
```
@@ -333,4 +333,3 @@ it('should render normally', async () => {
333333
});
334334
// ...
335335
```
336-

packages/kbn-i18n/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ import { i18n } from '@kbn/i18n';
188188
i18n.init(messages);
189189
```
190190

191-
One common use-case is that of internationalizing a string constant. Here's an
191+
One common use-case is that of internationalizing a string constant. Here's an
192192
example of how we'd do that:
193193

194194
```js
@@ -399,7 +399,7 @@ In order to translate attributes in Angular we should use `i18nFilter`:
399399
```html
400400
<input
401401
type="text"
402-
placeholder="{{'KIBANA-MANAGEMENT-OBJECTS-SEARCH_PLACEHOLDER' | i18n: {
402+
placeholder="{{ ::'KIBANA-MANAGEMENT-OBJECTS-SEARCH_PLACEHOLDER' | i18n: {
403403
defaultMessage: 'Search'
404404
} }}"
405405
>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`i18nDirective inserts correct translation html content with values 1`] = `"default-message word"`;
4+
5+
exports[`i18nDirective inserts correct translation html content with values 2`] = `"default-message anotherWord"`;

packages/kbn-i18n/src/angular/directive.test.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,15 @@ angular
3030

3131
describe('i18nDirective', () => {
3232
let compile: angular.ICompileService;
33-
let scope: angular.IRootScopeService;
33+
let scope: angular.IRootScopeService & { word?: string };
3434

3535
beforeEach(angular.mock.module('app'));
3636
beforeEach(
3737
angular.mock.inject(
3838
($compile: angular.ICompileService, $rootScope: angular.IRootScopeService) => {
3939
compile = $compile;
4040
scope = $rootScope.$new();
41+
scope.word = 'word';
4142
}
4243
)
4344
);
@@ -62,19 +63,23 @@ describe('i18nDirective', () => {
6263
test('inserts correct translation html content with values', () => {
6364
const id = 'id';
6465
const defaultMessage = 'default-message {word}';
65-
const compiledContent = 'default-message word';
6666

6767
const element = angular.element(
6868
`<div
6969
i18n-id="${id}"
7070
i18n-default-message="${defaultMessage}"
71-
i18n-values="{ word: 'word' }"
71+
i18n-values="{ word }"
7272
/>`
7373
);
7474

7575
compile(element)(scope);
7676
scope.$digest();
7777

78-
expect(element.html()).toEqual(compiledContent);
78+
expect(element.html()).toMatchSnapshot();
79+
80+
scope.word = 'anotherWord';
81+
scope.$digest();
82+
83+
expect(element.html()).toMatchSnapshot();
7984
});
8085
});

packages/kbn-i18n/src/angular/directive.ts

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,26 +21,37 @@ import { IDirective, IRootElementService, IScope } from 'angular';
2121

2222
import { I18nServiceType } from './provider';
2323

24-
export function i18nDirective(i18n: I18nServiceType): IDirective {
24+
interface I18nScope extends IScope {
25+
values?: Record<string, any>;
26+
defaultMessage: string;
27+
id: string;
28+
}
29+
30+
export function i18nDirective(i18n: I18nServiceType): IDirective<I18nScope> {
2531
return {
2632
restrict: 'A',
2733
scope: {
2834
id: '@i18nId',
2935
defaultMessage: '@i18nDefaultMessage',
30-
values: '=i18nValues',
36+
values: '<?i18nValues',
3137
},
32-
link($scope: IScope, $element: IRootElementService) {
33-
$scope.$watchGroup(
34-
['id', 'defaultMessage', 'values'],
35-
([id, defaultMessage = '', values = {}]) => {
36-
$element.html(
37-
i18n(id, {
38-
values,
39-
defaultMessage,
40-
})
41-
);
42-
}
43-
);
38+
link($scope, $element) {
39+
if ($scope.values) {
40+
$scope.$watchCollection('values', () => {
41+
setHtmlContent($element, $scope, i18n);
42+
});
43+
} else {
44+
setHtmlContent($element, $scope, i18n);
45+
}
4446
},
4547
};
4648
}
49+
50+
function setHtmlContent($element: IRootElementService, $scope: I18nScope, i18n: I18nServiceType) {
51+
$element.html(
52+
i18n($scope.id, {
53+
values: $scope.values,
54+
defaultMessage: $scope.defaultMessage,
55+
})
56+
);
57+
}

src/core_plugins/kibana/public/management/sections/indices/edit_index_pattern/edit_index_pattern.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
data-test-subj="editIndexPattern"
66
class="kuiViewContent"
77
role="region"
8-
aria-label="{{'kbn.management.editIndexPattern.detailsAria' | i18n: { defaultMessage: 'Index pattern details' } }}"
8+
aria-label="{{::'kbn.management.editIndexPattern.detailsAria' | i18n: { defaultMessage: 'Index pattern details' } }}"
99
>
1010
<!-- Header -->
1111
<kbn-management-index-header
@@ -103,9 +103,9 @@
103103
<input
104104
class="kuiSearchInput__input"
105105
type="text"
106-
aria-label="{{'kbn.management.editIndexPattern.fields.filterAria' | i18n: {defaultMessage: 'Filter'} }}"
106+
aria-label="{{::'kbn.management.editIndexPattern.fields.filterAria' | i18n: {defaultMessage: 'Filter'} }}"
107107
ng-model="fieldFilter"
108-
placeholder="{{'kbn.management.editIndexPattern.fields.filterPlaceholder' | i18n: {defaultMessage: 'Filter'} }}"
108+
placeholder="{{::'kbn.management.editIndexPattern.fields.filterPlaceholder' | i18n: {defaultMessage: 'Filter'} }}"
109109
data-test-subj="indexPatternFieldFilter"
110110
>
111111
</div>

src/core_plugins/kibana/public/management/sections/indices/edit_index_pattern/field_controls.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<a
33
data-test-subj="indexPatternFieldEditButton"
44
ng-href="{{ kbnUrl.getRouteHref(field, 'edit') }}"
5-
aria-label="{{'kbn.management.editIndexPattern.editFieldButton' | i18n: { defaultMessage: 'Edit' } }}"
5+
aria-label="{{::'kbn.management.editIndexPattern.editFieldButton' | i18n: { defaultMessage: 'Edit' } }}"
66
class="kuiButton kuiButton--basic kuiButton--small"
77
>
88
<span aria-hidden="true" class="kuiIcon fa-pencil"></span>
@@ -12,7 +12,7 @@
1212
ng-if="field.scripted"
1313
ng-click="remove(field)"
1414
class="kuiButton kuiButton--danger kuiButton--small"
15-
aria-label="{{'kbn.management.editIndexPattern.deleteFieldButton' | i18n: { defaultMessage: 'Delete' } }}"
15+
aria-label="{{::'kbn.management.editIndexPattern.deleteFieldButton' | i18n: { defaultMessage: 'Delete' } }}"
1616
>
1717
<span aria-hidden="true" class="kuiIcon fa-trash"></span>
1818
</button>

src/core_plugins/kibana/public/management/sections/indices/edit_index_pattern/index_header/index_header.html

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
<button
1919
ng-if="setDefault"
2020
ng-click="setDefault()"
21-
aria-label="{{'kbn.management.editIndexPattern.setDefaultAria' | i18n: { defaultMessage: 'Set as default index' } }}"
22-
tooltip="{{'kbn.management.editIndexPattern.setDefaultTooltip' | i18n: { defaultMessage: 'Set as default index' } }}"
21+
aria-label="{{::'kbn.management.editIndexPattern.setDefaultAria' | i18n: { defaultMessage: 'Set as default index' } }}"
22+
tooltip="{{::'kbn.management.editIndexPattern.setDefaultTooltip' | i18n: { defaultMessage: 'Set as default index' } }}"
2323
class="kuiButton kuiButton--basic"
2424
data-test-subj="setDefaultIndexPatternButton"
2525
>
@@ -32,8 +32,8 @@
3232
<button
3333
ng-if="refreshFields"
3434
ng-click="refreshFields()"
35-
aria-label="{{'kbn.management.editIndexPattern.refreshAria' | i18n: { defaultMessage: 'Reload field list' } }}"
36-
tooltip="{{'kbn.management.editIndexPattern.refreshTooltip' | i18n: { defaultMessage: 'Refresh field list' } }}"
35+
aria-label="{{::'kbn.management.editIndexPattern.refreshAria' | i18n: { defaultMessage: 'Reload field list' } }}"
36+
tooltip="{{::'kbn.management.editIndexPattern.refreshTooltip' | i18n: { defaultMessage: 'Refresh field list' } }}"
3737
class="kuiButton kuiButton--basic"
3838
>
3939
<span
@@ -45,8 +45,8 @@
4545
<button
4646
ng-if="delete"
4747
ng-click="delete()"
48-
aria-label="{{'kbn.management.editIndexPattern.removeAria' | i18n: { defaultMessage: 'Remove index pattern' } }}"
49-
tooltip="{{'kbn.management.editIndexPattern.removeTooltip' | i18n: { defaultMessage: 'Remove index pattern' } }}"
48+
aria-label="{{::'kbn.management.editIndexPattern.removeAria' | i18n: { defaultMessage: 'Remove index pattern' } }}"
49+
tooltip="{{::'kbn.management.editIndexPattern.removeTooltip' | i18n: { defaultMessage: 'Remove index pattern' } }}"
5050
class="kuiButton kuiButton--danger"
5151
data-test-subj="deleteIndexPatternButton"
5252
>

src/core_plugins/kibana/public/management/sections/indices/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<div class="euiPage">
2-
<div class="col-md-2 sidebar-container" role="region" aria-label="{{'kbn.management.editIndexPatternAria' | i18n: { defaultMessage: 'Index patterns' } }}">
2+
<div class="col-md-2 sidebar-container" role="region" aria-label="{{::'kbn.management.editIndexPatternAria' | i18n: { defaultMessage: 'Index patterns' } }}">
33
<div class="sidebar-list">
44
<div class="sidebar-item-title full-title">
55
<h5 data-test-subj="createIndexPatternParent">
@@ -55,4 +55,4 @@ <h5 data-test-subj="createIndexPatternParent">
5555
<div ng-transclude></div>
5656
</div>
5757
</div>
58-
</div>
58+
</div>

src/core_plugins/metric_vis/public/metric_vis_params.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
kbn-accessible-click
3333
aria-expanded="{{!!showColorRange}}"
3434
aria-controls="metricOptionsRanges"
35-
aria-label="{{'metricVis.params.ranges.toggleOptionsAriaLabel' | i18n: { defaultMessage: 'Toggle range options' } }}"
35+
aria-label="{{::'metricVis.params.ranges.toggleOptionsAriaLabel' | i18n: { defaultMessage: 'Toggle range options' } }}"
3636
class="kuiSideBarCollapsibleTitle__label"
3737
ng-click="showColorRange = !showColorRange"
3838
>
@@ -135,7 +135,7 @@
135135
kbn-accessible-click
136136
aria-expanded="{{!!showColorOptions}}"
137137
aria-controls="metricOptionsColors"
138-
aria-label="{{'metricVis.params.color.toggleOptionsAriaLabel' | i18n: { defaultMessage: 'Toggle color options' } }}"
138+
aria-label="{{::'metricVis.params.color.toggleOptionsAriaLabel' | i18n: { defaultMessage: 'Toggle color options' } }}"
139139
class="kuiSideBarCollapsibleTitle__label"
140140
ng-click="showColorOptions = !showColorOptions"
141141
>
@@ -219,7 +219,7 @@
219219
kbn-accessible-click
220220
aria-expanded="{{!!showStyle}}"
221221
aria-controls="metricOptionsStyle"
222-
aria-label="{{'metricVis.params.style.toggleOptionsAriaLabel' | i18n: { defaultMessage: 'Toggle style options' } }}"
222+
aria-label="{{::'metricVis.params.style.toggleOptionsAriaLabel' | i18n: { defaultMessage: 'Toggle style options' } }}"
223223
class="kuiSideBarCollapsibleTitle__label"
224224
ng-click="showStyle = !showStyle"
225225
>

0 commit comments

Comments
 (0)