---
# System prepended metadata

title: i18n 重構(2) - 尋找可替換的 key
tags: [JavaScript, i18n, Refactor]

---

# i18n 重構(2) - 尋找可替換的 key

經過(1)拉平 i18n 的物件後<br/>
我們需要在合併專案底下的 local JSON 跟 npm JSON 前做以下前置處理：

1. 抓出 local JSON 跟 npm JSON 重複命名的 key 值並給予 hash ( ex : xxx_1 、 xxx_2 ) 區分。
   這個很簡單就不對該步驟多做贅述了
2. **抓出專案 locale 底下有哪些 key 可以被 npm locale 取代。**

我們有三個語系 cn 、 en 、 vn 的 JSON 需要做處理<br/>
好險只有三包而且現在 JSON 還不夠肥大

![怕](https://i.imgur.com/Cc7wt8I.png =400x)

~~因為懶~~，直接在專案根目錄底下直接寫個 js 腳本解決

流程如下進行：

1. 遍歷 localCn 的 key 收集跟 localCn [ key ]值相同的 npmCn key 做候選人
2. 遍歷候選人篩選出全部 npm 跟 local 對應詞彙完全匹配者 (無痛替換)
3. 收集 before ( 原始 local 的 key 值 ) 跟 after (可替換成 npm 的 key 值 ) 的結果
4. 看是要人力或寫腳本將前端專案的 key 替換掉

```javascript
const npmCn = require('./node_modules/@unnotech/locale/src/zh-CN.json')
const npmEn = require('./node_modules/@unnotech/locale/src/en.json')
const npmVn = require('./node_modules/@unnotech/locale/src/vi-VN.json')
const localCn = require('./src/i18n/locale/zh-CN.json')
const localEn = require('./src/i18n/locale/en.json')
const localVn = require('./src/i18n/locale/vi-VN.json')

const npmList = [npmEn, npmVn]
const localList = [localEn, localVn]
const results = []

for (let lk in localCn) {
  let candidateList = []
  for (let nk in npmCn) {
    if (localCn[lk] === npmCn[nk]) candidateList.push(nk)
  }
  for (let nk of candidateList) {
    let isSame = true
    for (let i = 0; i < npmList.length; i++) {
      let npm = npmList[i]
      let local = localList[i]
      if (
        !npm[nk] ||
        !local[lk] ||
        npm[nk].toLowerCase() !== local[lk].toLowerCase()
      ) {
        isSame = false
        break
      }
    }
    if (isSame) results.push({ before: lk, after: nk })
  }
}
console.log(results)
```

結果如下：
因為列表太長我截片段就好
大概長這樣

![結果](https://i.imgur.com/juDI8kM.png)

雖然寫得真是夠隨意<br/>
但至少不用再勞心勞力找重複的 key 慢慢刪掉<br/>
蒸蚌

###### tags: `Refactor` `JavaScript` `i18n`
