diff --git a/data/npc-name-en.csv b/data/npc-name-en.csv
index 1449990217..45dd0b3b8e 100644
--- a/data/npc-name-en.csv
+++ b/data/npc-name-en.csv
@@ -1,115 +1,116 @@
-name,trans
-Lyria,露莉亚
-Vyrn,碧
-Katalina,卡塔莉娜
-Vira,维拉
-Rackam,拉卡姆
-Io,伊欧
-Furias,弗里亚斯
-Drang,德朗
-Sturm,斯特姆
-Orchis,欧尔基丝
-Noa,诺亚
-Lecia,莉夏
-Monika,莫妮卡
-Walfried,瓦尔福里德
-Eugen,欧根
-Rosetta,萝赛塔
-Freesia,芙莉西雅
-Primal Beasts,星晶兽
-Primal Beast,星晶兽
-Black Knight,黑骑士
-Gandharva,刚达尔瓦
-Imperial Soldier,帝国士兵
-Pommern,伯梅伦
-Hydra,海德拉
-Sierokarte,榭洛科特
-Siero,榭洛
-Townsperson,镇民
-Townsgirl,城镇少女
-Tzaka the Great,扎卡大公
-Tiamat,提亚马特
-Erste,艾尔斯提
-Skyfarer,骑空士
-Seasoned Skyfarer,熟练的骑空士
-Elderly Skyfarer,骑空士长者
-Monster,魔物
-Ran Mōri,毛利兰
-Ai Haibara,灰原哀
-Conan Edogawa,江户川柯南
-Doctor Agasa,阿笠博士
-Kogorō Mōri,毛利小五郎
-Tōru Amuro,安室透
-Detective,侦探
-Apprentice,助手
-All Four,4人
-Shinichi Kudō,工藤新一
-Sarya,萨雅
-Barawa,巴洛瓦
-Haughty Woman,傲慢的女人
-Carolina,卡罗丽娜
-Daniela,达涅拉
-Leila,蕾拉
-Nelly,内莉露
-Mannequin,机械人偶
-Sandalphon,圣德芬
-Lyria and Vyrn,露利亚和碧
-Lucifer,路西菲尔
-Lancelot,兰斯洛特
-Guard 1 &,守卫1&
-Guard,守卫
-Coffee Farmer,咖啡园主人
-Nicholas,士郎
-Lunalu,露娜露
-Elder,老人
-Mahira,玛琪拉
-Ann Takamaki,高卷杏
-Caroline,卡萝莉娜
-Justine,芮丝汀娜
-Morgana,摩尔加纳
-Ren Amamiya,雨宫莲
-Ryuji Sakamoto,坂本龙司
-Yusuke Kitagawa,喜多川祐介
-Cathy,凯茜
-De La Fille,蕾‧芬耶
-Man,男子
-Nouveau Riche,暴发户
-Shopkeeper,店主
-Shopkeeper's Wife,店主妻子
-Staff,店员
-Suspicious Man,可疑男子
-Witness,目击者
-Fisherman,渔师
-Fishermen,渔师
-Charlotta,夏洛特
-Siegfried,齐格飞
-Jessica,洁西卡
-Carren,卡莲
-Izmir,伊休米尔
-Ayer,艾鲁
-Waitress,女招待
-Tweyen,索恩
-Seofon,希耶提
-Threo,萨拉萨
-Goon,暴徒
-Goons,暴徒们
-Chika,千歌
-Chika Takami,高海千歌
-Sakurauchi Riko,樱内梨子
-Matsuura kanan,松浦果南
-Kurosawa Dia,黑泽黛雅
-Watanabe You,渡边曜
-Tsushima Yoshiko,津岛善子
-Kunikida Hanamaru,国木田花丸
-Ohara Mari,小原鞠莉
-Kurosawa Ruby,黑泽露比
-Dia,黛雅
-First-Years,善子・花丸・露比
-Hanamaru,花丸
-Kanan,果南
-Mari,鞠莉
-Riko,梨子
-Ruby,露比
-Second-Years,千歌・曜・梨子
-Third-Years,黛雅・果南・鞠莉
-Yoshiko,善子
+name,trans,scenario,noun
+Lyria,露莉亚,,
+Vyrn,碧,,
+Katalina,卡塔莉娜,,
+Vira,维拉,,
+Rackam,拉卡姆,,
+Io,伊欧,,
+Furias,弗里亚斯,,
+Drang,德朗,,
+Sturm,斯特姆,,
+Orchis,欧尔基丝,,
+Noa,诺亚,,
+Lecia,莉夏,,
+Monika,莫妮卡,,
+Walfried,瓦尔福里德,,
+Eugen,欧根,,
+Rosetta,萝赛塔,,
+Freesia,芙莉西雅,,
+Primal Beasts,星晶兽,,
+Primal Beast,星晶兽,,
+Black Knight,黑骑士,,
+Gandharva,刚达尔瓦,,
+Imperial Soldier,帝国士兵,,
+Pommern,伯梅伦,,
+Hydra,海德拉,,
+Sierokarte,榭洛科特,,
+Siero,榭洛,,
+Townsperson,镇民,,
+Townsgirl,城镇少女,,
+Tzaka the Great,扎卡大公,,
+Tiamat,提亚马特,,
+Erste,艾尔斯提,,
+Skyfarer,骑空士,,
+Seasoned Skyfarer,熟练的骑空士,,
+Elderly Skyfarer,骑空士长者,,
+Monster,魔物,,
+Ran Mōri,毛利兰,,
+Ai Haibara,灰原哀,,
+Conan Edogawa,江户川柯南,,
+Doctor Agasa,阿笠博士,,
+Kogorō Mōri,毛利小五郎,,
+Tōru Amuro,安室透,,
+Detective,侦探,,
+Apprentice,助手,,
+All Four,4人,,
+Shinichi Kudō,工藤新一,,
+Sarya,萨雅,,
+Barawa,巴洛瓦,,
+Haughty Woman,傲慢的女人,,
+Carolina,卡罗丽娜,,
+Daniela,达涅拉,,
+Leila,蕾拉,,
+Nelly,内莉露,,
+Mannequin,机械人偶,,
+Sandalphon,圣德芬,,
+Lyria and Vyrn,露利亚和碧,,
+Lucifer,路西菲尔,,
+Lancelot,兰斯洛特,,
+Guard 1 &,守卫1&,,
+Guard,守卫,,
+Coffee Farmer,咖啡园主人,,
+Nicholas,士郎,,
+Lunalu,露娜露,,
+Elder,老人,,
+Mahira,玛琪拉,,
+Ann Takamaki,高卷杏,,
+Caroline,卡萝莉娜,,
+Justine,芮丝汀娜,,
+Morgana,摩尔加纳,,
+Ren Amamiya,雨宫莲,,
+Ryuji Sakamoto,坂本龙司,,
+Yusuke Kitagawa,喜多川祐介,,
+Cathy,凯茜,,
+De La Fille,蕾‧芬耶,,
+Man,男子,,
+Nouveau Riche,暴发户,,
+Shopkeeper,店主,,
+Shopkeeper's Wife,店主妻子,,
+Staff,店员,,
+Suspicious Man,可疑男子,,
+Witness,目击者,,
+Fisherman,渔师,,
+Fishermen,渔师,,
+Charlotta,夏洛特,,
+Siegfried,齐格飞,,
+Jessica,洁西卡,,
+Carren,卡莲,,
+Izmir,伊休米尔,,
+Ayer,艾鲁,,
+Waitress,女招待,,
+Tweyen,索恩,,
+Seofon,希耶提,,
+Threo,萨拉萨,,
+Goon,暴徒,,
+Goons,暴徒们,,
+Chika,千歌,,
+Chika Takami,高海千歌,,
+Sakurauchi Riko,樱内梨子,,
+Matsuura kanan,松浦果南,,
+Kurosawa Dia,黑泽黛雅,,
+Watanabe You,渡边曜,,
+Tsushima Yoshiko,津岛善子,,
+Kunikida Hanamaru,国木田花丸,,
+Ohara Mari,小原鞠莉,,
+Kurosawa Ruby,黑泽露比,,
+Dia,黛雅,,
+First-Years,善子・花丸・露比,,
+Hanamaru,花丸,,
+Kanan,果南,,
+Mari,鞠莉,,
+Riko,梨子,,
+Ruby,露比,,
+Second-Years,千歌・曜・梨子,,
+Third-Years,黛雅・果南・鞠莉,,
+Yoshiko,善子,,
+You,曜,,0
diff --git a/data/npc-name-jp.csv b/data/npc-name-jp.csv
index 0ec526f96f..a640061e53 100644
--- a/data/npc-name-jp.csv
+++ b/data/npc-name-jp.csv
@@ -1,112 +1,112 @@
-name,trans
-黒騎士,黑骑士
-ロゼッタ,萝赛塔
-ルリア,露莉亚
-リーシャ,莉夏
-ラカム,拉卡姆
-ビィ,碧
-カタリナ,卡塔莉娜
-オルキス,欧尔基丝
-オイゲン,欧根
-イオ,伊欧
-ポンメルン,伯梅伦
-ヒドラ,海德拉
-シェロカルテ,榭洛科特
-ドランク,德朗克
-スツルム,斯特姆
-ゼタ,泽塔
-マギサ,玛基莎
-ハレゼナ,哈雷泽娜
-バザラガ,巴萨拉卡
-ヴィーラ,维拉
-ヘルエス,赫尔艾斯
-セルエル,杰鲁艾鲁
-シャルロッテ,夏洛特
-メリッサベル,梅丽莎贝尔
-ジャンヌダルク,贞德
-メーテラ,美黛拉
-ヴァイト,斑特
-イシュミール,伊休米尔
-ゾーイ,佐伊
-フィーナ,菲娜
-ルシオ,路西欧
-ソリッズ,索利茲
-ヤイア,雅雅
-アリサ,亚丽莎
-ヴェイン,维恩
-サラ,萨拉
-ミリン,米林
-ネモネ,涅莫涅
-ケルベロス,刻尔贝洛斯
-ソシエ,苏丝娅
-アルベール,阿尔贝鲁
-フェリ,菲莉
-ヨダルラーハ,尤达尔拉哈
-サルナーン,萨鲁纳恩
-イングヴェイ,英格威
-シャノワール,夏诺瓦
-アザゼル,阿萨谢尔
-ユグドラシル,尤格多拉希尔
-レ・フィーエ,蕾・芬耶
-セレフィラ,瑟蕾菲拉
-ヴァンピィ,斑比
-ユイシス,优希斯
-ディアンサ,戴安萨
-ザルハメリナ,扎尔哈梅丽娜
-ガンダゴウザ,冈达葛萨
-ベアトリクス,贝阿朵丽克丝
-カリオストロ,卡莉奥斯特萝
-クラリス,克拉莉丝
-ティアマト,提亚玛特
-ソーン,索恩
-エッセル,艾洁尔
-江戸川コナン,江户川柯南
-毛利蘭,毛利兰
-安室,安室
-探偵,侦探
-バロワ,巴洛瓦
-サーヤ,萨雅
-高飛車な女,傲慢的女人
-カロリーナ,卡罗丽娜
-ダニエラ,达涅拉
-レイラ,蕾拉
-ネリル,涅莉露
-機械人形,机械人偶
-農夫,农夫
-衛兵2,卫兵2
-衛兵1&衛兵2,卫兵1&卫兵2
-衛兵1,卫兵1
-自警団団長,民兵团团长
-自警団団員,民兵团团员
-ルリアとビィ,露利亚和碧
-ルシフェル,路西菲尔
-ランスロット,兰斯洛特
-サンダルフォン,圣德芬
-カール,卡尔
-シロウ,士郎
-ファラ,法拉
-ユーリ,尤利
-ポセイドン,波塞顿
-ジック,吉克
-ハーパー,哈波
-マキラ,玛琪拉
-ルナール,露娜露
-悪夢の欠片,恶梦的碎片
-帝国兵,帝国士兵
-ヴェトル,薇特尔
-モルペウス達,莫尔佩乌斯们
-モルペウス,莫尔佩乌斯
-モルフェ,莫尔菲
-オネイロス,奥涅伊洛斯
-イケロス,伊卡洛斯
-アルビオン兵,阿尔比昂士兵
-お母さん,妈妈
-カレン,卡莲
-アイル,艾鲁
-ならず者,暴徒
-ならず者達,暴徒们
-ジークフリート,齐格飞
-漁師,渔师
-善子・花丸・ルビィ,善子・花丸・露比
-ダイヤ,黛雅
-ルビィ,露比
+name,trans,scenario
+黒騎士,黑骑士,
+ロゼッタ,萝赛塔,
+ルリア,露莉亚,
+リーシャ,莉夏,
+ラカム,拉卡姆,
+ビィ,碧,
+カタリナ,卡塔莉娜,
+オルキス,欧尔基丝,
+オイゲン,欧根,
+イオ,伊欧,
+ポンメルン,伯梅伦,
+ヒドラ,海德拉,
+シェロカルテ,榭洛科特,
+ドランク,德朗克,
+スツルム,斯特姆,
+ゼタ,泽塔,
+マギサ,玛基莎,
+ハレゼナ,哈雷泽娜,
+バザラガ,巴萨拉卡,
+ヴィーラ,维拉,
+ヘルエス,赫尔艾斯,
+セルエル,杰鲁艾鲁,
+シャルロッテ,夏洛特,
+メリッサベル,梅丽莎贝尔,
+ジャンヌダルク,贞德,
+メーテラ,美黛拉,
+ヴァイト,斑特,
+イシュミール,伊休米尔,
+ゾーイ,佐伊,
+フィーナ,菲娜,
+ルシオ,路西欧,
+ソリッズ,索利茲,
+ヤイア,雅雅,
+アリサ,亚丽莎,
+ヴェイン,维恩,
+サラ,萨拉,
+ミリン,米林,
+ネモネ,涅莫涅,
+ケルベロス,刻尔贝洛斯,
+ソシエ,苏丝娅,
+アルベール,阿尔贝鲁,
+フェリ,菲莉,
+ヨダルラーハ,尤达尔拉哈,
+サルナーン,萨鲁纳恩,
+イングヴェイ,英格威,
+シャノワール,夏诺瓦,
+アザゼル,阿萨谢尔,
+ユグドラシル,尤格多拉希尔,
+レ・フィーエ,蕾・芬耶,
+セレフィラ,瑟蕾菲拉,
+ヴァンピィ,斑比,
+ユイシス,优希斯,
+ディアンサ,戴安萨,
+ザルハメリナ,扎尔哈梅丽娜,
+ガンダゴウザ,冈达葛萨,
+ベアトリクス,贝阿朵丽克丝,
+カリオストロ,卡莉奥斯特萝,
+クラリス,克拉莉丝,
+ティアマト,提亚玛特,
+ソーン,索恩,
+エッセル,艾洁尔,
+江戸川コナン,江户川柯南,
+毛利蘭,毛利兰,
+安室,安室,
+探偵,侦探,
+バロワ,巴洛瓦,
+サーヤ,萨雅,
+高飛車な女,傲慢的女人,
+カロリーナ,卡罗丽娜,
+ダニエラ,达涅拉,
+レイラ,蕾拉,
+ネリル,涅莉露,
+機械人形,机械人偶,
+農夫,农夫,
+衛兵2,卫兵2,
+衛兵1&衛兵2,卫兵1&卫兵2,
+衛兵1,卫兵1,
+自警団団長,民兵团团长,
+自警団団員,民兵团团员,
+ルリアとビィ,露利亚和碧,
+ルシフェル,路西菲尔,
+ランスロット,兰斯洛特,
+サンダルフォン,圣德芬,
+カール,卡尔,
+シロウ,士郎,
+ファラ,法拉,
+ユーリ,尤利,
+ポセイドン,波塞顿,
+ジック,吉克,
+ハーパー,哈波,
+マキラ,玛琪拉,
+ルナール,露娜露,
+悪夢の欠片,恶梦的碎片,
+帝国兵,帝国士兵,
+ヴェトル,薇特尔,
+モルペウス達,莫尔佩乌斯们,
+モルペウス,莫尔佩乌斯,
+モルフェ,莫尔菲,
+オネイロス,奥涅伊洛斯,
+イケロス,伊卡洛斯,
+アルビオン兵,阿尔比昂士兵,
+お母さん,妈妈,
+カレン,卡莲,
+アイル,艾鲁,
+ならず者,暴徒,
+ならず者達,暴徒们,
+ジークフリート,齐格飞,
+漁師,渔师,
+善子・花丸・ルビィ,善子・花丸・露比,
+ダイヤ,黛雅,
+ルビィ,露比,
diff --git a/modules/translate/scenario.js b/modules/translate/scenario.js
index 801f617473..dcf4a7be2d 100644
--- a/modules/translate/scenario.js
+++ b/modules/translate/scenario.js
@@ -18,25 +18,47 @@ if (CONFIG.transService === 'baidu') transApi = baiduTrans
const WORDS_LIMIT = 4500
const txtKeys = ['chapter_name', 'synopsis', 'detail', 'sel1_txt', 'sel2_txt', 'sel3_txt', 'sel4_txt']
-const replaceChar = (key, item, map) => {
+const getNameTrans = (name, map, scenarioName) => {
+ const item = map.get(name)
+ if (item) {
+ let existScenario = ''
+ if (item.scenarios.length) {
+ for (let sName of item.scenarios) {
+ if (scenarioName.indexOf(sName) !== -1) {
+ existScenario = sName
+ break
+ }
+ }
+ }
+ const result = { trans: item.trans, noun: item.noun }
+ if (existScenario) {
+ result.trans = item[existScenario].trans
+ result.noun = item[existScenario].noun
+ }
+ return result.trans
+ }
+ return null
+}
+
+const replaceChar = (key, item, map, scenarioName) => {
const name = item[key]
if (name && name !== 'null' && name !== '???' && name !== '???') {
- let trans = map.get(name)
+ let trans = getNameTrans(name, map, scenarioName)
let _name = name
if (/\s?[\??0-90-9]{1,2}$/.test(name)) {
// name with number or symbol
const nameRst = name.match(/(.+?)\s?([\??0-90-9]{1,2})$/)
- const _trans = map.get(nameRst[1])
+ const _trans = getNameTrans(nameRst[1], map, scenarioName)
_name = nameRst[1]
if (_trans) trans = `${_trans}${nameRst[2]}`
} else if (/'s\sVoice$/.test(name)) {
let nmKey = name.slice(0, name.length - 8)
- const _trans = map.get(nmKey)
+ const _trans = getNameTrans(nmKey, map, scenarioName)
if (_trans) trans = `${_trans}的声音`
} else if (/の声$/.test(name)) {
let nmKey = name.slice(0, name.length - 2)
- const _trans = map.get(nmKey)
+ const _trans = getNameTrans(nmKey, map, scenarioName)
if (_trans) trans = `${_trans}的声音`
}
@@ -160,9 +182,9 @@ const transStart = async (data, uid, pathname) => {
let names = []
data.forEach((item, index) => {
let name1, name2, name3
- name1 = replaceChar('charcter1_name', item, nameMap)
- name2 = replaceChar('charcter2_name', item, nameMap)
- name3 = replaceChar('charcter3_name', item, nameMap)
+ name1 = replaceChar('charcter1_name', item, nameMap, scenarioName)
+ name2 = replaceChar('charcter2_name', item, nameMap, scenarioName)
+ name3 = replaceChar('charcter3_name', item, nameMap, scenarioName)
name1 && !names.includes(name1) && names.push(name1)
name2 && !names.includes(name2) && names.push(name2)
name3 && !names.includes(name3) && names.push(name3)
diff --git a/package.json b/package.json
index e546b30893..78306be92d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "blhxfy",
- "version": "0.6.4",
+ "version": "0.6.5",
"description": "碧蓝幻想微风机翻团",
"main": "main.js",
"scripts": {
diff --git a/store/nameMap.js b/store/nameMap.js
index 3a238297d9..4964826015 100644
--- a/store/nameMap.js
+++ b/store/nameMap.js
@@ -15,6 +15,36 @@ const nameData = {
const cwd = process.cwd()
+const nameWithScenario = (list, key = 'name') => {
+ const newList = []
+ const keys = []
+ list.forEach(item => {
+ const existIdx = keys.indexOf(item[key])
+ if (existIdx !== -1) {
+ const obj = newList[existIdx]
+ if (item.scenario) {
+ obj[item.scenario] = item
+ obj.scenarios.push(item.scenario)
+ } else {
+ obj.trans = item.trans
+ obj.noun = !!item.noun
+ }
+ } else {
+ const obj = { [key]: item[key], scenarios: [] }
+ if (item.scenario) {
+ obj[item.scenario] = item
+ obj.scenarios.push(item.scenario)
+ } else {
+ obj.trans = item.trans
+ obj.noun = !!item.noun
+ }
+ newList.push(obj)
+ keys.push(item[key])
+ }
+ })
+ return newList
+}
+
const mergeList = async (pathLocal, pathStable, key = 'name') => {
const list = []
const tempMap = new Map()
@@ -29,6 +59,20 @@ const mergeList = async (pathLocal, pathStable, key = 'name') => {
return { list, listLocal }
}
+const mergeNpcList = async (pathLocal, pathStable, key = 'name') => {
+ const list = []
+ const tempMap = new Map()
+ let listLocal = nameWithScenario(await readCsv(pathLocal, true))
+ let listStable = nameWithScenario(await readCsv(pathStable))
+ listStable.concat(listLocal).forEach(item => {
+ if (item[key] && !tempMap.get(item[key])) {
+ list.push(item)
+ tempMap.set(item[key], true)
+ }
+ })
+ return list
+}
+
const getData = async (lang) => {
const DATA_PATH = await dataPath()
const NAME_EN_PATH = path.resolve(DATA_PATH, 'npc-name-en.csv')
@@ -38,10 +82,10 @@ const getData = async (lang) => {
const pathLocal = lang === 'en' ? NAME_EN_PATH_LOCAL : NAME_JP_PATH_LOCAL
const pathStable = lang === 'en' ? NAME_EN_PATH : NAME_JP_PATH
- const { list } = await mergeList(pathLocal, pathStable)
+ const list = await mergeNpcList(pathLocal, pathStable)
const result = new Map()
sortKeywords(list).forEach(item => {
- result.set(item.name, item.trans)
+ result.set(item.name, item)
})
if (lang === 'en') {
nameData['enNameMap'] = result
diff --git a/utils/index.js b/utils/index.js
index 9a5fdeba97..b38aaa41f1 100644
--- a/utils/index.js
+++ b/utils/index.js
@@ -18,7 +18,7 @@ const replaceWords = (str, map, lang = 'en') => {
const reStr = lang === 'en' ? `\\b${expr}\\b` : `${expr}`
if (typeof val === 'string') {
_str = _str.replace(new RegExp(reStr, 'g'), val)
- } else if (val) {
+ } else if (val && val.trans && !val.noun) {
if (val.ignoreCase) {
_str = _str.replace(new RegExp(reStr, 'gi'), val.trans)
} else {