UNPKG

3.24 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const tslib_1 = require("tslib");
4const path_1 = require("path");
5const stream_1 = require("stream");
6const bison_i18n_1 = require("@fitbit/bison-i18n");
7const humanize_list_1 = tslib_1.__importDefault(require("humanize-list"));
8const plugin_error_1 = tslib_1.__importDefault(require("plugin-error"));
9const languageTag_1 = require("./languageTag");
10const ProjectConfiguration_1 = require("./ProjectConfiguration");
11const PLUGIN_NAME = 'compileTranslations';
12function 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}
69exports.default = compileTranslations;