@streamplace/components 0.8.14 → 0.8.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/streamplace-store/stream.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAwHtE,wBAAgB,qBAAqB,KAKrB,6EAMX;IACD,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,qBAAqB,CAAC,oBAAoB,CAAC;CACnE,2CAuIF;AAED,wBAAgB,qBAAqB,CAAC,SAAS,GAAE,MAAM,GAAG,IAAW,IAMjE,OAAO,MAAM,EACb,YAAY,sBAAsB,GAAG,IAAI,EACzC,kBAAkB,IAAI,2CAqDzB"}
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/streamplace-store/stream.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAyHtE,wBAAgB,qBAAqB,KAKrB,6EAMX;IACD,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,qBAAqB,CAAC,oBAAoB,CAAC;CACnE,2CAuIF;AAED,wBAAgB,qBAAqB,CAAC,SAAS,GAAE,MAAM,GAAG,IAAW,IAMjE,OAAO,MAAM,EACb,YAAY,sBAAsB,GAAG,IAAI,EACzC,kBAAkB,IAAI,2CAqDzB"}
@@ -80,6 +80,7 @@ async function buildGoLivePost(text, url, profile, params, thumbnail, agent) {
80
80
  },
81
81
  facets: rt.facets,
82
82
  createdAt: now.toISOString(),
83
+ langs: ["en"],
83
84
  };
