mirror of
https://github.com/jakejarvis/sofa.git
synced 2026-07-14 18:15:56 -04:00
refactor(i18n): replace compiled .ts catalogs with direct .po imports
- Remove `lingui compile` / `i18n:compile` script — Vite and Metro LingUI plugins now compile `.po` files on the fly at dev/build time; no manual compile step needed
- Import `.po` files directly in `@sofa/i18n` (`./po/en.po` etc.) and add `po.d.ts` ambient module declaration so TypeScript accepts them
- Add `fallbackLocales: { default: "en" }` and `lineNumbers: false` to `lingui.config.ts`; prefix catalog paths with `<rootDir>` for correctness
- Derive `SupportedLocale` and `SUPPORTED_LOCALES` from `LOCALE_INFO` in `locales.ts` to eliminate the circular import between `index.ts` and `locales.ts`
- Update Crowdin config to use `project_id_env` instead of a hardcoded ID, drop `languages_mapping` (no longer needed), and add `preserve_hierarchy: true`
- Add a daily cron trigger (`0 6 * * *`) to the Crowdin GitHub Actions workflow and drop the now-redundant compile step from it
- Update docs and `AGENTS.md` to reflect that no compile step is required after `i18n:extract`
This commit is contained in:
@@ -530,16 +530,6 @@ if (!dryRun) {
|
||||
console.error("Extraction failed");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log("Compiling catalogs...");
|
||||
const compile = Bun.spawn(["bun", "run", "i18n:compile"], {
|
||||
stdout: "inherit",
|
||||
stderr: "inherit",
|
||||
});
|
||||
if ((await compile.exited) !== 0) {
|
||||
console.error("Catalog compilation failed");
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
console.log("Done!");
|
||||
|
||||
+10
-15
@@ -1,20 +1,20 @@
|
||||
import { i18n, type Messages } from "@lingui/core";
|
||||
|
||||
import { messages as enMessages } from "./po/en";
|
||||
import type { SupportedLocale } from "./locales";
|
||||
import { messages as enMessages } from "./po/en.po";
|
||||
|
||||
export const SUPPORTED_LOCALES = ["en", "fr", "de", "es", "it", "pt"] as const;
|
||||
export type SupportedLocale = (typeof SUPPORTED_LOCALES)[number];
|
||||
export { SUPPORTED_LOCALES, type SupportedLocale } from "./locales";
|
||||
|
||||
// English always bundled — zero async on default locale
|
||||
i18n.load("en", enMessages);
|
||||
i18n.activate("en");
|
||||
|
||||
const loaders: Record<string, () => Promise<{ messages: Messages }>> = {
|
||||
fr: () => import("./po/fr"),
|
||||
de: () => import("./po/de"),
|
||||
es: () => import("./po/es"),
|
||||
it: () => import("./po/it"),
|
||||
pt: () => import("./po/pt"),
|
||||
const loaders: Record<Exclude<SupportedLocale, "en">, () => Promise<{ messages: Messages }>> = {
|
||||
fr: () => import("./po/fr.po"),
|
||||
de: () => import("./po/de.po"),
|
||||
es: () => import("./po/es.po"),
|
||||
it: () => import("./po/it.po"),
|
||||
pt: () => import("./po/pt.po"),
|
||||
};
|
||||
|
||||
export async function activateLocale(locale: SupportedLocale): Promise<void> {
|
||||
@@ -22,12 +22,7 @@ export async function activateLocale(locale: SupportedLocale): Promise<void> {
|
||||
i18n.activate("en");
|
||||
return;
|
||||
}
|
||||
const loader = loaders[locale];
|
||||
if (!loader) {
|
||||
i18n.activate("en");
|
||||
return;
|
||||
}
|
||||
const { messages } = await loader();
|
||||
const { messages } = await loaders[locale]();
|
||||
i18n.load(locale, messages);
|
||||
i18n.activate(locale);
|
||||
}
|
||||
|
||||
@@ -1,16 +1,18 @@
|
||||
import type { SupportedLocale } from "./index";
|
||||
|
||||
export interface LocaleInfo {
|
||||
code: SupportedLocale;
|
||||
code: string;
|
||||
name: string;
|
||||
nativeName: string;
|
||||
}
|
||||
|
||||
export const LOCALE_INFO: LocaleInfo[] = [
|
||||
export const LOCALE_INFO = [
|
||||
{ code: "en", name: "English", nativeName: "English" },
|
||||
{ code: "fr", name: "French", nativeName: "Fran\u00e7ais" },
|
||||
{ code: "de", name: "German", nativeName: "Deutsch" },
|
||||
{ code: "es", name: "Spanish", nativeName: "Espa\u00f1ol" },
|
||||
{ code: "it", name: "Italian", nativeName: "Italiano" },
|
||||
{ code: "pt", name: "Portuguese", nativeName: "Portugu\u00eas" },
|
||||
];
|
||||
] as const satisfies readonly LocaleInfo[];
|
||||
|
||||
export type SupportedLocale = (typeof LOCALE_INFO)[number]["code"];
|
||||
|
||||
export const SUPPORTED_LOCALES = LOCALE_INFO.map((l) => l.code) as SupportedLocale[];
|
||||
|
||||
Vendored
+4
@@ -0,0 +1,4 @@
|
||||
declare module "*.po" {
|
||||
import type { Messages } from "@lingui/core";
|
||||
export const messages: Messages;
|
||||
}
|
||||
+817
-817
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
+817
-817
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
+817
-817
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
+817
-817
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
+817
-817
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
+817
-817
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -2,7 +2,7 @@ import { i18n } from "@lingui/core";
|
||||
import { I18nProvider } from "@lingui/react";
|
||||
import type { ReactNode } from "react";
|
||||
|
||||
import { messages } from "./po/en";
|
||||
import { messages } from "./po/en.po";
|
||||
|
||||
i18n.load("en", messages);
|
||||
i18n.activate("en");
|
||||
|
||||
Reference in New Issue
Block a user