diff --git a/packages/flutter/lib/src/material/i18n/README.md b/packages/flutter/lib/src/material/i18n/README.md new file mode 100644 index 0000000000..e1d030ec54 --- /dev/null +++ b/packages/flutter/lib/src/material/i18n/README.md @@ -0,0 +1,184 @@ +# Material Library Internationalization + +The `.arb` files in this directory contain localized values (primarily +strings) used by the material library. The `localizations.dart` file +combines all of the localizations into a single Dart Map that is +linked with the rest of the material library. + +If you're looking for information about internationalizing Flutter +apps in general, see th +[Internationalizing Flutter Apps](https://flutter.io/tutorials/internationalization/) tutorial. + + +### Translations for one locale: .arb files + +The Material library uses +[Application Resource Bundle](https://code.google.com/p/arb/wiki/ApplicationResourceBundleSpecification) +files, which have a `.arb` extension, to store localized translations +of messages, format strings, and other values. This format is also +used by the Dart [intl](https://pub.dartlang.org/packages/intl) +package and it is supported by the +[Google Translators Toolkit](https://translate.google.com/toolkit). + +The material library only depends on a small subset of the ARB format. +Each .arb file contains a single JSON table that maps from resource +IDs to localized values. + +Filenames contain the locale that the values have been translated +for. For example `material_de.arb` contains German translations, and +`material_ar.arb` contains Arabic translations. Files that contain +regional translations have names that include the locale's regional +suffix. For example `material_en_GB.arb` contains additional English +translations that are specific to Great Britain. + +There is one language-specifc .arb file for each supported locale. If +an additional file with a regional suffix is present, the regional +localizations are automatically merged with the language-specific ones. + +The JSON table's keys, called resource IDs, are valid Dart variable +names. They correspond to methods from the `MaterialLocalizations` +class. For example: + +```dart +Widget build(BuildContext context) { + return new FlatButton( + child: new Text( + MaterialLocalizations.of(context).cancelButtonLabel, + ), + ); +} +``` + +This widget build method creates a button whose label is the local +translation of "CANCEL" which is defined for the `cancelButtonLabel` +resource ID. + +Each of the language-specific .arb files contains an entry for +`cancelButtonLabel`. They're all represented by the Dart `Map` in the +generated `localizations.dart` file. The Map is used by the +MaterialLocalizations class. + + +### material_en.arb Defines all of the resource IDs + +All of the `.arb` files whose names do not include a regional suffix +contain translations for the same set of resource IDs as +`material_en.arb`. + +For each resource ID defined for English in material_en.arb, there is +an additional resource with an '@' prefix. These '@' resources are not +used by the material library at run time, they just exist to inform +translators about how the value will be used. + +```dart +"cancelButtonLabel": "CANCEL", +"@cancelButtonLabel": { + "description": "The label for cancel buttons and menu items.", + "type": "text" +}, +``` + + +### Values with Parameters, Plurals + +A few of material translations contain `$variable` tokens. The +material library replaces these tokens with values at run-time. For +example: + +```dart +"aboutListTileTitle": "About $applicationName", +``` + +The value for this resource ID is retrieved with a parameterized +method instead of a simple getter: + +```dart +MaterialLocalizations.of(context).aboutListTileTitle(yourAppTitle) +``` + +The names of the `$variable` tokens match the names of the +`MaterialLocalizations` method parameters. + + +Plurals are handled similarly, with a lookup method that includes a +quantity parameter. For example `selectedRowCountTitle` returns a +string like "1 item selected" or "no items selected". + +```dart +MaterialLocalizations.of(context).selectedRowCountTitle(yourRowCount) +``` + +Plural translations can be provided for several quantities: 0, 1, 2, +"few", "many", "other". The variations are identified by a resource ID +suffix which must be one of "Zero", "One", "Two", "Few", "Many", +"Other". The "Other" variation is used when none of the other +quantities apply. All plural resources must include a resource with +the "Other" suffix. For example the English translations +('material_en.arb') for `selectedRowCountTitle` are: + +```dart +"selectedRowCountTitleZero": "No items selected", +"selectedRowCountTitleOne": "1 item selected", +"selectedRowCountTitleOther": "$selectedRowCount items selected", +``` + + +### Generated file localizations.dart: all of the localizations as a Dart Map + +If you look at the comment at the top of `localizations.dart` you'll +see that it was manually generated using a `dev/tools` app called +`gen_localizations` roughly like this: + +```dart +dev/tools/gen_localizations.dart packages/flutter/lib/src/material/i18n material +``` + +The gen_localizations app just combines the contents of all of the +.arb files into a single Dart `Map` that has entries for each .arb +file's locale. The `MaterialLocalizations` class implementation uses +this Map to implement the methods that lookup localized resource +values. + +The gen_localizations app must be run by hand after .arb files have +been updated. The app's first parameter is the path to this directory, +the second is the file name prefix (the file name less the locale +suffix) for the .arb files in this directory. + + +### Translations Status, Reporting Errors + +The transltations (the `.arb` files) in this directory are based on +the english translations in `material_en.arb`. As noted earlier, +material_en.arb, contains a small amount of descriptive information +for each resource ID, under the companion resources whose IDs begin +with '@'. + +Not all of the translations represented here have been vetted by +native speakers. The following translations have been reviewed by +native speakers on the Flutter team: + +* material_de.arb +* material_en.arb, material_en_GB.arb, material_en_IE.arb, material_en_ZA.arb +* material_fr.arb, material_fr_CA.arb +* material_ja.arb +* material_ru.arb + +The others were automatically generated using the Google Translators +Toolkit. We are actively seeking review (by native speakers) for them. + +If you have feedback about the translations please +[file an issue on the Flutter github repo](https://github.com/flutter/flutter/issues/new). + + +### See Also + +The [Internationalizing Flutter Apps](https://flutter.io/tutorials/internationalization/) +tutorial describes how to use the internationlization APIs in an +ordinary Flutter app. + +[Application Resource Bundle](https://code.google.com/p/arb/wiki/ApplicationResourceBundleSpecification) +covers the `.arb` file format used to store localized translations +of messages, format strings, and other values. + +The Dart [intl](https://pub.dartlang.org/packages/intl) +package supports internationalization.