{"id":19703455,"url":"https://github.com/crowdin/translate-readme","last_synced_at":"2025-10-08T16:57:24.493Z","repository":{"id":183439716,"uuid":"669066883","full_name":"crowdin/translate-readme","owner":"crowdin","description":"A GitHub Action to automate the translation of your README.md files via Crowdin ✨","archived":false,"fork":false,"pushed_at":"2025-09-01T01:54:22.000Z","size":1104,"stargazers_count":10,"open_issues_count":3,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-09-29T22:50:07.537Z","etag":null,"topics":["automation","crowdin","github-actions","hacktoberfest","localization","readme","translate","translation"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/crowdin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","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":"2023-07-21T09:05:13.000Z","updated_at":"2025-07-17T16:32:58.000Z","dependencies_parsed_at":null,"dependency_job_id":"ebb0c0da-af6a-4d1f-b2e4-a8a65c9c7efc","html_url":"https://github.com/crowdin/translate-readme","commit_stats":null,"previous_names":["crowdin/readme-translate"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/crowdin/translate-readme","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crowdin%2Ftranslate-readme","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crowdin%2Ftranslate-readme/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crowdin%2Ftranslate-readme/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crowdin%2Ftranslate-readme/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/crowdin","download_url":"https://codeload.github.com/crowdin/translate-readme/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crowdin%2Ftranslate-readme/sbom","scorecard":{"id":309717,"data":{"date":"2025-08-11","repo":{"name":"github.com/crowdin/translate-readme","commit":"a69759c9a222a6bcc5dd10dabb917f5e7b60d862"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.7,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/8 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":"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":"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":"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":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/check-dist.yml:1","Warn: no topLevel permission defined: .github/workflows/dependency-analysis.yml:1","Warn: no topLevel permission defined: .github/workflows/e2e-test.yml:1","Warn: no topLevel permission defined: .github/workflows/test.yml:1","Info: no jobLevel write permissions found"],"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":"Pinned-Dependencies","score":4,"reason":"dependency not pinned by hash detected -- score normalized to 4","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/check-dist.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/crowdin/translate-readme/check-dist.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/check-dist.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/crowdin/translate-readme/check-dist.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/check-dist.yml:49: update your workflow using https://app.stepsecurity.io/secureworkflow/crowdin/translate-readme/check-dist.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dependency-analysis.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/crowdin/translate-readme/dependency-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/e2e-test.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/crowdin/translate-readme/e2e-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/crowdin/translate-readme/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/crowdin/translate-readme/test.yml/main?enable=pin","Info:   0 out of   5 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned","Info:   2 out of   2 npmCommand dependencies pinned"],"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":"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":"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":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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":"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 24 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"}},{"name":"Vulnerabilities","score":6,"reason":"4 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-jr5f-v2jv-69x6","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T22:56:25.932Z","repository_id":183439716,"created_at":"2025-08-17T22:56:25.932Z","updated_at":"2025-08-17T22:56:25.932Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278981512,"owners_count":26079640,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["automation","crowdin","github-actions","hacktoberfest","localization","readme","translate","translation"],"created_at":"2024-11-11T21:17:54.814Z","updated_at":"2025-10-08T16:57:24.451Z","avatar_url":"https://github.com/crowdin.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Translate Readme [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?url=https%3A%2F%2Fgithub.com%2Fcrowdin%2Ftranslate-readme\u0026text=A%20GitHub%20Action%20to%20automate%20the%20translation%20of%20your%20README%20files%20via%20Crowdin)\u0026nbsp;[![GitHub Repo stars](https://img.shields.io/github/stars/crowdin/translate-readme?style=social\u0026cacheSeconds=1800)](https://github.com/crowdin/translate-readme/stargazers)\n\nA GitHub Action to automate the translation of your README.md files via Crowdin ✨\n\n[![build-test](https://github.com/crowdin/translate-readme/actions/workflows/test.yml/badge.svg)](https://github.com/crowdin/translate-readme/actions/workflows/test.yml)\n[![e2e-test](https://github.com/crowdin/translate-readme/actions/workflows/e2e-test.yml/badge.svg)](https://github.com/crowdin/translate-readme/actions/workflows/e2e-test.yml)\n[![codecov](https://codecov.io/github/crowdin/translate-readme/branch/main/graph/badge.svg?token=IWJHNN05QB)](https://codecov.io/github/crowdin/translate-readme)\n[![GitHub](https://img.shields.io/github/license/crowdin/translate-readme?cacheSeconds=50000)](https://github.com/crowdin/translate-readme/blob/master/LICENSE)\n\n## What does this action do?\n\n- Upload your `README.md` file to Crowdin\n- Download the translations from Crowdin to the specified place\n- Manage the languages switcher in your `README.md` file\n\n## Usage\n\nSet up a workflow in *.github/workflows/translate-readme.yml* (or add a job to your existing workflows).\n\nRead the [Configuring a workflow](https://help.github.com/en/articles/configuring-a-workflow) article for more details on how to create and set up custom workflows.\n\n```yaml\n# .github/workflows/translate-readme.yml\nname: Translate Readme\n\non:\n  # When you push to the `main` branch\n  push:\n    branches: [ main ]\n  # And optionally, once every 12 hours\n  schedule:\n    - cron: '0 */12 * * *' # https://crontab.guru/#0_*/12_*_*_*\n  # To manually run this workflow\n  workflow_dispatch:\n\njobs:\n  translate-readme:\n    runs-on: ubuntu-latest\n\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v4\n\n    - name: Translate Readme\n      uses: crowdin/translate-readme@v0.1.2\n      env:\n        CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}\n        CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}\n        # Optional. Only for Crowdin Enterprise\n        CROWDIN_ORGANIZATION: ${{ secrets.CROWDIN_ORGANIZATION }}\n```\n\n### Creating a PR\n\nTo create a PR with the updated table, we recommend usage of the [Create Pull Request](https://github.com/peter-evans/create-pull-request) Action:\n\n```yaml\n# .github/workflows/translate-readme.yml\nname: Translate Readme\n\non:\n  # When you push to the `main` branch\n  push:\n    branches: [ main ]\n  # And optionally, once every 12 hours\n  schedule:\n    - cron: '0 */12 * * *' # https://crontab.guru/#0_*/12_*_*_*\n  # To manually run this workflow\n  workflow_dispatch:\n\njobs:\n  translate-readme:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v4\n\n    - name: Translate Readme\n      uses: crowdin/translate-readme@v0.1.2\n      env:\n        CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}\n        CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}\n\n    - name: Create Pull Request\n      uses: peter-evans/create-pull-request@v5\n      with:\n        title: New Readme Translations by Crowdin\n        body: By [translate-readme](https://github.com/crowdin/translate-readme) GitHub action\n        commit-message: New Readme Translations\n        committer: Crowdin Bot \u003csupport+bot@crowdin.com\u003e\n        branch: docs/readme-translations\n```\n\n### Languages Switcher\n\nThe Translate Readme Action will automatically add a language switcher to your `README.md` file.\n\nTo enable it, add the following placeholders to your `README.md` file:\n\n```\n\u003c!-- TRANSLATE-README-LANGUAGES-START --\u003e\n\u003c!-- TRANSLATE-README-LANGUAGES-END --\u003e\n```\n\nAlso, don't forget to add the following option to your workflow step:\n\n```diff\n​- name: Translate Readme\n  uses: crowdin/translate-readme@v0.1.2\n  with:\n+    language_switcher: true\n  env:\n    CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}\n    CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}\n```\n\n### Options\n\n| Option                  | Default value                 | Description                                                                                              |\n|-------------------------|-------------------------------|----------------------------------------------------------------------------------------------------------|\n| `file`                  | `README.md`                   | The Readme file name                                                                                     |\n| `destination`           | `./`                          | A directory where the localized readmes will be placed                                                   |\n| `languages`             | All Crowdin project languages | A list of Crowdin [language codes](https://developer.crowdin.com/language-codes) to translate the Readme |\n| `language_switcher`     | `false`                       | Defines whether to add a language switcher to the Readme                                                 |\n| `upload_sources`        | `true`                        | Defines whether to upload the source file to Crowdin                                                     |\n| `download_translations` | `true`                        | Defines whether to download translations from Crowdin                                                    |\n\n### Environment variables\n\n| Variable                 | Description                                                                             |\n|--------------------------|-----------------------------------------------------------------------------------------|\n| `CROWDIN_PROJECT_ID`     | Your Crowdin Project ID (numeric)                                                       |\n| `CROWDIN_PERSONAL_TOKEN` | Your Crowdin [Personal Access Token](https://support.crowdin.com/account-settings/#api) |\n| `CROWDIN_ORGANIZATION`   | Your Crowdin Enterprise organization name (only for Crowdin Enterprise)                 |\n\n### Automatic Pre-Translation\n\nYou can Pre-Translate your `README.md` file before creating a PR. Use the following configuration for that:\n\n```yaml\n# .github/workflows/translate-readme.yml\nname: Translate Readme\n\non:\n  push:\n    branches: [ main ]\n\njobs:\n  translate-readme:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Upload README.md to Crowdin\n        uses: crowdin/translate-readme@v0.1.2\n        with:\n          upload_sources: true\n          download_translations: false\n        env:\n          CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}\n          CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}\n\n      - name: Pre-Translate README.md via Translation Memory\n        uses: crowdin/github-action@v1\n        with:\n          command: 'pre-translate'\n          command_args: '-l uk --method tm'\n        env:\n          CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}\n          CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}\n\n      - name: Download Readme translations from Crowdin\n        uses: crowdin/translate-readme@v0.1.2\n        with:\n          upload_sources: false\n          download_translations: true\n        env:\n          CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}\n          CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}\n\n      # Create a PR with the latest translations\n```\n\nFor more about the Pre-Translate command arguments, please refer to the official [Crowdin CLI documentation](https://crowdin.github.io/crowdin-cli/commands/crowdin-pre-translate).\n\n## Demo\n\nVisit the [translate-readme-demo](https://github.com/andrii-bodnar/translate-readme-demo) to see how the action works in a real project.\n\n## Contributing\n\nIf you want to contribute please read the [Contributing](/CONTRIBUTING.md) guidelines.\n\n## Author\n\n- [Andrii Bodnar](https://github.com/andrii-bodnar/)\n\n## License\n\n\u003cpre\u003e\nThe Translate Readme Action is licensed under the MIT License.\nSee the LICENSE file distributed with this work for additional\ninformation regarding copyright ownership.\n\nExcept as contained in the LICENSE file, the name(s) of the above copyright\nholders shall not be used in advertising or otherwise to promote the sale,\nuse or other dealings in this Software without prior written authorization.\n\u003c/pre\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrowdin%2Ftranslate-readme","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcrowdin%2Ftranslate-readme","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrowdin%2Ftranslate-readme/lists"}