mirror of
https://github.com/grafana/grafana.git
synced 2025-02-13 00:55:47 -06:00
* I18N: Add Core Lingui framework for translating the UI * Make FieldSet accept ReactNode for the label, so it can be translated * Translate a phrase in the User profile edit form * Translate phrase * run lingui compile before webpack builds * init i18n more lazily * i1n:compile in drone lint step * wip for getting tests to work * Use mock lingui/macros because its too hard to use the real macros in Jest... * mock messages for tests * use specific lingui version * add comment for test helper * we actually don't need the i18n setup in tests because we mock out <Trans /> * update package.json * remove unneded imports * revert back babel core version * Create a I18nProvider wrapper
45 lines
1.4 KiB
TypeScript
45 lines
1.4 KiB
TypeScript
import React, { useState } from 'react';
|
|
import { I18n, i18n } from '@lingui/core';
|
|
import { I18nProvider as LinguiI18nProvider } from '@lingui/react';
|
|
|
|
import { messages } from '../../locales/en/messages';
|
|
|
|
let i18nInstance: I18n;
|
|
|
|
export function getI18n(locale = 'en') {
|
|
if (i18nInstance) {
|
|
return i18nInstance;
|
|
}
|
|
|
|
i18n.load(locale, messages);
|
|
|
|
// Browser support for Intl.PluralRules is good and covers what we support in .browserlistrc,
|
|
// but because this could potentially be in a the critical path of loading the frontend lets
|
|
// be extra careful
|
|
// If this isnt loaded, Lingui will log a warning and plurals will not be translated correctly.
|
|
const supportsPluralRules = 'Intl' in window && 'PluralRules' in Intl;
|
|
if (supportsPluralRules) {
|
|
const pluralsOrdinal = new Intl.PluralRules(locale, { type: 'ordinal' });
|
|
const pluralsCardinal = new Intl.PluralRules(locale, { type: 'cardinal' });
|
|
i18n.loadLocaleData(locale, {
|
|
plurals(count: number, ordinal: boolean) {
|
|
return (ordinal ? pluralsOrdinal : pluralsCardinal).select(count);
|
|
},
|
|
});
|
|
}
|
|
|
|
i18n.activate(locale);
|
|
i18nInstance = i18n;
|
|
|
|
return i18nInstance;
|
|
}
|
|
|
|
interface I18nProviderProps {
|
|
children: React.ReactNode;
|
|
}
|
|
export function I18nProvider({ children }: I18nProviderProps) {
|
|
const [i18nRef] = useState(() => getI18n());
|
|
|
|
return <LinguiI18nProvider i18n={i18nRef}>{children}</LinguiI18nProvider>;
|
|
}
|