diff --git a/awx/ui/src/App.js b/awx/ui/src/App.js index 5f35ecfbc2..21ca5a0b4f 100644 --- a/awx/ui/src/App.js +++ b/awx/ui/src/App.js @@ -28,7 +28,7 @@ import { getLanguageWithoutRegionCode } from 'util/language'; import Metrics from 'screens/Metrics'; import SubscriptionEdit from 'screens/Setting/Subscription/SubscriptionEdit'; import useTitle from 'hooks/useTitle'; -import { dynamicActivate, locales } from './i18nLoader'; +import { dynamicActivate } from './i18nLoader'; import getRouteConfig from './routeConfig'; import { SESSION_REDIRECT_URL } from './constants'; @@ -139,16 +139,15 @@ export function ProtectedRoute({ children, ...rest }) { function App() { const history = useHistory(); const { hash, search, pathname } = useLocation(); - let language = getLanguageWithoutRegionCode(navigator); - if (!Object.keys(locales).includes(language)) { - // If there isn't a string catalog available for the browser's - // preferred language, default to one that has strings. - language = 'en'; - } + const searchParams = Object.fromEntries(new URLSearchParams(search)); + const pseudolocalization = + searchParams.pseudolocalization === 'true' || false; + const language = + searchParams.lang || getLanguageWithoutRegionCode(navigator) || 'en'; useEffect(() => { - dynamicActivate(language); - }, [language]); + dynamicActivate(language, pseudolocalization); + }, [language, pseudolocalization]); useTitle(); diff --git a/awx/ui/src/i18nLoader.js b/awx/ui/src/i18nLoader.js index 4c039b406f..9662f3592a 100644 --- a/awx/ui/src/i18nLoader.js +++ b/awx/ui/src/i18nLoader.js @@ -27,8 +27,21 @@ i18n.loadLocaleData({ * We do a dynamic import of just the catalog that we need * @param locale any locale string */ -export async function dynamicActivate(locale) { +export async function dynamicActivate(locale, pseudolocalization = false) { const { messages } = await import(`./locales/${locale}/messages`); + + if (pseudolocalization) { + Object.keys(messages).forEach((key) => { + if (Array.isArray(messages[key])) { + // t`Foo ${param}` -> ["Foo ", ['param']] => [">>", "Foo ", ['param'], "<<"] + messages[key] = ['»', ...messages[key], '«']; + } else { + // simple string + messages[key] = `»${messages[key]}«`; + } + }); + } + i18n.load(locale, messages); i18n.activate(locale); }