--- layout: default title: Add new language parent: Development grand_parent: Miscellaneous nav_order: 3 --- # Add new language To add a new language to AliasVault, follow these steps in order: ## Step 1: Configure Crowdin Integration 1. **Update crowdin.yml**: Add the new language identifier to the `crowdin.yml` file in the root of the repository 2. **Crowdin will automatically**: - Fetch changes from the `main` branch - Offer new content for translation in the Crowdin web interface - Create translation files for the new language ## Step 2: Web App (Blazor WASM) 1. **Add language to LanguageService**: Update `apps/server/AliasVault.Client/Services/LanguageService.cs` with the new language identifier 2. **Translation files to create (optional, Crowdin should make a PR for this automatically)**: - `apps/server/AliasVault.Client/wwwroot/locales/{language-code}.json` - `apps/server/AliasVault.Client/Resources/{language-code}.resx` files ## Step 3: Browser Extension 1. **Add language identifier to config**: Update `/apps/browser-extension/src/utils/i18n/config.ts` and insert new language based on existing structure 1. **Create language file (optional, Crowdin should make a PR for this automatically)**: - `apps/browser-extension/src/locales/{language-code}.json` ## Step 4: Mobile App - React Native 1. **Add language identifier to config:** Update `/apps/mobile-app/i18n/index.ts` and insert new language based on existing structure 2 **Create translation file (optional, Crowdin should make a PR for this automatically)**: `apps/mobile-app/i18n/locales/{language-code}.json` ## Step 5: Mobile App - iOS Native **Location**: `apps/mobile-app/ios/` 2. **Add language in Xcode**: - Open workspace in Xcode - Go to target "AliasVault" > Project settings "Info" > Localizations - Add the desired language - Repeat the two steps above for target "Autofill" as well. 3. **Translation files to create (optional, Crowdin should make a PR for this automatically)**: - `AliasVault/{language-code}.lproj/Localizable.strings` - `AliasVault/{language-code}.lproj/InfoPlist.strings` - `Autofill/{language-code}.lproj/Localizable.strings` - `VaultUI/{language-code}.lproj/Localizable.strings` ## Step 6: Mobile App - Android Native **Location**: `apps/mobile-app/android/app/src/main/res/` 1. **Update locales config**: Add the language to `xml/locales_config.xml` 2. **Create translation file (optional, Crowdin should make a PR for this automatically)**: `values-{language-code}/strings.xml` ## Translation File Locations Summary ### React Native mobile app: - `apps/mobile-app/i18n/locales/en.json` - `apps/mobile-app/i18n/locales/nl.json` ### Browser Extension: - `apps/browser-extension/src/locales/en/**/*.json` - `apps/browser-extension/src/locales/nl/**/*.json` ### Web App (Blazor WASM): - `apps/server/AliasVault.Client/wwwroot/locales/en.json` - `apps/server/AliasVault.Client/wwwroot/locales/nl.json` - `apps/server/AliasVault.Client/Resources/**/*.en.resx` - `apps/server/AliasVault.Client/Resources/**/*.nl.resx` ### Android app native: - `apps/mobile-app/android/app/src/main/res/values/strings.xml` (default, English) - `apps/mobile-app/android/app/src/main/res/values-nl/strings.xml` (Dutch) ### iOS app native: - `apps/mobile-app/ios/AliasVault/en.lproj/Localizable.strings` (default, English) - `apps/mobile-app/ios/AliasVault/nl.lproj/Localizable.strings` (Dutch) - `apps/mobile-app/ios/Autofill/en.lproj/Localizable.strings` (default, English) - `apps/mobile-app/ios/Autofill/nl.lproj/Localizable.strings` (Dutch) - `apps/mobile-app/ios/VaultUI/en.lproj/Localizable.strings` (default, English) - `apps/mobile-app/ios/VaultUI/nl.lproj/Localizable.strings` (Dutch) ## Crowdin Integration AliasVault uses Crowdin for translation management with GitHub App integration. The project is configured with a centralized `crowdin.yml` file in the root of the repository that manages all translation files across the monorepo. The Crowdin GitHub App automatically: - Fetches changes from the `main` branch as soon as they become available - Offers new content for translation in the Crowdin web interface - Manages translation file synchronization across all applications Installing Crowdin CLI on MacOS for manually syncing source files: ```bash brew tap crowdin/crowdin brew install crowdin@4 brew link --force --overwrite crowdin@4 ``` To test uploading of source files via CLI to detect any issues with formatting: ```bash crowdin upload --token=[api_token] --project-id=808100 ``` Example output which may indicate errors: ```bash ✔️ Directory 'apps/mobile-app/ios/Autofill' ✔️ Directory 'apps/mobile-app/ios/Autofill/en.lproj' ❌ File 'apps/mobile-app/ios/Autofill/en.lproj/Localizable.strings' ❌ Wrong parameters: ✔️ Directory 'apps/mobile-app/android' ✔️ Directory 'apps/mobile-app/android/app' ✔️ Directory 'apps/mobile-app/android/app/src' ✔️ Directory 'apps/mobile-app/android/app/src/main' ✔️ Directory 'apps/mobile-app/android/app/src/main/res' ✔️ Directory 'apps/mobile-app/android/app/src/main/res/values' ✔️ File 'apps/mobile-app/android/app/src/main/res/values/strings.xml' ````