diff --git a/src/i18n.tsx b/src/i18n.tsx
index aa26407d9..8a31b2d91 100644
--- a/src/i18n.tsx
+++ b/src/i18n.tsx
@@ -14,21 +14,14 @@
TALER; see the file COPYING. If not, see
*/
-"use strict";
+/**
+ * Translation helpers for React components and template literals.
+ */
import * as jedLib from "jed";
import {strings} from "./i18n/strings";
-
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;
try {
lang = chrome.i18n.getUILanguage();
@@ -47,23 +40,6 @@ if (!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
*/
@@ -79,74 +55,20 @@ function toI18nString(strings: ReadonlyArray) {
}
-/**
- * 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.
*/
export function str(strings: TemplateStringsArray, ...values: any[]) {
let str = toI18nString(strings);
- let n = getPluralValue(values);
- let tr = jed.translate(str).ifPlural(n, str).fetch(...values);
-
- setI18nResult(str, n);
+ let tr = jed.translate(str).ifPlural(1, str).fetch(...values);
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 {
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 {
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:
+ *
+ * Hello. Your score is
+ *
+ */
export class Translate extends React.Component {
render(): JSX.Element {
let s = stringifyChildren(this.props.children);
@@ -208,6 +140,16 @@ export class Translate extends React.Component {
}
+/**
+ * Switch translation based on singular or plural based on the target prop.
+ * Should only contain TranslateSingular and TransplatePlural as children.
+ *
+ * Example:
+ *
+ * I have {n} apple.
+ * I have {n} apples.
+ *
+ */
export class TranslateSwitch extends React.Component{
render(): JSX.Element {
let singular: React.ReactElement | undefined;
@@ -228,7 +170,7 @@ export class TranslateSwitch extends React.Component{
return React.createElement("span", {}, ["translation not found"]);
}
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
// singular, even if we must use the plural form.
return singular;
@@ -240,7 +182,9 @@ interface TranslationPluralProps {
target: number;
}
-
+/**
+ * @see TranslateSwitch
+ */
export class TranslatePlural extends React.Component {
render(): JSX.Element {
let s = stringifyChildren(this.props.children);
@@ -270,6 +214,9 @@ export class TranslatePlural extends React.Component {
render(): JSX.Element {
let s = stringifyChildren(this.props.children);
diff --git a/webpack.config.js b/webpack.config.js
index 429591220..02b702a8c 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -9,7 +9,8 @@ module.exports = function (env) {
output: {
filename: '[name]-bundle.js',
chunkFilename: "[id].chunk.js",
- path: path.resolve(__dirname, "dist")
+ path: path.resolve(__dirname, "dist"),
+ devtoolModuleFilenameTemplate: "file://[absolute-resource-path]",
},
module: {
noParse: /taler-emscripten-lib/,