From d1a7d93be22d1b3cffef42651a4eceefbe03f8d3 Mon Sep 17 00:00:00 2001 From: Wojciech Maj Date: Tue, 3 Nov 2020 13:08:23 +0100 Subject: [PATCH] Support synchronous and static languageFiles --- README.md | 27 ++++++++++++++++++++------- src/useTranslation.js | 18 ++++++++++++++++-- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 0d30b1b..284792d 100644 --- a/README.md +++ b/README.md @@ -89,13 +89,26 @@ If `` attribute is not provided the following happens: Wrap your app in ``. -Define `languageFiles` prop that contains an object of functions that return promises: - -```js -{ - 'de-DE': () => import('./myLanguageFile.json'), -} -``` +Define `languageFiles` prop that contains an object of: + +* functions that return promises: + ```js + { + 'de-DE': () => import('./myLanguageFile.json'), + } + ``` +* functions that return language files: + ```js + { + 'de-DE': () => myLanguageFile, + } + ``` +* language files: + ```js + { + 'de-DE': myLanguageFile, + } + ``` ### Usage of the `T` component: diff --git a/src/useTranslation.js b/src/useTranslation.js index 67d2129..83a844c 100644 --- a/src/useTranslation.js +++ b/src/useTranslation.js @@ -2,8 +2,22 @@ import { useContext, useState, useEffect } from 'react'; import { Context } from './TProvider'; +function resolveLanguageFile(getterOrLanguageFile) { + if (!(getterOrLanguageFile instanceof Function)) { + return Promise.resolve(getterOrLanguageFile); + } + + const promiseOrLanguageFile = getterOrLanguageFile(); + + if (!(promiseOrLanguageFile instanceof Promise)) { + return Promise.resolve(promiseOrLanguageFile); + } + + return promiseOrLanguageFile; +} + function getTranslatedString(string, languageFiles, locale) { - return languageFiles[locale]() + return resolveLanguageFile(languageFiles[locale]) .then((languageFile) => { if (typeof languageFile[string] === 'string') { return languageFile[string]; @@ -13,7 +27,7 @@ function getTranslatedString(string, languageFiles, locale) { }) .catch(() => { // eslint-disable-next-line no-console - console.error(`Unable to load locale: ${locale}`); + console.error(`Failed to load locale: ${locale}`); return string; }); } -- 2.51.2