Skip to content
Merged
12 changes: 11 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,17 @@ First contribution checklist:

Translated READMEs: [`translated_readmes/`](./translated_readmes/README.md), available in English, 简体中文, 繁體中文, 日本語.

The App is available in the following languages: English (`en`), Japanese (`ja`), Simplified Chinese (`zh`), Vietnamese (`vi`), Brazilian Portuguese (`pt-BR`).
The App is available in the following languages:
- English (`en`)
- French (`fr`)
- Spanish (`es`)
- Catalan (`ca`)
- Brazilian Portuguese (`pt-BR`)
- Japanese (`ja`)
- Simplified Chinese (`zh`)
- Thai (`th`)
- Vietnamese (`vi`)
- Russian (`ru`)

## For Teams & Businesses

Expand Down
6 changes: 3 additions & 3 deletions TRANSLATIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ If you want to add a new README language:

You can also help translate the app UI via:

- `packages/app/src/i18n/`
- `apps/app/src/i18n/`

Currently available app UI locales: English (`en`), Japanese (`ja`), Simplified Chinese (`zh`), Vietnamese (`vi`), Brazilian Portuguese (`pt-BR`).
Currently available app UI locales: English (`en`), Japanese (`ja`), Simplified Chinese (`zh`), Vietnamese (`vi`), Brazilian Portuguese (`pt-BR`), Russian (`ru`).

Locale files live in `packages/app/src/i18n/locales/`.
Locale files live in `apps/app/src/i18n/locales/`.

If you are unsure where to start, open an issue and mention the language you want to contribute.
32 changes: 25 additions & 7 deletions apps/app/src/i18n/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,34 +7,51 @@ import th from "./locales/th";
import fr from "./locales/fr";
import ca from "./locales/ca";
import es from "./locales/es";
import ru from "./locales/ru";
import { LANGUAGE_PREF_KEY } from "../app/constants";

/**
* Supported languages
*/
export type Language = "en" | "ja" | "zh" | "vi" | "pt-BR" | "th" | "fr" | "ca" | "es";
export type Language = "en" | "ja" | "zh" | "vi" | "pt-BR" | "th" | "fr" | "ca" | "es" | "ru";
export type Locale = Language;

/**
* All supported languages - single source of truth
*/
export const LANGUAGES: Language[] = ["en", "ja", "zh", "vi", "pt-BR", "th", "fr", "ca", "es"];
export const LANGUAGES: Language[] = ["en", "ja", "zh", "vi", "pt-BR", "th", "fr", "ca", "es", "ru"];

/**
* Language options for UI - single source of truth
*/
export const LANGUAGE_OPTIONS = [
{ value: "en" as Language, label: "English", nativeName: "English" },
{ value: "ja" as Language, label: "日本語", nativeName: "日本語" },
{ value: "zh" as Language, label: "简体中文", nativeName: "简体中文" },
{ value: "ja" as Language, label: "Japanese", nativeName: "日本語" },
{ value: "zh" as Language, label: "Chinese (Simplified)", nativeName: "简体中文" },
{ value: "vi" as Language, label: "Vietnamese", nativeName: "Tiếng Việt" },
{ value: "pt-BR" as Language, label: "Portuguese (BR)", nativeName: "Português (BR)" },
{ value: "th" as Language, label: "ไทย", nativeName: "ไทย" },
{ value: "th" as Language, label: "Thai", nativeName: "ไทย" },
{ value: "fr" as Language, label: "French", nativeName: "Français" },
{ value: "ca" as Language, label: "Català", nativeName: "Català" },
{ value: "es" as Language, label: "Español", nativeName: "Español" },
{ value: "ca" as Language, label: "Catalan", nativeName: "Català" },
{ value: "es" as Language, label: "Spanish", nativeName: "Español" },
{ value: "ru" as Language, label: "Russian", nativeName: "Русский" },
] as const;

const PLURAL_SUFFIX_EMPTY_LANGUAGES = new Set<Language>(["ja", "zh", "th"]);

/**
* Current translation strings use an English-style plural suffix placeholder.
* Some locales render the noun without a visible plural marker, so we keep
* that suffix empty for them.
*/
export const pluralSuffix = (locale: Language, count: number): string => {
if (PLURAL_SUFFIX_EMPTY_LANGUAGES.has(locale)) {
return "";
}

return count === 1 ? "" : "s";
};

/**
* Translation maps
*/
Expand All @@ -48,6 +65,7 @@ const TRANSLATIONS: Record<Language, Record<string, string>> = {
fr,
ca,
es,
ru,
};

/**
Expand Down
1 change: 1 addition & 0 deletions apps/app/src/i18n/locales/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ export { default as ptBR } from "./pt-BR";
export { default as fr } from "./fr";
export { default as ca } from "./ca";
export { default as es } from "./es";
export { default as ru } from "./ru";
Loading
Loading