# Internationalization Workflow

## For Translators

### Use Crowdin

1. Register user account at https://crowdin.com/
2. Join the project https://crowdin.com/project/retroarch/
3. Select your language to translate
4. Click the file name `msg_hash_us.json` and the editor should open
5. Select an untranslated (red) string from the list
6. Type translation and save
7. Next string...

Links:
- [Video: How to use Crowdin](https://www.youtube.com/watch?v=kRMeCCr-D7s)
- [Learn more about contributing](https://support.crowdin.com/for-volunteer-translators/)
- [Learn more about the editor](https://support.crowdin.com/online-editor/)
- [Learn more about conversations](https://support.crowdin.com/conversations/)
- [Learn more about joining project](https://support.crowdin.com/joining-translation-project/)

### Request New Language

You can open a new issue and @guoyunhe to add new language.

## For Maintainers

### Set Up

Install Java, Python3 and Git

### Synchronize

```
cd intl
python3 crowin_sync.py
```

### Manage Crowdin Project

1. You need to be project admin. Please contact @guoyunhe or @twinaphex
2. Go to https://crowdin.com/project/retroarch/settings
3. You can manage languages, members etc. here

Links:
- [Learn more about project management](https://support.crowdin.com/advanced-project-setup/)
- [Learn more about inviting project members](https://support.crowdin.com/inviting-participants/)
- [Learn more about roles of members](https://support.crowdin.com/modifying-project-participants-roles/)

### Message File Format

1. Must **NOT** contain `#else`
2. Must **NOT** have multiple-line string syntax
   ```cpp
   // bad
   MSG_HASH(
     MENU_ENUM_SUBLABEL_CHEEVOS_ENABLE,
     "Compete to earn custom-made achievements in classic games.\n"
     "For more information, visit http://retroachievements.org"
     )
   // good
   MSG_HASH(
     MENU_ENUM_SUBLABEL_CHEEVOS_ENABLE,
     "Compete to earn custom-made achievements in classic games.\nFor more information, visit http://retroachievements.org"
     )
   ```
3. Must **NOT** contain lowercase letters in key name
   ```cpp
   // bad (x)
   MSG_HASH(
     MENU_ENUM_LABEL_VALUE_CTR_VIDEO_MODE_2D_800x240,
     "2D (High Resolution)"
     )
   // good (X)
   MSG_HASH(
     MENU_ENUM_LABEL_VALUE_CTR_VIDEO_MODE_2D_800X240,
     "2D (High Resolution)"
     )
   ```

### Add New Languages

1. Go to Crowdin and add the language
2. Run Crowdin script to download new translations
3. Add new language into menu (see [#10787](https://github.com/libretro/RetroArch/pull/10787))