Skip to content

Commit c346829

Browse files
k-yletyrasd
andauthored
fix terms/aliases not being expanded for en.json (#280)
Co-authored-by: Martin Raifer <martin@raifer.tech>
1 parent bddd700 commit c346829

File tree

2 files changed

+69
-62
lines changed

2 files changed

+69
-62
lines changed

lib/build.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import marky from 'marky';
99
import { createRequire } from 'module';
1010
import { compile, toSafeIdentifier } from 'json-schema-to-typescript-lite';
1111

12-
import fetchTranslations, { sortObject } from './translations.js';
12+
import fetchTranslations, { expandTStrings, sortObject } from './translations.js';
1313

1414
const require = createRequire(import.meta.url);
1515

@@ -177,6 +177,7 @@ function processData(options, type) {
177177
if (deprecated) fs.writeFileSync(distDir + '/deprecated.json', JSON.stringify(deprecated, null, 4));
178178
if (discarded) fs.writeFileSync(distDir + '/discarded.json', JSON.stringify(discarded, null, 4));
179179

180+
expandTStrings(tstrings);
180181
let translationsForJson = {};
181182
translationsForJson[sourceLocale] = { presets: tstrings };
182183

lib/translations.js

Lines changed: 67 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,72 @@ import fetch from 'node-fetch';
44
import YAML from 'js-yaml';
55
import { transifexApi } from '@transifex/api';
66

7+
export function expandTStrings(tstrings) {
8+
const presets = tstrings.presets || {};
9+
for (const key of Object.keys(presets)) {
10+
let preset = presets[key];
11+
12+
if (preset.name) {
13+
let names = preset.name.split('\n').map(s => s.trim()).filter(Boolean);
14+
preset.name = names[0];
15+
if (names.length > 1) {
16+
preset.aliases = names.slice(1);
17+
}
18+
}
19+
if (typeof preset.aliases === 'string') {
20+
preset.aliases = preset.aliases.split('\n');
21+
}
22+
23+
if (!preset.terms) continue;
24+
25+
// remove duplicates
26+
preset.terms = Array.from(new Set(
27+
// remove translation message if it was included somehow
28+
preset.terms.replace(/<.*>/, '')
29+
// convert to an array
30+
.split(',')
31+
// make everything lowercase and remove whitespace
32+
.map(s => s.toLowerCase().trim())
33+
// remove empty strings
34+
.filter(Boolean)
35+
));
36+
37+
if (!preset.terms.length) {
38+
// no need to include empty terms
39+
delete preset.terms;
40+
if (!Object.keys(preset).length) {
41+
delete presets[key];
42+
}
43+
}
44+
}
45+
46+
const fields = tstrings.fields || {};
47+
for (const key of Object.keys(fields)) {
48+
let field = fields[key];
49+
if (!field.terms) continue;
50+
51+
// remove duplicates
52+
field.terms = Array.from(new Set(
53+
// remove translation message if it was included somehow
54+
field.terms.replace(/\[.*\]/, '')
55+
// convert to an array
56+
.split(/[,،]/)
57+
// make everything lowercase and remove whitespace
58+
.map(s => s.toLowerCase().trim())
59+
// remove empty strings
60+
.filter(Boolean)
61+
));
62+
63+
if (!field.terms.length) {
64+
// no need to include empty terms
65+
delete field.terms;
66+
if (!Object.keys(field).length) {
67+
delete fields[key];
68+
}
69+
}
70+
}
71+
}
72+
773
/**
874
* Sorts the keys of an object alphabetically
975
* @template {object} T @param {T} original @returns {T}
@@ -124,67 +190,7 @@ function fetchTranslations(options) {
124190

125191
let locale = {};
126192
results.forEach((result, i) => {
127-
let presets = (result.presets && result.presets.presets) || {};
128-
for (const key of Object.keys(presets)) {
129-
let preset = presets[key];
130-
131-
if (preset.name) {
132-
let names = preset.name.split('\n').map(s => s.trim()).filter(Boolean);
133-
preset.name = names[0];
134-
if (names.length > 1) {
135-
preset.aliases = names.slice(1);
136-
}
137-
}
138-
139-
if (!preset.terms) continue;
140-
141-
// remove duplicates
142-
preset.terms = Array.from(new Set(
143-
// remove translation message if it was included somehow
144-
preset.terms.replace(/<.*>/, '')
145-
// convert to an array
146-
.split(',')
147-
// make everything lowercase and remove whitespace
148-
.map(s => s.toLowerCase().trim())
149-
// remove empty strings
150-
.filter(Boolean)
151-
));
152-
153-
if (!preset.terms.length) {
154-
// no need to include empty terms
155-
delete preset.terms;
156-
if (!Object.keys(preset).length) {
157-
delete presets[key];
158-
}
159-
}
160-
}
161-
162-
let fields = (result.presets && result.presets.fields) || {};
163-
for (const key of Object.keys(fields)) {
164-
let field = fields[key];
165-
if (!field.terms) continue;
166-
167-
// remove duplicates
168-
field.terms = Array.from(new Set(
169-
// remove translation message if it was included somehow
170-
field.terms.replace(/\[.*\]/, '')
171-
// convert to an array
172-
.split(/[,،]/)
173-
// make everything lowercase and remove whitespace
174-
.map(s => s.toLowerCase().trim())
175-
// remove empty strings
176-
.filter(Boolean)
177-
));
178-
179-
if (!field.terms.length) {
180-
// no need to include empty terms
181-
delete field.terms;
182-
if (!Object.keys(field).length) {
183-
delete fields[key];
184-
}
185-
}
186-
}
187-
193+
expandTStrings(result.presets || {});
188194
locale[codes[i]] = result;
189195
});
190196

0 commit comments

Comments
 (0)