@el-j/google-sheet-translations 1.3.1 → 1.3.3
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.
- package/dist/utils/dataConverter/findLocalChanges.d.ts +9 -1
- package/dist/utils/dataConverter/findLocalChanges.d.ts.map +1 -1
- package/dist/utils/dataConverter/findLocalChanges.js +35 -4
- package/dist/utils/dataConverter/findLocalChanges.js.map +1 -1
- package/dist/utils/localeNormalizer.d.ts +22 -2
- package/dist/utils/localeNormalizer.d.ts.map +1 -1
- package/dist/utils/localeNormalizer.js +33 -2
- package/dist/utils/localeNormalizer.js.map +1 -1
- package/dist/utils/spreadsheetUpdater.d.ts +6 -1
- package/dist/utils/spreadsheetUpdater.d.ts.map +1 -1
- package/dist/utils/spreadsheetUpdater.js +48 -15
- package/dist/utils/spreadsheetUpdater.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import type { TranslationData } from "../../types";
|
|
2
2
|
/**
|
|
3
|
-
* Compares local languageData.json with spreadsheet data to find new keys
|
|
3
|
+
* Compares local languageData.json with spreadsheet data to find new keys.
|
|
4
|
+
*
|
|
5
|
+
* A key is considered "new" when:
|
|
6
|
+
* - No matching locale exists in `spreadsheetData` for that locale, OR
|
|
7
|
+
* - The sheet or key is absent for the resolved locale.
|
|
8
|
+
*
|
|
9
|
+
* Locale matching is fuzzy: `'en'` and `'en-GB'` will both match against
|
|
10
|
+
* an `'en-us'` entry in `spreadsheetData` (language-family resolution).
|
|
11
|
+
*
|
|
4
12
|
* @param localData - Data from local languageData.json file
|
|
5
13
|
* @param spreadsheetData - Data fetched from the spreadsheet
|
|
6
14
|
* @returns Object with new keys that are in localData but not in spreadsheetData
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findLocalChanges.d.ts","sourceRoot":"","sources":["../../../src/utils/dataConverter/findLocalChanges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"findLocalChanges.d.ts","sourceRoot":"","sources":["../../../src/utils/dataConverter/findLocalChanges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA2BnD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC/B,SAAS,EAAE,eAAe,EAC1B,eAAe,EAAE,eAAe,GAC9B,eAAe,CAgCjB"}
|
|
@@ -1,8 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.findLocalChanges = findLocalChanges;
|
|
4
|
+
const localeNormalizer_1 = require("../localeNormalizer");
|
|
4
5
|
/**
|
|
5
|
-
*
|
|
6
|
+
* Resolves a locale key from `localData` to the corresponding key actually
|
|
7
|
+
* present in `spreadsheetData`, using a three-step strategy:
|
|
8
|
+
*
|
|
9
|
+
* 1. Exact match – `'en-us'` → `'en-us'`
|
|
10
|
+
* 2. Lowercase match – `'en-US'` → `'en-us'`
|
|
11
|
+
* 3. Language-family prefix – `'en'` or `'en-GB'` → `'en-us'`
|
|
12
|
+
* (when `'en-us'` is the only English variant in the spreadsheet data)
|
|
13
|
+
*
|
|
14
|
+
* Returns `undefined` when no matching locale exists in `spreadsheetData`.
|
|
15
|
+
*/
|
|
16
|
+
function resolveLocaleAlias(locale, spreadsheetData) {
|
|
17
|
+
if (spreadsheetData[locale])
|
|
18
|
+
return locale;
|
|
19
|
+
const lower = locale.toLowerCase();
|
|
20
|
+
if (spreadsheetData[lower])
|
|
21
|
+
return lower;
|
|
22
|
+
const langCode = (0, localeNormalizer_1.getLanguagePrefix)(lower);
|
|
23
|
+
return Object.keys(spreadsheetData).find((k) => (0, localeNormalizer_1.getLanguagePrefix)(k) === langCode);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Compares local languageData.json with spreadsheet data to find new keys.
|
|
27
|
+
*
|
|
28
|
+
* A key is considered "new" when:
|
|
29
|
+
* - No matching locale exists in `spreadsheetData` for that locale, OR
|
|
30
|
+
* - The sheet or key is absent for the resolved locale.
|
|
31
|
+
*
|
|
32
|
+
* Locale matching is fuzzy: `'en'` and `'en-GB'` will both match against
|
|
33
|
+
* an `'en-us'` entry in `spreadsheetData` (language-family resolution).
|
|
34
|
+
*
|
|
6
35
|
* @param localData - Data from local languageData.json file
|
|
7
36
|
* @param spreadsheetData - Data fetched from the spreadsheet
|
|
8
37
|
* @returns Object with new keys that are in localData but not in spreadsheetData
|
|
@@ -13,6 +42,8 @@ function findLocalChanges(localData, spreadsheetData) {
|
|
|
13
42
|
for (const locale of Object.keys(localData)) {
|
|
14
43
|
if (!localData[locale])
|
|
15
44
|
continue;
|
|
45
|
+
// Resolve the locale to the matching key in spreadsheetData (fuzzy match)
|
|
46
|
+
const resolvedLocale = resolveLocaleAlias(locale, spreadsheetData);
|
|
16
47
|
// Check each sheet in local data
|
|
17
48
|
for (const sheet of Object.keys(localData[locale])) {
|
|
18
49
|
if (!localData[locale][sheet])
|
|
@@ -20,9 +51,9 @@ function findLocalChanges(localData, spreadsheetData) {
|
|
|
20
51
|
// Check each key in local data
|
|
21
52
|
for (const key of Object.keys(localData[locale][sheet])) {
|
|
22
53
|
// If the spreadsheet doesn't have this locale, sheet, or key, it's a new key
|
|
23
|
-
const isNewKey = !
|
|
24
|
-
!spreadsheetData[
|
|
25
|
-
!spreadsheetData[
|
|
54
|
+
const isNewKey = !resolvedLocale ||
|
|
55
|
+
!spreadsheetData[resolvedLocale]?.[sheet] ||
|
|
56
|
+
!spreadsheetData[resolvedLocale][sheet][key];
|
|
26
57
|
// If it's a new key, add it to changes
|
|
27
58
|
if (isNewKey) {
|
|
28
59
|
if (!changes[locale])
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findLocalChanges.js","sourceRoot":"","sources":["../../../src/utils/dataConverter/findLocalChanges.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"findLocalChanges.js","sourceRoot":"","sources":["../../../src/utils/dataConverter/findLocalChanges.ts"],"names":[],"mappings":";;AAyCA,4CAmCC;AA3ED,0DAAwD;AAExD;;;;;;;;;;GAUG;AACH,SAAS,kBAAkB,CAC1B,MAAc,EACd,eAAgC;IAEhC,IAAI,eAAe,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,IAAI,eAAe,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAA,oCAAiB,EAAC,KAAK,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,oCAAiB,EAAC,CAAC,CAAC,KAAK,QAAQ,CACxC,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAgB,gBAAgB,CAC/B,SAA0B,EAC1B,eAAgC;IAEhC,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,kCAAkC;IAClC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAAE,SAAS;QAEjC,0EAA0E;QAC1E,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QAEnE,iCAAiC;QACjC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC;gBAAE,SAAS;YAExC,+BAA+B;YAC/B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBACzD,6EAA6E;gBAC7E,MAAM,QAAQ,GAAG,CAAC,cAAc;oBAC/B,CAAC,eAAe,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,CAAC;oBACzC,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;gBAE9C,uCAAuC;gBACvC,IAAI,QAAQ,EAAE,CAAC;oBACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;wBAAE,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;oBAC3C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC;wBAAE,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;oBACzD,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC7D,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,OAAO,CAAC;AAChB,CAAC"}
|
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
* Locale normalization utilities for converting simple language codes to full locale codes
|
|
3
3
|
* and maintaining mappings between normalized codes and original spreadsheet headers
|
|
4
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* Returns the language prefix of a locale code (the part before the first
|
|
7
|
+
* `-` or `_` separator), lowercased.
|
|
8
|
+
*
|
|
9
|
+
* Examples:
|
|
10
|
+
* - `'en-US'` → `'en'`
|
|
11
|
+
* - `'zh_CN'` → `'zh'`
|
|
12
|
+
* - `'de'` → `'de'`
|
|
13
|
+
*
|
|
14
|
+
* Used for language-family matching when an exact locale code is not found.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getLanguagePrefix(locale: string): string;
|
|
5
17
|
/**
|
|
6
18
|
* Normalizes a language code to include country code if missing
|
|
7
19
|
* @param locale The original locale code from spreadsheet header
|
|
@@ -20,8 +32,16 @@ export declare function createLocaleMapping(originalHeaders: string[], keyColumn
|
|
|
20
32
|
originalMapping: Record<string, string>;
|
|
21
33
|
};
|
|
22
34
|
/**
|
|
23
|
-
* Finds the original header name for a given normalized locale
|
|
24
|
-
*
|
|
35
|
+
* Finds the original header name for a given normalized locale.
|
|
36
|
+
*
|
|
37
|
+
* Lookup order (most-specific → most-lenient):
|
|
38
|
+
* 1. Direct key match (`'en-us'` → `'en-US'`)
|
|
39
|
+
* 2. Lowercase key match (`'EN-US'` → key `'en-us'`)
|
|
40
|
+
* 3. Case-insensitive key comparison
|
|
41
|
+
* 4. Language-family prefix match – e.g. `'en'` or `'en-GB'` finds `'en-US'`
|
|
42
|
+
* when `'en-US'` is the only English variant present in the mapping.
|
|
43
|
+
*
|
|
44
|
+
* @param normalizedLocale The normalized locale code (e.g., `'en-GB'`, `'en'`)
|
|
25
45
|
* @param localeMapping Mapping from normalized locales to original headers
|
|
26
46
|
* @returns Original header name or undefined if not found
|
|
27
47
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localeNormalizer.d.ts","sourceRoot":"","sources":["../../src/utils/localeNormalizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"localeNormalizer.d.ts","sourceRoot":"","sources":["../../src/utils/localeNormalizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAExD;AA4CD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA0B1D;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAClC,eAAe,EAAE,MAAM,EAAE,EACzB,SAAS,EAAE,MAAM,GACf;IACF,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC,CA+BA;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACzC,gBAAgB,EAAE,MAAM,EACxB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,MAAM,GAAG,SAAS,CA2BpB;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC3C,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACrC,MAAM,GAAG,SAAS,CAEpB"}
|
|
@@ -4,10 +4,25 @@
|
|
|
4
4
|
* and maintaining mappings between normalized codes and original spreadsheet headers
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.getLanguagePrefix = getLanguagePrefix;
|
|
7
8
|
exports.normalizeLocaleCode = normalizeLocaleCode;
|
|
8
9
|
exports.createLocaleMapping = createLocaleMapping;
|
|
9
10
|
exports.getOriginalHeaderForLocale = getOriginalHeaderForLocale;
|
|
10
11
|
exports.getNormalizedLocaleForHeader = getNormalizedLocaleForHeader;
|
|
12
|
+
/**
|
|
13
|
+
* Returns the language prefix of a locale code (the part before the first
|
|
14
|
+
* `-` or `_` separator), lowercased.
|
|
15
|
+
*
|
|
16
|
+
* Examples:
|
|
17
|
+
* - `'en-US'` → `'en'`
|
|
18
|
+
* - `'zh_CN'` → `'zh'`
|
|
19
|
+
* - `'de'` → `'de'`
|
|
20
|
+
*
|
|
21
|
+
* Used for language-family matching when an exact locale code is not found.
|
|
22
|
+
*/
|
|
23
|
+
function getLanguagePrefix(locale) {
|
|
24
|
+
return locale.toLowerCase().split(/[-_]/)[0];
|
|
25
|
+
}
|
|
11
26
|
/**
|
|
12
27
|
* Common language to country mappings for normalization
|
|
13
28
|
* Maps language codes to their most common country variants
|
|
@@ -109,8 +124,16 @@ function createLocaleMapping(originalHeaders, keyColumn) {
|
|
|
109
124
|
};
|
|
110
125
|
}
|
|
111
126
|
/**
|
|
112
|
-
* Finds the original header name for a given normalized locale
|
|
113
|
-
*
|
|
127
|
+
* Finds the original header name for a given normalized locale.
|
|
128
|
+
*
|
|
129
|
+
* Lookup order (most-specific → most-lenient):
|
|
130
|
+
* 1. Direct key match (`'en-us'` → `'en-US'`)
|
|
131
|
+
* 2. Lowercase key match (`'EN-US'` → key `'en-us'`)
|
|
132
|
+
* 3. Case-insensitive key comparison
|
|
133
|
+
* 4. Language-family prefix match – e.g. `'en'` or `'en-GB'` finds `'en-US'`
|
|
134
|
+
* when `'en-US'` is the only English variant present in the mapping.
|
|
135
|
+
*
|
|
136
|
+
* @param normalizedLocale The normalized locale code (e.g., `'en-GB'`, `'en'`)
|
|
114
137
|
* @param localeMapping Mapping from normalized locales to original headers
|
|
115
138
|
* @returns Original header name or undefined if not found
|
|
116
139
|
*/
|
|
@@ -130,6 +153,14 @@ function getOriginalHeaderForLocale(normalizedLocale, localeMapping) {
|
|
|
130
153
|
return value;
|
|
131
154
|
}
|
|
132
155
|
}
|
|
156
|
+
// Language-family fallback: 'en' or 'en-GB' should find 'en-US' when that
|
|
157
|
+
// is the only English variant present in the localeMapping.
|
|
158
|
+
const inputLangCode = getLanguagePrefix(normalizedLocale);
|
|
159
|
+
for (const [key, value] of Object.entries(localeMapping)) {
|
|
160
|
+
if (getLanguagePrefix(key) === inputLangCode) {
|
|
161
|
+
return value;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
133
164
|
return undefined;
|
|
134
165
|
}
|
|
135
166
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localeNormalizer.js","sourceRoot":"","sources":["../../src/utils/localeNormalizer.ts"],"names":[],"mappings":";AAAA;;;GAGG;;
|
|
1
|
+
{"version":3,"file":"localeNormalizer.js","sourceRoot":"","sources":["../../src/utils/localeNormalizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { GoogleSpreadsheet } from "google-spreadsheet";
|
|
2
2
|
import type { TranslationData } from "../types";
|
|
3
3
|
/**
|
|
4
|
-
* Updates the Google Spreadsheet with new keys from local data
|
|
4
|
+
* Updates the Google Spreadsheet with new keys from local data.
|
|
5
5
|
*
|
|
6
6
|
* When autoTranslate is enabled:
|
|
7
7
|
* - For each new key added to the spreadsheet, the system checks which languages have translations
|
|
@@ -9,6 +9,11 @@ import type { TranslationData } from "../types";
|
|
|
9
9
|
* - The formula format is: =GOOGLETRANSLATE(INDIRECT(sourceColumn&ROW());$sourceColumn$1;targetColumn$1)
|
|
10
10
|
* - This dynamic formula uses cell references for language codes and automatically adapts to the correct row
|
|
11
11
|
*
|
|
12
|
+
* If a sheet named `sheetTitle` does not yet exist in the document and `localeMapping` is
|
|
13
|
+
* non-empty, the sheet is **created automatically** with "key" as the first column followed by
|
|
14
|
+
* the original locale-header names from `localeMapping`. This ensures that new feature sheets
|
|
15
|
+
* (e.g. "ui") are bootstrapped on the first sync without requiring manual spreadsheet setup.
|
|
16
|
+
*
|
|
12
17
|
* Example:
|
|
13
18
|
* If a new key "welcome" has an English translation in column B but no German translation in column C,
|
|
14
19
|
* and autoTranslate is enabled, the system will add:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spreadsheetUpdater.d.ts","sourceRoot":"","sources":["../../src/utils/spreadsheetUpdater.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"spreadsheetUpdater.d.ts","sourceRoot":"","sources":["../../src/utils/spreadsheetUpdater.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAA8B,MAAM,oBAAoB,CAAC;AACxF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAehD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,iCAAiC,CACnD,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,eAAe,EACxB,WAAW,EAAE,MAAM,EACnB,aAAa,UAAQ,EACrB,aAAa,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAC3C,OAAO,CAAC,IAAI,CAAC,CAqPf"}
|
|
@@ -14,7 +14,7 @@ function columnIndexToLetter(index) {
|
|
|
14
14
|
return result;
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
|
-
* Updates the Google Spreadsheet with new keys from local data
|
|
17
|
+
* Updates the Google Spreadsheet with new keys from local data.
|
|
18
18
|
*
|
|
19
19
|
* When autoTranslate is enabled:
|
|
20
20
|
* - For each new key added to the spreadsheet, the system checks which languages have translations
|
|
@@ -22,6 +22,11 @@ function columnIndexToLetter(index) {
|
|
|
22
22
|
* - The formula format is: =GOOGLETRANSLATE(INDIRECT(sourceColumn&ROW());$sourceColumn$1;targetColumn$1)
|
|
23
23
|
* - This dynamic formula uses cell references for language codes and automatically adapts to the correct row
|
|
24
24
|
*
|
|
25
|
+
* If a sheet named `sheetTitle` does not yet exist in the document and `localeMapping` is
|
|
26
|
+
* non-empty, the sheet is **created automatically** with "key" as the first column followed by
|
|
27
|
+
* the original locale-header names from `localeMapping`. This ensures that new feature sheets
|
|
28
|
+
* (e.g. "ui") are bootstrapped on the first sync without requiring manual spreadsheet setup.
|
|
29
|
+
*
|
|
25
30
|
* Example:
|
|
26
31
|
* If a new key "welcome" has an English translation in column B but no German translation in column C,
|
|
27
32
|
* and autoTranslate is enabled, the system will add:
|
|
@@ -40,24 +45,48 @@ async function updateSpreadsheetWithLocalChanges(doc, changes, waitSeconds, auto
|
|
|
40
45
|
// Process each sheet in the changes object
|
|
41
46
|
for (const sheetTitle of new Set(Object.values(changes).flatMap(locale => Object.keys(locale)))) {
|
|
42
47
|
console.log(`Processing sheet: ${sheetTitle}`);
|
|
43
|
-
|
|
48
|
+
// Allow re-assignment: sheet may be auto-created below
|
|
49
|
+
let sheet = doc.sheetsByTitle[sheetTitle];
|
|
50
|
+
if (!sheet) {
|
|
51
|
+
const localeHeaders = Object.values(localeMapping);
|
|
52
|
+
if (localeHeaders.length === 0) {
|
|
53
|
+
console.warn(`Sheet "${sheetTitle}" not found in the document, cannot update`);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
console.log(`Sheet "${sheetTitle}" not found — creating it with ${localeHeaders.length} locale column(s).`);
|
|
57
|
+
sheet = await (0, rateLimiter_1.withRetry)(() => doc.addSheet({ title: sheetTitle, headerValues: ['key', ...localeHeaders] }), `addSheet: ${sheetTitle}`, baseDelayMs);
|
|
58
|
+
}
|
|
59
|
+
// Safety guard — should never be reached, but satisfies TypeScript
|
|
44
60
|
if (!sheet) {
|
|
45
|
-
console.warn(`Sheet "${sheetTitle}" not found
|
|
61
|
+
console.warn(`Sheet "${sheetTitle}" could not be found or created, skipping.`);
|
|
46
62
|
continue;
|
|
47
63
|
}
|
|
48
64
|
// Get all rows from the sheet (retries automatically on rate-limit)
|
|
49
65
|
const rows = await (0, rateLimiter_1.withRetry)(() => sheet.getRows(), `getRows: ${sheetTitle}`, baseDelayMs);
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
66
|
+
// Determine column headers.
|
|
67
|
+
// Normal path: derive from the first data row (most reliable).
|
|
68
|
+
// Empty-sheet path: the sheet was just auto-created (or had all rows deleted);
|
|
69
|
+
// reconstruct from localeMapping so we can still add new keys correctly.
|
|
70
|
+
let headerRow;
|
|
71
|
+
let originalHeaders;
|
|
72
|
+
if (rows.length > 0) {
|
|
73
|
+
originalHeaders = Object.keys(rows[0].toObject());
|
|
74
|
+
headerRow = originalHeaders.map(h => h.toLowerCase());
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
const localeHeaders = Object.values(localeMapping);
|
|
78
|
+
if (localeHeaders.length === 0) {
|
|
79
|
+
console.warn(`No rows found in sheet "${sheetTitle}", cannot update`);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
// Reconstruct headers from the locale mapping (original case preserved)
|
|
83
|
+
originalHeaders = ['key', ...localeHeaders];
|
|
84
|
+
headerRow = originalHeaders.map(h => h.toLowerCase());
|
|
53
85
|
}
|
|
54
|
-
//
|
|
55
|
-
const rowObject = rows[0].toObject();
|
|
56
|
-
const headerRow = Object.keys(rowObject).map(key => key.toLowerCase());
|
|
57
|
-
const keyColumn = headerRow[0]; // First column is the key
|
|
86
|
+
const keyColumn = headerRow[0]; // First column is always the key column
|
|
58
87
|
// Get all locales from the headerRow except the key column
|
|
59
88
|
const locales = headerRow.filter(key => key !== keyColumn);
|
|
60
|
-
// Map of existing keys to their row indices
|
|
89
|
+
// Map of existing keys to their row indices (empty when rows.length === 0)
|
|
61
90
|
const existingKeys = new Map();
|
|
62
91
|
rows.forEach((row, index) => {
|
|
63
92
|
const rowData = row.toObject();
|
|
@@ -86,9 +115,11 @@ async function updateSpreadsheetWithLocalChanges(doc, changes, waitSeconds, auto
|
|
|
86
115
|
}
|
|
87
116
|
// Find the exact header for this locale using the mapping
|
|
88
117
|
let localeHeader = (0, localeNormalizer_1.getOriginalHeaderForLocale)(locale, localeMapping);
|
|
89
|
-
// Fallback
|
|
118
|
+
// Fallback: language-family prefix match against original-case sheet headers
|
|
119
|
+
// e.g. locale 'en' finds column header 'en-US' (not the lowercase 'en-us')
|
|
90
120
|
if (!localeHeader) {
|
|
91
|
-
|
|
121
|
+
const localeLang = (0, localeNormalizer_1.getLanguagePrefix)(locale);
|
|
122
|
+
localeHeader = originalHeaders.find(h => (0, localeNormalizer_1.getLanguagePrefix)(h) === localeLang);
|
|
92
123
|
}
|
|
93
124
|
if (localeHeader) {
|
|
94
125
|
const theKey = newKeys.get(keyLower);
|
|
@@ -112,9 +143,11 @@ async function updateSpreadsheetWithLocalChanges(doc, changes, waitSeconds, auto
|
|
|
112
143
|
const row = rows[rowIndex];
|
|
113
144
|
// Find the exact header for this locale using the mapping
|
|
114
145
|
let localeHeader = (0, localeNormalizer_1.getOriginalHeaderForLocale)(locale, localeMapping);
|
|
115
|
-
// Fallback
|
|
146
|
+
// Fallback: language-family prefix match against the row's own keys
|
|
147
|
+
// e.g. locale 'en' finds column header 'en-US' on the existing row
|
|
116
148
|
if (!localeHeader) {
|
|
117
|
-
|
|
149
|
+
const localeLang = (0, localeNormalizer_1.getLanguagePrefix)(locale);
|
|
150
|
+
localeHeader = Object.keys(row.toObject()).find(h => (0, localeNormalizer_1.getLanguagePrefix)(h) === localeLang);
|
|
118
151
|
}
|
|
119
152
|
if (localeHeader) {
|
|
120
153
|
// Use set() method instead of direct property assignment to avoid TS errors
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spreadsheetUpdater.js","sourceRoot":"","sources":["../../src/utils/spreadsheetUpdater.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"spreadsheetUpdater.js","sourceRoot":"","sources":["../../src/utils/spreadsheetUpdater.ts"],"names":[],"mappings":"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"}
|