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 {