gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-wallet-core] 03/04: moving strings from wallet-core to web-extens


From: gnunet
Subject: [taler-wallet-core] 03/04: moving strings from wallet-core to web-extension
Date: Tue, 08 Jun 2021 22:18:37 +0200

This is an automated email from the git hooks/post-receive script.

sebasjm pushed a commit to branch master
in repository wallet-core.

commit 1d55c551bb9e9322a822895c7ff9c9378bc43a92
Author: Sebastian <sebasjm@gmail.com>
AuthorDate: Tue Jun 8 16:01:41 2021 -0300

    moving strings from wallet-core to web-extension
---
 packages/taler-wallet-core/src/i18n/index.ts       |  93 ---------
 .../.storybook/preview.js                          |   7 +-
 packages/taler-wallet-webextension/src/i18n.tsx    | 209 ---------------------
 .../src/i18n/de.po                                 |   0
 .../src/i18n/en-US.po                              |   0
 .../src/i18n/fr.po                                 |   0
 .../src/i18n/index.ts}                             |  11 +-
 .../src/i18n/it.po                                 |   0
 .../src/i18n/poheader                              |   0
 .../src/i18n/strings-prelude                       |   0
 .../src/i18n/strings.ts                            |   0
 .../src/i18n/sv.po                                 |   0
 .../src/i18n/taler-wallet-webex.pot                |   0
 .../taler-wallet-webextension/src/pages/pay.tsx    |  10 +-
 .../src/pages/popup.stories.tsx                    |  11 +-
 .../taler-wallet-webextension/src/pages/popup.tsx  |  16 +-
 .../src/pages/withdraw.tsx                         |   7 +-
 .../taler-wallet-webextension/tests/i18n.test.tsx  |   2 +-
 18 files changed, 38 insertions(+), 328 deletions(-)

