From e4919e2e6ca8778464fd750398b9a289a8eff751 Mon Sep 17 00:00:00 2001 From: Christopher Chedeau Date: Fri, 31 Jan 2020 21:06:06 +0000 Subject: [PATCH] Replace i18n by a custom implementation (#638) There are two problems with the current localization strategy: - We download the translations on-demand, which means that it does a serial roundtrip for nothing. - withTranslation helper actually renders the app 3 times on startup, instead of once (I haven't tried to debug it) --- package-lock.json | 47 ---------- package.json | 4 - src/actions/actionCanvas.tsx | 5 +- src/actions/actionExport.tsx | 9 +- src/actions/actionProperties.tsx | 17 ++-- src/actions/manager.tsx | 10 +- src/actions/types.ts | 3 - src/components/ColorPicker.tsx | 8 +- src/components/ExportDialog.tsx | 6 +- src/components/LanguageList.tsx | 10 +- src/components/StoredScenesList.test.tsx | 4 - src/components/StoredScenesList.tsx | 4 +- src/i18n.ts | 92 +++++++++++++------ src/index.tsx | 34 ++----- .../translation.json => src/locales/de.json | 0 .../translation.json => src/locales/en.json | 0 .../translation.json => src/locales/es.json | 0 .../translation.json => src/locales/fr.json | 0 .../translation.json => src/locales/pt.json | 0 .../translation.json => src/locales/ru.json | 0 src/scene/data.ts | 15 ++- 21 files changed, 101 insertions(+), 167 deletions(-) rename public/locales/de/translation.json => src/locales/de.json (100%) rename public/locales/en/translation.json => src/locales/en.json (100%) rename public/locales/es/translation.json => src/locales/es.json (100%) rename public/locales/fr/translation.json => src/locales/fr.json (100%) rename public/locales/pt/translation.json => src/locales/pt.json (100%) rename public/locales/ru/translation.json => src/locales/ru.json (100%) diff --git a/package-lock.json b/package-lock.json index 45070642..dd8d564a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1681,15 +1681,6 @@ "csstype": "^2.2.0" } }, - "@types/react-color": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/react-color/-/react-color-3.0.1.tgz", - "integrity": "sha512-J6mYm43Sid9y+OjZ7NDfJ2VVkeeuTPNVImNFITgQNXodHteKfl/t/5pAR5Z9buodZ2tCctsZjgiMlQOpfntakw==", - "dev": true, - "requires": { - "@types/react": "*" - } - }, "@types/react-dom": { "version": "16.9.5", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.5.tgz", @@ -7123,14 +7114,6 @@ } } }, - "html-parse-stringify2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-parse-stringify2/-/html-parse-stringify2-2.0.1.tgz", - "integrity": "sha1-3FZwtyksoVi3vJFsmmc1rIhyg0o=", - "requires": { - "void-elements": "^2.0.1" - } - }, "html-webpack-plugin": { "version": "4.0.0-beta.5", "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.5.tgz", @@ -7412,14 +7395,6 @@ } } }, - "i18next": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-19.1.0.tgz", - "integrity": "sha512-ISbmukX4L6Dz0QoH9+EW1AnBw7j+NRLoMu9uLPMaNSSTP9Eie9/oUL0dOyWX15baB3gYOpkHJpGZRHOqcnl0ew==", - "requires": { - "@babel/runtime": "^7.3.1" - } - }, "i18next-browser-languagedetector": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-4.0.1.tgz", @@ -7428,14 +7403,6 @@ "@babel/runtime": "^7.5.5" } }, - "i18next-xhr-backend": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/i18next-xhr-backend/-/i18next-xhr-backend-3.2.2.tgz", - "integrity": "sha512-OtRf2Vo3IqAxsttQbpjYnmMML12IMB5e0fc5B7qKJFLScitYaXa1OhMX0n0X/3vrfFlpHL9Ro/H+ps4Ej2j7QQ==", - "requires": { - "@babel/runtime": "^7.5.5" - } - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -12928,15 +12895,6 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.4.tgz", "integrity": "sha512-ueZzLmHltszTshDMwyfELDq8zOA803wQ1ZuzCccXa1m57k1PxSHfflPD5W9YIiTXLs0JTLzoj6o1LuM5N6zzNA==" }, - "react-i18next": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.3.1.tgz", - "integrity": "sha512-S/CWHcnew1lXo8HeniGhBU5kTmPhZ4w4rtA4m/gDN07soCtKKYSAcLNm7zhwjI2OSR4Skd0vOtzNp/FzEEjxIw==", - "requires": { - "@babel/runtime": "^7.3.1", - "html-parse-stringify2": "2.0.1" - } - }, "react-is": { "version": "16.12.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", @@ -15969,11 +15927,6 @@ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" - }, "w3c-hr-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", diff --git a/package.json b/package.json index 0d677322..99e1a265 100644 --- a/package.json +++ b/package.json @@ -7,13 +7,10 @@ ], "dependencies": { "browser-nativefs": "0.2.0", - "i18next": "19.1.0", "i18next-browser-languagedetector": "4.0.1", - "i18next-xhr-backend": "3.2.2", "nanoid": "2.1.10", "react": "16.12.0", "react-dom": "16.12.0", - "react-i18next": "11.3.1", "react-scripts": "3.3.0", "roughjs": "4.0.4" }, @@ -24,7 +21,6 @@ "@types/jest": "25.1.0", "@types/nanoid": "2.1.0", "@types/react": "16.9.19", - "@types/react-color": "3.0.1", "@types/react-dom": "16.9.5", "enzyme": "3.11.0", "enzyme-adapter-react-16": "1.15.2", diff --git a/src/actions/actionCanvas.tsx b/src/actions/actionCanvas.tsx index c71f5498..a09c0018 100644 --- a/src/actions/actionCanvas.tsx +++ b/src/actions/actionCanvas.tsx @@ -4,13 +4,14 @@ import { ColorPicker } from "../components/ColorPicker"; import { getDefaultAppState } from "../appState"; import { trash } from "../components/icons"; import { ToolButton } from "../components/ToolButton"; +import { t } from "../i18n"; export const actionChangeViewBackgroundColor: Action = { name: "changeViewBackgroundColor", perform: (elements, appState, value) => { return { appState: { ...appState, viewBackgroundColor: value } }; }, - PanelComponent: ({ appState, updateData, t }) => { + PanelComponent: ({ appState, updateData }) => { return (
( + PanelComponent: ({ updateData }) => ( { return { appState: { ...appState, name: value } }; }, - PanelComponent: ({ appState, updateData, t }) => ( + PanelComponent: ({ appState, updateData }) => ( { return { appState: { ...appState, exportBackground: value } }; }, - PanelComponent: ({ appState, updateData, t }) => ( + PanelComponent: ({ appState, updateData }) => (