@dayanulanov/i18n-light 0.1.7 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +145 -0
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# @dayanulanov/i18n-light
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+

|
|
5
|
+

|
|
6
|
+

|
|
7
|
+
|
|
8
|
+
**Ultra-lightweight** (< 400 bytes gzipped) и **полностью типобезопасная** библиотека интернационализации (i18n) для JavaScript/TypeScript. Без зависимостей. Без лишнего.
|
|
9
|
+
|
|
10
|
+
## Особенности
|
|
11
|
+
|
|
12
|
+
- 🪶 **Нано-размер**: менее 1 КБ в minified + gzip виде
|
|
13
|
+
- 🛡️ **Типобезопасность**
|
|
14
|
+
- Автодополнение ключей перевода
|
|
15
|
+
- Проверка ключей на этапе компиляции
|
|
16
|
+
- 🚀 **Ноль зависимостей**
|
|
17
|
+
- Работает в Browser Node.js Bun Deno Edge-runtimes
|
|
18
|
+
- 🔄 **Динамическая загрузка**
|
|
19
|
+
- Подгрузка новых локалей во время выполнения
|
|
20
|
+
- 🧩 **Интерполяция**
|
|
21
|
+
- Поддержка переменных через `{placeholder}`
|
|
22
|
+
- 🌍 **Fallback-локаль**
|
|
23
|
+
- Автоматический откат на резервную локаль при отсутствии перевода
|
|
24
|
+
|
|
25
|
+
## Установка
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# pnpm
|
|
29
|
+
pnpm add @dayanulanov/i18n-light
|
|
30
|
+
|
|
31
|
+
# npm
|
|
32
|
+
npm install @dayanulanov/i18n-light
|
|
33
|
+
|
|
34
|
+
# yarn
|
|
35
|
+
yarn add @dayanulanov/i18n-light
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Быстрый пример
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
import { createI18n } from '@dayanulanov/i18n-light';
|
|
42
|
+
|
|
43
|
+
const messages = {
|
|
44
|
+
en: {
|
|
45
|
+
hello: 'Hello {name}!'
|
|
46
|
+
goodbye: 'Goodbye!'
|
|
47
|
+
}
|
|
48
|
+
ru: {
|
|
49
|
+
hello: 'Привет {name}!'
|
|
50
|
+
goodbye: 'До свидания!'
|
|
51
|
+
}
|
|
52
|
+
fr: {
|
|
53
|
+
hello: 'Bonjour {name} !'
|
|
54
|
+
}
|
|
55
|
+
} as const;
|
|
56
|
+
|
|
57
|
+
const i18n = createI18n({
|
|
58
|
+
locale: 'ru'
|
|
59
|
+
fallbackLocale: 'en'
|
|
60
|
+
messages
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// Типобезопасный вызов
|
|
64
|
+
i18n.t('hello' { name: 'Даян' }); // → \Привет Даян!\
|
|
65
|
+
i18n.t('goodbye'); // → \До свидания!\
|
|
66
|
+
|
|
67
|
+
// Переключение локали
|
|
68
|
+
i18n.setLocale('en');
|
|
69
|
+
i18n.t('hello' { name: 'Dayan' }); // → \Hello Dayan!\
|
|
70
|
+
|
|
71
|
+
// Если перевода нет — используется fallback
|
|
72
|
+
i18n.setLocale('fr');
|
|
73
|
+
i18n.t('goodbye'); // → \Goodbye!\ (из en)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Основные методы
|
|
77
|
+
|
|
78
|
+
1. `i18n.t(key variables? locale?)`
|
|
79
|
+
- Перевод с опциональной интерполяцией и переопределением локали
|
|
80
|
+
2. `i18n.setLocale('en')`
|
|
81
|
+
- Сменить текущую локаль
|
|
82
|
+
3. `i18n.getLocale()`
|
|
83
|
+
- Получить текущую локаль
|
|
84
|
+
4. `i18n.loadLocale('es' { hello: '¡Hola!' })`
|
|
85
|
+
- Добавить или расширить локаль во время выполнения
|
|
86
|
+
|
|
87
|
+
## Динамическая загрузка локалей
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
// Ленивое подгружение переводов по запросу
|
|
91
|
+
fetch('/locales/es.json')
|
|
92
|
+
.then(r => r.json())
|
|
93
|
+
.then(data => {
|
|
94
|
+
i18n.loadLocale('es' data);
|
|
95
|
+
i18n.setLocale('es');
|
|
96
|
+
});
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Полная типобезопасность
|
|
100
|
+
|
|
101
|
+
- TypeScript знает какие ключи доступны для каждой локали:
|
|
102
|
+
```ts
|
|
103
|
+
i18n.t('hello'); // OK
|
|
104
|
+
i18n.t('goodbye'); // OK
|
|
105
|
+
// i18n.t('unknown'); // Ошибка компиляции!
|
|
106
|
+
```
|
|
107
|
+
- Если добавить новую локаль через `loadLocale` типы обновятся после перезапуска TypeScript.
|
|
108
|
+
|
|
109
|
+
## Примеры использования
|
|
110
|
+
|
|
111
|
+
### 1. React + Vite
|
|
112
|
+
```ts
|
|
113
|
+
import { createI18n } from '@dayanulanov/i18n-light';
|
|
114
|
+
import { createContext useContext } from 'react';
|
|
115
|
+
|
|
116
|
+
const i18n = createI18n({ locale: 'en' messages: { en: {} ru: {} } });
|
|
117
|
+
const I18nContext = createContext(i18n);
|
|
118
|
+
|
|
119
|
+
export function App() {
|
|
120
|
+
const { t } = useContext(I18nContext);
|
|
121
|
+
return <h1>{t('hello' { name: 'World' })}</h1>;
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### 2. Node.js / Express
|
|
126
|
+
```ts
|
|
127
|
+
import express from 'express';
|
|
128
|
+
import { createI18n } from '@dayanulanov/i18n-light';
|
|
129
|
+
|
|
130
|
+
const app = express();
|
|
131
|
+
const i18n = createI18n({ locale: 'en' fallbackLocale: 'en' messages: { en: {} ru: {} } });
|
|
132
|
+
|
|
133
|
+
app.get('/greeting' (req res) => {
|
|
134
|
+
const locale = req.query.lang as string || 'en';
|
|
135
|
+
i18n.setLocale(locale);
|
|
136
|
+
res.send(i18n.t('hello' { name: req.query.name || 'Guest' }));
|
|
137
|
+
});
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Лицензия
|
|
141
|
+
MIT License
|
|
142
|
+
|
|
143
|
+
## Автор
|
|
144
|
+
Даян Уланов
|
|
145
|
+
Если библиотека оказалась полезной — поставьте ⭐ на GitHub!
|