rebellion 0.1.0 rebellion: ^0.1.0 copied to clipboard
A linter for Flutter's ARB files. Analyze ARB files and find possible issues, find missing translations and sort ARB files
Rebellion #
Rebellion is a linter for Flutter's ARB translation files.
Features:
- Analyze ARB files and find possible issues
- Find missing translations
- Sort ARB files
At the moment rebellion is meant to be used as a CLI tool and can't be used as a custom lint rule. Consider adding it to your CI job to make sure all strings are translated and have no issues.
Installation #
dart pub global activate rebellion
Example #
> rebellion analyze ./lib/l10n/
l10n/intl_fi.arb: all caps string key "key2"
l10n/intl_fi.arb: no @@locale key found
l10n/intl_en.arb: key "@key4" is missing placeholders definition
l10n/intl_fi.arb key "key3" is missing a plural value "one"
l10n/intl_en.arb key "key3" contains a redundant plural value "zero"
l10n/intl_fi.arb: missing translation for key "key_5"
l10n/intl_fi.arb: @-key "@key" should only be present in the main file
l10n/intl_en.arb: key "key_5" does not match selected naming convention (camel case)
8 issues found
Analyze ARB files #
Find problems in ARB files:
rebellion analyze ./lib/l10n/
See Configuration section below to customize the set of rules.
Diff #
Find missing translations:
> rebellion diff ./lib/l10n/
l10n/intl_fi.arb: 2 missing translations:
- key4
- key_5
By default this command prints missing translations to the console. You can instruct Rebellion to create "diff" ARB files with missing translations using --output
option (available values: console
or file
).
diff
uses main app locale to compare ARB files. Default locale is en
but you can change it using --main-locale
option
Sort #
Sort ARB files alphabetically, in reverse alphabetical order or follow main ARB file's order:
rebellion sort ./lib/l10n/
Use --sorting
to change sorting: alphabetical
(default), alphabetical-reverse
or follow-main-file
Configuration #
You can disable some rules, set sort
and diff
settings using a configuration file. Create a file called rebellion_options.yaml
in the root of your app and enable certain rules and options:
# List all rules that rebellion should follow
rules:
# Enable mandatory @-key description rule (it's off by default)
- mandatory_at_key_description
# Disable missing translations rule
# - missing_translations
# Enable all other rules
- all_caps
- string_type
- at_key_type
- duplicated_keys
- empty_at_key
- locale_definition
- missing_placeholders
- missing_plurals
- naming_convention
- redundant_at_key
- redundant_translations
- unused_at_key
options:
# Set main locale
main_locale: en
# Set naming convention that all keys should follow
# Available options: snake or camel
naming_convention: snake
# Set sorting for the `sort` command
# Available options: alphabetical, alphabetical-reverse, follow-main-file
sorting: alphabetical
If this YAML file could not be found, default set of options is used. Consider committing this file to git so all developers and CI actions use the same config.
Available rules #
-
missing_plurals
#Check that
plural
strings contain all required plural options for current locale and don't contain unused strings for this locale.For example:
- English uses
one
("1 book") andother
("0 books", "20 books"). All other options are never used - French uses
one
,many
andother
- Arabic uses
zero
,one
,two
,few
,many
,other
- Vietnamese uses
other
- English uses
-
missing_placeholders
#Check that @-keys don't contain empty placeholders
-
all_caps
#Check that strings are not written in capital letters
-
string_type
#Check that all strings are of type String
-
at_key_type
#Check that @-key has correct type
-
duplicated_keys
#Check that ARB files don't contain duplicated keys
-
empty_at_key
#Check that ARB files don't contain empty @-keys
There's no need for ARB files
-
locale_definition_presence
#Check that ARB file has locale definition key (
@@locale
) -
locale_definition_allowlist
#Check that locale is in the list of locales supported by Flutter's
intl
package -
locale_definition_match
#Check that locale in the filename and
@@locale
value match -
mandatory_at_key_description
#Check that all @-keys have
description
provided. Disabled by default -
missing_translations
#Check that translation files have strings for all keys (checked against the main localization file)
-
naming_convention
#Check that key names are following naming conventions (camelCase or snake_case)
-
redundant_at_key
#Check that only main localization file contains @-keys
-
redundant_translations
#Check that translation files don't have keys not present in the main localization file
-
unused_at_key
#Check that all @-keys have corresponding key
Ignoring rules for individual keys #
Rules can be ignored for individual keys. Use @@x-ignore
inside @-key body to list ignored list. For example, here all caps rules is ignored because this string is short and uses upper-case on purpose:
{
"indicatorLost": "X",
"@indicatorLost": {
"description": "Indicates a failed attempt",
"@@x-ignore": "all_caps"
}
}
Ignoring multiple rules can be done by listing all ignored rules:
"@@x-ignore": ["all_caps", "naming_convention"]
Updating plurals rules #
Rebellion uses Unicode's plural rules when checking if certain plural options should be or should be not present in a translation file. To get updated rules in a format that Rebellion understands, run the script:
dart packages/plural_rules_generator/bin/plural_rules_generator.dart ./lib/src/generated/plural_rules.dart
There's a CI action that runs this script periodically so rules are up-to-date.
Name #
- "Rebel" is from Rebel App Studio
- "Lion" is
l10n
(localization) that could be misread aslion
It's rebel, lion and localization at the same time. Roar!