1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const tslib_1 = require("tslib");
|
4 | const path_1 = require("path");
|
5 | const stream_1 = require("stream");
|
6 | const bison_i18n_1 = require("@fitbit/bison-i18n");
|
7 | const humanize_list_1 = tslib_1.__importDefault(require("humanize-list"));
|
8 | const plugin_error_1 = tslib_1.__importDefault(require("plugin-error"));
|
9 | const languageTag_1 = require("./languageTag");
|
10 | const ProjectConfiguration_1 = require("./ProjectConfiguration");
|
11 | const PLUGIN_NAME = 'compileTranslations';
|
12 | function compileTranslations(defaultLanguage) {
|
13 | const translations = new bison_i18n_1.TranslationLoader();
|
14 | const translationFiles = new Map();
|
15 | const transform = new stream_1.Transform({
|
16 | objectMode: true,
|
17 | transform(file, _, next) {
|
18 | if (file.isNull() || file.extname !== '.po') {
|
19 | return next(undefined, file);
|
20 | }
|
21 | const languageTag = path_1.basename(file.basename, '.po');
|
22 | if (!languageTag_1.validateLanguageTag(languageTag)) {
|
23 | next(new plugin_error_1.default(PLUGIN_NAME, `Translation file ${file.basename} has a bad name. Translation files must be named ${humanize_list_1.default(Object.keys(ProjectConfiguration_1.Locales).map((tag) => tag + '.po'), { conjunction: 'or' })}.`, { fileName: file.relative }));
|
24 | return;
|
25 | }
|
26 | if (file.isBuffer()) {
|
27 | try {
|
28 | const contents = file.contents.toString('utf-8');
|
29 | translations.loadLanguage(languageTag, contents);
|
30 | translationFiles.set(languageTag, file.clone({ contents: false }));
|
31 | return next();
|
32 | }
|
33 | catch (error) {
|
34 | next(new plugin_error_1.default(PLUGIN_NAME, error, { fileName: file.relative }));
|
35 | }
|
36 | }
|
37 | else {
|
38 | next(new plugin_error_1.default(PLUGIN_NAME, file.isStream()
|
39 | ? 'Streaming mode is not supported.'
|
40 | : 'Internal error processing file.', { fileName: file.relative }));
|
41 | return;
|
42 | }
|
43 | },
|
44 | flush(done) {
|
45 | const languageTable = translations.build();
|
46 | if (languageTable.languages.size > 0 &&
|
47 | !languageTable.languages.has(defaultLanguage)) {
|
48 | done(new plugin_error_1.default(PLUGIN_NAME, `No translation file found for default language "${defaultLanguage}"`));
|
49 | return;
|
50 | }
|
51 | for (const language of languageTable.languages) {
|
52 | const file = translationFiles.get(language);
|
53 | try {
|
54 | file.contents = Buffer.from(languageTable.getLanguage(language));
|
55 | file.translationLanguage = language;
|
56 | }
|
57 | catch (error) {
|
58 | done(new plugin_error_1.default(PLUGIN_NAME, error, { fileName: file.relative }));
|
59 | return;
|
60 | }
|
61 | file.path = `l/${language}`;
|
62 | transform.push(file);
|
63 | }
|
64 | done();
|
65 | },
|
66 | });
|
67 | return transform;
|
68 | }
|
69 | exports.default = compileTranslations;
|