@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 CHANGED
@@ -1,17 +1,148 @@
1
- # @tnet-i18n/i18n
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 release.
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-i18n/i18n
154
+ yarn add @tnet-store/i18n-stock@latest
24
155
  # hoặc npm
25
- npm install @tnet-i18n/i18n
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-i18n/i18n";
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-i18n/i18n";
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-i18n/i18n";
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" ? "cn" : "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
- └─ cn.json # Chinese
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 `dist/keys.d.ts` sẽ được sinh tự động từ `en.json`.
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-i18n/i18n";
106
- import type { TranslationKey } from "@tnet-i18n/i18n/dist/keys";
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)