| When you introduce a new UI string or modify an existing one that will be displayed to the users, or remove a string that is localized, follow these steps so that it can be localized. | |
| **Table of Contents** | |
| - [Adding a string](#adding-a-string) | |
| - [Modifying a string](#modifying-a-string) | |
| - [Removing a string](#removing-a-string) | |
| ## Adding a string | |
| Before proceeding, make sure you know the different [localization APIs](localization_apis_V2.md) and know which one you should use. | |
| Code example: | |
| ```javascript | |
| import * as i18n from '../i18n/i18n.js'; | |
| // at the top of example.js file, after import statements | |
| const UIStrings = { | |
| /** | |
| * @description A string that is already added | |
| */ | |
| alreadyAddedString: 'Someone already created a "UIStrings = {}" and added this string', | |
| /** | |
| * @description This is an example description for my new string | |
| */ | |
| addThisString: 'The new string I want to add', | |
| /** | |
| * @description This is an example description for my new string with placeholder | |
| * @example {example for placeholder} PH1 | |
| */ | |
| addAnotherString: 'Another new string I want to add, with {PH1}', | |
| }; | |
| const str_ = i18n.i18n.registerUIStrings('example.js', UIStrings); | |
| const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_); | |
| ``` | |
| ```javascript | |
| // in example.js file, where you want to call the string | |
| const message1 = i18nString(UIStrings.addThisString); | |
| console.log(message1); // The new string I want to add | |
| const message2 = i18nString(UIStrings.addAnotherString, {PH1: 'a placeholder'}); | |
| console.log(message2); // Another new string I want to add, with a placeholder | |
| ``` | |
| 1. If there is already `UIStrings = {}` declared in the file, add your string to it. | |
| If there isn't `UIStrings = {}` in the file, create one and add your string, also register the new UIStrings into the `en-US.json` by adding: | |
| 1. `const str_ = i18n.i18n.registerUIStrings({the current fileName.js, relative to front_end}, UIStrings);` | |
| 1. `const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);` | |
| 2. Add description and examples for placeholder(if any): | |
| 1. To specify the description, use `@description …` | |
| `@description This is an example description for my new string` | |
| 2. To specify an example for placeholder, use `@example {…} …` | |
| `@example {example for placeholder} PH1` | |
| 3. Make sure your string is localizable: | |
| 1. Do not assume word order by using concatenation. Use the whole string. | |
| ❌ | |
| ```javascript | |
| 'Add' + 'breakpoint' | |
| ``` | |
| ✔️ | |
| ```javascript | |
| 'Add breakpoint' | |
| ``` | |
| or | |
| ❌ | |
| ```javascript | |
| let description = 'first part' | |
| if (condition) | |
| description += ' second part' | |
| ``` | |
| ✔️ | |
| ```javascript | |
| let description | |
| if (condition) | |
| description = 'first part second part' | |
| else | |
| description = 'first part' | |
| ``` | |
| 2. Use placeholder over concatenation. This is so that the translators can adjust variable order based on what works in another language. For example: | |
| ❌ | |
| ```javascript | |
| 'Check ' + title + ' for more information.' | |
| ``` | |
| ✔️ | |
| ```javascript | |
| 'Check {PH1} for more information.', {PH1: title} | |
| ``` | |
| 3. If your string contains <b>leading or trailing white space</b>, it's usually an indication that it's half of a sentence. This decreases localizability as it's essentially concatenating. Modify it so that it doesn't contain leading or trailing white space anymore if you can. | |
| 4. <b>Backticks</b> are only used for the text that should not be localized. They cannot be escaped as part of the string. Check if there are something should not be localized (see [locked_terms](locked_terms_V2.md) for more details). | |
| ❌ Not localized | |
| - Numbers: 1, 1.23, 1.2e3, etc. | |
| - Application data: error codes, enums, database names, rgba, urls, etc. | |
| ✔️ Can be localized | |
| - Words and sentences | |
| - Punctuation | |
| - Units of measurement: kb/s, mph, etc. | |
| 4. The following commands would add the new strings to `en-US.json`: | |
| - `git cl presubmit --upload`, or | |
| - `node third_party/i18n/collect-strings.js` under the DevTools src folder | |
| 5. Strings containing possible plurals have a special format in ICU. This is because plurals work quite differently in other languages, e.g. special forms for two or three items. | |
| ❌ | |
| ```javascript | |
| if (count === 1) { | |
| str = '1 breakpoint'; | |
| } else { | |
| str = '{n} breakpoints', {n: count}; | |
| } | |
| ``` | |
| ✔️ | |
| ```javascript | |
| '{n, plural, =1 {# breakpoint} other {# breakpoints}}', {n: count}; | |
| ``` | |
| - '#' is replaced with the value of `n` | |
| - 'n' is a naming convention, but any name can be used | |
| - Nesting placeholders inside of plurals is allowed | |
| - Put the entire string within the plural switch, e.g. `{# breakpoints were found}`, not `{# breakpoints} were found` | |
| - Always provide the `=1` and the `other` case, even if they are the same for English. | |
| ## Modifying a string | |
| 1. Update the string you want to modify in `UIStrings` | |
| 2. Update the description and placeholders of the string if necessary | |
| ## Removing a string | |
| 1. Remove your string and the metadata from `UIStrings` |