|
| 1 | +# 貢獻指南 |
| 2 | + |
| 3 | +感謝您對 OpenCC 專案的貢獻!本文件說明如何為 OpenCC 貢獻詞典條目、撰寫測試並確保程式碼品質。 |
| 4 | + |
| 5 | +## 目錄 |
| 6 | + |
| 7 | +- [新增詞典條目](#新增詞典條目) |
| 8 | +- [排序詞典](#排序詞典) |
| 9 | +- [執行測試](#執行測試) |
| 10 | +- [撰寫測試案例](#撰寫測試案例) |
| 11 | +- [簡轉繁轉換的特殊注意事項](#簡轉繁轉換的特殊注意事項) |
| 12 | + |
| 13 | +## 新增詞典條目 |
| 14 | + |
| 15 | +### 1. 選擇正確的詞典檔案 |
| 16 | + |
| 17 | +詞典檔案位於 `data/dictionary/` 目錄下,根據轉換類型選擇對應的檔案: |
| 18 | + |
| 19 | +- **簡繁轉換** |
| 20 | + - `STCharacters.txt` - 簡體到繁體(單字) |
| 21 | + - `STPhrases.txt` - 簡體到繁體(詞組) |
| 22 | + - `TSCharacters.txt` - 繁體到簡體(單字) |
| 23 | + - `TSPhrases.txt` - 繁體到簡體(詞組) |
| 24 | + |
| 25 | +- **臺灣正體用詞** |
| 26 | + - `TWVariants.txt` - 臺灣異體字 |
| 27 | + - `TWPhrases.txt` - 臺灣慣用詞 |
| 28 | + |
| 29 | +- **香港繁體用詞** |
| 30 | + - `HKVariants.txt` - 香港異體字 |
| 31 | + - `HKVariantsRevPhrases.txt` - 香港異體字反向詞組 |
| 32 | + |
| 33 | +- **日文新舊字形** |
| 34 | + - `JPShinjitaiCharacters.txt` - 日文新字體(單字) |
| 35 | + - `JPShinjitaiPhrases.txt` - 日文新字體(詞組) |
| 36 | + - `JPVariants.txt` - 日文異體字 |
| 37 | + |
| 38 | +### 2. 詞典格式規範 |
| 39 | + |
| 40 | +詞典檔案使用 **Tab 字元**(`\t`)分隔來源詞與目標詞,**請勿使用空格**。 |
| 41 | + |
| 42 | +格式:`來源詞<TAB>目標詞` |
| 43 | + |
| 44 | +範例: |
| 45 | + |
| 46 | +``` |
| 47 | +虚伪叹息 虛偽嘆息 |
| 48 | +潮湿灶台 潮濕灶台 |
| 49 | +赞叹 讚歎 |
| 50 | +``` |
| 51 | + |
| 52 | +如果一個來源詞對應多個可能的目標詞,使用空格分隔: |
| 53 | + |
| 54 | +``` |
| 55 | +一出 一齣 一出 |
| 56 | +``` |
| 57 | + |
| 58 | +### 3. 編輯詞典 |
| 59 | + |
| 60 | +使用文字編輯器開啟對應的 `.txt` 檔案,新增您的詞條。請確保: |
| 61 | + |
| 62 | +1. 使用 **Tab 字元**(`\t`)分隔來源詞與目標詞 |
| 63 | +2. 每行一個條目 |
| 64 | +3. 檔案使用 UTF-8 編碼 |
| 65 | + |
| 66 | +## 排序詞典 |
| 67 | + |
| 68 | +**重要**:詞典檔案必須按字典序排序,否則測試會失敗。 |
| 69 | + |
| 70 | +### 使用排序工具 |
| 71 | + |
| 72 | +專案提供了自動排序工具,位於 `data/scripts/` 目錄: |
| 73 | + |
| 74 | +#### 排序單一檔案 |
| 75 | + |
| 76 | +```bash |
| 77 | +python3 data/scripts/sort.py data/dictionary/STPhrases.txt |
| 78 | +``` |
| 79 | + |
| 80 | +這會直接排序並覆蓋原檔案。如果想輸出到其他檔案: |
| 81 | + |
| 82 | +```bash |
| 83 | +python3 data/scripts/sort.py data/dictionary/STPhrases.txt data/dictionary/STPhrases_sorted.txt |
| 84 | +``` |
| 85 | + |
| 86 | +#### 排序所有詞典檔案 |
| 87 | + |
| 88 | +```bash |
| 89 | +python3 data/scripts/sort_all.py data/dictionary |
| 90 | +``` |
| 91 | + |
| 92 | +這會自動排序 `data/dictionary/` 目錄下所有 `.txt` 檔案。 |
| 93 | + |
| 94 | +### 排序檢查 |
| 95 | + |
| 96 | +排序是否正確會在測試時自動檢查。如果詞典未排序或包含重複的鍵,`DictionaryTest` 會報錯: |
| 97 | + |
| 98 | +``` |
| 99 | +[ FAILED ] DictionaryTest/STPhrases.UniqueSortedTest |
| 100 | +STPhrases is not sorted. |
| 101 | +``` |
| 102 | + |
| 103 | +遇到此錯誤時,請執行排序工具重新排序。 |
| 104 | + |
| 105 | +## 執行測試 |
| 106 | + |
| 107 | +OpenCC 使用 [Bazel](https://bazel.build/) 作為建置系統。 |
| 108 | + |
| 109 | +### 安裝 Bazel |
| 110 | + |
| 111 | +#### macOS |
| 112 | + |
| 113 | +```bash |
| 114 | +brew install bazel |
| 115 | +``` |
| 116 | + |
| 117 | +#### Ubuntu/Debian |
| 118 | + |
| 119 | +```bash |
| 120 | +sudo apt install bazel |
| 121 | +``` |
| 122 | + |
| 123 | +或參考 [Bazel 官方安裝指南](https://bazel.build/install)。 |
| 124 | + |
| 125 | +#### 其他作業系統 |
| 126 | + |
| 127 | +請參考 [Bazel 安裝文件](https://bazel.build/install) 獲取適合您系統的安裝方式。 |
| 128 | + |
| 129 | +### 執行所有測試 |
| 130 | + |
| 131 | +```bash |
| 132 | +bazel test --test_output=all //src/... //data/... //test/... //python/... |
| 133 | +``` |
| 134 | + |
| 135 | +### 執行特定測試 |
| 136 | + |
| 137 | +僅測試詞典: |
| 138 | + |
| 139 | +```bash |
| 140 | +bazel test //data/dictionary:dictionary_test |
| 141 | +``` |
| 142 | + |
| 143 | +僅測試轉換案例: |
| 144 | + |
| 145 | +```bash |
| 146 | +bazel test //data/config:config_dict_validation_test |
| 147 | +``` |
| 148 | + |
| 149 | +### 測試輸出 |
| 150 | + |
| 151 | +- `--test_output=all`:顯示所有測試輸出 |
| 152 | +- `--test_output=errors`:僅顯示失敗的測試 |
| 153 | + |
| 154 | +## 撰寫測試案例 |
| 155 | + |
| 156 | +### 測試驅動開發流程 |
| 157 | + |
| 158 | +在修改詞典前,建議先撰寫測試案例,遵循測試驅動開發(TDD)流程: |
| 159 | + |
| 160 | +1. **先寫測試**:在 `test/testcases/testcases.json` 新增測試案例 |
| 161 | +2. **確認測試失敗**:執行測試,確認新案例因為詞典未更新而失敗 |
| 162 | +3. **修改詞典**:新增或修改詞典條目 |
| 163 | +4. **測試通過**:再次執行測試,確認修改後測試通過 |
| 164 | + |
| 165 | +這樣可以確保您的修改確實達到預期效果。 |
| 166 | + |
| 167 | +### 測試案例格式 |
| 168 | + |
| 169 | +測試案例定義於 `test/testcases/testcases.json`,格式如下: |
| 170 | + |
| 171 | +```json |
| 172 | +{ |
| 173 | + "cases": [ |
| 174 | + { |
| 175 | + "id": "英文簡要描述這個測試是修復或解決什麼問題的", |
| 176 | + "input": "輸入內容", |
| 177 | + "expected": { |
| 178 | + "s2t": "預期的簡轉繁輸出", |
| 179 | + "s2tw": "預期的簡轉臺灣正體輸出", |
| 180 | + "t2s": "預期的繁轉簡輸出", |
| 181 | + ... |
| 182 | + } |
| 183 | + } |
| 184 | + ] |
| 185 | +} |
| 186 | +``` |
| 187 | + |
| 188 | +### 欄位說明 |
| 189 | + |
| 190 | +- `id`:唯一的測試案例識別碼,可使用 `case_` 前綴加流水號,或 `OpenCC_Issue_1234` 等 |
| 191 | +- `input`:輸入文字 |
| 192 | +- `expected`:各種轉換配置的預期輸出 |
| 193 | + - 僅需包含您要測試的轉換配置 |
| 194 | + - 可以同時測試多種配置 |
| 195 | + |
| 196 | +### 可用的轉換配置 |
| 197 | + |
| 198 | +- `s2t` - 簡體到 OpenCC 標準繁體 |
| 199 | +- `s2tw` - 簡體到臺灣正體 |
| 200 | +- `s2twp` - 簡體到臺灣正體(含地域用詞轉換) |
| 201 | +- `s2hk` - 簡體到香港繁體 |
| 202 | +- `tw2s` - OpenCC 標準臺灣正體到簡體 |
| 203 | +- `tw2sp` - 臺灣正體到簡體(含地域用詞轉換) |
| 204 | +- `tw2t` - 臺灣正體到 OpenCC 標準繁體 |
| 205 | +- `hk2s` - 香港繁體到簡體 |
| 206 | +- `hk2t` - 香港繁體到臺灣正體 |
| 207 | +- `t2s` - OpenCC 標準繁體到簡體 |
| 208 | +- `t2tw` - OpenCC 標準繁體到臺灣正體 |
| 209 | +- `t2hk` - OpenCC 標準繁體到香港繁體 |
| 210 | +- `jp2t` - 日文新字體到舊字體 |
| 211 | +- `t2jp` - 日文舊字體到新字體 |
| 212 | + |
| 213 | +### 範例 |
| 214 | + |
| 215 | +```json |
| 216 | +{ |
| 217 | + "id": "case_050", |
| 218 | + "input": "這個軟體裡有一套軟體動物的資料庫", |
| 219 | + "expected": { |
| 220 | + "tw2sp": "这个软件里有一套软体动物的数据库" |
| 221 | + } |
| 222 | +} |
| 223 | +``` |
| 224 | + |
| 225 | +## 簡轉繁轉換的特殊注意事項 |
| 226 | + |
| 227 | +當您修改簡轉繁相關詞典時,需要特別注意不同地區的轉換配置可能都會受到影響。 |
| 228 | + |
| 229 | +### 關聯修改 |
| 230 | + |
| 231 | +如需修改 `TWPhrases.txt`,需要同時修改 `TWPhrasesRev.txt`,反之亦然。否則測試會失敗。 |
| 232 | + |
| 233 | +### 涉及的配置檔案 |
| 234 | + |
| 235 | +簡轉繁轉換主要涉及以下配置: |
| 236 | + |
| 237 | +1. **`s2t.json`** - 基本簡轉繁 |
| 238 | + - 使用 `STPhrases.txt` 和 `STCharacters.txt` |
| 239 | + |
| 240 | +2. **`s2tw.json`** - 簡體轉臺灣正體 |
| 241 | + - 使用 `STPhrases.txt`、`STCharacters.txt` |
| 242 | + - 額外使用 `TWVariants.txt` |
| 243 | + |
| 244 | +3. **`s2twp.json`** - 簡體轉臺灣正體(含慣用詞) |
| 245 | + - 使用 `STPhrases.txt`、`STCharacters.txt` |
| 246 | + - 額外使用 `TWPhrases.txt`、`TWVariants.txt` |
| 247 | + |
| 248 | +4. **`s2hk.json`** - 簡體轉香港繁體 |
| 249 | + - 使用 `STPhrases.txt`、`STCharacters.txt` |
| 250 | + - 額外使用 `HKVariants.txt` |
| 251 | + |
| 252 | +### 測試建議 |
| 253 | + |
| 254 | +修改 `STPhrases.txt` 或 `STCharacters.txt` 時,建議在 `testcases.json` 中同時測試多個相關配置: |
| 255 | + |
| 256 | +```json |
| 257 | +{ |
| 258 | + "id": "case_example", |
| 259 | + "input": "简体文字", |
| 260 | + "expected": { |
| 261 | + "s2t": "繁體文字", |
| 262 | + "s2tw": "繁體文字", |
| 263 | + "s2twp": "臺灣慣用詞", |
| 264 | + "s2hk": "香港繁體" |
| 265 | + } |
| 266 | +} |
| 267 | +``` |
| 268 | + |
| 269 | +這樣可以確保您的修改在各種轉換情境下都能正確運作。 |
| 270 | + |
| 271 | +### 常見情況 |
| 272 | + |
| 273 | +- **僅修改基本簡繁對應**:修改 `STCharacters.txt`,測試至少包含 `s2t` |
| 274 | +- **修改詞組轉換**:修改 `STPhrases.txt`,測試包含 `s2t`、`s2tw`、`s2twp`、`s2hk` |
| 275 | +- **臺灣特有用詞**:修改 `TWPhrases*.txt` 或 `TWVariants.txt`,測試包含 `s2tw`、`s2twp` |
| 276 | +- **香港特有用詞**:修改 `HKVariants*.txt`,測試包含 `s2hk` |
| 277 | + |
| 278 | +## 提交變更 |
| 279 | + |
| 280 | +完成修改後,請確認: |
| 281 | + |
| 282 | +- [ ] 詞典檔案已使用 Tab 字元分隔 |
| 283 | +- [ ] 詞典檔案已正確排序(執行 `sort.py` 或 `sort_all.py`) |
| 284 | +- [ ] 已新增對應的測試案例到 `testcases.json` |
| 285 | +- [ ] 修改前測試案例失敗,修改後測試通過 |
| 286 | +- [ ] 所有測試通過(`bazel test --test_output=all //src/... //data/... //test/...`) |
| 287 | + |
| 288 | +符合以上條件後,即可提交 Pull Request。 |
| 289 | + |
| 290 | +## 需要協助? |
| 291 | + |
| 292 | +如有任何問題,歡迎: |
| 293 | + |
| 294 | +- 在 [GitHub Issues](https://github.com/BYVoid/OpenCC/issues) 提問 |
| 295 | +- 加入 [Telegram 討論群組](https://t.me/open_chinese_convert) |
| 296 | + |
| 297 | +感謝您的貢獻! |
0 commit comments