feat: add i18n - dict, en\ru, state
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
import { getLocale, initLocale, setLocale } from './locale.svelte';
|
||||
import { interpolate, t } from './t';
|
||||
import { ru } from './ru';
|
||||
|
||||
type Store = Record<string, string>;
|
||||
|
||||
function stubStorage(): { store: Store } {
|
||||
const store: Store = {};
|
||||
vi.stubGlobal('localStorage', {
|
||||
getItem: (k: string) => (k in store ? store[k] : null),
|
||||
setItem: (k: string, v: string) => {
|
||||
store[k] = v;
|
||||
}
|
||||
});
|
||||
vi.stubGlobal('window', {});
|
||||
return { store };
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
setLocale('ru');
|
||||
delete (ru.home as Record<string, string>).onlyRuKey;
|
||||
vi.unstubAllGlobals();
|
||||
});
|
||||
|
||||
describe('t', () => {
|
||||
it('возвращает строку по точечному пути активной локали', () => {
|
||||
expect(t('header.workspace')).toBe('Рабочая область');
|
||||
setLocale('en');
|
||||
expect(t('header.catalog')).toBe('Catalog');
|
||||
});
|
||||
|
||||
it('фолбэк на базовую локаль, если в активной нет ключа', () => {
|
||||
(ru.home as Record<string, string>).onlyRuKey = 'Только русская строка';
|
||||
setLocale('en');
|
||||
expect(t('home.onlyRuKey')).toBe('Только русская строка');
|
||||
});
|
||||
|
||||
it('неизвестный путь возвращает сам путь', () => {
|
||||
expect(t('no.such.key')).toBe('no.such.key');
|
||||
});
|
||||
});
|
||||
|
||||
describe('interpolate', () => {
|
||||
it('подставляет переменные в шаблон', () => {
|
||||
expect(interpolate('Шаг {n} из {total}', { n: 2, total: 5 })).toBe('Шаг 2 из 5');
|
||||
});
|
||||
|
||||
it('оставляет плейсхолдер без переменной как есть', () => {
|
||||
expect(interpolate('Привет, {name}!', {})).toBe('Привет, {name}!');
|
||||
});
|
||||
|
||||
it('без переменных возвращает строку без изменений', () => {
|
||||
expect(interpolate('Просто текст')).toBe('Просто текст');
|
||||
});
|
||||
});
|
||||
|
||||
describe('персист локали', () => {
|
||||
it('initLocale читает сохранённый выбор', () => {
|
||||
const { store } = stubStorage();
|
||||
store['locale'] = 'en';
|
||||
initLocale();
|
||||
expect(getLocale()).toBe('en');
|
||||
});
|
||||
|
||||
it('initLocale игнорирует мусор в хранилище', () => {
|
||||
const { store } = stubStorage();
|
||||
store['locale'] = 'fr';
|
||||
initLocale();
|
||||
expect(getLocale()).toBe('ru');
|
||||
});
|
||||
|
||||
it('setLocale сохраняет выбор в localStorage', () => {
|
||||
const { store } = stubStorage();
|
||||
initLocale();
|
||||
setLocale('en');
|
||||
expect(store['locale']).toBe('en');
|
||||
expect(getLocale()).toBe('en');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user