Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
For each translation file available, create a module for cockpit containing the translations. We only need these modules to initialize the locale data within cockpit and to provide translations for the manifest label, but just include the entire .po file anyway so that we don't need to do anything special. po2json and po.empty.js are copied from the cockpit sources, and handle converting .po files into modules in the format that cockpit requires. Despite the name, the data format is very much not JSON, so beware if attempting to modify the scripts. po.empty.js is modified from the cockpit source to include an eslint-disable comment. In main.js, check if we are running within cockpit, and if so use cockpit's language information to select the messages to use with react-intl.
- Loading branch information
Showing
8 changed files
with
237 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
/* eslint-disable */ | ||
(function (root, data) { | ||
var loaded, module; | ||
|
||
/* Load into AMD if desired */ | ||
if (typeof define === 'function' && define.amd) { | ||
define(data); | ||
loaded = true; | ||
} | ||
|
||
/* Load into Cockpit locale */ | ||
if (typeof cockpit === 'object') { | ||
cockpit.locale(data) | ||
loaded = true; | ||
} | ||
|
||
function transformAngular(data, prev) { | ||
var key, context, parts, value, result = { }; | ||
for (key in data) { | ||
if (key === "") | ||
continue; | ||
parts = key.split("\u0004"); | ||
value = data[key]; | ||
if (parts[1]) { | ||
context = parts[0]; | ||
key = parts[1]; | ||
} else { | ||
context = "$$noContext"; | ||
key = parts[0]; | ||
} | ||
if (value[0] === null) | ||
value = value[1]; | ||
else | ||
value = value.slice(1); | ||
if (!(key in result)) | ||
result[key] = { }; | ||
result[key][context] = value; | ||
} | ||
return angular.extend(prev, result); | ||
} | ||
|
||
/* Load into angular here */ | ||
if (typeof angular === 'object') { | ||
try { | ||
module = angular.module(["gettext"]); | ||
} catch(ex) { console.log(ex); /* Either no angular or angular-gettext */ }; | ||
if (module) { | ||
loaded = true; | ||
module.run(['gettextCatalog', function(gettextCatalog) { | ||
var lang = data[""]["language"]; | ||
var prev = (gettextCatalog.getCurrentLanguage() == lang) ? gettextCatalog.strings : { }; | ||
gettextCatalog.setStrings(lang, transformAngular(data, prev)); | ||
gettextCatalog.setCurrentLanguage(lang); | ||
}]); | ||
} | ||
} | ||
|
||
if (!loaded) | ||
root.po = data; | ||
|
||
/* The syntax of this line is important by po2json */ | ||
}(this, {"":{"language":"en"}})); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
} | ||
} |