From 78d0fe4fb178a5dffd5f0d6fb6c6efcd0948b5a1 Mon Sep 17 00:00:00 2001 From: David Turnbull Date: Mon, 27 Oct 2025 09:38:36 -0700 Subject: [PATCH 1/5] feat: bucket metadata --- packages/cli/src/cli/loaders/index.ts | 220 ++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) diff --git a/packages/cli/src/cli/loaders/index.ts b/packages/cli/src/cli/loaders/index.ts index cce4c39be..de04bf9eb 100644 --- a/packages/cli/src/cli/loaders/index.ts +++ b/packages/cli/src/cli/loaders/index.ts @@ -57,6 +57,226 @@ type BucketLoaderOptions = { formatter?: FormatterType; }; +export interface BucketMetadata { + supportsFormatter: boolean; + supportsInjectLocale: boolean; + supportsLockedKeys: boolean; + supportsIgnoredKeys: boolean; + supportsLockedPatterns: boolean; +} + +export const BUCKET_METADATA: Record = { + android: { + supportsFormatter: false, + supportsInjectLocale: false, + supportsLockedKeys: false, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + csv: { + supportsFormatter: false, + supportsInjectLocale: false, + supportsLockedKeys: false, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + html: { + supportsFormatter: true, + supportsInjectLocale: false, + supportsLockedKeys: false, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + ejs: { + supportsFormatter: false, + supportsInjectLocale: false, + supportsLockedKeys: false, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + json: { + supportsFormatter: true, + supportsInjectLocale: true, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: false, + }, + json5: { + supportsFormatter: false, + supportsInjectLocale: true, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: false, + }, + jsonc: { + supportsFormatter: false, + supportsInjectLocale: true, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: false, + }, + markdown: { + supportsFormatter: true, + supportsInjectLocale: false, + supportsLockedKeys: false, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + markdoc: { + supportsFormatter: false, + supportsInjectLocale: false, + supportsLockedKeys: false, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + mdx: { + supportsFormatter: true, + supportsInjectLocale: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + }, + po: { + supportsFormatter: false, + supportsInjectLocale: false, + supportsLockedKeys: false, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + properties: { + supportsFormatter: false, + supportsInjectLocale: false, + supportsLockedKeys: false, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + "xcode-strings": { + supportsFormatter: false, + supportsInjectLocale: false, + supportsLockedKeys: false, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + "xcode-stringsdict": { + supportsFormatter: false, + supportsInjectLocale: false, + supportsLockedKeys: false, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + "xcode-xcstrings": { + supportsFormatter: false, + supportsInjectLocale: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: false, + }, + "xcode-xcstrings-v2": { + supportsFormatter: false, + supportsInjectLocale: false, + supportsLockedKeys: true, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + yaml: { + supportsFormatter: true, + supportsInjectLocale: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: false, + }, + "yaml-root-key": { + supportsFormatter: true, + supportsInjectLocale: false, + supportsLockedKeys: false, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + flutter: { + supportsFormatter: true, + supportsInjectLocale: false, + supportsLockedKeys: false, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + xliff: { + supportsFormatter: false, + supportsInjectLocale: false, + supportsLockedKeys: false, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + xml: { + supportsFormatter: false, + supportsInjectLocale: false, + supportsLockedKeys: false, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + srt: { + supportsFormatter: false, + supportsInjectLocale: false, + supportsLockedKeys: false, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + dato: { + supportsFormatter: false, + supportsInjectLocale: false, + supportsLockedKeys: false, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + vtt: { + supportsFormatter: false, + supportsInjectLocale: false, + supportsLockedKeys: false, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + php: { + supportsFormatter: false, + supportsInjectLocale: false, + supportsLockedKeys: false, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + "vue-json": { + supportsFormatter: false, + supportsInjectLocale: false, + supportsLockedKeys: false, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + typescript: { + supportsFormatter: true, + supportsInjectLocale: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: false, + }, + txt: { + supportsFormatter: false, + supportsInjectLocale: false, + supportsLockedKeys: false, + supportsIgnoredKeys: false, + supportsLockedPatterns: false, + }, + "json-dictionary": { + supportsFormatter: true, + supportsInjectLocale: true, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: false, + }, +}; + +export function getBucketMetadata( + bucketType: string, +): BucketMetadata | undefined { + return BUCKET_METADATA[bucketType]; +} + export default function createBucketLoader( bucketType: Z.infer, bucketPathPattern: string, From 6e945479b9f1bd64fd0e8ced3ec01fb8ebb1849b Mon Sep 17 00:00:00 2001 From: David Turnbull Date: Mon, 27 Oct 2025 09:44:29 -0700 Subject: [PATCH 2/5] feat: factories --- packages/cli/src/cli/loaders/index.ts | 880 +++++++++++++------------- 1 file changed, 448 insertions(+), 432 deletions(-) diff --git a/packages/cli/src/cli/loaders/index.ts b/packages/cli/src/cli/loaders/index.ts index de04bf9eb..e67971d82 100644 --- a/packages/cli/src/cli/loaders/index.ts +++ b/packages/cli/src/cli/loaders/index.ts @@ -57,77 +57,194 @@ type BucketLoaderOptions = { formatter?: FormatterType; }; +export interface BucketLoaderContext { + bucketPathPattern: string; + options: BucketLoaderOptions; + lockedKeys?: string[]; + lockedPatterns?: string[]; + ignoredKeys?: string[]; +} + export interface BucketMetadata { supportsFormatter: boolean; supportsInjectLocale: boolean; supportsLockedKeys: boolean; supportsIgnoredKeys: boolean; supportsLockedPatterns: boolean; + createLoader: (ctx: BucketLoaderContext) => ILoader>; } export const BUCKET_METADATA: Record = { android: { supportsFormatter: false, supportsInjectLocale: false, - supportsLockedKeys: false, - supportsIgnoredKeys: false, - supportsLockedPatterns: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createAndroidLoader(), + createEnsureKeyOrderLoader(), + createFlatLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, csv: { supportsFormatter: false, supportsInjectLocale: false, - supportsLockedKeys: false, - supportsIgnoredKeys: false, - supportsLockedPatterns: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createCsvLoader(), + createEnsureKeyOrderLoader(), + createFlatLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, html: { supportsFormatter: true, supportsInjectLocale: false, - supportsLockedKeys: false, - supportsIgnoredKeys: false, - supportsLockedPatterns: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createFormatterLoader(ctx.options.formatter, "html", ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createHtmlLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, ejs: { supportsFormatter: false, supportsInjectLocale: false, - supportsLockedKeys: false, - supportsIgnoredKeys: false, - supportsLockedPatterns: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createEjsLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, json: { supportsFormatter: true, supportsInjectLocale: true, supportsLockedKeys: true, supportsIgnoredKeys: true, - supportsLockedPatterns: false, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createFormatterLoader(ctx.options.formatter, "json", ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createJsonLoader(), + createEnsureKeyOrderLoader(), + createFlatLoader(), + createInjectLocaleLoader(ctx.options.injectLocale), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, json5: { supportsFormatter: false, supportsInjectLocale: true, supportsLockedKeys: true, supportsIgnoredKeys: true, - supportsLockedPatterns: false, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createJson5Loader(), + createEnsureKeyOrderLoader(), + createFlatLoader(), + createInjectLocaleLoader(ctx.options.injectLocale), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, jsonc: { supportsFormatter: false, supportsInjectLocale: true, supportsLockedKeys: true, supportsIgnoredKeys: true, - supportsLockedPatterns: false, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createJsoncLoader(), + createEnsureKeyOrderLoader(), + createFlatLoader(), + createInjectLocaleLoader(ctx.options.injectLocale), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, markdown: { supportsFormatter: true, supportsInjectLocale: false, - supportsLockedKeys: false, - supportsIgnoredKeys: false, - supportsLockedPatterns: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createFormatterLoader(ctx.options.formatter, "markdown", ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createMarkdownLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, markdoc: { supportsFormatter: false, supportsInjectLocale: false, - supportsLockedKeys: false, - supportsIgnoredKeys: false, - supportsLockedPatterns: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createMarkdocLoader(), + createFlatLoader(), + createEnsureKeyOrderLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, mdx: { supportsFormatter: true, @@ -135,139 +252,392 @@ export const BUCKET_METADATA: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createFormatterLoader(ctx.options.formatter, "mdx", ctx.bucketPathPattern), + createMdxCodePlaceholderLoader(), + createLockedPatternsLoader(ctx.lockedPatterns), + createMdxFrontmatterSplitLoader(), + createMdxSectionsSplit2Loader(), + createLocalizableMdxDocumentLoader(), + createFlatLoader(), + createEnsureKeyOrderLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, po: { supportsFormatter: false, supportsInjectLocale: false, - supportsLockedKeys: false, - supportsIgnoredKeys: false, - supportsLockedPatterns: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createPoLoader(), + createFlatLoader(), + createEnsureKeyOrderLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createVariableLoader({ type: "python" }), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, properties: { supportsFormatter: false, supportsInjectLocale: false, - supportsLockedKeys: false, - supportsIgnoredKeys: false, - supportsLockedPatterns: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createPropertiesLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, "xcode-strings": { supportsFormatter: false, supportsInjectLocale: false, - supportsLockedKeys: false, - supportsIgnoredKeys: false, - supportsLockedPatterns: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createXcodeStringsLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, "xcode-stringsdict": { supportsFormatter: false, supportsInjectLocale: false, - supportsLockedKeys: false, - supportsIgnoredKeys: false, - supportsLockedPatterns: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createXcodeStringsdictLoader(), + createFlatLoader(), + createEnsureKeyOrderLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, "xcode-xcstrings": { supportsFormatter: false, supportsInjectLocale: false, supportsLockedKeys: true, supportsIgnoredKeys: true, - supportsLockedPatterns: false, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createPlutilJsonTextLoader(), + createLockedPatternsLoader(ctx.lockedPatterns), + createJsonLoader(), + createXcodeXcstringsLoader(ctx.options.defaultLocale), + createFlatLoader(), + createEnsureKeyOrderLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createVariableLoader({ type: "ieee" }), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, "xcode-xcstrings-v2": { supportsFormatter: false, supportsInjectLocale: false, supportsLockedKeys: true, - supportsIgnoredKeys: false, - supportsLockedPatterns: false, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createPlutilJsonTextLoader(), + createLockedPatternsLoader(ctx.lockedPatterns), + createJsonLoader(), + createXcodeXcstringsLoader(ctx.options.defaultLocale), + createXcodeXcstringsV2Loader(ctx.options.defaultLocale), + createFlatLoader({ shouldPreserveObject: isICUPluralObject }), + createEnsureKeyOrderLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createVariableLoader({ type: "ieee" }), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, yaml: { supportsFormatter: true, supportsInjectLocale: false, supportsLockedKeys: true, supportsIgnoredKeys: true, - supportsLockedPatterns: false, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createFormatterLoader(ctx.options.formatter, "yaml", ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createYamlLoader(), + createFlatLoader(), + createEnsureKeyOrderLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, "yaml-root-key": { supportsFormatter: true, supportsInjectLocale: false, - supportsLockedKeys: false, - supportsIgnoredKeys: false, - supportsLockedPatterns: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createFormatterLoader(ctx.options.formatter, "yaml", ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createYamlLoader(), + createRootKeyLoader(true), + createFlatLoader(), + createEnsureKeyOrderLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, flutter: { supportsFormatter: true, supportsInjectLocale: false, - supportsLockedKeys: false, - supportsIgnoredKeys: false, - supportsLockedPatterns: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createFormatterLoader(ctx.options.formatter, "json", ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createJsonLoader(), + createEnsureKeyOrderLoader(), + createFlutterLoader(), + createFlatLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, xliff: { supportsFormatter: false, supportsInjectLocale: false, - supportsLockedKeys: false, - supportsIgnoredKeys: false, - supportsLockedPatterns: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createXliffLoader(), + createFlatLoader(), + createEnsureKeyOrderLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, xml: { supportsFormatter: false, supportsInjectLocale: false, - supportsLockedKeys: false, - supportsIgnoredKeys: false, - supportsLockedPatterns: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createXmlLoader(), + createFlatLoader(), + createEnsureKeyOrderLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, srt: { supportsFormatter: false, supportsInjectLocale: false, - supportsLockedKeys: false, - supportsIgnoredKeys: false, - supportsLockedPatterns: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createSrtLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, dato: { supportsFormatter: false, supportsInjectLocale: false, - supportsLockedKeys: false, - supportsIgnoredKeys: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, supportsLockedPatterns: false, + createLoader: (ctx) => + composeLoaders( + createDatoLoader(ctx.bucketPathPattern), + createSyncLoader(), + createFlatLoader(), + createEnsureKeyOrderLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, vtt: { supportsFormatter: false, supportsInjectLocale: false, - supportsLockedKeys: false, - supportsIgnoredKeys: false, - supportsLockedPatterns: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createVttLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, php: { supportsFormatter: false, supportsInjectLocale: false, - supportsLockedKeys: false, - supportsIgnoredKeys: false, - supportsLockedPatterns: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createPhpLoader(), + createSyncLoader(), + createFlatLoader(), + createEnsureKeyOrderLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, "vue-json": { supportsFormatter: false, supportsInjectLocale: false, - supportsLockedKeys: false, - supportsIgnoredKeys: false, - supportsLockedPatterns: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createVueJsonLoader(), + createSyncLoader(), + createFlatLoader(), + createEnsureKeyOrderLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, typescript: { supportsFormatter: true, supportsInjectLocale: false, supportsLockedKeys: true, supportsIgnoredKeys: true, - supportsLockedPatterns: false, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createFormatterLoader( + ctx.options.formatter, + "typescript", + ctx.bucketPathPattern, + ), + createLockedPatternsLoader(ctx.lockedPatterns), + createTypescriptLoader(), + createFlatLoader(), + createEnsureKeyOrderLoader(), + createSyncLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, txt: { supportsFormatter: false, supportsInjectLocale: false, - supportsLockedKeys: false, - supportsIgnoredKeys: false, - supportsLockedPatterns: false, + supportsLockedKeys: true, + supportsIgnoredKeys: true, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createTxtLoader(), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, "json-dictionary": { supportsFormatter: true, supportsInjectLocale: true, supportsLockedKeys: true, supportsIgnoredKeys: true, - supportsLockedPatterns: false, + supportsLockedPatterns: true, + createLoader: (ctx) => + composeLoaders( + createTextFileLoader(ctx.bucketPathPattern), + createFormatterLoader(ctx.options.formatter, "json", ctx.bucketPathPattern), + createLockedPatternsLoader(ctx.lockedPatterns), + createJsonLoader(), + createJsonKeysLoader(), + createEnsureKeyOrderLoader(), + createFlatLoader(), + createInjectLocaleLoader(ctx.options.injectLocale), + createLockedKeysLoader(ctx.lockedKeys || []), + createIgnoredKeysLoader(ctx.ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(ctx.options.returnUnlocalizedKeys), + ), }, }; @@ -285,369 +655,15 @@ export default function createBucketLoader( lockedPatterns?: string[], ignoredKeys?: string[], ): ILoader> { - switch (bucketType) { - default: - throw new Error(`Unsupported bucket type: ${bucketType}`); - case "android": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createAndroidLoader(), - createEnsureKeyOrderLoader(), - createFlatLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "csv": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createCsvLoader(), - createEnsureKeyOrderLoader(), - createFlatLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "html": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createFormatterLoader(options.formatter, "html", bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createHtmlLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "ejs": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createEjsLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "json": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createFormatterLoader(options.formatter, "json", bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createJsonLoader(), - createEnsureKeyOrderLoader(), - createFlatLoader(), - createInjectLocaleLoader(options.injectLocale), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "json5": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createJson5Loader(), - createEnsureKeyOrderLoader(), - createFlatLoader(), - createInjectLocaleLoader(options.injectLocale), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "jsonc": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createJsoncLoader(), - createEnsureKeyOrderLoader(), - createFlatLoader(), - createInjectLocaleLoader(options.injectLocale), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "markdown": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createFormatterLoader(options.formatter, "markdown", bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createMarkdownLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "markdoc": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createMarkdocLoader(), - createFlatLoader(), - createEnsureKeyOrderLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "mdx": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createFormatterLoader(options.formatter, "mdx", bucketPathPattern), - createMdxCodePlaceholderLoader(), - createLockedPatternsLoader(lockedPatterns), - createMdxFrontmatterSplitLoader(), - createMdxSectionsSplit2Loader(), - createLocalizableMdxDocumentLoader(), - createFlatLoader(), - createEnsureKeyOrderLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "po": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createPoLoader(), - createFlatLoader(), - createEnsureKeyOrderLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createVariableLoader({ type: "python" }), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "properties": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createPropertiesLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "xcode-strings": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createXcodeStringsLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "xcode-stringsdict": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createXcodeStringsdictLoader(), - createFlatLoader(), - createEnsureKeyOrderLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "xcode-xcstrings": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createPlutilJsonTextLoader(), - createLockedPatternsLoader(lockedPatterns), - createJsonLoader(), - createXcodeXcstringsLoader(options.defaultLocale), - createFlatLoader(), - createEnsureKeyOrderLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createVariableLoader({ type: "ieee" }), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "xcode-xcstrings-v2": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createPlutilJsonTextLoader(), - createLockedPatternsLoader(lockedPatterns), - createJsonLoader(), - createXcodeXcstringsLoader(options.defaultLocale), - createXcodeXcstringsV2Loader(options.defaultLocale), - createFlatLoader({ shouldPreserveObject: isICUPluralObject }), - createEnsureKeyOrderLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createVariableLoader({ type: "ieee" }), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "yaml": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createFormatterLoader(options.formatter, "yaml", bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createYamlLoader(), - createFlatLoader(), - createEnsureKeyOrderLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "yaml-root-key": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createFormatterLoader(options.formatter, "yaml", bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createYamlLoader(), - createRootKeyLoader(true), - createFlatLoader(), - createEnsureKeyOrderLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "flutter": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createFormatterLoader(options.formatter, "json", bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createJsonLoader(), - createEnsureKeyOrderLoader(), - createFlutterLoader(), - createFlatLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "xliff": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createXliffLoader(), - createFlatLoader(), - createEnsureKeyOrderLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "xml": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createXmlLoader(), - createFlatLoader(), - createEnsureKeyOrderLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "srt": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createSrtLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "dato": - return composeLoaders( - createDatoLoader(bucketPathPattern), - createSyncLoader(), - createFlatLoader(), - createEnsureKeyOrderLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "vtt": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createVttLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "php": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createPhpLoader(), - createSyncLoader(), - createFlatLoader(), - createEnsureKeyOrderLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "vue-json": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createVueJsonLoader(), - createSyncLoader(), - createFlatLoader(), - createEnsureKeyOrderLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "typescript": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createFormatterLoader( - options.formatter, - "typescript", - bucketPathPattern, - ), - createLockedPatternsLoader(lockedPatterns), - createTypescriptLoader(), - createFlatLoader(), - createEnsureKeyOrderLoader(), - createSyncLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "txt": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createTxtLoader(), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); - case "json-dictionary": - return composeLoaders( - createTextFileLoader(bucketPathPattern), - createFormatterLoader(options.formatter, "json", bucketPathPattern), - createLockedPatternsLoader(lockedPatterns), - createJsonLoader(), - createJsonKeysLoader(), - createEnsureKeyOrderLoader(), - createFlatLoader(), - createInjectLocaleLoader(options.injectLocale), - createLockedKeysLoader(lockedKeys || []), - createIgnoredKeysLoader(ignoredKeys || []), - createSyncLoader(), - createUnlocalizableLoader(options.returnUnlocalizedKeys), - ); + const metadata = BUCKET_METADATA[bucketType]; + if (!metadata) { + throw new Error(`Unsupported bucket type: ${bucketType}`); } + return metadata.createLoader({ + bucketPathPattern, + options, + lockedKeys, + lockedPatterns, + ignoredKeys, + }); } From ae325e5c024f941f852fb1c5642ca2390cdb4316 Mon Sep 17 00:00:00 2001 From: David Turnbull Date: Mon, 27 Oct 2025 09:47:45 -0700 Subject: [PATCH 3/5] chore: renames --- packages/cli/src/cli/loaders/index.ts | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/packages/cli/src/cli/loaders/index.ts b/packages/cli/src/cli/loaders/index.ts index e67971d82..d5342d450 100644 --- a/packages/cli/src/cli/loaders/index.ts +++ b/packages/cli/src/cli/loaders/index.ts @@ -57,24 +57,24 @@ type BucketLoaderOptions = { formatter?: FormatterType; }; -export interface BucketLoaderContext { +export type BucketLoaderContext = { bucketPathPattern: string; options: BucketLoaderOptions; lockedKeys?: string[]; lockedPatterns?: string[]; ignoredKeys?: string[]; -} +}; -export interface BucketMetadata { +export type Bucket = { supportsFormatter: boolean; supportsInjectLocale: boolean; supportsLockedKeys: boolean; supportsIgnoredKeys: boolean; supportsLockedPatterns: boolean; createLoader: (ctx: BucketLoaderContext) => ILoader>; -} +}; -export const BUCKET_METADATA: Record = { +export const BUCKETS: Record = { android: { supportsFormatter: false, supportsInjectLocale: false, @@ -641,10 +641,8 @@ export const BUCKET_METADATA: Record = { }, }; -export function getBucketMetadata( - bucketType: string, -): BucketMetadata | undefined { - return BUCKET_METADATA[bucketType]; +export function getBucket(bucketType: string): Bucket | undefined { + return BUCKETS[bucketType]; } export default function createBucketLoader( @@ -655,11 +653,11 @@ export default function createBucketLoader( lockedPatterns?: string[], ignoredKeys?: string[], ): ILoader> { - const metadata = BUCKET_METADATA[bucketType]; - if (!metadata) { + const bucket = BUCKETS[bucketType]; + if (!bucket) { throw new Error(`Unsupported bucket type: ${bucketType}`); } - return metadata.createLoader({ + return bucket.createLoader({ bucketPathPattern, options, lockedKeys, From 7561d8cf0c5024d26f92b16f3e41e6d7dd1f57bb Mon Sep 17 00:00:00 2001 From: David Turnbull Date: Mon, 27 Oct 2025 09:55:48 -0700 Subject: [PATCH 4/5] feat: supportsLocalePlaceholder --- packages/cli/src/cli/loaders/index.ts | 30 +++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/packages/cli/src/cli/loaders/index.ts b/packages/cli/src/cli/loaders/index.ts index d5342d450..5ca820b00 100644 --- a/packages/cli/src/cli/loaders/index.ts +++ b/packages/cli/src/cli/loaders/index.ts @@ -71,6 +71,7 @@ export type Bucket = { supportsLockedKeys: boolean; supportsIgnoredKeys: boolean; supportsLockedPatterns: boolean; + supportsLocalePlaceholder: boolean; createLoader: (ctx: BucketLoaderContext) => ILoader>; }; @@ -81,6 +82,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -100,6 +102,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: false, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -119,6 +122,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -137,6 +141,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -154,6 +159,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -175,6 +181,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -195,6 +202,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -215,6 +223,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -233,6 +242,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -252,6 +262,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -275,6 +286,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -295,6 +307,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -312,6 +325,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -329,6 +343,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -348,6 +363,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: false, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -370,6 +386,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: false, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -393,6 +410,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -413,6 +431,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: false, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -434,6 +453,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -455,6 +475,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -474,6 +495,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -493,6 +515,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -510,6 +533,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: false, + supportsLocalePlaceholder: false, createLoader: (ctx) => composeLoaders( createDatoLoader(ctx.bucketPathPattern), @@ -527,6 +551,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -544,6 +569,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -563,6 +589,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: false, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -582,6 +609,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -606,6 +634,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: true, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), @@ -623,6 +652,7 @@ export const BUCKETS: Record = { supportsLockedKeys: true, supportsIgnoredKeys: true, supportsLockedPatterns: true, + supportsLocalePlaceholder: false, createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), From a98c88027b90f6c6e8c2acadd7c040b1dc685573 Mon Sep 17 00:00:00 2001 From: David Turnbull Date: Mon, 27 Oct 2025 09:59:29 -0700 Subject: [PATCH 5/5] feat: display names --- packages/cli/src/cli/loaders/index.ts | 82 ++++++++++++++++++++++++--- 1 file changed, 73 insertions(+), 9 deletions(-) diff --git a/packages/cli/src/cli/loaders/index.ts b/packages/cli/src/cli/loaders/index.ts index 5ca820b00..0256ed6e8 100644 --- a/packages/cli/src/cli/loaders/index.ts +++ b/packages/cli/src/cli/loaders/index.ts @@ -66,17 +66,21 @@ export type BucketLoaderContext = { }; export type Bucket = { + displayName: string; supportsFormatter: boolean; supportsInjectLocale: boolean; supportsLockedKeys: boolean; supportsIgnoredKeys: boolean; supportsLockedPatterns: boolean; supportsLocalePlaceholder: boolean; - createLoader: (ctx: BucketLoaderContext) => ILoader>; + createLoader: ( + ctx: BucketLoaderContext, + ) => ILoader>; }; export const BUCKETS: Record = { android: { + displayName: "Android XML", supportsFormatter: false, supportsInjectLocale: false, supportsLockedKeys: true, @@ -97,6 +101,7 @@ export const BUCKETS: Record = { ), }, csv: { + displayName: "CSV", supportsFormatter: false, supportsInjectLocale: false, supportsLockedKeys: true, @@ -117,6 +122,7 @@ export const BUCKETS: Record = { ), }, html: { + displayName: "HTML", supportsFormatter: true, supportsInjectLocale: false, supportsLockedKeys: true, @@ -126,7 +132,11 @@ export const BUCKETS: Record = { createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), - createFormatterLoader(ctx.options.formatter, "html", ctx.bucketPathPattern), + createFormatterLoader( + ctx.options.formatter, + "html", + ctx.bucketPathPattern, + ), createLockedPatternsLoader(ctx.lockedPatterns), createHtmlLoader(), createLockedKeysLoader(ctx.lockedKeys || []), @@ -136,6 +146,7 @@ export const BUCKETS: Record = { ), }, ejs: { + displayName: "EJS", supportsFormatter: false, supportsInjectLocale: false, supportsLockedKeys: true, @@ -154,6 +165,7 @@ export const BUCKETS: Record = { ), }, json: { + displayName: "JSON", supportsFormatter: true, supportsInjectLocale: true, supportsLockedKeys: true, @@ -163,7 +175,11 @@ export const BUCKETS: Record = { createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), - createFormatterLoader(ctx.options.formatter, "json", ctx.bucketPathPattern), + createFormatterLoader( + ctx.options.formatter, + "json", + ctx.bucketPathPattern, + ), createLockedPatternsLoader(ctx.lockedPatterns), createJsonLoader(), createEnsureKeyOrderLoader(), @@ -176,6 +192,7 @@ export const BUCKETS: Record = { ), }, json5: { + displayName: "JSON5", supportsFormatter: false, supportsInjectLocale: true, supportsLockedKeys: true, @@ -197,6 +214,7 @@ export const BUCKETS: Record = { ), }, jsonc: { + displayName: "JSONC", supportsFormatter: false, supportsInjectLocale: true, supportsLockedKeys: true, @@ -218,6 +236,7 @@ export const BUCKETS: Record = { ), }, markdown: { + displayName: "Markdown", supportsFormatter: true, supportsInjectLocale: false, supportsLockedKeys: true, @@ -227,7 +246,11 @@ export const BUCKETS: Record = { createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), - createFormatterLoader(ctx.options.formatter, "markdown", ctx.bucketPathPattern), + createFormatterLoader( + ctx.options.formatter, + "markdown", + ctx.bucketPathPattern, + ), createLockedPatternsLoader(ctx.lockedPatterns), createMarkdownLoader(), createLockedKeysLoader(ctx.lockedKeys || []), @@ -237,6 +260,7 @@ export const BUCKETS: Record = { ), }, markdoc: { + displayName: "Markdoc", supportsFormatter: false, supportsInjectLocale: false, supportsLockedKeys: true, @@ -257,6 +281,7 @@ export const BUCKETS: Record = { ), }, mdx: { + displayName: "MDX", supportsFormatter: true, supportsInjectLocale: false, supportsLockedKeys: true, @@ -266,7 +291,11 @@ export const BUCKETS: Record = { createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), - createFormatterLoader(ctx.options.formatter, "mdx", ctx.bucketPathPattern), + createFormatterLoader( + ctx.options.formatter, + "mdx", + ctx.bucketPathPattern, + ), createMdxCodePlaceholderLoader(), createLockedPatternsLoader(ctx.lockedPatterns), createMdxFrontmatterSplitLoader(), @@ -281,6 +310,7 @@ export const BUCKETS: Record = { ), }, po: { + displayName: "PO", supportsFormatter: false, supportsInjectLocale: false, supportsLockedKeys: true, @@ -302,6 +332,7 @@ export const BUCKETS: Record = { ), }, properties: { + displayName: "Properties", supportsFormatter: false, supportsInjectLocale: false, supportsLockedKeys: true, @@ -320,6 +351,7 @@ export const BUCKETS: Record = { ), }, "xcode-strings": { + displayName: "Xcode Strings", supportsFormatter: false, supportsInjectLocale: false, supportsLockedKeys: true, @@ -338,6 +370,7 @@ export const BUCKETS: Record = { ), }, "xcode-stringsdict": { + displayName: "Xcode Stringsdict", supportsFormatter: false, supportsInjectLocale: false, supportsLockedKeys: true, @@ -358,6 +391,7 @@ export const BUCKETS: Record = { ), }, "xcode-xcstrings": { + displayName: "Xcode XCStrings", supportsFormatter: false, supportsInjectLocale: false, supportsLockedKeys: true, @@ -381,6 +415,7 @@ export const BUCKETS: Record = { ), }, "xcode-xcstrings-v2": { + displayName: "Xcode XCStrings (v2)", supportsFormatter: false, supportsInjectLocale: false, supportsLockedKeys: true, @@ -405,6 +440,7 @@ export const BUCKETS: Record = { ), }, yaml: { + displayName: "YAML", supportsFormatter: true, supportsInjectLocale: false, supportsLockedKeys: true, @@ -414,7 +450,11 @@ export const BUCKETS: Record = { createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), - createFormatterLoader(ctx.options.formatter, "yaml", ctx.bucketPathPattern), + createFormatterLoader( + ctx.options.formatter, + "yaml", + ctx.bucketPathPattern, + ), createLockedPatternsLoader(ctx.lockedPatterns), createYamlLoader(), createFlatLoader(), @@ -426,6 +466,7 @@ export const BUCKETS: Record = { ), }, "yaml-root-key": { + displayName: "YAML Root Key", supportsFormatter: true, supportsInjectLocale: false, supportsLockedKeys: true, @@ -435,7 +476,11 @@ export const BUCKETS: Record = { createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), - createFormatterLoader(ctx.options.formatter, "yaml", ctx.bucketPathPattern), + createFormatterLoader( + ctx.options.formatter, + "yaml", + ctx.bucketPathPattern, + ), createLockedPatternsLoader(ctx.lockedPatterns), createYamlLoader(), createRootKeyLoader(true), @@ -448,6 +493,7 @@ export const BUCKETS: Record = { ), }, flutter: { + displayName: "Flutter ARB", supportsFormatter: true, supportsInjectLocale: false, supportsLockedKeys: true, @@ -457,7 +503,11 @@ export const BUCKETS: Record = { createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), - createFormatterLoader(ctx.options.formatter, "json", ctx.bucketPathPattern), + createFormatterLoader( + ctx.options.formatter, + "json", + ctx.bucketPathPattern, + ), createLockedPatternsLoader(ctx.lockedPatterns), createJsonLoader(), createEnsureKeyOrderLoader(), @@ -470,6 +520,7 @@ export const BUCKETS: Record = { ), }, xliff: { + displayName: "XLIFF", supportsFormatter: false, supportsInjectLocale: false, supportsLockedKeys: true, @@ -490,6 +541,7 @@ export const BUCKETS: Record = { ), }, xml: { + displayName: "XML", supportsFormatter: false, supportsInjectLocale: false, supportsLockedKeys: true, @@ -510,6 +562,7 @@ export const BUCKETS: Record = { ), }, srt: { + displayName: "SRT", supportsFormatter: false, supportsInjectLocale: false, supportsLockedKeys: true, @@ -528,6 +581,7 @@ export const BUCKETS: Record = { ), }, dato: { + displayName: "DatoCMS", supportsFormatter: false, supportsInjectLocale: false, supportsLockedKeys: true, @@ -546,6 +600,7 @@ export const BUCKETS: Record = { ), }, vtt: { + displayName: "WebVTT", supportsFormatter: false, supportsInjectLocale: false, supportsLockedKeys: true, @@ -564,6 +619,7 @@ export const BUCKETS: Record = { ), }, php: { + displayName: "PHP", supportsFormatter: false, supportsInjectLocale: false, supportsLockedKeys: true, @@ -584,6 +640,7 @@ export const BUCKETS: Record = { ), }, "vue-json": { + displayName: "Vue I18n", supportsFormatter: false, supportsInjectLocale: false, supportsLockedKeys: true, @@ -604,6 +661,7 @@ export const BUCKETS: Record = { ), }, typescript: { + displayName: "TypeScript", supportsFormatter: true, supportsInjectLocale: false, supportsLockedKeys: true, @@ -629,6 +687,7 @@ export const BUCKETS: Record = { ), }, txt: { + displayName: "Plain text", supportsFormatter: false, supportsInjectLocale: false, supportsLockedKeys: true, @@ -647,6 +706,7 @@ export const BUCKETS: Record = { ), }, "json-dictionary": { + displayName: "JSON Dictionary", supportsFormatter: true, supportsInjectLocale: true, supportsLockedKeys: true, @@ -656,7 +716,11 @@ export const BUCKETS: Record = { createLoader: (ctx) => composeLoaders( createTextFileLoader(ctx.bucketPathPattern), - createFormatterLoader(ctx.options.formatter, "json", ctx.bucketPathPattern), + createFormatterLoader( + ctx.options.formatter, + "json", + ctx.bucketPathPattern, + ), createLockedPatternsLoader(ctx.lockedPatterns), createJsonLoader(), createJsonKeysLoader(),