{"id":26122002,"url":"https://github.com/ipfs-shipyard/i18n","last_synced_at":"2026-01-17T06:57:28.386Z","repository":{"id":66214312,"uuid":"148369983","full_name":"ipfs-shipyard/i18n","owner":"ipfs-shipyard","description":"IPFS Translation Project","archived":false,"fork":false,"pushed_at":"2022-10-07T17:33:10.000Z","size":21,"stargazers_count":24,"open_issues_count":8,"forks_count":3,"subscribers_count":10,"default_branch":"main","last_synced_at":"2025-04-13T13:06:27.784Z","etag":null,"topics":["i18n","ipfs","ipfs-gui"],"latest_commit_sha":null,"homepage":"https://www.transifex.com/ipfs/public/","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ipfs-shipyard.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-09-11T19:35:09.000Z","updated_at":"2025-04-04T09:37:02.000Z","dependencies_parsed_at":null,"dependency_job_id":"af42c002-263d-48ac-a7bd-276d8f76e559","html_url":"https://github.com/ipfs-shipyard/i18n","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipfs-shipyard%2Fi18n","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipfs-shipyard%2Fi18n/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipfs-shipyard%2Fi18n/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipfs-shipyard%2Fi18n/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ipfs-shipyard","download_url":"https://codeload.github.com/ipfs-shipyard/i18n/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248717242,"owners_count":21150389,"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","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":["i18n","ipfs","ipfs-gui"],"created_at":"2025-03-10T14:38:05.296Z","updated_at":"2026-01-17T06:57:28.373Z","avatar_url":"https://github.com/ipfs-shipyard.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# IPFS Translation Project  🌐✍️🖖\n\n\u003e Adapting IPFS apps and websites for a specific language by translating text and adding locale-specific components\n\n## Lead\n\n[Marcin Rataj](https://github.com/lidel)\n\n\n## How can I contribute translation for my language?\n\nGo to https://explore.transifex.com/ipfs/, select projects and languages you want to help with and start translating!  \n\nTransifex is localization platform for crowdsourcing translations from IPFS Community:\n- Everyone can contribute translations, all you need is an account.\n- Be sure to change your Transifex notification settings to be notified when translation sources change.\n- Missing language? Request it via Transifex UI\n- Night Owl? Try [Dark Mode](#dark-mode) :owl:\n\nThat is all!\n\n## I am a developer, how can I enable translation of my project?\n\nContinue reading! \n\n\n- [Developer Tools and Best Practices](#developer-tools-and-best-practices)\n  - [Adding i18n to Your Project](#adding-i18n-to-your-project)\n  - [Locale File Formats](#locale-file-formats)\n  - [Suggested Libraries](#suggested-libraries)\n  - [Transifex 101](#transifex-101)\n    - [Documentation Hightlights](#documentation-hightlights)\n    - [Language Mapping](#language-mapping)\n    - [Automatically Updating Source Locale at Transifex](#automatically-updating-source-locale-at-transifex)\n    - [Sharing Translation Memory](#sharing-translation-memory)\n    - **Note:** [Someone submitted a PR with translations instead of using Transifex\n](#someone-submitted-a-pr-with-translations-instead-of-using-transifex)\n\n## What does i18n mean?\n\n\u003e **Internationalization** (I18N) is the process of designing a software application so that it can be adapted to various languages and regions without engineering changes. \n\u003e\n\u003e **Localization** (L10N) is the process of adapting internationalized software for a specific region or language by translating text and adding locale-specific components. \n\u003e\n\u003e Localization (which is potentially performed multiple times, for different locales) uses the infrastructure or flexibility provided by internationalization (which is ideally performed only once, or as an integral part of ongoing development).\n\nMore: https://en.wikipedia.org/wiki/Internationalization_and_localization:\n\n----\n\n\n# Developer Tools and Best Practices\n\n## Adding i18n to Your Project\n\n1. Extract strings into separate files(s) in [JSON-ICU or PO formats](#locale-file-formats) and wire them up to be loaded by your app.\n   - See sections below for platform-specific notes\n1. Create a PR with above changes in your repository\n1. Create an issue in this repo to: [Add a new project to Transifex](https://github.com/ipfs/i18n/issues/new/choose)\n\nNext steps, after your project is added to Transifex:\n\n1. Add `.tx/config` to the PR (read _Transifex_ section below)\n1. Smoke-test by pushing source locale with `tx push -s` \n1. Merge the PR to `master`\n1. Set up automated sync of source locale (read _Transifex_ section below)\n\nThat's it!\n\nAfter this initial setup, the only manual step going forward is fetching new translations with `tx pull -a` as a part of release dance of your project.\n\n## Locale File Formats\n\nThe most important is to use future-proof format for locale files, such as ICU, JSON-ICU or gettext (`.po`). \n\nMake sure to read and understand [how plurals and genders impact translations](https://docs.transifex.com/projects/plurals-and-genders), and [how to define plurals in JSON-ICU](https://docs.transifex.com/formats/json#plurals-support).\n\n## Suggested Libraries\n\n### JavaScript\n\nWe've had some success with [i18next](https://www.i18next.com/) with [i18next-icu](https://github.com/i18next/i18next-icu) or  using [yahoo/intl-messageformat](https://github.com/yahoo/intl-messageformat) manually.\n\n## Transifex 101\n \nTransifex is localization platform for crowdsourcing translations from IPFS Community.\n \n### Documentation Hightlights\n \n- [Installing the Transifex Client](https://docs.transifex.com/client/installing-the-client)\n- [Understanding `.tx/config` file](https://docs.transifex.com/client/client-configuration#section-tx-config)\n- [Using Transifex with GitHub in Your Development Workflow](https://docs.transifex.com/integrations/github)\n  - [Syncing a local project to Transifex with the Transifex Client](https://docs.transifex.com/integrations/github#section-using-the-client)\n- [Understanding User Roles](https://docs.transifex.com/teams/understanding-user-roles)\n- [How Translation Memory works](https://docs.transifex.com/setup/translation-memory/)\n\n### Language Mapping\n\nTransifex use POSIX style `_` underscores when in it's locale tags to separate language tag and ISO region code, so `en_GB`\ndenotes `en` or English as the language, and `GB` or Great Britain as the region.\n\nBrowsers and the IETF standard use hyphens as the separator, like `en-GB`. Some libraries such as i18next look up languages based on the hyphenated IETF language code, with hyphens rather than undercores so we tell the `tx` client to map those underscored country specific locales to the hypenated version in the config file `.tx/config` by adding:\n\n```ini\nlang_map = zh_CN: zh-CN, ko_KR: ko-KR\n```\n\n#### `zh-CN` and  `zh-TW` vs `zh-HANS` and `zh-HANT`\n\nSummary from [mozilla/addons-server/issues/5829]( https://github.com/mozilla/addons-server/issues/5829#issuecomment-325935847):\n\u003e In practice, `zh-CN` and `zh-SG` are subsets of `zh-Hans`; `zh-TW` and `zh-HK` are subset of `zh-Hant`. So `zh-CN` if not resolved directly, should be resolved as `zh-Hans`.\n\u003e \n\u003e The difference within the subsets are usually vocabularies and translation costumes (much like the difference between `en_US` and `en_UK`). But the scripts used are common within the sets.\n\nMore: https://www.w3.org/International/articles/bcp47/\n\n###  Automatically Updating Source Locale at Transifex\n\n\u003e  Manually updating source files isn't fun or scalable if you've got frequent updates. To avoid this, you can have Transifex automatically check for updates to your source file. You simply need to provide Transifex with the public URL of the file. The file can be hosted on any service, such as GitHub \n\n[Project Manager](https://docs.transifex.com/teams/understanding-user-roles) is able to set up [source file sync automation](https://docs.transifex.com/projects/updating-content/#automatically-updating-source-files).  Every new text that lands in `master` branch will be fetched by Transifex. Sync happens twice a day, so translation team gets notification within 24h.\n\nHaving this, the only manual step is to fetch fresh translations via `tx pull -a` as a part of release dance :dancer:\n\n\u003e Example: Setting up IPFS Companion to sync source locale using raw URL:    \n\u003e https://github.com/ipfs-shipyard/ipfs-companion/raw/master/add-on/_locales/en/messages.json\n\u003e ![Setting up IPFS Companion i18n sync](https://user-images.githubusercontent.com/157609/45259536-88d40a80-b3cf-11e8-9944-38f1836f275b.png)\n\n### Sharing Translation Memory\n\n\u003e Each project in Transifex has its own Translation Memory. However, if you have projects which have similar or related content, e.g. [IPFS app and a website], you can share TMs across those projects by creating a TM group. – [sharing-tm](https://docs.transifex.com/setup/translation-memory/sharing-tm)\n\nRight now we have a single TM group named \"ipfs\".\n\n\n### Someone submitted a PR with translations instead of using Transifex\n\nWe don't accept direct PRs with translated strings coming from users other than Transifex itself, as those changes can be lost.\n\nTranslations need to be submitted using Transifex project at https://app.transifex.com/ipfs/\n\nPRs that  bypass Transifex should be **closed without merging**, with thank you note and ask to apply changes via Transifex or just a link to [ipfs/i18n#how-can-i-contribute-translation-for-my-language](https://github.com/ipfs/i18n#how-can-i-contribute-translation-for-my-language) ([example](https://github.com/ipfs-shipyard/ipfs-webui/pull/950)).  \n\n\n### Dark Mode \n\nTransifex supports _Dark Mode_ now, it can be enabled in _Editor Preferences_:\n\n\u003e ![Enabling Dark Mode on Transifex](https://user-images.githubusercontent.com/157609/66070351-6fa97900-e551-11e9-8ff0-dbb24a907732.png)\n\nIn the past, we had to use dedicated extensions:\n   - [Dark Reader](https://darkreader.org) (Universal Browser Extension)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fipfs-shipyard%2Fi18n","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fipfs-shipyard%2Fi18n","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fipfs-shipyard%2Fi18n/lists"}