diff --git a/packages/taler-wallet-core/src/i18n/index.ts 
b/packages/taler-wallet-core/src/i18n/index.ts
deleted file mode 100644
index a820eaeb..00000000
--- a/packages/taler-wallet-core/src/i18n/index.ts
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- This file is part of TALER
- (C) 2016 GNUnet e.V.
-
- TALER is free software; you can redistribute it and/or modify it under the
- terms of the GNU General Public License as published by the Free Software
- Foundation; either version 3, or (at your option) any later version.
-
- TALER is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along with
- TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
- */
-
-/**
- * Translation helpers for React components and template literals.
- */
-
-/**
- * Imports.
- */
-import { strings } from "./strings";
-export { strings } from "./strings";
-
-// @ts-ignore: no type decl for this library
-import * as jedLib from "jed";
-import { Logger } from "../util/logging";
-
-const logger = new Logger("i18n/index.ts");
-
-export let jed: any = undefined;
-
-/**
- * Set up jed library for internationalization,
- * based on browser language settings.
- */
-export function setupI18n(lang: string): any {
-  lang = lang.replace("_", "-");
-
-  if (!strings[lang]) {
-    lang = "en-US";
-    logger.warn(`language ${lang} not found, defaulting to english`);
-  }
-  jed = new jedLib.Jed(strings[lang]);
-}
-
-/**
- * Use different translations for testing.  Should not be used outside
- * of test cases.
- */
-export function internalSetStrings(langStrings: any): void {
-  jed = new jedLib.Jed(langStrings);
-}
-
-/**
- * Convert template strings to a msgid
- */
-function toI18nString(stringSeq: ReadonlyArray<string>): string {
-  let s = "";
-  for (let i = 0; i < stringSeq.length; i++) {
-    s += stringSeq[i];
-    if (i < stringSeq.length - 1) {
-      s += `%${i + 1}$s`;
-    }
-  }
-  return s;
-}
-
-/**
- * Internationalize a string template with arbitrary serialized values.
- */
-export function str(stringSeq: TemplateStringsArray, ...values: any[]): string 
{
-  const s = toI18nString(stringSeq);
-  const tr = jed
-    .translate(s)
-    .ifPlural(1, s)
-    .fetch(...values);
-  return tr;
-}
-
-/**
- * Get an internationalized string (based on the globally set, current 
language)
- * from a JSON object.  Fall back to the default language of the JSON object
- * if no match exists.
- */
-export function getJsonI18n<K extends string>(
-  obj: Record<K, string>,
-  key: K,
-): string {
-  return obj[key];
-}
diff --git a/packages/taler-wallet-webextension/.storybook/preview.js 
b/packages/taler-wallet-webextension/.storybook/preview.js
index c5740261..e669398d 100644
--- a/packages/taler-wallet-webextension/.storybook/preview.js
+++ b/packages/taler-wallet-webextension/.storybook/preview.js
@@ -14,7 +14,8 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-import * as core from "@gnu-taler/taler-wallet-core";
+import { setupI18n } from "@gnu-taler/taler-util"
+import { strings } from '../src/i18n'
 
 const mockConfig = {
   backendURL: 'http://demo.taler.net',
@@ -45,8 +46,8 @@ export const globalTypes = {
 
 export const decorators = [
   (Story, { globals }) => {
-    core.setupI18n(globals.locale);
+    setupI18n(globals.locale, strings);
     return <Story />
   },
-//   (Story) => <ConfigContextProvider value={mockConfig}> <Story /> 
</ConfigContextProvider>
+  //   (Story) => <ConfigContextProvider value={mockConfig}> <Story /> 
</ConfigContextProvider>
 ];
diff --git a/packages/taler-wallet-webextension/src/i18n.tsx 
b/packages/taler-wallet-webextension/src/i18n.tsx
deleted file mode 100644
index 4d5f8341..00000000
--- a/packages/taler-wallet-webextension/src/i18n.tsx
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- This file is part of TALER
- (C) 2016 GNUnet e.V.
-
- TALER is free software; you can redistribute it and/or modify it under the
- terms of the GNU General Public License as published by the Free Software
- Foundation; either version 3, or (at your option) any later version.
-
- TALER is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along with
- TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
- */
-
-/**
- * Translation helpers for React components and template literals.
- */
-
-/**
- * Imports
- */
-
-import * as i18nCore from "@gnu-taler/taler-wallet-core";
-import { Component, ComponentChildren, h, JSX, toChildArray, VNode } from 
"preact";
-/**
- * Convert template strings to a msgid
- */
-function toI18nString(stringSeq: ReadonlyArray<string>): string {
-  let s = "";
-  for (let i = 0; i < stringSeq.length; i++) {
-    s += stringSeq[i];
-    if (i < stringSeq.length - 1) {
-      s += `%${i + 1}$s`;
-    }
-  }
-  return s;
-}
-
-
-export const str = i18nCore.str;
-export const internalSetStrings = i18nCore.internalSetStrings;
-export const strings = i18nCore.strings;
-
-
-interface TranslateSwitchProps {
-  target: number;
-}
-
-function stringifyChildren(children: any): string {
-  let n = 1;
-  const ss = toChildArray(children).map((c) => {
-    if (typeof c === "string") {
-      return c;
-    }
-    return `%${n++}$s`;
-  });
-  const s = ss.join("").replace(/ +/g, " ").trim();
-  console.log("translation lookup", JSON.stringify(s));
-  return s;
-}
-
-interface TranslateProps {
-  /**
-   * Component that the translated element should be wrapped in.
-   * Defaults to "div".
-   */
-  wrap?: any;
-
-  /**
-   * Props to give to the wrapped component.
-   */
-  wrapProps?: any;
-
-  /**
-   * Translated elements
-   */
-  children: ComponentChildren;
-}
-
-function getTranslatedChildren(
-  translation: string,
-  children: ComponentChildren,
-): ComponentChildren {
-  const tr = translation.split(/%(\d+)\$s/);
-  const childArray = toChildArray(children);
-  // Merge consecutive string children.
-  const placeholderChildren = [];
-  for (let i = 0; i < childArray.length; i++) {
-    const x = childArray[i];
-    if (x === undefined) {
-      continue;
-    } else if (typeof x === "string") {
-      continue;
-    } else {
-      placeholderChildren.push(x);
-    }
-  }
-  const result = [];
-  for (let i = 0; i < tr.length; i++) {
-    if (i % 2 == 0) {
-      // Text
-      result.push(tr[i]);
-    } else {
-      const childIdx = Number.parseInt(tr[i]) - 1;
-      result.push(placeholderChildren[childIdx]);
-    }
-  }
-  return result;
-}
-
-/**
- * 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 function Translate({children, wrap, wrapProps}: TranslateProps): VNode {
-    const s = stringifyChildren(children);
-    const translation: string = i18nCore.jed.ngettext(s, s, 1);
-    const result = getTranslatedChildren(translation, children);
-    if (!wrap) {
-      return <div>{result}</div>;
-    }
-    return h(wrap, wrapProps, result);
-}
-
-/**
- * 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 Component<
-  TranslateSwitchProps,
-  void
-> {
-  render(): JSX.Element {
-    let singular: VNode<TranslationPluralProps> | undefined;
-    let plural: VNode<TranslationPluralProps> | undefined;
-    const children = this.props.children;
-    if (children) {
-      toChildArray(children).forEach((child: any) => {
-        if (child.type === TranslatePlural) {
-          plural = child;
-        }
-        if (child.type === TranslateSingular) {
-          singular = child;
-        }
-      });
-    }
-    if (!singular || !plural) {
-      console.error("translation not found");
-      return h("span", {}, ["translation not found"]);
-    }
-    singular.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;
-  }
-}
-
-interface TranslationPluralProps {
-  target: number;
-}
-
-/**
- * See [[TranslateSwitch]].
- */
-export class TranslatePlural extends Component<
-  TranslationPluralProps,
-  void
-> {
-  render(): JSX.Element {
-    const s = stringifyChildren(this.props.children);
-    const translation = i18nCore.jed.ngettext(s, s, 1);
-    const result = getTranslatedChildren(translation, this.props.children);
-    return <div>{result}</div>;
-  }
-}
-
-/**
- * See [[TranslateSwitch]].
- */
-export class TranslateSingular extends Component<
-  TranslationPluralProps,
-  void
-> {
-  render(): JSX.Element {
-    const s = stringifyChildren(this.props.children);
-    const translation = i18nCore.jed.ngettext(s, s, this.props.target);
-    const result = getTranslatedChildren(translation, this.props.children);
-    return <div>{result}</div>;
-  }
-}
diff --git a/packages/taler-wallet-core/src/i18n/de.po 
b/packages/taler-wallet-webextension/src/i18n/de.po
similarity index 100%
rename from packages/taler-wallet-core/src/i18n/de.po
rename to packages/taler-wallet-webextension/src/i18n/de.po
diff --git a/packages/taler-wallet-core/src/i18n/en-US.po 
b/packages/taler-wallet-webextension/src/i18n/en-US.po
similarity index 100%
rename from packages/taler-wallet-core/src/i18n/en-US.po
rename to packages/taler-wallet-webextension/src/i18n/en-US.po
diff --git a/packages/taler-wallet-core/src/i18n/fr.po 
b/packages/taler-wallet-webextension/src/i18n/fr.po
similarity index 100%
rename from packages/taler-wallet-core/src/i18n/fr.po
rename to packages/taler-wallet-webextension/src/i18n/fr.po
diff --git a/packages/taler-wallet-core/src/i18n/strings-prelude 
b/packages/taler-wallet-webextension/src/i18n/index.ts
similarity index 80%
copy from packages/taler-wallet-core/src/i18n/strings-prelude
copy to packages/taler-wallet-webextension/src/i18n/index.ts
index aa6602bd..abfc8b92 100644
--- a/packages/taler-wallet-core/src/i18n/strings-prelude
+++ b/packages/taler-wallet-webextension/src/i18n/index.ts
@@ -1,6 +1,6 @@
 /*
  This file is part of TALER
- (C) 2016 Inria
+ (C) 2016 GNUnet e.V.
 
  TALER is free software; you can redistribute it and/or modify it under the
  terms of the GNU General Public License as published by the Free Software
@@ -14,4 +14,11 @@
  TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-export const strings: {[s: string]: any} = {};
+/**
+ * Translation helpers for React components and template literals.
+ */
+
+/**
+ * Imports.
+ */
+export { strings } from "./strings";
diff --git a/packages/taler-wallet-core/src/i18n/it.po 
b/packages/taler-wallet-webextension/src/i18n/it.po
similarity index 100%
rename from packages/taler-wallet-core/src/i18n/it.po
rename to packages/taler-wallet-webextension/src/i18n/it.po
diff --git a/packages/taler-wallet-core/src/i18n/poheader 
b/packages/taler-wallet-webextension/src/i18n/poheader
similarity index 100%
rename from packages/taler-wallet-core/src/i18n/poheader
rename to packages/taler-wallet-webextension/src/i18n/poheader
diff --git a/packages/taler-wallet-core/src/i18n/strings-prelude 
b/packages/taler-wallet-webextension/src/i18n/strings-prelude
similarity index 100%
rename from packages/taler-wallet-core/src/i18n/strings-prelude
rename to packages/taler-wallet-webextension/src/i18n/strings-prelude
diff --git a/packages/taler-wallet-core/src/i18n/strings.ts 
b/packages/taler-wallet-webextension/src/i18n/strings.ts
similarity index 100%
rename from packages/taler-wallet-core/src/i18n/strings.ts
rename to packages/taler-wallet-webextension/src/i18n/strings.ts
diff --git a/packages/taler-wallet-core/src/i18n/sv.po 
b/packages/taler-wallet-webextension/src/i18n/sv.po
similarity index 100%
rename from packages/taler-wallet-core/src/i18n/sv.po
rename to packages/taler-wallet-webextension/src/i18n/sv.po
diff --git a/packages/taler-wallet-core/src/i18n/taler-wallet-webex.pot 
b/packages/taler-wallet-webextension/src/i18n/taler-wallet-webex.pot
similarity index 100%
rename from packages/taler-wallet-core/src/i18n/taler-wallet-webex.pot
rename to packages/taler-wallet-webextension/src/i18n/taler-wallet-webex.pot
diff --git a/packages/taler-wallet-webextension/src/pages/pay.tsx 
b/packages/taler-wallet-webextension/src/pages/pay.tsx
index fd8b0f3a..e958cd48 100644
--- a/packages/taler-wallet-webextension/src/pages/pay.tsx
+++ b/packages/taler-wallet-webextension/src/pages/pay.tsx
@@ -22,14 +22,14 @@
 /**
  * Imports.
  */
-import * as i18n from "../i18n";
+// import * as i18n from "../i18n";
 
 import { renderAmount, ProgressButton } from "../renderHtml";
 import * as wxApi from "../wxApi";
 
 import { useState, useEffect } from "preact/hooks";
 
-import { getJsonI18n } from "@gnu-taler/taler-wallet-core";
+import { getJsonI18n, i18n } from "@gnu-taler/taler-util";
 import {
   PreparePayResult,
   ConfirmPayResult,
@@ -171,19 +171,19 @@ export function TalerPayDialog({ talerPayUri }: Props): 
JSX.Element {
   return (
     <div>
       <p>
-        <i18n.Translate wrap="p">
+        <i18n.Translate>
           The merchant <span>{merchantName}</span> offers you to purchase:
         </i18n.Translate>
         <div style={{ textAlign: "center" }}>
           <strong>{contractTerms.summary}</strong>
         </div>
         {totalFees ? (
-          <i18n.Translate wrap="p">
+          <i18n.Translate>
             The total price is <span>{amount} </span>
             (plus <span>{renderAmount(totalFees)}</span> fees).
           </i18n.Translate>
         ) : (
-          <i18n.Translate wrap="p">
+          <i18n.Translate>
             The total price is <span>{amount}</span>.
           </i18n.Translate>
         )}
diff --git a/packages/taler-wallet-webextension/src/pages/popup.stories.tsx 
b/packages/taler-wallet-webextension/src/pages/popup.stories.tsx
index 1aec771a..0cb51a33 100644
--- a/packages/taler-wallet-webextension/src/pages/popup.stories.tsx
+++ b/packages/taler-wallet-webextension/src/pages/popup.stories.tsx
@@ -19,8 +19,13 @@
 * @author Sebastian Javier Marchano (sebasjm)
 */
 
-import { PaymentStatus, TransactionPayment, TransactionType, 
TransactionWithdrawal, TransactionDeposit, TransactionRefresh, TransactionTip, 
TransactionRefund, WithdrawalType, TransactionCommon } from 
'@gnu-taler/taler-util';
-import { Fragment, h } from 'preact';
+import {
+  PaymentStatus,
+  TransactionCommon, TransactionDeposit, TransactionPayment,
+  TransactionRefresh, TransactionRefund, TransactionTip, TransactionType,
+  TransactionWithdrawal,
+  WithdrawalType
+} from '@gnu-taler/taler-util';
 import { WalletTransactionView as Component } from './popup';
 
 export default {
@@ -174,7 +179,7 @@ export const Refund = dynamic({
 });
 
 export const RefundPending = dynamic({
-  transaction: { ...exampleData.refund , pending: true }
+  transaction: { ...exampleData.refund, pending: true }
 });
 
 export const RefundWithProducts = dynamic({
diff --git a/packages/taler-wallet-webextension/src/pages/popup.tsx 
b/packages/taler-wallet-webextension/src/pages/popup.tsx
index 5fb08b77..d6c03e07 100644
--- a/packages/taler-wallet-webextension/src/pages/popup.tsx
+++ b/packages/taler-wallet-webextension/src/pages/popup.tsx
@@ -37,13 +37,13 @@ import {
   AmountString,
   Timestamp,
   amountFractionalBase,
+  i18n,
 } from "@gnu-taler/taler-util";
 import { format } from "date-fns";
 import { Component, ComponentChildren, Fragment, JSX } from "preact";
 import { route, Route, Router } from 'preact-router';
 import { Match } from 'preact-router/match';
 import { useEffect, useState } from "preact/hooks";
-import * as i18n from "../i18n";
 import { PageLink, renderAmount } from "../renderHtml";
 import * as wxApi from "../wxApi";
 import { PermissionsCheckbox, useExtendedPermissions, Diagnostics } from 
"./welcome";
@@ -92,10 +92,10 @@ function bigAmount(amount: AmountJson): JSX.Element {
 
 function EmptyBalanceView(): JSX.Element {
   return (
-    <i18n.Translate wrap="p">
+    <p><i18n.Translate>
       You have no balance to show. Need some{" "}
       <PageLink pageName="/welcome">help</PageLink> getting started?
-    </i18n.Translate>
+    </i18n.Translate></p>
   );
 }
 
@@ -166,13 +166,13 @@ class WalletBalanceView extends Component<any, any> {
 
     if (!Amounts.isZero(pendingIncoming)) {
       incoming = (
-        <i18n.Translate wrap="span">
+        <span><i18n.Translate>
           <span style={{ color: "darkgreen" }}>
             {"+"}
             {renderAmount(entry.pendingIncoming)}
           </span>{" "}
           incoming
-        </i18n.Translate>
+        </i18n.Translate></span>
       );
     }
 
@@ -436,14 +436,14 @@ interface WalletTransactionProps {
 
 export function WalletTransactionView({ transaction, onDelete, onBack }: 
WalletTransactionProps) {
   if (!transaction) {
-    return <div>Loading ...</div>;
+    return <div><i18n.Translate>Loading ...</i18n.Translate></div>;
   }
 
   function Footer() {
     return <footer style={{ marginTop: 'auto', display: 'flex' }}>
-      <button onClick={onBack}>back</button>
+      <button onClick={onBack}><i18n.Translate>back</i18n.Translate></button>
       <div style={{ width: '100%', flexDirection: 'row', justifyContent: 
'flex-end', display: 'flex' }}>
-        <button onClick={onDelete}>remove</button>
+        <button 
onClick={onDelete}><i18n.Translate>remove</i18n.Translate></button>
 
       </div>
 
diff --git a/packages/taler-wallet-webextension/src/pages/withdraw.tsx 
b/packages/taler-wallet-webextension/src/pages/withdraw.tsx
index 7b6a06d2..6bdafd94 100644
--- a/packages/taler-wallet-webextension/src/pages/withdraw.tsx
+++ b/packages/taler-wallet-webextension/src/pages/withdraw.tsx
@@ -21,8 +21,7 @@
  * @author Florian Dold
  */
 
-import * as i18n from "../i18n";
-
+import { i18n } from '@gnu-taler/taler-util'
 import { renderAmount } from "../renderHtml";
 
 import { useState, useEffect } from "preact/hooks";
@@ -64,11 +63,11 @@ export function View({ talerWithdrawUri, details, 
cancelled, selectedExchange, a
   return (
     <div>
       <h1>Digital Cash Withdrawal</h1>
-      <i18n.Translate wrap="p">
+      <p><i18n.Translate>
         You are about to withdraw{" "}
         <strong>{renderAmount(details.amount)}</strong> from your bank account
         into your wallet.
-      </i18n.Translate>
+      </i18n.Translate></p>
       {selectedExchange ? (
         <p>
           The exchange <strong>{selectedExchange}</strong> will be used as the
diff --git a/packages/taler-wallet-webextension/tests/i18n.test.tsx 
b/packages/taler-wallet-webextension/tests/i18n.test.tsx
index 89c5b3d5..bba1770b 100644
--- a/packages/taler-wallet-webextension/tests/i18n.test.tsx
+++ b/packages/taler-wallet-webextension/tests/i18n.test.tsx
@@ -15,7 +15,7 @@
  */
 
 // import * as test from "ava";
-import { internalSetStrings, str, Translate } from "../src/i18n";
+import { internalSetStrings, str, Translate } from "@gnu-taler/taler-util";
 import { render, configure } from "enzyme";
 import Adapter from 'enzyme-adapter-preact-pure';
 

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]