@tnet-store/i18n-stock 1.357.0 → 1.359.0
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 +171 -34
- package/dist/__generated__/keys.d.ts +1 -1
- package/dist/locales/en.json +5 -3
- package/dist/locales/zh-CN.json +13 -11
- package/dist/locales/zh-HK.json +13 -11
- package/dist/locales/zh-TW.json +13 -11
- package/locales/en.json +5 -3
- package/locales/zh-CN.json +13 -11
- package/locales/zh-HK.json +13 -11
- package/locales/zh-TW.json +13 -11
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,17 +1,148 @@
|
|
|
1
|
-
# @tnet-
|
|
1
|
+
# @tnet-store/i18n-stock
|
|
2
2
|
|
|
3
3
|
> Shared **i18n package** cho hệ thống web & mobile apps của Trinity Net Technology.
|
|
4
4
|
> Dùng để đồng bộ key/value translations (multi-language) và cung cấp API/React hook để thao tác thuận tiện.
|
|
5
5
|
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
+
## 🚀 QUAN TRỌNG: Hướng dẫn tạo key mới và quy trình merge
|
|
9
|
+
|
|
10
|
+
### 1. Setup ban đầu
|
|
11
|
+
|
|
12
|
+
Khi pull source code về, **nhớ chạy yarn trước**:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
git pull origin main
|
|
16
|
+
yarn install
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### 2. Tạo branch mới
|
|
20
|
+
|
|
21
|
+
Khi update/thêm ngôn ngữ, checkout nhánh mới hoặc nhánh đã có theo format:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# Tạo nhánh mới
|
|
25
|
+
git checkout -b feat/add-new-translations
|
|
26
|
+
# hoặc
|
|
27
|
+
git checkout -b fix/update-missing-keys
|
|
28
|
+
|
|
29
|
+
# Hoặc checkout nhánh đã có
|
|
30
|
+
git checkout feat/xxx
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### 3. Tạo key mới trong locales
|
|
34
|
+
|
|
35
|
+
#### Bước 1: Thêm key vào `locales/en.json` (file gốc)
|
|
36
|
+
|
|
37
|
+
Mở file `locales/en.json` và thêm key mới theo cấu trúc nested:
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"button": {
|
|
42
|
+
"newKey": "New Button Text"
|
|
43
|
+
},
|
|
44
|
+
"common": {
|
|
45
|
+
"newMessage": "New message"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Lưu ý**:
|
|
51
|
+
- File `en.json` là file gốc, tất cả keys phải được định nghĩa ở đây trước
|
|
52
|
+
- Sử dụng cấu trúc nested (ví dụ: `"section.subsection.key"`)
|
|
53
|
+
- Key phải là camelCase hoặc kebab-case
|
|
54
|
+
|
|
55
|
+
#### Bước 2: Thêm translation tương ứng vào các file locale khác
|
|
56
|
+
|
|
57
|
+
Sau khi thêm vào `en.json`, cần thêm translation vào các file:
|
|
58
|
+
- `locales/zh-CN.json` (Chinese Simplified)
|
|
59
|
+
- `locales/zh-TW.json` (Chinese Traditional - Taiwan)
|
|
60
|
+
- `locales/zh-HK.json` (Chinese Traditional - Hong Kong)
|
|
61
|
+
|
|
62
|
+
**Ví dụ**: Nếu thêm `"button.newKey": "New Button Text"` vào `en.json`, thì cần thêm:
|
|
63
|
+
- `zh-CN.json`: `"button.newKey": "新按钮文本"`
|
|
64
|
+
- `zh-TW.json`: `"button.newKey": "新按鈕文本"`
|
|
65
|
+
- `zh-HK.json`: `"button.newKey": "新按鈕文本"`
|
|
66
|
+
|
|
67
|
+
#### Bước 3: Kiểm tra translations
|
|
68
|
+
|
|
69
|
+
Chạy script để kiểm tra tất cả locales đã đầy đủ:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
yarn check:i18n:all
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Script này sẽ:
|
|
76
|
+
- Kiểm tra tất cả keys trong `en.json` đã có trong các locale khác chưa
|
|
77
|
+
- Kiểm tra placeholders (ví dụ: `{{count}}`) có khớp nhau không
|
|
78
|
+
- Báo lỗi nếu thiếu key hoặc placeholder không khớp
|
|
79
|
+
|
|
80
|
+
#### Bước 4: Generate keys và build
|
|
81
|
+
|
|
82
|
+
Sau khi thêm key, generate lại type-safe keys:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
yarn gen:keys
|
|
86
|
+
# hoặc build toàn bộ
|
|
87
|
+
yarn build
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### 4. Commit code
|
|
91
|
+
|
|
92
|
+
Sau khi thay đổi, commit với format chuẩn:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
git commit -m "feat: add new translation keys for checkout flow"
|
|
96
|
+
# hoặc
|
|
97
|
+
git commit -m "fix: update missing translations in zh-CN"
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**Lưu ý quan trọng**:
|
|
101
|
+
- Sử dụng prefix `feat:` cho tính năng mới (thêm key mới)
|
|
102
|
+
- Sử dụng prefix `fix:` cho sửa lỗi (sửa translation, thêm key thiếu)
|
|
103
|
+
- Mục đích: tránh version tăng không kiểm soát khi merge vào main
|
|
104
|
+
- CI sẽ tự động phân tích commit message và quyết định version bump (patch/minor/major)
|
|
105
|
+
|
|
106
|
+
### 5. Push và tạo Pull Request
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
git push origin feat/xxx
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Sau đó tạo PR trên GitHub và merge vào `main`.
|
|
113
|
+
|
|
114
|
+
### 6. CI tự động build và publish
|
|
115
|
+
|
|
116
|
+
Sau khi merge vào `main`, GitHub Actions sẽ **tự động**:
|
|
117
|
+
- ✅ Chạy semantic-release
|
|
118
|
+
- ✅ Phân tích commit messages để quyết định version bump
|
|
119
|
+
- ✅ Build package
|
|
120
|
+
- ✅ Publish lên npm với version mới
|
|
121
|
+
- ✅ Tạo GitHub release và CHANGELOG
|
|
122
|
+
|
|
123
|
+
**Không cần** làm gì thêm, chỉ cần đợi CI chạy xong!
|
|
124
|
+
|
|
125
|
+
### 7. Cập nhật package trong app/web
|
|
126
|
+
|
|
127
|
+
Sau khi CI publish thành công (thường mất 2-3 phút), vào project `app/web` và cập nhật:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
# Với npm
|
|
131
|
+
npm install @tnet-store/i18n-stock@latest
|
|
132
|
+
|
|
133
|
+
# Với yarn
|
|
134
|
+
yarn add @tnet-store/i18n-stock@latest
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
8
139
|
## ✨ Tính năng
|
|
9
140
|
|
|
10
141
|
- 📦 **Centralized translations**: dùng chung `locales/*.json` cho cả web (React) và app (React Native).
|
|
11
142
|
- 🔑 **Type-safe keys**: auto-generate type từ `en.json` → autocomplete khi gọi `t()`.
|
|
12
143
|
- ⚡ **React hooks**: có sẵn `useT()` để dễ dùng trong component.
|
|
13
144
|
- 🔄 **Hot language switch**: hỗ trợ `i18next.changeLanguage()` runtime.
|
|
14
|
-
- 🚀 **CI/CD ready**: publish tự động qua GitHub Actions khi
|
|
145
|
+
- 🚀 **CI/CD ready**: publish tự động qua GitHub Actions khi merge vào main.
|
|
15
146
|
|
|
16
147
|
---
|
|
17
148
|
|
|
@@ -20,9 +151,9 @@
|
|
|
20
151
|
Package được publish public trên npm:
|
|
21
152
|
|
|
22
153
|
```bash
|
|
23
|
-
yarn add @tnet-
|
|
154
|
+
yarn add @tnet-store/i18n-stock@latest
|
|
24
155
|
# hoặc npm
|
|
25
|
-
npm install @tnet-
|
|
156
|
+
npm install @tnet-store/i18n-stock@latest
|
|
26
157
|
```
|
|
27
158
|
|
|
28
159
|
---
|
|
@@ -34,7 +165,7 @@ npm install @tnet-i18n/i18n
|
|
|
34
165
|
Trong **entry file** của app (ví dụ `main.tsx` với React, `App.tsx` với React Native):
|
|
35
166
|
|
|
36
167
|
```ts
|
|
37
|
-
import { initI18n } from "@tnet-
|
|
168
|
+
import { initI18n } from "@tnet-store/i18n-stock";
|
|
38
169
|
|
|
39
170
|
// Khởi tạo với ngôn ngữ mặc định
|
|
40
171
|
initI18n({ lng: "en" });
|
|
@@ -43,7 +174,7 @@ initI18n({ lng: "en" });
|
|
|
43
174
|
### 2. Dùng hàm `t()`
|
|
44
175
|
|
|
45
176
|
```tsx
|
|
46
|
-
import { t } from "@tnet-
|
|
177
|
+
import { t } from "@tnet-store/i18n-stock";
|
|
47
178
|
|
|
48
179
|
function Example() {
|
|
49
180
|
return <h1>{t("button.viewQuotes")}</h1>;
|
|
@@ -53,7 +184,7 @@ function Example() {
|
|
|
53
184
|
### 3. Dùng hook `useT()`
|
|
54
185
|
|
|
55
186
|
```tsx
|
|
56
|
-
import { useT } from "@tnet-
|
|
187
|
+
import { useT } from "@tnet-store/i18n-stock";
|
|
57
188
|
|
|
58
189
|
export function Example() {
|
|
59
190
|
const { t, i18n, lng } = useT();
|
|
@@ -62,7 +193,7 @@ export function Example() {
|
|
|
62
193
|
<>
|
|
63
194
|
<p>Current language: {lng}</p>
|
|
64
195
|
<p>{t("common.loading")}</p>
|
|
65
|
-
<button onClick={() => i18n.changeLanguage(lng === "en" ? "
|
|
196
|
+
<button onClick={() => i18n.changeLanguage(lng === "en" ? "zh-CN" : "en")}>
|
|
66
197
|
Switch Language
|
|
67
198
|
</button>
|
|
68
199
|
</>
|
|
@@ -76,8 +207,10 @@ export function Example() {
|
|
|
76
207
|
|
|
77
208
|
```txt
|
|
78
209
|
locales/
|
|
79
|
-
├─ en.json # English
|
|
80
|
-
|
|
210
|
+
├─ en.json # English (file gốc - tất cả keys phải có ở đây)
|
|
211
|
+
├─ zh-CN.json # Chinese (Simplified)
|
|
212
|
+
├─ zh-TW.json # Chinese (Traditional - Taiwan)
|
|
213
|
+
└─ zh-HK.json # Chinese (Traditional - Hong Kong)
|
|
81
214
|
```
|
|
82
215
|
|
|
83
216
|
Ví dụ `en.json`:
|
|
@@ -99,11 +232,11 @@ Ví dụ `en.json`:
|
|
|
99
232
|
|
|
100
233
|
## 🔑 Type-safe Keys
|
|
101
234
|
|
|
102
|
-
Sau mỗi lần build, file `
|
|
235
|
+
Sau mỗi lần build, file `src/__generated__/keys.ts` sẽ được sinh tự động từ `en.json`.
|
|
103
236
|
|
|
104
237
|
```ts
|
|
105
|
-
import { t } from "@tnet-
|
|
106
|
-
import type { TranslationKey } from "@tnet-
|
|
238
|
+
import { t } from "@tnet-store/i18n-stock";
|
|
239
|
+
import type { TranslationKey } from "@tnet-store/i18n-stock";
|
|
107
240
|
|
|
108
241
|
function safeT<K extends TranslationKey>(key: K) {
|
|
109
242
|
return t(key);
|
|
@@ -115,34 +248,38 @@ safeT("button.notExists"); // ❌ lỗi compile
|
|
|
115
248
|
|
|
116
249
|
---
|
|
117
250
|
|
|
118
|
-
## 🚀 Release quy trình
|
|
119
|
-
|
|
120
|
-
### 1. Tự động (qua GitHub Actions)
|
|
121
|
-
- Bump version trong `package.json` (ví dụ `"1.0.1"`).
|
|
122
|
-
- Commit & tạo tag theo format:
|
|
123
|
-
```bash
|
|
124
|
-
git commit -am "chore(release): v1.0.1"
|
|
125
|
-
git tag i18n-v1.0.1
|
|
126
|
-
git push origin main --tags
|
|
127
|
-
```
|
|
128
|
-
- GitHub Actions sẽ tự build & publish lên npm.
|
|
129
|
-
|
|
130
|
-
### 2. Thủ công (Run workflow)
|
|
131
|
-
- Push code với version mới trong `package.json`.
|
|
132
|
-
- Vào tab **Actions → Publish to npm → Run workflow**.
|
|
133
|
-
- CI sẽ build & publish version mới.
|
|
134
|
-
|
|
135
|
-
---
|
|
136
|
-
|
|
137
251
|
## 📦 Scripts có sẵn
|
|
138
252
|
|
|
139
|
-
- `yarn build` – build TypeScript → `dist/`
|
|
253
|
+
- `yarn build` – build TypeScript → `dist/` và generate keys
|
|
254
|
+
- `yarn check:i18n` – check translations giữa các file locale
|
|
140
255
|
- `yarn check:placeholders` – check placeholders giữa các file locale
|
|
256
|
+
- `yarn check:i18n:all` – chạy full check cho tất cả locales (nên chạy trước khi commit)
|
|
141
257
|
- `yarn gen:keys` – generate type keys từ `en.json`
|
|
142
258
|
- `yarn prepublishOnly` – chạy full build + check + gen trước khi publish
|
|
143
259
|
|
|
144
260
|
---
|
|
145
261
|
|
|
262
|
+
## 🚀 Release Process
|
|
263
|
+
|
|
264
|
+
Release được tự động hóa hoàn toàn qua **semantic-release**:
|
|
265
|
+
|
|
266
|
+
- **Không cần** bump version thủ công trong `package.json`
|
|
267
|
+
- **Không cần** tạo git tag thủ công
|
|
268
|
+
- CI sẽ tự động:
|
|
269
|
+
- Phân tích commit messages (feat/fix/breaking change)
|
|
270
|
+
- Quyết định version bump (patch/minor/major)
|
|
271
|
+
- Build và publish lên npm
|
|
272
|
+
- Tạo GitHub release
|
|
273
|
+
- Update CHANGELOG.md
|
|
274
|
+
|
|
275
|
+
### Commit message format
|
|
276
|
+
|
|
277
|
+
- `feat: xxx` → minor version bump (1.0.0 → 1.1.0)
|
|
278
|
+
- `fix: xxx` → patch version bump (1.0.0 → 1.0.1)
|
|
279
|
+
- `feat!: xxx` hoặc `BREAKING CHANGE: xxx` → major version bump (1.0.0 → 2.0.0)
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
146
283
|
## 📜 License
|
|
147
284
|
|
|
148
|
-
MIT © [Trinity Net Technology](https://github.com/Trinity-Net-Technology)
|
|
285
|
+
MIT © [Trinity Net Technology](https://github.com/Trinity-Net-Technology)
|