mirror of
https://github.com/react/react-native-devtools-frontend.git
synced 2026-10-01 09:47:56 +08:00
Hi everyone, Our plan for implementing Localization V2 considers 3 phases: Infrastructure, Migration & Cleaning This CL is part of the Cleaning phase, it's goal is to remove any non-standard usage of V1 APIs (outside of the devtools_ui_strings.grd) I'm splittling these changes into small pieces following this heuristic: - make sense when logically grouped. - keep them as small as possible - can be atomically reverted. I'll follow up with other changes removing usage on presubmit, scripts and build.gn files (if any). Bug: 1136655 Change-Id: I735dc8ba1045ed4afff7deb1a43cf02a7ab55865 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2733640 Commit-Queue: Vidal Diazleal <vidorteg@microsoft.com> Reviewed-by: Simon Zünd <szuend@chromium.org>
134 lines
5.2 KiB
Markdown
134 lines
5.2 KiB
Markdown
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`
|