9.6 KiB
Localization 101
PokéRogue's localization team puts immense effort into making the game accessible around the world, supporting over 12 different languages at the time of writing this document.
As a developer, it's important to help maintain global accessibility by effectively coordinating with the Translation Team on any new features or enhancements.
This document aims to cover everything you need to know to help keep the integration process for localization smooth and simple.
Stupid Assumptions
Before you continue, this document assumes:
- You have already forked the repository and set up a development environment according to the respository README.
- You have a basic level of familiarity with Git commands and GitHub repositories.
- You have joined the community Discord and have access to
#dev-corner
and related channels via #select-roles. This is the easiest way to keep in touch with both the Translation Team and other like-minded contributors!
About the pokerogue-locales
submodule
PokéRogue's translations are managed under a separate dedicated repository, pokerogue-locales
.
This repository is integrated into the main one as a git submodule within the public/locales
folder.
What Is a Submodule?
In essence, a submodule is a way for one repository (i.e. pokerogue
) to use another repository (i.e. pokerogue-locales
) internally. The parent repo (the "superproject") houses a cloned version of the 2nd repository (the "submodule") inside it, making locales effectively a "repository within a repository", so to speak.
Tip
Many popular IDEs have integrated
git
support with special handling around submodules:
From the perspective of the main project, the locales submodule is fairly simple to work with, but there are some important commands to keep in mind.
Fetching Changes from Submodules
Once you have set up your fork, run the following command to initialize your branch's locales repository and update its HEAD:
git submodule update --init --recursive
This is run automatically after merge or switching branches, so you usually won't have to run it yourself after the first time.
Warning
If you run into issues with your development environment afterwards, try deleting the
.git/modules/public
andpublic/locales
folders before re-running the command.
How Are Translations Integrated?
This project uses the i18next library to integrate translations from public/locales
into the source code.
The basic process for fetching translated text goes roughly as follows:
- The source code fetches text by a given key.
globalScene.phaseManager.queueMessage( i18next.t("fileName:keyName", { arg1: "Hello", arg2: "an example", ... }) );
- The game looks up the key in the corresponding JSON file for the user's language.
If the key doesn't exist for the given language, the game will default to an appropriate fallback (usually the corresponding English key).// from "en/file-name.json"... "keyName": "{{arg1}}! This is {{arg2}} of translated text!"
- The game shows the translated text to the user.
"Hello! This is an example of translated text!"
Submitting Locales Changes
If you have a feature or enhancement that requires additions or changes to in-game text, you will need to make a fork of the pokerogue-locales
repo and submit your text changes as a pull request in addition to your pull request to the main project.
Since these two PRs aren't technically linked, it's important to coordinate with the Translation Team to ensure that both PRs are integrated safely into the project.
Caution
DO NOT HARDCODE PLAYER-FACING TEXT INTO THE CODE!
Making Changes
One perk of submodules is you don't actually need to clone the locales repository to start contributing - initializing the submodule already does that for you.
Given pokerogue-locales
is a full-fledged git
repository inside pokerogue
, making changes is roughly the same as normal, merely using public/locales
as your root directory.
Important
Make sure to checkout or rebase onto
upstream/HEAD
BEFORE creating a PR!
The checked-out commit is based on the superproject's SHA-1 by default, so hastily making changes may see you basing your commits on last week'sHEAD
.
Requirements for Adding Translated Text
When your new feature or enhancement requires adding a new locales key without changing text in existing keys, we require the following workflow with regards to localization:
- You (the developer) make a pull request to the main repository for your new feature.
If this feature requires new text, the text should be integrated into the code with a new
i18next
key pointing to where you plan to add it into the locales repository. - You then make another pull request — this time to the
pokerogue-locales
repository — adding a new entry with text for each key you added to your main PR.
- You must add the corresponding English keys while making the PR; the Translation Team can take care of the rest1.
- For any feature pulled from the mainline Pokémon games (e.g. a Move or Ability implementation), it's best practice to include a source link for any added text.
Poké Corpus is a great resource for finding text from the mainline games; otherwise, a video/picture showing the text being displayed should suffice. - You should also notify the current Head of Translation to ensure a fast response.
- At this point, you may begin testing locales integration in your main PR.
- The Translation Team will approve the locale PR (after corrections, if necessary), then merge it into
pokerogue-locales
. - The Dev Team will approve your main PR for your feature, then merge it into PokéRogue's beta environment.
Requirements for Modifying Translated Text
PRs that modify existing text have different risks with respect to coordination between development and translation, so their requirements are slightly different:
- As above, you set up 2 PRs: one for the feature itself in the main repo, and another for the associated locales changes in the locale repo.
- Now, however, you need to have your main PR be approved by the Dev Team before your corresponding locale changes are merged in.
- After your main PR is approved, the Translation Team will merge your locale PR, and you may update the submodule and post video evidence of integration into the locales PR.
- A Lead or Senior Translator from the Translation Team will then approve your main PR (if all is well), clearing your feature for merging into
beta
.
Filming Locales Changes
After making a PR involving any outwards-facing behavior (but especially locales-related ones), it's generally considered good practice to attach a video of those changes working in-game.
Basic procedure:
- Update your locales submodule to point to the branch you used to make the locales PR.
Many IDEs withgit
integration support doing this from the GUI,
or you can simply do it via command-line:cd public/locales git checkout your-branch-name-here
- Set some of the in-game overrides inside
overrides.ts
to values corresponding to the interactions being tested. - Start a local dev server (
npm run start:dev
) and open localhost in your browser. - Film the locales change being displayed in the recording software of your choice1.
Notifying Translation
Put simply, stating that a PR exists makes it much easier to review and merge.
The easiest way to do this is by pinging the current Head of Translation in the Discord (ideally in #dev-corner
or similar).
Important
The current Head of Translation is:
** @lugiadrien **
Closing Remarks
If you have any questions about the developer process for localization, don't hesitate to ask! Feel free to contact us on Discord - the Dev Team and Translation Team will be happy to answer any questions.
-
For those wondering, the reason for choosing English specifically is due to it being the master language set in Pontoon (the program used by the Translation Team to perform locale updates). If a key is present in any language except the master language, it won't appear anywhere else in the translation tool, rendering missing English keys quite a hassle. ↩︎