84
85
  record.embed = {
85
86
  $type: "app.bsky.embed.external",
@@ -1 +1 @@
1
- {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/streamplace-store/stream.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/streamplace-store/stream.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { defineConfig } from "i18next-cli";
2
+ // i18next-cli configuration
3
+ // We use i18next-fluent, so variant handling (platform, count, etc.)
4
+ // is done using Fluent's select expressions within messages.
5
+ // Example: shortcut-key-search = { $platform -> [mac] Cmd+K [windows] Ctrl+K *[other] Ctrl+K }
6
+
7
+ export default defineConfig({
8
+ locales: ["en-US", "es-ES", "fr-FR", "pt-BR", "zh-Hant"],
9
+ extract: {
10
+ input: [
11
+ "src/**/*.{js,jsx,ts,tsx}",
12
+ "../app/src/**/*.{js,jsx,ts,tsx}",
13
+ "../app/components/**/*.{js,jsx,ts,tsx}",
14
+ ],
15
+ contextSeparator: "|",
16
+ pluralSeparator: "/",
17
+ output: "public/locales/{{language}}/{{namespace}}.json",
18
+ primaryLanguage: "en-US",
19
+ defaultNS: "common",
20
+ },
21
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@streamplace/components",
3
- "version": "0.8.14",
3
+ "version": "0.8.17",
4
4
  "description": "Streamplace React (Native) Components",
5
5
  "main": "dist/index.js",
6
6
  "types": "src/index.tsx",
@@ -19,6 +19,7 @@
19
19
  "devDependencies": {
20
20
  "@fluent/syntax": "^0.19.0",
21
21
  "@types/sdp-transform": "^2.15.0",
22
+ "i18next-cli": "^1.32.0",
22
23
  "nodemon": "^3.1.10",
23
24
  "tsup": "^8.5.0"
24
25
  },
@@ -74,8 +75,8 @@
74
75
  "start": "tsc --watch --preserveWatchOutput",
75
76
  "prepare": "node scripts/compile-translations.js && tsc",
76
77
  "i18n:compile": "node scripts/compile-translations.js",
77
- "i18n:watch": "nodemon scripts/compile-translations.js --watch locales/**/*.ftl",
78
- "i18n:extract": "node scripts/extract-i18n.js"
78
+ "i18n:watch": "nodemon --watch 'locales/**/*.ftl' --exec 'node scripts/compile-translations.js'",
79
+ "i18n:extract": "i18next-cli extract && node scripts/migrate-i18n.js"
79
80
  },
80
- "gitHead": "e5835f817342ca5b587bc9bb3e541082bbeac4ea"
81
+ "gitHead": "80f92d685c83c1065486e447b05a365d0cfc4d01"
81
82
  }
@@ -1,18 +1,22 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * i18n key extraction script
5
- * 1. Scans the codebase for i18n keys (t('key'), Trans components, etc)
6
- * 2. Extracts keys into namespace JSON files (common.json, settings.json, etc)
7
- * 3. Migrates new keys to corresponding .ftl files for translation
4
+ * i18n migration script
5
+ * Migrates extracted JSON keys to .ftl files for translation
6
+ *
7
+ * This script expects that i18next-cli has already extracted keys to JSON files.
8
+ * It reads those JSON files, compares them to existing .ftl files, and adds any
9
+ * new keys to the .ftl files.
10
+ *
11
+ * For keys with i18next context/plural suffixes (e.g., key_male, key_female, key_one, key_other),
12
+ * it will convert them into Fluent select expressions.
8
13
  *
9
14
  * Usage:
10
- * node extract-i18n.js # Extract keys and report new ones
11
- * node extract-i18n.js --add-to=common # Add new keys to common.ftl
12
- * node extract-i18n.js --add-to=settings # Add new keys to settings.ftl
15
+ * node migrate-i18n.js # Report new keys
16
+ * node migrate-i18n.js --add-to=common # Add new keys to common.ftl
17
+ * node migrate-i18n.js --add-to=settings # Add new keys to settings.ftl
13
18
  */
14
19
 
15
- const { execSync } = require("child_process");
16
20
  const fs = require("fs");
17
21
  const path = require("path");
18
22
 
@@ -24,7 +28,6 @@ const addToNamespace = args
24
28
 
25
29
  // Paths
26
30
  const COMPONENTS_ROOT = path.join(__dirname, "..");
27
- const APP_ROOT = path.join(__dirname, "..", "..", "app");
28
31
  const MANIFEST_PATH = path.join(COMPONENTS_ROOT, "locales/manifest.json");
29
32
  const LOCALES_FTL_DIR = path.join(COMPONENTS_ROOT, "locales");
30
33
  const LOCALES_JSON_DIR = path.join(COMPONENTS_ROOT, "public/locales");
@@ -32,72 +35,141 @@ const LOCALES_JSON_DIR = path.join(COMPONENTS_ROOT, "public/locales");
32
35
  // Load manifest
33
36
  const manifest = JSON.parse(fs.readFileSync(MANIFEST_PATH, "utf8"));
34
37
 
35
- // Configuration for i18next-parser
36
- const parserConfig = {
37
- contextSeparator: "_",
38
- createOldCatalogs: false,
39
- defaultNamespace: "messages",
40
- defaultValue: "",
41
- indentation: 2,
42
- keepRemoved: true,
43
- keySeparator: false,
44
- namespaceSeparator: false,
45
-
46
- lexers: {
47
- js: ["JavascriptLexer"],
48
- ts: ["JavascriptLexer"],
49
- jsx: ["JsxLexer"],
50
- tsx: ["JsxLexer"],
51
- html: false,
52
- htm: false,
53
- handlebars: false,
54
- hbs: false,
55
- },
56
-
57
- locales: manifest.supportedLocales,
58
- output: path.join(LOCALES_JSON_DIR, "$LOCALE/$NAMESPACE.json"),
59
- input: [
60
- path.join(COMPONENTS_ROOT, "src/**/*.{js,jsx,ts,tsx}"),
61
- path.join(APP_ROOT, "src/**/*.{js,jsx,ts,tsx}"),
62
- path.join(APP_ROOT, "components/**/*.{js,jsx,ts,tsx}"),
63
- "!**/node_modules/**",
64
- "!**/dist/**",
65
- "!**/*.test.{js,jsx,ts,tsx}",
66
- "!**/*.spec.{js,jsx,ts,tsx}",
67
- ],
68
-
69
- verbose: true,
70
- sort: true,
71
- failOnWarnings: false,
72
- failOnUpdate: false,
73
- };
38
+ // Plural forms that i18next uses
39
+ const PLURAL_FORMS = ["zero", "one", "two", "few", "many", "other"];
40
+
41
+ // Separators used by i18next-cli (configured in i18next.config.js)
42
+ const CONTEXT_SEPARATOR = "|";
43
+ const PLURAL_SEPARATOR = "/";
74
44
 
75
45
  /**
76
- * Extract keys from codebase using i18next-parser
46
+ * Group keys by base name, detecting context and plural variants
47
+ * Returns { baseKey: { base: true, variants: { context: Set, plurals: Set } } }
77
48
  */
78
- function extractKeys() {
79
- const configPath = path.join(__dirname, ".i18next-parser.config.js");
80
- const configContent = `module.exports = ${JSON.stringify(parserConfig, null, 2)};`;
81
-
82
- try {
83
- fs.writeFileSync(configPath, configContent);
84
- console.log("🔍 Extracting i18n keys from codebase...");
49
+ function groupKeysByBase(keys) {
50
+ const groups = {};
51
+
52
+ for (const key of keys) {
53
+ if (!key.includes(CONTEXT_SEPARATOR) && !key.includes(PLURAL_SEPARATOR)) {
54
+ // Simple key with no variants
55
+ if (!groups[key]) {
56
+ groups[key] = {
57
+ base: true,
58
+ variants: { contexts: new Set(), plurals: new Set() },
59
+ };
60
+ }
61
+ groups[key].base = true;
62
+ } else {
63
+ // Key with variants
64
+ // Format: base|context/plural or base/plural or base|context
65
+ let baseKey = key;
66
+ const detectedContexts = new Set();
67
+ const detectedPlurals = new Set();
68
+
69
+ // Split by context separator first
70
+ if (key.includes(CONTEXT_SEPARATOR)) {
71
+ const contextParts = key.split(CONTEXT_SEPARATOR);
72
+ baseKey = contextParts[0];
73
+
74
+ // The remaining part might have plurals
75
+ const contextAndPlural = contextParts[1];
76
+
77
+ if (contextAndPlural.includes(PLURAL_SEPARATOR)) {
78
+ const pluralParts = contextAndPlural.split(PLURAL_SEPARATOR);
79
+ detectedContexts.add(pluralParts[0]);
80
+ pluralParts.slice(1).forEach((p) => {
81
+ if (PLURAL_FORMS.includes(p)) {
82
+ detectedPlurals.add(p);
83
+ }
84
+ });
85
+ } else {
86
+ detectedContexts.add(contextAndPlural);
87
+ }
88
+ } else if (key.includes(PLURAL_SEPARATOR)) {
89
+ // No context, just plural
90
+ const pluralParts = key.split(PLURAL_SEPARATOR);
91
+ baseKey = pluralParts[0];
92
+ pluralParts.slice(1).forEach((p) => {
93
+ if (PLURAL_FORMS.includes(p)) {
94
+ detectedPlurals.add(p);
95
+ }
96
+ });
97
+ }
85
98
 
86
- execSync(`npx i18next-parser --config ${configPath}`, {
87
- stdio: "inherit",
88
- cwd: __dirname,
89
- });
99
+ if (!groups[baseKey]) {
100
+ groups[baseKey] = {
101
+ base: false,
102
+ variants: { contexts: new Set(), plurals: new Set() },
103
+ };
104
+ }
90
105
 
91
- console.log("✅ Keys extracted successfully!");
92
- return true;
93
- } catch (error) {
94
- console.error("❌ Error extracting i18n keys:", error.message);
95
- return false;
96
- } finally {
97
- if (fs.existsSync(configPath)) {
98
- fs.unlinkSync(configPath);
106
+ detectedContexts.forEach((c) => groups[baseKey].variants.contexts.add(c));
107
+ detectedPlurals.forEach((p) => groups[baseKey].variants.plurals.add(p));
99
108
  }
100
109
  }
110
+
111
+ return groups;
112
+ }
113
+
114
+ /**
115
+ * Convert a group of keys into Fluent format
116
+ */
117
+ function convertToFluentFormat(baseKey, group) {
118
+ const hasContexts = group.variants.contexts.size > 0;
119
+ const hasPlurals = group.variants.plurals.size > 0;
120
+
121
+ if (!hasContexts && !hasPlurals) {
122
+ // Simple key
123
+ return `${baseKey} = ${baseKey}`;
124
+ }
125
+
126
+ // Build Fluent select expression
127
+ let selector = "";
128
+ let variants = [];
129
+
130
+ if (hasContexts && hasPlurals) {
131
+ // Both context and plural - outer selector is context, inner is plural
132
+ selector = "$context";
133
+ const contextsList = Array.from(group.variants.contexts).sort();
134
+ const pluralsList = Array.from(group.variants.plurals).sort();
135
+
136
+ contextsList.forEach((context, idx) => {
137
+ const isDefault = idx === contextsList.length - 1;
138
+ const prefix = isDefault ? "*" : " ";
139
+
140
+ // Build inner plural select
141
+ const pluralVariants = pluralsList
142
+ .map((p) => {
143
+ const pluralPrefix = p === "other" ? "*" : "";
144
+ return `${pluralPrefix}[${p}] ${baseKey}`;
145
+ })
146
+ .join(" ");
147
+
148
+ variants.push(
149
+ `\n ${prefix}[${context}] { $count -> ${pluralVariants} }`,
150
+ );
151
+ });
152
+ } else if (hasContexts) {
153
+ // Only context
154
+ selector = "$context";
155
+ const contextsList = Array.from(group.variants.contexts).sort();
156
+ contextsList.forEach((context, idx) => {
157
+ const isDefault = idx === contextsList.length - 1;
158
+ const prefix = isDefault ? "*" : " ";
159
+ variants.push(`\n ${prefix}[${context}] ${baseKey}`);
160
+ });
161
+ } else if (hasPlurals) {
162
+ // Only plural
163
+ selector = "$count";
164
+ const pluralsList = Array.from(group.variants.plurals).sort();
165
+ pluralsList.forEach((plural) => {
166
+ const isDefault = plural === "other";
167
+ const prefix = isDefault ? "*" : " ";
168
+ variants.push(`\n ${prefix}[${plural}] ${baseKey}`);
169
+ });
170
+ }
171
+
172
+ return `# TODO: Convert to proper Fluent select expression\n${baseKey} = { ${selector} ->${variants.join("")}\n}`;
101
173
  }
102
174
 
103
175
  /**
@@ -151,7 +223,7 @@ function getNamespaces(localeJsonDir) {
151
223
  }
152
224
 
153
225
  /**
154
- * Add new keys to a .ftl file
226
+ * Add new keys to a .ftl file, converting context/plural keys to Fluent format
155
227
  */
156
228
  function addKeysToFtlFile(localeDir, namespace, newKeys, locale) {
157
229
  const targetFile = path.join(localeDir, `${namespace}.ftl`);
@@ -169,6 +241,15 @@ function addKeysToFtlFile(localeDir, namespace, newKeys, locale) {
169
241
  fs.writeFileSync(targetFile, header);
170
242
  }
171
243
 
244
+ // Group keys by base to detect context/plural variants
245
+ const keyGroups = groupKeysByBase(newKeys);
246
+
247
+ // Build content
248
+ const fluentEntries = [];
249
+ for (const [baseKey, group] of Object.entries(keyGroups)) {
250
+ fluentEntries.push(convertToFluentFormat(baseKey, group));
251
+ }
252
+
172
253
  // Append new keys
173
254
  let content = fs.readFileSync(targetFile, "utf8");
174
255
 
@@ -177,7 +258,7 @@ function addKeysToFtlFile(localeDir, namespace, newKeys, locale) {
177
258
  }
178
259
 
179
260
  content += "\n# Newly extracted keys\n";
180
- content += newKeys.map((key) => `${key} = ${key}`).join("\n") + "\n";
261
+ content += fluentEntries.join("\n\n") + "\n";
181
262
 
182
263
  fs.writeFileSync(targetFile, content);
183
264
 
@@ -188,7 +269,7 @@ function addKeysToFtlFile(localeDir, namespace, newKeys, locale) {
188
269
  * Migrate extracted JSON keys to .ftl files
189
270
  */
190
271
  function migrateKeysToFtl() {
191
- console.log("\n🔄 Analyzing extracted keys...");
272
+ console.log("🔄 Analyzing extracted keys...");
192
273
 
193
274
  const newKeysByLocaleAndNamespace = {}; // locale -> namespace -> [keys]
194
275
 
@@ -297,7 +378,9 @@ function migrateKeysToFtl() {
297
378
 
298
379
  console.log("\n💡 Next steps:");
299
380
  console.log(" 1. Review the new keys in your .ftl files");
300
- console.log(" 2. Replace placeholder values with actual translations");
381
+ console.log(
382
+ " 2. Convert TODO placeholders to proper Fluent translations",
383
+ );
301
384
  console.log(" 3. Run `pnpm i18n:compile` to update compiled JSON files");
302
385
  } else {
303
386
  // Just report
@@ -318,19 +401,13 @@ function migrateKeysToFtl() {
318
401
  );
319
402
  console.log("\nTo add these keys to a specific namespace file, run:");
320
403
  Array.from(namespaceSet).forEach((ns) => {
321
- console.log(` node extract-i18n.js --add-to=${ns}`);
404
+ console.log(` node migrate-i18n.js --add-to=${ns}`);
322
405
  });
323
406
  }
324
407
  }
325
408
 
326
409
  function main() {
327
- const success = extractKeys();
328
-
329
- if (success) {
330
- migrateKeysToFtl();
331
- } else {
332
- process.exit(1);
333
- }
410
+ migrateKeysToFtl();
334
411
  }
335
412
 
336
413
  main();
@@ -108,6 +108,7 @@ async function buildGoLivePost(
108
108
  },
109
109
  facets: rt.facets,
110
110
  createdAt: now.toISOString(),
111
+ langs: ["en"],
111
112
  };
112
113
  record.embed = {
113
114
  $type: "app.bsky.embed.external",