Add i18n support
Make the "Running on.." string translatable and copy the extraction and conversion of JSX and PO files from Cockpit.
This commit is contained in:
parent
21950771af
commit
7ce7b2b40b
8 changed files with 220 additions and 3 deletions
18
po/de.po
Normal file
18
po/de.po
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
# starter-kit German translations
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: starter-kit 1.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-06-19 10:54+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: src/app.jsx:40
|
||||
msgid "Running on $0"
|
||||
msgstr "Läuft auf $0"
|
||||
14
po/po.empty.js
Normal file
14
po/po.empty.js
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
(function (root, data) {
|
||||
var loaded, module;
|
||||
|
||||
/* Load into Cockpit locale */
|
||||
if (typeof cockpit === 'object') {
|
||||
cockpit.locale(data)
|
||||
loaded = true;
|
||||
}
|
||||
|
||||
if (!loaded)
|
||||
root.po = data;
|
||||
|
||||
/* The syntax of this line is important by po2json */
|
||||
}(this, {"":{"language":"en"}}));
|
||||
127
po/po2json
Executable file
127
po/po2json
Executable file
|
|
@ -0,0 +1,127 @@
|
|||
#!/usr/bin/env node
|
||||
|
||||
function fatal(message, code) {
|
||||
console.log((filename || "html2po") + ": " + message);
|
||||
process.exit(code || 1);
|
||||
}
|
||||
|
||||
function usage() {
|
||||
console.log("usage: po2json [--module=template.js] input output");
|
||||
process.exit(2);
|
||||
}
|
||||
|
||||
var fs, po2json, Jed, stdio;
|
||||
|
||||
try {
|
||||
fs = require('fs');
|
||||
po2json = require('po2json');
|
||||
Jed = require('jed');
|
||||
stdio = require('stdio');
|
||||
} catch(ex) {
|
||||
fatal(ex.message, 127); /* missing looks for this */
|
||||
}
|
||||
|
||||
var argi = 2;
|
||||
var filename = null;
|
||||
|
||||
var opts = stdio.getopt({
|
||||
module: { key: "m", args: 1, description: "Module template to include" },
|
||||
output: { key: "o", args: 1, description: "Output file" },
|
||||
});
|
||||
|
||||
if (opts.args.length != 1) {
|
||||
usage();
|
||||
}
|
||||
|
||||
parse();
|
||||
|
||||
function prepareHeader(header) {
|
||||
var body, statement, plurals = header["plural-forms"], ret = null;
|
||||
if (plurals) {
|
||||
try {
|
||||
/* Check that the plural forms isn't being sneaky since we build a function here */
|
||||
Jed.PF.parse(plurals);
|
||||
} catch(ex) {
|
||||
fatal("bad plural forms: " + ex.message, 1);
|
||||
}
|
||||
|
||||
/* A function for the front end */
|
||||
statement = header["plural-forms"];
|
||||
if (statement[statement.length - 1] != ';')
|
||||
statement += ';';
|
||||
ret = 'function(n) {\nvar nplurals, plural;\n' + statement + '\nreturn plural;\n}';
|
||||
|
||||
/* Added back in later */
|
||||
delete header["plural-forms"];
|
||||
}
|
||||
|
||||
/* We don't need to be transferring this */
|
||||
delete header["project-id-version"];
|
||||
delete header["report-msgid-bugs-to"];
|
||||
delete header["pot-creation-date"];
|
||||
delete header["po-revision-date"];
|
||||
delete header["last-translator"];
|
||||
delete header["language-team"];
|
||||
delete header["mime-version"];
|
||||
delete header["content-type"];
|
||||
delete header["content-transfer-encoding"];
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Parse and process the po data */
|
||||
function parse() {
|
||||
filename = opts.args[0];
|
||||
po2json.parseFile(opts.args[0], { "fuzzy": true }, function(err, jsonData) {
|
||||
var plurals, pos;
|
||||
|
||||
if (err)
|
||||
fatal(err.message);
|
||||
|
||||
var header = jsonData[""];
|
||||
if (header)
|
||||
plurals = prepareHeader(header);
|
||||
|
||||
var data = JSON.stringify(jsonData, null, 1);
|
||||
|
||||
/* We know the brace in is the location to insert our function */
|
||||
if (plurals) {
|
||||
pos = data.indexOf('{', 1);
|
||||
data = data.substr(0, pos + 1) + "'plural-forms':" + String(plurals) + "," + data.substr(pos + 1);
|
||||
}
|
||||
|
||||
if (data == JSON.stringify({}))
|
||||
finish("");
|
||||
else
|
||||
wrap(data);
|
||||
});
|
||||
}
|
||||
|
||||
/* Wrap the data if desired */
|
||||
function wrap(data) {
|
||||
if (opts.module) {
|
||||
filename = opts.module;
|
||||
fs.readFile(opts.module, { encoding: "utf-8" }, function(err, template) {
|
||||
if (err)
|
||||
fatal(err.message);
|
||||
data = template.replace('{"":{"language":"en"}}', data);
|
||||
finish(data);
|
||||
});
|
||||
} else {
|
||||
finish(data);
|
||||
}
|
||||
}
|
||||
|
||||
/* Write it out */
|
||||
function finish(data) {
|
||||
if (opts.output) {
|
||||
fs.writeFile(opts.output, data, function(err) {
|
||||
if (err)
|
||||
fatal(err.message);
|
||||
process.exit(0);
|
||||
});
|
||||
} else {
|
||||
process.stdout.write(data);
|
||||
process.exit(0);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue