{"id":32270010,"url":"https://github.com/rebelappstudio/rebellion","last_synced_at":"2026-02-19T09:33:25.047Z","repository":{"id":258284996,"uuid":"777597315","full_name":"rebelappstudio/rebellion","owner":"rebelappstudio","description":"A linter for Flutter's ARB files","archived":false,"fork":false,"pushed_at":"2025-03-18T11:52:20.000Z","size":301,"stargazers_count":4,"open_issues_count":7,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-22T22:37:25.216Z","etag":null,"topics":["arb","flutter","l10n","localisation","localization"],"latest_commit_sha":null,"homepage":"https://pub.dev/packages/rebellion","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rebelappstudio.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-03-26T06:39:20.000Z","updated_at":"2025-09-20T07:50:10.000Z","dependencies_parsed_at":"2024-10-28T08:52:24.347Z","dependency_job_id":"e25d13b3-3b93-4dc2-8ed8-31511bb3e3b6","html_url":"https://github.com/rebelappstudio/rebellion","commit_stats":null,"previous_names":["rebelappstudio/rebellion"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/rebelappstudio/rebellion","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rebelappstudio%2Frebellion","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rebelappstudio%2Frebellion/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rebelappstudio%2Frebellion/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rebelappstudio%2Frebellion/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rebelappstudio","download_url":"https://codeload.github.com/rebelappstudio/rebellion/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rebelappstudio%2Frebellion/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29609524,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-19T06:47:36.664Z","status":"ssl_error","status_checked_at":"2026-02-19T06:45:47.551Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arb","flutter","l10n","localisation","localization"],"created_at":"2025-10-22T22:31:51.429Z","updated_at":"2026-02-19T09:33:25.041Z","avatar_url":"https://github.com/rebelappstudio.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Banner](https://github.com/rebelappstudio/rebellion/raw/main/assets/banner.png)\n\n# Rebellion\n\nRebellion is a linter for Flutter's ARB translation files.\n\nFeatures:\n* Analyze ARB files and find possible issues\n* Find missing translations\n* Sort ARB files\n\nAt 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.\n\n* [Github repo](https://github.com/rebelappstudio/rebellion/)\n* [pub.dev page](https://pub.dev/packages/rebellion)\n* [Rebel App Studio](https://rebelappstudio.com)\n\n## Installation\n\n```sh\ndart pub global activate rebellion\n```\n\n## Example\n\n```\n\u003e rebellion analyze ./lib/l10n/\n\nl10n/intl_fi.arb: all caps string key \"key2\"\nl10n/intl_fi.arb: no @@locale key found\nl10n/intl_en.arb: key \"@key4\" is missing placeholders definition\nl10n/intl_fi.arb key \"key3\" is missing a plural value \"one\"\nl10n/intl_en.arb key \"key3\" contains a redundant plural value \"zero\"\nl10n/intl_fi.arb: missing translation for key \"key_5\"\nl10n/intl_fi.arb: @-key \"@key\" should only be present in the main file\nl10n/intl_en.arb: key \"key_5\" does not match selected naming convention (camel case)\n\n8 issues found\n```\n\n## Analyze ARB files\n\nFind problems in ARB files:\n\n```sh\nrebellion analyze ./lib/l10n/\n```\n\nSee Configuration section below to customize the set of rules.\n\n## Diff\n\nFind missing translations:\n\n```sh\n\u003e rebellion diff ./lib/l10n/\n\nl10n/intl_fi.arb: 2 missing translations:\n - key4\n - key_5\n```\n\nBy 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`).\n\n`diff` uses main app locale to compare ARB files. Default locale is `en` but you can change it using `--main-locale` option\n\n## Sort\n\nSort ARB files alphabetically, in reverse alphabetical order or follow main ARB file's order:\n\n```sh\nrebellion sort ./lib/l10n/\n```\n\nUse `--sorting` to change sorting: `alphabetical` (default), `alphabetical-reverse` or `follow-main-file`\n\n## Configuration\n\nYou 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:\n\n```yaml\n# List all rules that rebellion should follow\nrules:\n    # Enable mandatory @-key description rule (it's off by default)\n    - mandatory_at_key_description\n    \n    # Disable missing translations rule\n    # - missing_translations\n\n    # Enable all other rules\n    - all_caps\n    - string_type\n    - at_key_type\n    - duplicated_keys\n    - empty_at_key\n    - locale_definition\n    - missing_placeholders\n    - missing_plurals\n    - naming_convention\n    - redundant_at_key\n    - redundant_translations\n    - unused_at_key\n\noptions:\n  # Set main locale\n  main_locale: en\n  \n  # Set naming convention that all keys should follow\n  # Available options: snake or camel\n  naming_convention: snake\n\n  # Set sorting for the `sort` command\n  # Available options: alphabetical, alphabetical-reverse, follow-main-file\n  sorting: alphabetical\n```\n\nIf 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.\n\n## Available rules\n\n* ### `missing_plurals`\n\n  Check that `plural` strings contain all required plural options for current locale and don't contain unused strings for this locale.\n\n  For example:\n    - English uses `one` (\"1 book\") and `other` (\"0 books\", \"20 books\"). All other options are never used\n    - French uses `one`, `many` and `other`\n    - Arabic uses `zero`, `one`, `two`, `few`, `many`, `other`\n    - Vietnamese uses `other`\n\n* ### `missing_placeholders` \n  \n  Check that @-keys don't contain empty placeholders\n\n* ### `all_caps` \n  \n  Check that strings are not written in capital letters\n\n* ### `string_type` \n  \n  Check that all strings are of type String\n\n* ### `at_key_type` \n  \n  Check that @-key has correct type\n\n* ### `duplicated_keys` \n  \n  Check that ARB files don't contain duplicated keys\n\n* ### `empty_at_key` \n  \n  Check that ARB files don't contain empty @-keys\n\n  There's no need for ARB files\n\n* ### `locale_definition_presence`\n  \n  Check that ARB file has locale definition key (`@@locale`)\n\n* ### `locale_definition_allowlist`\n\n  Check that locale is in the list of locales supported by Flutter's `intl` package\n\n* ### `locale_definition_match`\n\n  Check that locale in the filename and `@@locale` value match\n\n* ### `mandatory_at_key_description` \n  \n  Check that all @-keys have `description` provided. Disabled by default\n\n* ### `missing_translations` \n  \n  Check that translation files have strings for all keys (checked against the main \n  localization file)\n* ### `naming_convention` \n  \n  Check that key names are following naming conventions (camelCase or snake_case)\n\n* ### `redundant_at_key` \n  \n  Check that only main localization file contains @-keys\n\n* ### `redundant_translations` \n  \n  Check that translation files don't have keys not present in the main localization file\n\n* ### `unused_at_key` \n  \n  Check that all @-keys have corresponding key\n\n## Ignoring rules for individual keys\n\nRules 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:\n\n```json\n{\n  \"indicatorLost\": \"X\",\n  \"@indicatorLost\": {\n    \"description\": \"Indicates a failed attempt\",\n    \"@@x-ignore\": \"all_caps\"\n  }\n}\n```\n\nIgnoring multiple rules can be done by listing all ignored rules:\n\n```json\n\"@@x-ignore\": [\"all_caps\", \"naming_convention\"]\n```\n\n## Updating plurals rules\n\nRebellion uses Unicode's [plural rules](https://www.unicode.org/cldr/charts/45/supplemental/language_plural_rules.html) 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:\n\n```sh\ndart packages/plural_rules_generator/bin/plural_rules_generator.dart ./lib/src/generated/plural_rules.dart\n```\n\nThere's a CI action that runs this script periodically so rules are up-to-date.\n\n## Name\n\n* \"Rebel\" is from [Rebel App Studio](https://rebelappstudio.com)\n* \"Lion\" is `l10n` (localization) that could be misread as `lion`\n\nIt's rebel, lion and localization at the same time. Roar!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frebelappstudio%2Frebellion","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frebelappstudio%2Frebellion","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frebelappstudio%2Frebellion/lists"}