{"id":34059882,"url":"https://github.com/jordanjoz1/android-localization-helper","last_synced_at":"2026-03-27T04:31:01.073Z","repository":{"id":25309064,"uuid":"28735705","full_name":"jordanjoz1/android-localization-helper","owner":"jordanjoz1","description":"Make sure that you aren't missing string translations in any language, and keep your localized strings organized.","archived":false,"fork":false,"pushed_at":"2015-07-17T23:40:03.000Z","size":464,"stargazers_count":44,"open_issues_count":0,"forks_count":4,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-08-09T22:53:12.681Z","etag":null,"topics":["android","android-tools","pip","python","string-translation"],"latest_commit_sha":null,"homepage":null,"language":"Python","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/jordanjoz1.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-01-03T05:15:37.000Z","updated_at":"2023-12-19T15:22:34.000Z","dependencies_parsed_at":"2022-07-25T12:32:08.055Z","dependency_job_id":null,"html_url":"https://github.com/jordanjoz1/android-localization-helper","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/jordanjoz1/android-localization-helper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jordanjoz1%2Fandroid-localization-helper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jordanjoz1%2Fandroid-localization-helper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jordanjoz1%2Fandroid-localization-helper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jordanjoz1%2Fandroid-localization-helper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jordanjoz1","download_url":"https://codeload.github.com/jordanjoz1/android-localization-helper/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jordanjoz1%2Fandroid-localization-helper/sbom","scorecard":{"id":532674,"data":{"date":"2025-08-11","repo":{"name":"github.com/jordanjoz1/android-localization-helper","commit":"e11d75f7f9c69cae2880644d6335a1fa8ea47194"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/17 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 15 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-20T06:06:33.566Z","repository_id":25309064,"created_at":"2025-08-20T06:06:33.566Z","updated_at":"2025-08-20T06:06:33.566Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31019308,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-27T03:51:26.850Z","status":"ssl_error","status_checked_at":"2026-03-27T03:51:09.693Z","response_time":164,"last_error":"SSL_read: 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":["android","android-tools","pip","python","string-translation"],"created_at":"2025-12-14T04:02:29.812Z","updated_at":"2026-03-27T04:31:01.060Z","avatar_url":"https://github.com/jordanjoz1.png","language":"Python","readme":"[travis-url]: http://travis-ci.org/#!/jordanjoz1/android-localization-helper\n[travis-build-image]: https://secure.travis-ci.org/jordanjoz1/android-localization-helper.svg\n\n[coveralls-url]: https://coveralls.io/r/jordanjoz1/android-localization-helper\n[coveralls-image]: https://coveralls.io/repos/jordanjoz1/android-localization-helper/badge.svg\n\n[pypi-url]: https://badge.fury.io/py/android-localization-helper\n[pypi-image]: https://badge.fury.io/py/android-localization-helper.svg\n\n[arsenal-url]: https://android-arsenal.com/details/1/1367\n[arsenal-image]: https://img.shields.io/badge/Android%20Arsenal-android--localization--helper-brightgreen.svg?style=flat\n\n[downloads-url]: https://pypi.python.org/pypi/android-localization-helper/\n[downloads-image]: https://img.shields.io/pypi/dm/android-localization-helper.svg\n\n[codeclimate-url]: https://codeclimate.com/github/jordanjoz1/android-localization-helper\n[codeclimate-image]: https://codeclimate.com/github/jordanjoz1/android-localization-helper/badges/gpa.svg\n\n[![Travis build image][travis-build-image]][travis-url]\n[![Coverage Status][coveralls-image]][coveralls-url]\n[![PyPi version][pypi-image]][pypi-url]\n[![PyPi download count image][downloads-image]][downloads-url]\n[![Android Arsenal][arsenal-image]][arsenal-url]\n[![Code Climate][codeclimate-image]][codeclimate-url]\n\n\nandroid-localization-helper\n===========================\n\nPython script that checks for missing string translations in your project's localized languages.\n\nEver lose track of what strings have and haven't been translated in each language? Android Studio [made an awesome GUI](http://tools.android.com/recent/androidstudio087released) to help deal with this issue, but there is no easy way to export missing strings, so if you are missing more than a few strings in a language it can become a tenuous problem. Here's a solution!\n\nThis python package will output a directory with all the string translations that are missing for each localized values directory. It can also clean-up localized `strings.xml` to remove translations that are no longer used in the default `strings.xml` file.\n\n\n## Getting started\nRequirements:\n\n* Python \u003e= 2.7.*\n* [Standard Android project structure](https://developer.android.com/tools/projects/index.html) for localized values-* folders in `res/` folder\n\n![Project structure](art/project_structure.png)\n\nTo install run:\n```bash\npip install android-localization-helper\n```\n\n## Usage\n\n#### Normal use\n\n`cd` into your `res/` folder, and run:\n\n```\nandroid-localization-helper\n```\n\nBy default, this creates an output directory `to_translate/` ([sample output](./sample_output)) with separate files for the missing strings in each language. Now that you have the untranslated strings for each language in a standard format, you can [send them out for translation](https://developer.android.com/distribute/tools/localization-checklist.html#gp-trans)!\n\n#### Change output directory (--output)\nUse the output option to change the output directory path. \n\nFor example, we can output the missing translations into a `to_translate/` directory on the Desktop:\n\n```\nandroid-localization-helper --output ~/Desktop/to_translate\n```\n  \n#### Clean-up translated string files (--clean)\n  \nThis option will remove strings that aren't in the default file and sort strings to match the default `strings.xml` order. **Warning:** *this will overwrite your existing localized `strings.xml` files, so make sure you have a back-up in case of any unexpected changes*\n```\nandroid-localization-helper --clean\n```\n\n#### Use multiple default string sources (--input)\n  \nIt is recommended that all your translatable strings are in `strings.xml`. If that's not the case, the input option will allow you to include multiple default string source files. The localized output will still have only one file for each language. \n\nFor example, if we had `strings.xml` and `plurals.xml` files in our `values/` directory, we could make sure those are included as part of our default string source:\n\n```\nandroid-localization-helper --input strings.xml plurals.xml\n```\n\n### Options\n\n#### -h, --help\nPrints help message.\n\n#### --res\nPath to the app's /res folder. Like, `./main/res`\n\nBy default assumes the current directory\n\n#### --input\nList of file names to include from default values directory (e.g. *strings.xml* *plurals.xml*). By default, only *strings.xml* is used\n\n#### --output\nOutput directory path (directory will be created automatically). Like, `~/Desktop/to_translate`\n\nBy default creates *to_translate* folder in the current directory.\n\n#### --clean\nClean the existing `string.xml` files for each language.  This will remove strings that are in the localized language but not in the default language (they presumably got removed from the default langauge).  It will also sort the strings so that they are in the same order as the default language.\n\n\n## Release History\n* 2015-07-16   v0.1.4   fix handling same resource name for different types\n* 2015-05-31   v0.1.3   support for multiple default string sources\n* 2015-01-05   v0.1.2   support for more language folders, better feedback and error handling\n* 2015-01-04   v0.1.1   xliff namespace support, better indentation handling\n* 2015-01-03   v0.1.0   Initial release\n\n## License\n\nSee the [LICENSE](LICENSE) file for license rights and limitations (MIT).\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjordanjoz1%2Fandroid-localization-helper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjordanjoz1%2Fandroid-localization-helper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjordanjoz1%2Fandroid-localization-helper/lists"}