remove debug logging, add comments
This commit is contained in:
parent
039ab7baef
commit
46776d0c30
115
src/i18n.tsx
115
src/i18n.tsx
@ -14,21 +14,14 @@
|
|||||||
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
"use strict";
|
/**
|
||||||
|
* Translation helpers for React components and template literals.
|
||||||
|
*/
|
||||||
|
|
||||||
import * as jedLib from "jed";
|
import * as jedLib from "jed";
|
||||||
import {strings} from "./i18n/strings";
|
import {strings} from "./i18n/strings";
|
||||||
|
|
||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
|
|
||||||
console.log("jed:", jedLib);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Information about the last two i18n results, used by plural()
|
|
||||||
* 2-element array, each element contains { stringFound: boolean, pluralValue: number }
|
|
||||||
*/
|
|
||||||
const i18nResult = [] as any;
|
|
||||||
|
|
||||||
let lang: string;
|
let lang: string;
|
||||||
try {
|
try {
|
||||||
lang = chrome.i18n.getUILanguage();
|
lang = chrome.i18n.getUILanguage();
|
||||||
@ -47,23 +40,6 @@ if (!strings[lang]) {
|
|||||||
let jed = new jedLib.Jed(strings[lang]);
|
let jed = new jedLib.Jed(strings[lang]);
|
||||||
|
|
||||||
|
|
||||||
class PluralNumber {
|
|
||||||
n: number;
|
|
||||||
|
|
||||||
constructor(n: number) {
|
|
||||||
this.n = n;
|
|
||||||
}
|
|
||||||
|
|
||||||
valueOf () {
|
|
||||||
return this.n;
|
|
||||||
}
|
|
||||||
|
|
||||||
toString () {
|
|
||||||
return this.n.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert template strings to a msgid
|
* Convert template strings to a msgid
|
||||||
*/
|
*/
|
||||||
@ -79,74 +55,20 @@ function toI18nString(strings: ReadonlyArray<string>) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Use the first number in values to determine plural form
|
|
||||||
*/
|
|
||||||
function getPluralValue (values: any) {
|
|
||||||
let n = null;
|
|
||||||
for (let i = 0; i < values.length; i++) {
|
|
||||||
if ("number" === typeof values[i] || values[i] instanceof PluralNumber) {
|
|
||||||
if (null === n || values[i] instanceof PluralNumber) {
|
|
||||||
n = values[i].valueOf();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (null === n) ? 1 : n;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Store information about the result of the last to i18n().
|
|
||||||
*
|
|
||||||
* @param i18nString the string template as found in i18n.strings
|
|
||||||
* @param pluralValue value returned by getPluralValue()
|
|
||||||
*/
|
|
||||||
function setI18nResult (i18nString: string, pluralValue: number) {
|
|
||||||
i18nResult[1] = i18nResult[0];
|
|
||||||
i18nResult[0] = {
|
|
||||||
stringFound: i18nString in strings[lang].locale_data[lang],
|
|
||||||
pluralValue: pluralValue
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Internationalize a string template with arbitrary serialized values.
|
* Internationalize a string template with arbitrary serialized values.
|
||||||
*/
|
*/
|
||||||
export function str(strings: TemplateStringsArray, ...values: any[]) {
|
export function str(strings: TemplateStringsArray, ...values: any[]) {
|
||||||
let str = toI18nString(strings);
|
let str = toI18nString(strings);
|
||||||
let n = getPluralValue(values);
|
let tr = jed.translate(str).ifPlural(1, str).fetch(...values);
|
||||||
let tr = jed.translate(str).ifPlural(n, str).fetch(...values);
|
|
||||||
|
|
||||||
setI18nResult(str, n);
|
|
||||||
return tr;
|
return tr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pluralize based on first numeric parameter in the template.
|
|
||||||
* @todo The plural argument is used for extraction by pogen.js
|
|
||||||
*/
|
|
||||||
function plural(singular: any, plural: any) {
|
|
||||||
if (i18nResult[1].stringFound) { // string found in translation file?
|
|
||||||
// 'singular' has the correctly translated & pluralized text
|
|
||||||
return singular;
|
|
||||||
} else {
|
|
||||||
// return appropriate form based on value found in 'singular'
|
|
||||||
return (1 == i18nResult[1].pluralValue) ? singular : plural;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
interface TranslateSwitchProps {
|
interface TranslateSwitchProps {
|
||||||
target: number;
|
target: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Return a number that is used to determine the plural form for a template.
|
|
||||||
*/
|
|
||||||
function number(n : number) {
|
|
||||||
return new PluralNumber (n);
|
|
||||||
};
|
|
||||||
|
|
||||||
function stringifyChildren(children: any): string {
|
function stringifyChildren(children: any): string {
|
||||||
let n = 1;
|
let n = 1;
|
||||||
@ -174,6 +96,16 @@ interface TranslateProps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translate text node children of this component.
|
||||||
|
* If a child component might produce a text node, it must be wrapped
|
||||||
|
* in a another non-text element.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* <Translate>
|
||||||
|
* Hello. Your score is <span><PlayerScore player={player} /></span>
|
||||||
|
* </Translate>
|
||||||
|
*/
|
||||||
export class Translate extends React.Component<TranslateProps,void> {
|
export class Translate extends React.Component<TranslateProps,void> {
|
||||||
render(): JSX.Element {
|
render(): JSX.Element {
|
||||||
let s = stringifyChildren(this.props.children);
|
let s = stringifyChildren(this.props.children);
|
||||||
@ -208,6 +140,16 @@ export class Translate extends React.Component<TranslateProps,void> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Switch translation based on singular or plural based on the target prop.
|
||||||
|
* Should only contain TranslateSingular and TransplatePlural as children.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* <TranslateSwitch target={n}>
|
||||||
|
* <TranslateSingular>I have {n} apple.</TranslateSingular>
|
||||||
|
* <TranslatePlural>I have {n} apples.</TranslatePlural>
|
||||||
|
* </TranslateSwitch>
|
||||||
|
*/
|
||||||
export class TranslateSwitch extends React.Component<TranslateSwitchProps,void>{
|
export class TranslateSwitch extends React.Component<TranslateSwitchProps,void>{
|
||||||
render(): JSX.Element {
|
render(): JSX.Element {
|
||||||
let singular: React.ReactElement<TranslationPluralProps> | undefined;
|
let singular: React.ReactElement<TranslationPluralProps> | undefined;
|
||||||
@ -228,7 +170,7 @@ export class TranslateSwitch extends React.Component<TranslateSwitchProps,void>{
|
|||||||
return React.createElement("span", {}, ["translation not found"]);
|
return React.createElement("span", {}, ["translation not found"]);
|
||||||
}
|
}
|
||||||
singular.props.target = this.props.target;
|
singular.props.target = this.props.target;
|
||||||
plural.props.target = this.props.target;;
|
plural.props.target = this.props.target;
|
||||||
// We're looking up the translation based on the
|
// We're looking up the translation based on the
|
||||||
// singular, even if we must use the plural form.
|
// singular, even if we must use the plural form.
|
||||||
return singular;
|
return singular;
|
||||||
@ -240,7 +182,9 @@ interface TranslationPluralProps {
|
|||||||
target: number;
|
target: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see TranslateSwitch
|
||||||
|
*/
|
||||||
export class TranslatePlural extends React.Component<TranslationPluralProps,void> {
|
export class TranslatePlural extends React.Component<TranslationPluralProps,void> {
|
||||||
render(): JSX.Element {
|
render(): JSX.Element {
|
||||||
let s = stringifyChildren(this.props.children);
|
let s = stringifyChildren(this.props.children);
|
||||||
@ -270,6 +214,9 @@ export class TranslatePlural extends React.Component<TranslationPluralProps,void
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see TranslateSwitch
|
||||||
|
*/
|
||||||
export class TranslateSingular extends React.Component<TranslationPluralProps,void> {
|
export class TranslateSingular extends React.Component<TranslationPluralProps,void> {
|
||||||
render(): JSX.Element {
|
render(): JSX.Element {
|
||||||
let s = stringifyChildren(this.props.children);
|
let s = stringifyChildren(this.props.children);
|
||||||
|
@ -9,7 +9,8 @@ module.exports = function (env) {
|
|||||||
output: {
|
output: {
|
||||||
filename: '[name]-bundle.js',
|
filename: '[name]-bundle.js',
|
||||||
chunkFilename: "[id].chunk.js",
|
chunkFilename: "[id].chunk.js",
|
||||||
path: path.resolve(__dirname, "dist")
|
path: path.resolve(__dirname, "dist"),
|
||||||
|
devtoolModuleFilenameTemplate: "file://[absolute-resource-path]",
|
||||||
},
|
},
|
||||||
module: {
|
module: {
|
||||||
noParse: /taler-emscripten-lib/,
|
noParse: /taler-emscripten-lib/,
|
||||||
|
Loading…
Reference in New Issue
Block a user