3
import { get } from 'lodash-es';
4
import { cookies } from 'next/headers';
5
import { existsSync, readFileSync } from 'node:fs';
6
import { join } from 'node:path';
8
import { DEFAULT_LANG, LOBE_LOCALE_COOKIE } from '@/const/locale';
9
import { Locales, NS, normalizeLocale } from '@/locales/resources';
10
import { isDev } from '@/utils/env';
12
export const getLocale = async (hl?: string): Promise<Locales> => {
13
if (hl) return normalizeLocale(hl) as Locales;
14
const cookieStore = cookies();
15
const defaultLang = cookieStore.get(LOBE_LOCALE_COOKIE);
16
return (defaultLang?.value || DEFAULT_LANG) as Locales;
19
export const translation = async (ns: NS = 'common', hl?: string) => {
21
const lng = await getLocale(hl);
23
let filepath = join(process.cwd(), `locales/${normalizeLocale(lng)}/${ns}.json`);
24
const isExist = existsSync(filepath);
28
`locales/${normalizeLocale(isDev ? 'zh-CN' : DEFAULT_LANG)}/${ns}.json`,
30
const file = readFileSync(filepath, 'utf8');
31
i18ns = JSON.parse(file);
33
console.error('Error while reading translation file', e);
38
t: (key: string, options: { [key: string]: string } = {}) => {
39
if (!i18ns) return key;
40
let content = get(i18ns, key);
41
if (!content) return key;
43
Object.entries(options).forEach(([key, value]) => {
44
content = content.replace(`{{${key}}}`, value);