gen_lang is a dart library for internationalization. Extracts messages to generate dart files required by Intl.
Now, three steps for internationalization
- Preparing Json files
- Run gen_lang
- Use it in coding
Add these libraries into pubspec.yaml
dependencies:
flutter_localizations:
sdk: flutter
dev_dependencies:
gen_lang: 0.1.2
pub run gen_lang:generate
A below table shown all supported arguments:
Argument | Description |
---|---|
--source-dir | A source folder contains all string json files (defaults to "res/string") |
--output-dir | A output folder stores all generated files (defaults to "lib/generated") |
--template-locale | Use string_{template-locale}.json as a template to search KEY. If string_en does not exist, this script will use the first string json file as a template (defaults to "en") |
By default, the json files are required to locate at res/string
. Using
--source-dir
argument can change the default source path. These files
must be named in this pattern string_{Locale}.json
Example of the files,
|--- lib
|--- res
|--- string
|--- string_en.json
|--- string_zh_TW.json
|--- string_ja.json
Define a json key and message without parameters
{
"simpleMessage": "This is a simple Message"
}
Define a message with parameters. Use ${parameterName} in a message.
{
"messageWithParams": "Hi ${yourName}, Welcome you!"
}
Define messages in a plural form. ${how many} is a reserved parameter in a plural message. This parameters support integer only. For Intl, Intl.plural() supports these plural keyword including 'Zero', 'One', 'Two', 'Few', 'Many' and 'Other'. Define a json key into this pattern {jsonKey} {pluralKeyword}. For 'Other', need to define 'POther' for the plural keyword.
Example
{
"pluralMessageZero": "Hi ${interviewerName}, I have no working experience.",
"pluralMessageOne": "Hi ${interviewerName}, I have one year working experience.",
"pluralMessageTwo": "Hi ${interviewerName}, I have two years of working experience.",
"pluralMessageFew": "Hi ${interviewerName}, I have few years of working experience.",
"pluralMessageMany": "Hi ${interviewerName}, I worked for a long time.",
"pluralMessagePOther": "Hi ${interviewerName}, I have ${howMany} years of working experience."
}
To know plural rules more, please read Intl's plural rules source code.
Define a message in gender form. ${targetGender} is a reserved parameter in a gender message. This parameters support string value with 'male', female' and 'other'. For Intl, Intl.gender() supports these keyword including 'Male', 'Female' and 'Other'. Define a json key into this pattern {jsonKey} {genderKeyword}. For 'Other', need to define 'GOther' for the gender keyword.
Example
{
"genderMessageMale": "Hi ${name}, He is boy.",
"genderMessageFemale": "Hi ${name}, She is girl",
"genderMessageGOther": "Hi ${name}, he/she is boy/girl."
}
The script will generate two files into the output folder including
i18n.dart
and messages_all.dart
. Import i18n.dart
into your source
code. Then finish internationalization tasks.
Example
import 'package:gen_lang_example/generated/i18n.dart';
...
MaterialApp(
localizationsDelegates: [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate
],
supportedLocales: S.delegate.supportedLocales,
...
...
S.of(context).simpleMessage; // Simple Message
S.of(context).messageWithParams('developer'); // Message with parameters
S.of(context).pluralMessage(10, 'King Wu'); // Plural Message with parameters
S.of(context).genderMessage('male', 'King Wu'); // Gender Message with parameters
Go into example folder. Run the command
cd example
pub run gen_lang:generate
Then will generate i18n.dart
and messages_all.dart