diff options
Diffstat (limited to 'packages/taler-wallet-webextension')
37 files changed, 175 insertions, 213 deletions
| diff --git a/packages/taler-wallet-webextension/src/NavigationBar.tsx b/packages/taler-wallet-webextension/src/NavigationBar.tsx index bebe9436e..8d5c1fa4d 100644 --- a/packages/taler-wallet-webextension/src/NavigationBar.tsx +++ b/packages/taler-wallet-webextension/src/NavigationBar.tsx @@ -27,7 +27,7 @@  import { VNode, h } from "preact";  import { JustInDevMode } from "./components/JustInDevMode";  import { NavigationHeader, NavigationHeaderHolder } from "./components/styled"; -import { useTranslationContext } from "./context/translation.js"; +import { useTranslationContext } from "./context/translation";  /**   * List of pages used by the wallet diff --git a/packages/taler-wallet-webextension/src/components/BankDetailsByPaytoType.tsx b/packages/taler-wallet-webextension/src/components/BankDetailsByPaytoType.tsx index 48360f7c7..f55f5c846 100644 --- a/packages/taler-wallet-webextension/src/components/BankDetailsByPaytoType.tsx +++ b/packages/taler-wallet-webextension/src/components/BankDetailsByPaytoType.tsx @@ -17,7 +17,7 @@  import { PaytoUri } from "@gnu-taler/taler-util";  import { Fragment, h, VNode } from "preact";  import { useEffect, useState } from "preact/hooks"; -import { useTranslationContext } from "../context/translation.js"; +import { useTranslationContext } from "../context/translation";  import { CopiedIcon, CopyIcon } from "../svg";  import { ButtonBox, TooltipRight } from "./styled"; diff --git a/packages/taler-wallet-webextension/src/components/DebugCheckbox.tsx b/packages/taler-wallet-webextension/src/components/DebugCheckbox.tsx index b5ad7cda7..dc42b9ef7 100644 --- a/packages/taler-wallet-webextension/src/components/DebugCheckbox.tsx +++ b/packages/taler-wallet-webextension/src/components/DebugCheckbox.tsx @@ -14,8 +14,8 @@   TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>   */ -import { i18n } from "@gnu-taler/taler-util";  import { h, VNode } from "preact"; +import { useTranslationContext } from "../context/translation";  export function DebugCheckbox({    enabled, @@ -24,6 +24,8 @@ export function DebugCheckbox({    enabled: boolean;    onToggle: () => void;  }): VNode { +  const { i18n } = useTranslationContext(); +    return (      <div>        <input diff --git a/packages/taler-wallet-webextension/src/components/Diagnostics.tsx b/packages/taler-wallet-webextension/src/components/Diagnostics.tsx index b136ebc24..0998cab7b 100644 --- a/packages/taler-wallet-webextension/src/components/Diagnostics.tsx +++ b/packages/taler-wallet-webextension/src/components/Diagnostics.tsx @@ -14,8 +14,9 @@   GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>   */ -import { i18n, WalletDiagnostics } from "@gnu-taler/taler-util"; +import { WalletDiagnostics } from "@gnu-taler/taler-util";  import { Fragment, h, VNode } from "preact"; +import { useTranslationContext } from "../context/translation";  import { PageLink } from "../renderHtml";  interface Props { @@ -24,6 +25,7 @@ interface Props {  }  export function Diagnostics({ timedOut, diagnostics }: Props): VNode { +  const { i18n } = useTranslationContext();    if (timedOut) {      return (        <p> diff --git a/packages/taler-wallet-webextension/src/components/EditableText.tsx b/packages/taler-wallet-webextension/src/components/EditableText.tsx index 8d45cae90..8f342ef28 100644 --- a/packages/taler-wallet-webextension/src/components/EditableText.tsx +++ b/packages/taler-wallet-webextension/src/components/EditableText.tsx @@ -14,9 +14,9 @@   GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>   */ -import { i18n } from "@gnu-taler/taler-util";  import { h, VNode } from "preact";  import { useRef, useState } from "preact/hooks"; +import { useTranslationContext } from "../context/translation";  interface Props {    value: string; @@ -32,6 +32,7 @@ export function EditableText({    label,    description,  }: Props): VNode { +  const { i18n } = useTranslationContext();    const [editing, setEditing] = useState(false);    const ref = useRef<HTMLInputElement>(null);    let InputText; diff --git a/packages/taler-wallet-webextension/src/components/Loading.tsx b/packages/taler-wallet-webextension/src/components/Loading.tsx index 7504034a0..d28953a10 100644 --- a/packages/taler-wallet-webextension/src/components/Loading.tsx +++ b/packages/taler-wallet-webextension/src/components/Loading.tsx @@ -13,13 +13,30 @@   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/>   */ -import { i18n } from "@gnu-taler/taler-util"; -import { h, VNode } from "preact"; +import { Fragment, h, VNode } from "preact"; +import { useEffect, useState } from "preact/hooks"; +import { useTranslationContext } from "../context/translation"; +import { CenteredText } from "./styled";  export function Loading(): VNode { -  return ( -    <div> -      <i18n.Translate>Loading</i18n.Translate>... -    </div> -  ); +  const { i18n } = useTranslationContext(); +  const [tooLong, setTooLong] = useState(false); +  useEffect(() => { +    const id = setTimeout(() => { +      setTooLong(true); +    }, 500); +    return () => { +      clearTimeout(id); +    }; +  }); +  if (tooLong) { +    return ( +      <section style={{ margin: "auto" }}> +        <CenteredText> +          <i18n.Translate>Loading</i18n.Translate>... +        </CenteredText> +      </section> +    ); +  } +  return <Fragment />;  } diff --git a/packages/taler-wallet-webextension/src/components/SelectList.tsx b/packages/taler-wallet-webextension/src/components/SelectList.tsx index 676fd672f..122b473b1 100644 --- a/packages/taler-wallet-webextension/src/components/SelectList.tsx +++ b/packages/taler-wallet-webextension/src/components/SelectList.tsx @@ -14,8 +14,8 @@   GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>   */ -import { i18n } from "@gnu-taler/taler-util";  import { Fragment, h, VNode } from "preact"; +import { useTranslationContext } from "../context/translation";  import { NiceSelect } from "./styled";  interface Props { @@ -39,6 +39,7 @@ export function SelectList({    description,    canBeNull,  }: Props): VNode { +  const { i18n } = useTranslationContext();    return (      <Fragment>        <label diff --git a/packages/taler-wallet-webextension/src/components/TransactionItem.tsx b/packages/taler-wallet-webextension/src/components/TransactionItem.tsx index b17dfce88..42afe5eaf 100644 --- a/packages/taler-wallet-webextension/src/components/TransactionItem.tsx +++ b/packages/taler-wallet-webextension/src/components/TransactionItem.tsx @@ -21,23 +21,18 @@ import {    Timestamp,    Transaction,    TransactionType, -  i18n,  } from "@gnu-taler/taler-util";  import { h, VNode } from "preact"; -import imageBank from "../../static/img/ri-bank-line.svg"; -import imageHandHeart from "../../static/img/ri-hand-heart-line.svg"; -import imageRefresh from "../../static/img/ri-refresh-line.svg"; -import imageRefund from "../../static/img/ri-refund-2-line.svg"; -import imageShoppingCart from "../../static/img/ri-shopping-cart-line.svg"; +import { useTranslationContext } from "../context/translation";  import { Avatar } from "../mui/Avatar";  import { Pages } from "../NavigationBar";  import {    Column,    ExtraLargeText,    HistoryRow, -  SmallLightText,    LargeText,    LightText, +  SmallLightText,  } from "./styled";  import { Time } from "./Time"; @@ -121,6 +116,7 @@ export function TransactionItem(props: { tx: Transaction }): VNode {  }  function TransactionLayout(props: TransactionLayoutProps): VNode { +  const { i18n } = useTranslationContext();    return (      <HistoryRow        href={Pages.balance_transaction.replace(":tid", props.id)} @@ -183,6 +179,7 @@ interface TransactionAmountProps {  }  function TransactionAmount(props: TransactionAmountProps): VNode { +  const { i18n } = useTranslationContext();    let sign: string;    switch (props.debitCreditIndicator) {      case "credit": diff --git a/packages/taler-wallet-webextension/src/context/translation.ts b/packages/taler-wallet-webextension/src/context/translation.ts index 2ded07078..82ea41e32 100644 --- a/packages/taler-wallet-webextension/src/context/translation.ts +++ b/packages/taler-wallet-webextension/src/context/translation.ts @@ -31,7 +31,8 @@ interface Type {    lang: string;    supportedLang: { [id in keyof typeof supportedLang]: string }    changeLanguage: (l: string) => void; -  i18n: typeof i18n +  i18n: typeof i18n; +  isSaved: boolean;  }  const supportedLang = { @@ -44,7 +45,8 @@ const supportedLang = {    it: "Italiano [it]",    // ko: "한국어 [ko]",    // ru: "Ру́сский язы́к [ru]", -  tr: "Türk [tr]" +  tr: "Türk [tr]", +  navigator: "Defined by navigator",  }; @@ -54,7 +56,8 @@ const initial = {    changeLanguage: () => {      // do not change anything    }, -  i18n +  i18n, +  isSaved: false,  };  const Context = createContext<Type>(initial); @@ -69,7 +72,7 @@ export const TranslationProvider = ({    children,    forceLang,  }: Props): VNode => { -  const [lang, changeLanguage] = useLang(initial); +  const [lang, changeLanguage, isSaved] = useLang(initial);    useEffect(() => {      if (forceLang) {        changeLanguage(forceLang); @@ -83,7 +86,7 @@ export const TranslationProvider = ({    } else {      setupI18n(lang, strings);    } -  return h(Context.Provider, { value: { lang, changeLanguage, supportedLang, i18n }, children }); +  return h(Context.Provider, { value: { lang, changeLanguage, supportedLang, i18n, isSaved }, children });  };  export const useTranslationContext = (): Type => useContext(Context); diff --git a/packages/taler-wallet-webextension/src/cta/Deposit.tsx b/packages/taler-wallet-webextension/src/cta/Deposit.tsx index 82d898d77..ac6c1fd6d 100644 --- a/packages/taler-wallet-webextension/src/cta/Deposit.tsx +++ b/packages/taler-wallet-webextension/src/cta/Deposit.tsx @@ -22,7 +22,6 @@  /**   * Imports.   */ -// import * as i18n from "../i18n";  import {    AmountJson, @@ -31,7 +30,6 @@ import {    ConfirmPayResult,    ConfirmPayResultType,    ContractTerms, -  i18n,    NotificationType,    PreparePayResult,    PreparePayResultType, @@ -49,6 +47,7 @@ import {    WalletAction,    WarningBox,  } from "../components/styled"; +import { useTranslationContext } from "../context/translation";  import { useAsyncAsHook } from "../hooks/useAsyncAsHook";  import * as wxApi from "../wxApi"; @@ -58,6 +57,7 @@ interface Props {  }  export function DepositPage({ talerPayUri, goBack }: Props): VNode { +  const { i18n } = useTranslationContext();    const [payStatus, setPayStatus] = useState<PreparePayResult | undefined>(      undefined,    ); @@ -199,6 +199,7 @@ export function PaymentRequestView({  }: PaymentRequestViewProps): VNode {    let totalFees: AmountJson = Amounts.getZero(payStatus.amountRaw);    const contractTerms: ContractTerms = payStatus.contractTerms; +  const { i18n } = useTranslationContext();    return (      <WalletAction> diff --git a/packages/taler-wallet-webextension/src/cta/Pay.tsx b/packages/taler-wallet-webextension/src/cta/Pay.tsx index 4fe44dcff..ba31f4c34 100644 --- a/packages/taler-wallet-webextension/src/cta/Pay.tsx +++ b/packages/taler-wallet-webextension/src/cta/Pay.tsx @@ -22,7 +22,6 @@  /**   * Imports.   */ -// import * as i18n from "../i18n";  import {    AmountJson, @@ -32,12 +31,10 @@ import {    ConfirmPayResultDone,    ConfirmPayResultType,    ContractTerms, -  i18n,    NotificationType,    PreparePayResult,    PreparePayResultType,    Product, -  Translate,  } from "@gnu-taler/taler-util";  import { OperationFailedError } from "@gnu-taler/taler-wallet-core";  import { Fragment, h, VNode } from "preact"; @@ -50,13 +47,13 @@ import { Part } from "../components/Part";  import { QR } from "../components/QR";  import {    ButtonSuccess, -  LightText,    LinkSuccess,    SmallLightText,    SuccessBox,    WalletAction,    WarningBox,  } from "../components/styled"; +import { useTranslationContext } from "../context/translation";  import { useAsyncAsHook } from "../hooks/useAsyncAsHook";  import * as wxApi from "../wxApi"; @@ -89,6 +86,7 @@ export function PayPage({    goToWalletManualWithdraw,    goBack,  }: Props): VNode { +  const { i18n } = useTranslationContext();    const [payResult, setPayResult] = useState<ConfirmPayResult | undefined>(      undefined,    ); @@ -166,6 +164,7 @@ export function PaymentRequestView({    goToWalletManualWithdraw,    balance,  }: PaymentRequestViewProps): VNode { +  const { i18n } = useTranslationContext();    let totalFees: AmountJson = Amounts.getZero(payStatus.amountRaw);    const contractTerms: ContractTerms = payStatus.contractTerms; @@ -412,6 +411,7 @@ export function PaymentRequestView({  }  function ProductList({ products }: { products: Product[] }): VNode { +  const { i18n } = useTranslationContext();    return (      <Fragment>        <SmallLightText style={{ margin: ".5em" }}> diff --git a/packages/taler-wallet-webextension/src/cta/Refund.tsx b/packages/taler-wallet-webextension/src/cta/Refund.tsx index 8ce008bcd..efc436bc8 100644 --- a/packages/taler-wallet-webextension/src/cta/Refund.tsx +++ b/packages/taler-wallet-webextension/src/cta/Refund.tsx @@ -20,9 +20,10 @@   * @author sebasjm   */ -import { Amounts, ApplyRefundResponse, i18n } from "@gnu-taler/taler-util"; +import { Amounts, ApplyRefundResponse } from "@gnu-taler/taler-util";  import { h, VNode } from "preact";  import { useEffect, useState } from "preact/hooks"; +import { useTranslationContext } from "../context/translation";  import { AmountView } from "../renderHtml";  import * as wxApi from "../wxApi"; @@ -33,6 +34,7 @@ export interface ViewProps {    applyResult: ApplyRefundResponse;  }  export function View({ applyResult }: ViewProps): VNode { +  const { i18n } = useTranslationContext();    return (      <section class="main">        <h1>GNU Taler Wallet</h1> @@ -71,6 +73,7 @@ export function RefundPage({ talerRefundUri }: Props): VNode {    const [applyResult, setApplyResult] = useState<      ApplyRefundResponse | undefined    >(undefined); +  const { i18n } = useTranslationContext();    const [errMsg, setErrMsg] = useState<string | undefined>(undefined);    useEffect(() => { diff --git a/packages/taler-wallet-webextension/src/cta/TermsOfServiceSection.tsx b/packages/taler-wallet-webextension/src/cta/TermsOfServiceSection.tsx index 1244b7915..cafc43c6f 100644 --- a/packages/taler-wallet-webextension/src/cta/TermsOfServiceSection.tsx +++ b/packages/taler-wallet-webextension/src/cta/TermsOfServiceSection.tsx @@ -1,4 +1,3 @@ -import { i18n, Translate } from "@gnu-taler/taler-util";  import { Fragment, h, VNode } from "preact";  import { CheckboxOutlined } from "../components/CheckboxOutlined";  import { ExchangeXmlTos } from "../components/ExchangeToS"; @@ -10,6 +9,7 @@ import {    WarningBox,    WarningText,  } from "../components/styled"; +import { useTranslationContext } from "../context/translation";  import { TermsState } from "../utils/index";  interface Props { @@ -26,6 +26,7 @@ export function TermsOfServiceSection({    onAccept,    onReview,  }: Props): VNode { +  const { i18n } = useTranslationContext();    if (!reviewing) {      if (!reviewed) {        if (!onReview) { diff --git a/packages/taler-wallet-webextension/src/cta/Tip.tsx b/packages/taler-wallet-webextension/src/cta/Tip.tsx index ff86ce8c7..71aa04a2b 100644 --- a/packages/taler-wallet-webextension/src/cta/Tip.tsx +++ b/packages/taler-wallet-webextension/src/cta/Tip.tsx @@ -20,10 +20,11 @@   * @author sebasjm <dold@taler.net>   */ -import { PrepareTipResult, i18n } from "@gnu-taler/taler-util"; +import { PrepareTipResult } from "@gnu-taler/taler-util";  import { h, VNode } from "preact";  import { useEffect, useState } from "preact/hooks";  import { Loading } from "../components/Loading"; +import { useTranslationContext } from "../context/translation";  import { AmountView } from "../renderHtml";  import * as wxApi from "../wxApi"; @@ -40,6 +41,7 @@ export function View({    onAccept,    onIgnore,  }: ViewProps): VNode { +  const { i18n } = useTranslationContext();    return (      <section class="main">        <h1>GNU Taler Wallet</h1> @@ -77,6 +79,7 @@ export function View({  }  export function TipPage({ talerTipUri }: Props): VNode { +  const { i18n } = useTranslationContext();    const [updateCounter, setUpdateCounter] = useState<number>(0);    const [prepareTipResult, setPrepareTipResult] = useState<      PrepareTipResult | undefined diff --git a/packages/taler-wallet-webextension/src/cta/Withdraw.tsx b/packages/taler-wallet-webextension/src/cta/Withdraw.tsx index 7c9745ddc..8535c67eb 100644 --- a/packages/taler-wallet-webextension/src/cta/Withdraw.tsx +++ b/packages/taler-wallet-webextension/src/cta/Withdraw.tsx @@ -25,7 +25,6 @@ import {    AmountJson,    Amounts,    ExchangeListItem, -  i18n,    Translate,    WithdrawUriInfoResponse,  } from "@gnu-taler/taler-util"; @@ -52,6 +51,7 @@ import {  } from "../utils/index";  import * as wxApi from "../wxApi";  import { TermsOfServiceSection } from "./TermsOfServiceSection"; +import { useTranslationContext } from "../context/translation";  interface Props {    talerWithdrawUri?: string; @@ -84,6 +84,7 @@ export function View({    onAccept,    reviewed,  }: ViewProps): VNode { +  const { i18n } = useTranslationContext();    const [withdrawError, setWithdrawError] = useState<      OperationFailedError | undefined    >(undefined); @@ -236,12 +237,10 @@ export function WithdrawPageWithParsedURI({    uri: string;    uriInfo: WithdrawUriInfoResponse;  }): VNode { +  const { i18n } = useTranslationContext();    const [customExchange, setCustomExchange] = useState<string | undefined>(      undefined,    ); -  // const [errorAccepting, setErrorAccepting] = useState<string | undefined>( -  //   undefined, -  // );    const [reviewing, setReviewing] = useState<boolean>(false);    const [reviewed, setReviewed] = useState<boolean>(false); @@ -332,6 +331,7 @@ export function WithdrawPageWithParsedURI({    );  }  export function WithdrawPage({ talerWithdrawUri }: Props): VNode { +  const { i18n } = useTranslationContext();    const uriInfoHook = useAsyncAsHook(() =>      !talerWithdrawUri        ? Promise.reject(undefined) diff --git a/packages/taler-wallet-webextension/src/cta/reset-required.tsx b/packages/taler-wallet-webextension/src/cta/reset-required.tsx deleted file mode 100644 index 350c32d76..000000000 --- a/packages/taler-wallet-webextension/src/cta/reset-required.tsx +++ /dev/null @@ -1,112 +0,0 @@ -/* - This file is part of TALER - (C) 2017 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/> - */ - -/** - * Page to inform the user when a database reset is required. - * - * @author sebasjm - */ - -import { i18n } from "@gnu-taler/taler-util"; -import { Component, h, VNode } from "preact"; -import * as wxApi from "../wxApi"; - -interface State { -  /** -   * Did the user check the confirmation check box? -   */ -  checked: boolean; - -  /** -   * Do we actually need to reset the db? -   */ -  resetRequired: boolean; -} - -class ResetNotification extends Component<any, State> { -  constructor(props: any) { -    super(props); -    this.state = { checked: false, resetRequired: true }; -    setInterval(() => this.update(), 500); -  } -  async update(): Promise<void> { -    const res = await wxApi.checkUpgrade(); -    this.setState({ resetRequired: res.dbResetRequired }); -  } -  render(): VNode { -    if (this.state.resetRequired) { -      return ( -        <div> -          <h1> -            <i18n.Translate>Manual Reset Required</i18n.Translate> -          </h1> -          <p> -            <i18n.Translate> -              The wallet's database in your browser is incompatible with -              the currently installed wallet. Please reset manually. -            </i18n.Translate> -          </p> -          <p> -            <i18n.Translate> -              Once the database format has stabilized, we will provide automatic -              upgrades. -            </i18n.Translate> -          </p> -          <input -            id="check" -            type="checkbox" -            checked={this.state.checked} -            onChange={() => { -              this.setState((prev) => ({ checked: prev.checked })); -            }} -          />{" "} -          <label htmlFor="check"> -            <i18n.Translate> -              I understand that I will lose all my data -            </i18n.Translate> -          </label> -          <br /> -          <button -            class="pure-button" -            disabled={!this.state.checked} -            onClick={() => wxApi.resetDb()} -          > -            <i18n.Translate>Reset</i18n.Translate> -          </button> -        </div> -      ); -    } -    return ( -      <div> -        <h1> -          <i18n.Translate>Everything is fine!</i18n.Translate> -        </h1> -        <p> -          <i18n.Translate> -            A reset is not required anymore, you can close this page. -          </i18n.Translate> -        </p> -      </div> -    ); -  } -} - -/** - * @deprecated to be removed - */ -export function createResetRequiredPage(): VNode { -  return <ResetNotification />; -} diff --git a/packages/taler-wallet-webextension/src/cta/return-coins.tsx b/packages/taler-wallet-webextension/src/cta/return-coins.tsx index 1d688fa06..e7a784e2c 100644 --- a/packages/taler-wallet-webextension/src/cta/return-coins.tsx +++ b/packages/taler-wallet-webextension/src/cta/return-coins.tsx @@ -14,8 +14,8 @@   TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>   */ -import { i18n } from "@gnu-taler/taler-util";  import { h, VNode } from "preact"; +import { useTranslationContext } from "../context/translation";  /**   * Return coins to own bank account.   * @@ -26,6 +26,7 @@ import { h, VNode } from "preact";   * Imports.   */  export function createReturnCoinsPage(): VNode { +  const { i18n } = useTranslationContext();    return (      <span>        <i18n.Translate>Not implemented yet.</i18n.Translate> diff --git a/packages/taler-wallet-webextension/src/hooks/useLang.ts b/packages/taler-wallet-webextension/src/hooks/useLang.ts index 7215f2256..959297647 100644 --- a/packages/taler-wallet-webextension/src/hooks/useLang.ts +++ b/packages/taler-wallet-webextension/src/hooks/useLang.ts @@ -22,7 +22,7 @@ function getBrowserLang(): string | undefined {    return undefined;  } -export function useLang(initial?: string): [string, (s: string) => void] { +export function useLang(initial?: string): [string, (s: string) => void, boolean] {    const defaultLang = (getBrowserLang() || initial || "en").substring(0, 2);    return useNotNullLocalStorage("lang-preference", defaultLang);  } diff --git a/packages/taler-wallet-webextension/src/hooks/useLocalStorage.ts b/packages/taler-wallet-webextension/src/hooks/useLocalStorage.ts index 3883aff04..4be82976f 100644 --- a/packages/taler-wallet-webextension/src/hooks/useLocalStorage.ts +++ b/packages/taler-wallet-webextension/src/hooks/useLocalStorage.ts @@ -56,7 +56,7 @@ export function useLocalStorage(  export function useNotNullLocalStorage(    key: string,    initialValue: string, -): [string, StateUpdater<string>] { +): [string, StateUpdater<string>, boolean] {    const [storedValue, setStoredValue] = useState<string>((): string => {      return typeof window !== "undefined"        ? window.localStorage.getItem(key) || initialValue @@ -75,5 +75,6 @@ export function useNotNullLocalStorage(      }    }; -  return [storedValue, setValue]; +  const isSaved = window.localStorage.getItem(key) !== null; +  return [storedValue, setValue, isSaved];  } diff --git a/packages/taler-wallet-webextension/src/popup/BalancePage.tsx b/packages/taler-wallet-webextension/src/popup/BalancePage.tsx index 53b4e1518..c894c333f 100644 --- a/packages/taler-wallet-webextension/src/popup/BalancePage.tsx +++ b/packages/taler-wallet-webextension/src/popup/BalancePage.tsx @@ -17,7 +17,6 @@  import {    Amounts,    Balance, -  i18n,    NotificationType,    Transaction,  } from "@gnu-taler/taler-util"; @@ -29,6 +28,7 @@ import { Loading } from "../components/Loading";  import { LoadingError } from "../components/LoadingError";  import { MultiActionButton } from "../components/MultiActionButton";  import { ButtonBoxPrimary, ButtonPrimary } from "../components/styled"; +import { useTranslationContext } from "../context/translation";  import { useAsyncAsHook } from "../hooks/useAsyncAsHook";  import { AddNewActionView } from "../wallet/AddNewActionView";  import * as wxApi from "../wxApi"; @@ -44,6 +44,7 @@ export function BalancePage({    goToWalletDeposit,    goToWalletHistory,  }: Props): VNode { +  const { i18n } = useTranslationContext();    const [addingAction, setAddingAction] = useState(false);    const state = useAsyncAsHook(wxApi.getBalance, [      NotificationType.WithdrawGroupFinished, @@ -92,6 +93,7 @@ export function BalanceView({    goToWalletHistory,    goToAddAction,  }: BalanceViewProps): VNode { +  const { i18n } = useTranslationContext();    const currencyWithNonZeroAmount = balances      .filter((b) => !Amounts.isZero(b.available))      .map((b) => b.available.split(":")[0]); diff --git a/packages/taler-wallet-webextension/src/popup/DeveloperPage.tsx b/packages/taler-wallet-webextension/src/popup/DeveloperPage.tsx index 228c3cdfd..3144a9ce3 100644 --- a/packages/taler-wallet-webextension/src/popup/DeveloperPage.tsx +++ b/packages/taler-wallet-webextension/src/popup/DeveloperPage.tsx @@ -21,7 +21,6 @@ import {    ExchangeListItem,    NotificationType,    Translate, -  i18n,  } from "@gnu-taler/taler-util";  import { PendingTaskInfo } from "@gnu-taler/taler-wallet-core";  import { format } from "date-fns"; @@ -30,6 +29,7 @@ import { useRef, useState } from "preact/hooks";  import { Diagnostics } from "../components/Diagnostics";  import { NotifyUpdateFadeOut } from "../components/styled";  import { Time } from "../components/Time"; +import { useTranslationContext } from "../context/translation";  import { useAsyncAsHook } from "../hooks/useAsyncAsHook";  import { useDiagnostics } from "../hooks/useDiagnostics";  import * as wxApi from "../wxApi"; @@ -110,6 +110,7 @@ export function View({    coins,    onDownloadDatabase,  }: Props): VNode { +  const { i18n } = useTranslationContext();    const [downloadedDatabase, setDownloadedDatabase] = useState<      { time: Date; content: string } | undefined    >(undefined); @@ -153,7 +154,13 @@ export function View({        <p>          <i18n.Translate>Debug tools</i18n.Translate>:        </p> -      <button onClick={confirmReset}> +      <button +        onClick={() => +          confirmReset( +            i18n.str`Do you want to IRREVOCABLY DESTROY everything inside your wallet and LOSE ALL YOUR COINS?`, +          ) +        } +      >          <i18n.Translate>reset</i18n.Translate>        </button>        <br /> @@ -262,6 +269,7 @@ function ShowAllCoins({    coins: SplitedCoinInfo;    currencies: { [ex: string]: string };  }) { +  const { i18n } = useTranslationContext();    const [collapsedSpent, setCollapsedSpent] = useState(true);    const [collapsedUnspent, setCollapsedUnspent] = useState(false);    const total = coins.usable.reduce((prev, cur) => prev + cur.denom_value, 0); @@ -372,12 +380,10 @@ export function reload(): void {  function runIntegrationTest() {} -export async function confirmReset(): Promise<void> { -  if ( -    confirm( -      i18n.str`Do you want to IRREVOCABLY DESTROY everything inside your wallet and LOSE ALL YOUR COINS?`, -    ) -  ) { +export async function confirmReset( +  confirmTheResetMessage: string, +): Promise<void> { +  if (confirm(confirmTheResetMessage)) {      await wxApi.resetDb();      window.close();    } diff --git a/packages/taler-wallet-webextension/src/popup/NoBalanceHelp.tsx b/packages/taler-wallet-webextension/src/popup/NoBalanceHelp.tsx index b8b21b24c..dfb99ac6a 100644 --- a/packages/taler-wallet-webextension/src/popup/NoBalanceHelp.tsx +++ b/packages/taler-wallet-webextension/src/popup/NoBalanceHelp.tsx @@ -1,12 +1,13 @@ -import { i18n } from "@gnu-taler/taler-util";  import { h, VNode } from "preact";  import { ButtonBoxWarning, WarningBox } from "../components/styled"; +import { useTranslationContext } from "../context/translation";  export function NoBalanceHelp({    goToWalletManualWithdraw,  }: {    goToWalletManualWithdraw: () => void;  }): VNode { +  const { i18n } = useTranslationContext();    return (      <WarningBox>        <p> diff --git a/packages/taler-wallet-webextension/src/popup/TalerActionFound.tsx b/packages/taler-wallet-webextension/src/popup/TalerActionFound.tsx index 40b76a289..9ac83a578 100644 --- a/packages/taler-wallet-webextension/src/popup/TalerActionFound.tsx +++ b/packages/taler-wallet-webextension/src/popup/TalerActionFound.tsx @@ -19,9 +19,10 @@   * @author Sebastian Javier Marchano (sebasjm)   */ -import { classifyTalerUri, TalerUriType, i18n } from "@gnu-taler/taler-util"; +import { classifyTalerUri, TalerUriType } from "@gnu-taler/taler-util";  import { Fragment, h } from "preact";  import { ButtonPrimary, ButtonSuccess } from "../components/styled"; +import { useTranslationContext } from "../context/translation";  import { actionForTalerUri } from "../utils/index";  export interface Props { @@ -49,6 +50,7 @@ async function navigateTo(url?: string) {  export function TalerActionFound({ url, onDismiss }: Props) {    const uriType = classifyTalerUri(url); +  const { i18n } = useTranslationContext();    return (      <Fragment>        <section> diff --git a/packages/taler-wallet-webextension/src/wallet/AddNewActionView.tsx b/packages/taler-wallet-webextension/src/wallet/AddNewActionView.tsx index 229fab7be..04ed5ec57 100644 --- a/packages/taler-wallet-webextension/src/wallet/AddNewActionView.tsx +++ b/packages/taler-wallet-webextension/src/wallet/AddNewActionView.tsx @@ -1,32 +1,18 @@ -import { classifyTalerUri, TalerUriType, i18n } from "@gnu-taler/taler-util"; +import { classifyTalerUri, TalerUriType } from "@gnu-taler/taler-util";  import { Fragment, h, VNode } from "preact";  import { useState } from "preact/hooks";  import { Button, ButtonSuccess, InputWithLabel } from "../components/styled"; +import { useTranslationContext } from "../context/translation";  import { actionForTalerUri } from "../utils/index";  export interface Props {    onCancel: () => void;  } -function buttonLabelByTalerType(type: TalerUriType): VNode { -  switch (type) { -    case TalerUriType.TalerNotifyReserve: -      return <i18n.Translate>Open reserve page</i18n.Translate>; -    case TalerUriType.TalerPay: -      return <i18n.Translate>Open pay page</i18n.Translate>; -    case TalerUriType.TalerRefund: -      return <i18n.Translate>Open refund page</i18n.Translate>; -    case TalerUriType.TalerTip: -      return <i18n.Translate>Open tip page</i18n.Translate>; -    case TalerUriType.TalerWithdraw: -      return <i18n.Translate>Open withdraw page</i18n.Translate>; -  } -  return <Fragment />; -} -  export function AddNewActionView({ onCancel }: Props): VNode {    const [url, setUrl] = useState("");    const uriType = classifyTalerUri(url); +  const { i18n } = useTranslationContext();    return (      <Fragment> @@ -57,7 +43,21 @@ export function AddNewActionView({ onCancel }: Props): VNode {                chrome.tabs.create({ url: actionForTalerUri(uriType, url) });              }}            > -            {buttonLabelByTalerType(uriType)} +            {(() => { +              switch (uriType) { +                case TalerUriType.TalerNotifyReserve: +                  return <i18n.Translate>Open reserve page</i18n.Translate>; +                case TalerUriType.TalerPay: +                  return <i18n.Translate>Open pay page</i18n.Translate>; +                case TalerUriType.TalerRefund: +                  return <i18n.Translate>Open refund page</i18n.Translate>; +                case TalerUriType.TalerTip: +                  return <i18n.Translate>Open tip page</i18n.Translate>; +                case TalerUriType.TalerWithdraw: +                  return <i18n.Translate>Open withdraw page</i18n.Translate>; +              } +              return <Fragment />; +            })()}            </ButtonSuccess>          )}        </footer> diff --git a/packages/taler-wallet-webextension/src/wallet/BackupPage.tsx b/packages/taler-wallet-webextension/src/wallet/BackupPage.tsx index a5821d48b..39afe8441 100644 --- a/packages/taler-wallet-webextension/src/wallet/BackupPage.tsx +++ b/packages/taler-wallet-webextension/src/wallet/BackupPage.tsx @@ -14,7 +14,7 @@   TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>  */ -import { i18n, Timestamp, Translate } from "@gnu-taler/taler-util"; +import { Timestamp, Translate } from "@gnu-taler/taler-util";  import {    ProviderInfo,    ProviderPaymentPaid, @@ -40,6 +40,7 @@ import {    SmallLightText,    SmallText,  } from "../components/styled"; +import { useTranslationContext } from "../context/translation";  import { useAsyncAsHook } from "../hooks/useAsyncAsHook";  import { Pages } from "../NavigationBar";  import * as wxApi from "../wxApi"; @@ -65,6 +66,7 @@ interface Props {  // }  export function BackupPage({ onAddProvider }: Props): VNode { +  const { i18n } = useTranslationContext();    const status = useAsyncAsHook(wxApi.getBackupInfo);    if (!status) {      return <Loading />; @@ -110,6 +112,7 @@ export function BackupView({    onAddProvider,    onSyncAll,  }: ViewProps): VNode { +  const { i18n } = useTranslationContext();    return (      <Fragment>        <section> @@ -164,6 +167,7 @@ interface TransactionLayoutProps {  }  function BackupLayout(props: TransactionLayoutProps): VNode { +  const { i18n } = useTranslationContext();    const date = !props.timestamp ? undefined : new Date(props.timestamp.t_ms);    const dateStr = date?.toLocaleString([], {      dateStyle: "medium", @@ -205,6 +209,7 @@ function BackupLayout(props: TransactionLayoutProps): VNode {  }  function ExpirationText({ until }: { until: Timestamp }): VNode { +  const { i18n } = useTranslationContext();    return (      <Fragment>        <CenteredText> diff --git a/packages/taler-wallet-webextension/src/wallet/CreateManualWithdraw.tsx b/packages/taler-wallet-webextension/src/wallet/CreateManualWithdraw.tsx index 96644be28..0ee83c265 100644 --- a/packages/taler-wallet-webextension/src/wallet/CreateManualWithdraw.tsx +++ b/packages/taler-wallet-webextension/src/wallet/CreateManualWithdraw.tsx @@ -19,7 +19,7 @@   * @author Sebastian Javier Marchano (sebasjm)   */ -import { AmountJson, Amounts, i18n, Translate } from "@gnu-taler/taler-util"; +import { AmountJson, Amounts } from "@gnu-taler/taler-util";  import { Fragment, h, VNode } from "preact";  import { useState } from "preact/hooks";  import { ErrorMessage } from "../components/ErrorMessage"; @@ -34,6 +34,7 @@ import {    LightText,    LinkPrimary,  } from "../components/styled"; +import { useTranslationContext } from "../context/translation";  export interface Props {    error: string | undefined; @@ -52,6 +53,7 @@ export function CreateManualWithdraw({    onCreate,    onAddExchange,  }: Props): VNode { +  const { i18n } = useTranslationContext();    const exchangeSelectList = Object.keys(exchangeList);    const currencySelectList = Object.values(exchangeList);    const exchangeMap = exchangeSelectList.reduce( diff --git a/packages/taler-wallet-webextension/src/wallet/DepositPage.tsx b/packages/taler-wallet-webextension/src/wallet/DepositPage.tsx index d1d618e9f..a5b5997b3 100644 --- a/packages/taler-wallet-webextension/src/wallet/DepositPage.tsx +++ b/packages/taler-wallet-webextension/src/wallet/DepositPage.tsx @@ -19,7 +19,6 @@ import {    Amounts,    AmountString,    PaytoUri, -  i18n,  } from "@gnu-taler/taler-util";  import { DepositFee } from "@gnu-taler/taler-wallet-core/src/operations/deposits";  import { Fragment, h, VNode } from "preact"; @@ -34,6 +33,7 @@ import {    InputWithLabel,    WarningBox,  } from "../components/styled"; +import { useTranslationContext } from "../context/translation";  import { useAsyncAsHook } from "../hooks/useAsyncAsHook";  import * as wxApi from "../wxApi"; @@ -103,6 +103,7 @@ export function View({    onSend,    onCalculateFee,  }: ViewProps): VNode { +  const { i18n } = useTranslationContext();    const accountMap = createLabelsForBankAccount(knownBankAccounts);    const [accountIdx, setAccountIdx] = useState(0);    const [amount, setAmount] = useState<number | undefined>(undefined); diff --git a/packages/taler-wallet-webextension/src/wallet/ExchangeAddConfirm.tsx b/packages/taler-wallet-webextension/src/wallet/ExchangeAddConfirm.tsx index 1ffca827b..1b40fe78e 100644 --- a/packages/taler-wallet-webextension/src/wallet/ExchangeAddConfirm.tsx +++ b/packages/taler-wallet-webextension/src/wallet/ExchangeAddConfirm.tsx @@ -1,7 +1,7 @@ -import { i18n, Translate } from "@gnu-taler/taler-util";  import { Fragment, h, VNode } from "preact";  import { useState } from "preact/hooks";  import { Button, ButtonSuccess, ButtonWarning } from "../components/styled"; +import { useTranslationContext } from "../context/translation";  import { TermsOfServiceSection } from "../cta/TermsOfServiceSection";  import { useAsyncAsHook } from "../hooks/useAsyncAsHook";  import { buildTermsOfServiceState, TermsState } from "../utils/index"; @@ -77,6 +77,7 @@ export function View({    onConfirm,    onCancel,  }: ViewProps): VNode { +  const { i18n } = useTranslationContext();    const needsReview =      !terms || terms.status === "changed" || terms.status === "new";    const [reviewed, setReviewed] = useState<boolean>(false); diff --git a/packages/taler-wallet-webextension/src/wallet/ExchangeSetUrl.tsx b/packages/taler-wallet-webextension/src/wallet/ExchangeSetUrl.tsx index 7199ce90c..62d7e15b8 100644 --- a/packages/taler-wallet-webextension/src/wallet/ExchangeSetUrl.tsx +++ b/packages/taler-wallet-webextension/src/wallet/ExchangeSetUrl.tsx @@ -1,8 +1,6 @@  import {    canonicalizeBaseUrl, -  i18n,    TalerConfigResponse, -  Translate,  } from "@gnu-taler/taler-util";  import { Fragment, h } from "preact";  import { useEffect, useState } from "preact/hooks"; @@ -14,6 +12,7 @@ import {    LightText,    WarningBox,  } from "../components/styled"; +import { useTranslationContext } from "../context/translation";  export interface Props {    initialValue?: string; @@ -81,6 +80,7 @@ export function ExchangeSetUrlPage({    onVerify,    onConfirm,  }: Props) { +  const { i18n } = useTranslationContext();    const { loading, result, endpoint, updateEndpoint, error } =      useEndpointStatus(initialValue ?? "", onVerify); diff --git a/packages/taler-wallet-webextension/src/wallet/History.tsx b/packages/taler-wallet-webextension/src/wallet/History.tsx index e0a1c588e..ea6057d05 100644 --- a/packages/taler-wallet-webextension/src/wallet/History.tsx +++ b/packages/taler-wallet-webextension/src/wallet/History.tsx @@ -19,7 +19,6 @@ import {    Balance,    NotificationType,    Transaction, -  i18n,  } from "@gnu-taler/taler-util";  import { Fragment, h, VNode } from "preact";  import { useState } from "preact/hooks"; @@ -37,6 +36,7 @@ import {  } from "../components/styled";  import { Time } from "../components/Time";  import { TransactionItem } from "../components/TransactionItem"; +import { useTranslationContext } from "../context/translation";  import { useAsyncAsHook } from "../hooks/useAsyncAsHook";  import { NoBalanceHelp } from "../popup/NoBalanceHelp";  import * as wxApi from "../wxApi"; @@ -51,6 +51,7 @@ export function HistoryPage({    goToWalletManualWithdraw,    goToWalletDeposit,  }: Props): VNode { +  const { i18n } = useTranslationContext();    const balance = useAsyncAsHook(wxApi.getBalance);    const balanceWithoutError = balance?.hasError      ? [] @@ -106,6 +107,7 @@ export function HistoryView({    transactions: Transaction[];    balances: Balance[];  }): VNode { +  const { i18n } = useTranslationContext();    const currencies = balances.map((b) => b.available.split(":")[0]);    const defaultCurrencyIndex = currencies.findIndex( diff --git a/packages/taler-wallet-webextension/src/wallet/ManualWithdrawPage.tsx b/packages/taler-wallet-webextension/src/wallet/ManualWithdrawPage.tsx index d9a1544a7..6d9b9d2b5 100644 --- a/packages/taler-wallet-webextension/src/wallet/ManualWithdrawPage.tsx +++ b/packages/taler-wallet-webextension/src/wallet/ManualWithdrawPage.tsx @@ -19,12 +19,12 @@ import {    AmountJson,    Amounts,    NotificationType, -  i18n,  } from "@gnu-taler/taler-util";  import { h, VNode } from "preact";  import { useState } from "preact/hooks";  import { Loading } from "../components/Loading";  import { LoadingError } from "../components/LoadingError"; +import { useTranslationContext } from "../context/translation";  import { useAsyncAsHook } from "../hooks/useAsyncAsHook";  import { Pages } from "../NavigationBar";  import * as wxApi from "../wxApi"; @@ -51,6 +51,7 @@ export function ManualWithdrawPage({ currency, onCancel }: Props): VNode {    const state = useAsyncAsHook(wxApi.listExchanges, [      NotificationType.ExchangeAdded,    ]); +  const { i18n } = useTranslationContext();    async function doCreate(      exchangeBaseUrl: string, diff --git a/packages/taler-wallet-webextension/src/wallet/ProviderAddPage.tsx b/packages/taler-wallet-webextension/src/wallet/ProviderAddPage.tsx index 6bb5b6836..051aff0b6 100644 --- a/packages/taler-wallet-webextension/src/wallet/ProviderAddPage.tsx +++ b/packages/taler-wallet-webextension/src/wallet/ProviderAddPage.tsx @@ -18,7 +18,6 @@ import {    Amounts,    BackupBackupProviderTerms,    canonicalizeBaseUrl, -  i18n,    Translate,  } from "@gnu-taler/taler-util";  import { Fragment, h, VNode } from "preact"; @@ -32,6 +31,7 @@ import {    LightText,    SmallLightText,  } from "../components/styled"; +import { useTranslationContext } from "../context/translation";  import { queryToSlashConfig } from "../utils/index";  import * as wxApi from "../wxApi"; @@ -90,6 +90,7 @@ export function SetUrlView({    onConfirm,    withError,  }: SetUrlViewProps) { +  const { i18n } = useTranslationContext();    const [value, setValue] = useState<string>(initialValue || "");    const [urlError, setUrlError] = useState(false);    const [name, setName] = useState<string | undefined>(undefined); @@ -190,6 +191,7 @@ export function ConfirmProviderView({    onConfirm,  }: ConfirmProviderViewProps) {    const [accepted, setAccepted] = useState(false); +  const { i18n } = useTranslationContext();    return (      <Fragment> diff --git a/packages/taler-wallet-webextension/src/wallet/ProviderDetailPage.tsx b/packages/taler-wallet-webextension/src/wallet/ProviderDetailPage.tsx index 65049d6b6..066763ef5 100644 --- a/packages/taler-wallet-webextension/src/wallet/ProviderDetailPage.tsx +++ b/packages/taler-wallet-webextension/src/wallet/ProviderDetailPage.tsx @@ -14,7 +14,7 @@   TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>  */ -import { i18n } from "@gnu-taler/taler-util"; +import * as utils from "@gnu-taler/taler-util";  import {    ProviderInfo,    ProviderPaymentStatus, @@ -32,6 +32,7 @@ import {    SmallLightText,  } from "../components/styled";  import { Time } from "../components/Time"; +import { useTranslationContext } from "../context/translation";  import { useAsyncAsHook } from "../hooks/useAsyncAsHook";  import * as wxApi from "../wxApi"; @@ -41,6 +42,7 @@ interface Props {  }  export function ProviderDetailPage({ pid: providerURL, onBack }: Props): VNode { +  const { i18n } = useTranslationContext();    async function getProviderInfo(): Promise<ProviderInfo | null> {      //create a first list of backup info by currency      const status = await wxApi.getBackupInfo(); @@ -100,6 +102,7 @@ export function ProviderView({    onBack,    onExtend,  }: ViewProps): VNode { +  const { i18n } = useTranslationContext();    if (info === null) {      return (        <Fragment> @@ -156,7 +159,7 @@ export function ProviderView({              </p>            </Fragment>          )} -        <p>{descriptionByStatus(info.paymentStatus)}</p> +        <p>{descriptionByStatus(info.paymentStatus, i18n)}</p>          <ButtonPrimary disabled onClick={onExtend}>            <i18n.Translate>Extend</i18n.Translate>          </ButtonPrimary> @@ -219,6 +222,7 @@ export function ProviderView({  }  function Error({ info }: { info: ProviderInfo }): VNode { +  const { i18n } = useTranslationContext();    if (info.lastError) {      return (        <ErrorMessage @@ -267,7 +271,10 @@ function Error({ info }: { info: ProviderInfo }): VNode {    return <Fragment />;  } -function descriptionByStatus(status: ProviderPaymentStatus): VNode { +function descriptionByStatus( +  status: ProviderPaymentStatus, +  i18n: typeof utils.i18n, +): VNode {    switch (status.type) {      case ProviderPaymentType.Paid:      case ProviderPaymentType.TermsChanged: diff --git a/packages/taler-wallet-webextension/src/wallet/ReserveCreated.tsx b/packages/taler-wallet-webextension/src/wallet/ReserveCreated.tsx index 5a54c2e41..526daa7a1 100644 --- a/packages/taler-wallet-webextension/src/wallet/ReserveCreated.tsx +++ b/packages/taler-wallet-webextension/src/wallet/ReserveCreated.tsx @@ -1,7 +1,6 @@  import {    AmountJson,    parsePaytoUri, -  i18n,    Amounts,    segwitMinAmount,    generateFakeSegwitAddress, @@ -10,6 +9,7 @@ import { Fragment, h, VNode } from "preact";  import { BankDetailsByPaytoType } from "../components/BankDetailsByPaytoType";  import { QR } from "../components/QR";  import { ButtonDestructive, WarningBox } from "../components/styled"; +import { useTranslationContext } from "../context/translation";  import { amountToString } from "../utils/index";  export interface Props {    reservePub: string; @@ -26,6 +26,7 @@ export function ReserveCreated({    exchangeBaseUrl,    amount,  }: Props): VNode { +  const { i18n } = useTranslationContext();    const paytoURI = parsePaytoUri(payto);    if (!paytoURI) {      return ( diff --git a/packages/taler-wallet-webextension/src/wallet/Settings.tsx b/packages/taler-wallet-webextension/src/wallet/Settings.tsx index 8456ca550..f806da6a7 100644 --- a/packages/taler-wallet-webextension/src/wallet/Settings.tsx +++ b/packages/taler-wallet-webextension/src/wallet/Settings.tsx @@ -14,9 +14,10 @@   TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>  */ -import { ExchangeListItem, i18n, Translate } from "@gnu-taler/taler-util"; +import { ExchangeListItem } from "@gnu-taler/taler-util";  import { Fragment, h, VNode } from "preact";  import { Checkbox } from "../components/Checkbox"; +import { JustInDevMode } from "../components/JustInDevMode";  import { SelectList } from "../components/SelectList";  import {    DestructiveText, @@ -80,25 +81,12 @@ export function SettingsView({    developerMode,    toggleDeveloperMode,  }: ViewProps): VNode { -  const { lang, supportedLang, changeLanguage } = useTranslationContext(); +  const { i18n, lang, supportedLang, changeLanguage } = useTranslationContext();    return (      <Fragment>        <section>          <h2> -          <i18n.Translate>Display</i18n.Translate> -        </h2> -        <Input> -          <SelectList -            label={<i18n.Translate>Current Language</i18n.Translate>} -            list={supportedLang} -            name="lang" -            value={lang} -            onChange={(v) => changeLanguage(v)} -          /> -        </Input> - -        <h2>            <i18n.Translate>Navigator</i18n.Translate>          </h2>          <Checkbox @@ -206,6 +194,21 @@ export function SettingsView({            enabled={developerMode}            onToggle={toggleDeveloperMode}          /> + +        <JustInDevMode> +          <h2> +            <i18n.Translate>Display</i18n.Translate> +          </h2> +          <Input> +            <SelectList +              label={<i18n.Translate>Current Language</i18n.Translate>} +              list={supportedLang} +              name="lang" +              value={lang} +              onChange={(v) => changeLanguage(v)} +            /> +          </Input> +        </JustInDevMode>        </section>      </Fragment>    ); diff --git a/packages/taler-wallet-webextension/src/wallet/Transaction.tsx b/packages/taler-wallet-webextension/src/wallet/Transaction.tsx index cae70d60d..fc54d3c3a 100644 --- a/packages/taler-wallet-webextension/src/wallet/Transaction.tsx +++ b/packages/taler-wallet-webextension/src/wallet/Transaction.tsx @@ -17,7 +17,6 @@  import {    AmountLike,    Amounts, -  i18n,    NotificationType,    parsePaytoUri,    Transaction, @@ -46,6 +45,7 @@ import {    WarningBox,  } from "../components/styled";  import { Time } from "../components/Time"; +import { useTranslationContext } from "../context/translation";  import { useAsyncAsHook } from "../hooks/useAsyncAsHook";  import * as wxApi from "../wxApi"; @@ -54,6 +54,7 @@ interface Props {    goToWalletHistory: (currency?: string) => void;  }  export function TransactionPage({ tid, goToWalletHistory }: Props): VNode { +  const { i18n } = useTranslationContext();    async function getTransaction(): Promise<Transaction> {      const res = await wxApi.getTransactions();      const ts = res.transactions.filter((t) => t.transactionId === tid); @@ -127,6 +128,8 @@ export function TransactionView({      }    } +  const { i18n } = useTranslationContext(); +    function TransactionTemplate({      children,    }: { diff --git a/packages/taler-wallet-webextension/src/wallet/Welcome.tsx b/packages/taler-wallet-webextension/src/wallet/Welcome.tsx index 7b28cb742..36b4b13fc 100644 --- a/packages/taler-wallet-webextension/src/wallet/Welcome.tsx +++ b/packages/taler-wallet-webextension/src/wallet/Welcome.tsx @@ -20,10 +20,11 @@   * @author sebasjm   */ -import { i18n, WalletDiagnostics } from "@gnu-taler/taler-util"; +import { WalletDiagnostics } from "@gnu-taler/taler-util";  import { Fragment, h, VNode } from "preact";  import { Checkbox } from "../components/Checkbox";  import { Diagnostics } from "../components/Diagnostics"; +import { useTranslationContext } from "../context/translation";  import { useDiagnostics } from "../hooks/useDiagnostics";  import { useExtendedPermissions } from "../hooks/useExtendedPermissions"; @@ -52,6 +53,7 @@ export function View({    diagnostics,    timedOut,  }: ViewProps): VNode { +  const { i18n } = useTranslationContext();    return (      <Fragment>        <h1> | 
