add simplifed chinese locale (#485)
* add chinese locale, but translation is not yet complete. * Add chs and cht locale * translate ability,move,pokeball,pokemon * Add files via upload * Add files via upload * Update i18n.ts * Delete src/locales/zh_cn directory * Add files via upload * Update settings.ts * Delete src/locales/chs directory * Add files via upload * add tutorial * fix conflict issue * remove cht, due to chs is almost done by justhil * remove duplicated setting * spell correction --------- Co-authored-by: ZXZhuang <2993968012@qq.com> Co-authored-by: justhil <138752349+justhil@users.noreply.github.com> Co-authored-by: Jianfeng 2. Wang (NSB) <jianfeng.2.wang@nokia-sbell.com>pull/667/head
parent
76ac86d2ae
commit
5992d9eb81
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,53 @@
|
||||||
|
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||||
|
|
||||||
|
export const battle: SimpleTranslationEntries = {
|
||||||
|
"bossAppeared": "{{bossName}} 出现了。",
|
||||||
|
"trainerAppeared": "{{trainerName}}\n想要和你对战!",
|
||||||
|
"singleWildAppeared": "一只野生 {{pokemonName}} 出现了。!",
|
||||||
|
"multiWildAppeared": "野生的 {{pokemonName1}}\n和 {{pokemonName2}} 出现了。!",
|
||||||
|
"playerComeBack": "回来吧, {{pokemonName}}!",
|
||||||
|
"trainerComeBack": "{{trainerName}} 收回了 {{pokemonName}}!",
|
||||||
|
"playerGo": "去吧! {{pokemonName}}!",
|
||||||
|
"trainerGo": "{{trainerName}} 派出了 {{pokemonName}}!",
|
||||||
|
"switchQuestion": "要更换\n{{pokemonName}}吗?",
|
||||||
|
"trainerDefeated": `你击败了\n{{trainerName}}!`,
|
||||||
|
"pokemonCaught": "{{pokemonName}} 被抓住了!",
|
||||||
|
"pokemon": "宝可梦",
|
||||||
|
"sendOutPokemon": "上吧! {{pokemonName}}!",
|
||||||
|
"hitResultCriticalHit": "击中了要害!",
|
||||||
|
"hitResultSuperEffective": "效果拔群!",
|
||||||
|
"hitResultNotVeryEffective": "收效甚微…",
|
||||||
|
"hitResultNoEffect": "对 {{pokemonName}} 没有效果!!",
|
||||||
|
"hitResultOneHitKO": "一击必杀!",
|
||||||
|
"attackFailed": "但是失败了!",
|
||||||
|
"attackHitsCount": `击中 {{count}} 次!`,
|
||||||
|
"expGain": "{{pokemonName}} 获得了 {{exp}} 经验值!",
|
||||||
|
"levelUp": "{{pokemonName}} 升级到 Lv. {{level}}!",
|
||||||
|
"learnMove": "{{pokemonName}} 学会了 {{moveName}}!",
|
||||||
|
"learnMovePrompt": "{{pokemonName}} 想要学习 {{moveName}}。",
|
||||||
|
"learnMoveLimitReached": "但是,{{pokemonName}} 已经学会了\n四个技能",
|
||||||
|
"learnMoveReplaceQuestion": "要忘记一个技能并学习 {{moveName}} 吗?",
|
||||||
|
"learnMoveStopTeaching": "不再尝试学习 {{moveName}}?",
|
||||||
|
"learnMoveNotLearned": "{{pokemonName}} 没有学会 {{moveName}}。",
|
||||||
|
"learnMoveForgetQuestion": "要忘记哪个技能?",
|
||||||
|
"learnMoveForgetSuccess": "{{pokemonName}} 忘记了\n如何使用 {{moveName}}。",
|
||||||
|
"levelCapUp": "等级上限提升到 {{levelCap}}!",
|
||||||
|
"moveNotImplemented": "{{moveName}} 尚未实装,无法选择。",
|
||||||
|
"moveNoPP": "这个技能的 PP 用完了",
|
||||||
|
"moveDisabled": "{{moveName}} 被禁用!",
|
||||||
|
"noPokeballForce": "一股无形的力量阻止了你使用精灵球。",
|
||||||
|
"noPokeballTrainer": "你不能捕捉其他训练家的宝可梦!",
|
||||||
|
"noPokeballMulti": "只能在剩下一只宝可梦时才能扔出精灵球!",
|
||||||
|
"noPokeballStrong": "目标宝可梦太强了,无法捕捉!你需要先削弱它!",
|
||||||
|
"noEscapeForce": "一股无形的力量阻止你逃跑。",
|
||||||
|
"noEscapeTrainer": "你不能从训练家战斗中逃跑!",
|
||||||
|
"noEscapePokemon": "{{pokemonName}} 的 {{moveName}} 阻止了你 {{escapeVerb}}!",
|
||||||
|
"runAwaySuccess": "你成功逃脱了!",
|
||||||
|
"runAwayCannotEscape": '你无法逃脱!',
|
||||||
|
"escapeVerbSwitch": "切换",
|
||||||
|
"escapeVerbFlee": "逃跑",
|
||||||
|
"notDisabled": "{{moveName}} 不再被禁用!",
|
||||||
|
"skipItemQuestion": "你确定要跳过拾取道具吗?",
|
||||||
|
"eggHatching": "咦?",
|
||||||
|
"ivScannerUseQuestion": "对 {{pokemonName}} 使用个体值扫描仪?"
|
||||||
|
} as const;
|
|
@ -0,0 +1,9 @@
|
||||||
|
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||||
|
|
||||||
|
export const commandUiHandler: SimpleTranslationEntries = {
|
||||||
|
"fight": "战斗",
|
||||||
|
"ball": "精灵球",
|
||||||
|
"pokemon": "宝可梦",
|
||||||
|
"run": "逃跑",
|
||||||
|
"actionMessage": "要让\n{{pokemonName}} 做什么?",
|
||||||
|
} as const;
|
|
@ -0,0 +1,28 @@
|
||||||
|
import { ability } from "./ability";
|
||||||
|
import { battle } from "./battle";
|
||||||
|
import { commandUiHandler } from "./command-ui-handler";
|
||||||
|
import { fightUiHandler } from "./fight-ui-handler";
|
||||||
|
import { menu } from "./menu";
|
||||||
|
import { menuUiHandler } from "./menu-ui-handler";
|
||||||
|
import { move } from "./move";
|
||||||
|
import { pokeball } from "./pokeball";
|
||||||
|
import { pokemon } from "./pokemon";
|
||||||
|
import { pokemonStat } from "./pokemon-stat";
|
||||||
|
import { starterSelectUiHandler } from "./starter-select-ui-handler";
|
||||||
|
import { tutorial } from "./tutorial";
|
||||||
|
|
||||||
|
|
||||||
|
export const chsConfig = {
|
||||||
|
ability: ability,
|
||||||
|
battle: battle,
|
||||||
|
commandUiHandler: commandUiHandler,
|
||||||
|
fightUiHandler: fightUiHandler,
|
||||||
|
menuUiHandler: menuUiHandler,
|
||||||
|
menu: menu,
|
||||||
|
move: move,
|
||||||
|
pokeball: pokeball,
|
||||||
|
pokemonStat: pokemonStat,
|
||||||
|
pokemon: pokemon,
|
||||||
|
starterSelectUiHandler: starterSelectUiHandler,
|
||||||
|
tutorial: tutorial
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||||
|
|
||||||
|
export const fightUiHandler: SimpleTranslationEntries = {
|
||||||
|
"pp": "PP",
|
||||||
|
"power": "POWER",
|
||||||
|
} as const;
|
|
@ -0,0 +1,23 @@
|
||||||
|
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||||
|
|
||||||
|
export const menuUiHandler: SimpleTranslationEntries = {
|
||||||
|
"GAME_SETTINGS": '游戏设置',
|
||||||
|
"ACHIEVEMENTS": "成就",
|
||||||
|
"STATS": "数据统计",
|
||||||
|
"VOUCHERS": "兑换券",
|
||||||
|
"EGG_LIST": "蛋列表",
|
||||||
|
"EGG_GACHA": "蛋扭蛋",
|
||||||
|
"MANAGE_DATA": "管理数据",
|
||||||
|
"COMMUNITY": "社区",
|
||||||
|
"RETURN_TO_TITLE": "返回标题画面",
|
||||||
|
"LOG_OUT": "登出",
|
||||||
|
"slot": "存档位 {{slotNumber}}",
|
||||||
|
"importSession": "导入存档",
|
||||||
|
"importSlotSelect": "选择要导入到的存档位。",
|
||||||
|
"exportSession": "导出存档",
|
||||||
|
"exportSlotSelect": "选择要导出的存档位。",
|
||||||
|
"importData": "导入数据",
|
||||||
|
"exportData": "导出数据",
|
||||||
|
"cancel": "取消",
|
||||||
|
"losingProgressionWarning": "你将失去自战斗开始以来的所有进度。是否继续?"
|
||||||
|
} as const;
|
|
@ -0,0 +1,46 @@
|
||||||
|
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The menu namespace holds most miscellaneous text that isn't directly part of the game's
|
||||||
|
* contents or directly related to Pokemon data. This includes menu navigation, settings,
|
||||||
|
* account interactions, descriptive text, etc.
|
||||||
|
*/
|
||||||
|
export const menu: SimpleTranslationEntries = {
|
||||||
|
"cancel": "取消",
|
||||||
|
"continue": "继续",
|
||||||
|
"dailyRun": "每日挑战 (Beta)",
|
||||||
|
"loadGame": "加载游戏",
|
||||||
|
"newGame": "新游戏",
|
||||||
|
"selectGameMode": "选择一个游戏模式",
|
||||||
|
"logInOrCreateAccount": "登录或创建账户以开始游戏。无需邮箱!",
|
||||||
|
"username": "用户名",
|
||||||
|
"password": "密码",
|
||||||
|
"login": "登录",
|
||||||
|
"register": "注册",
|
||||||
|
"emptyUsername": "用户名不能为空",
|
||||||
|
"invalidLoginUsername": "提供的用户名无效",
|
||||||
|
"invalidRegisterUsername": "用户名只能包含字母、数字或下划线",
|
||||||
|
"invalidLoginPassword": "提供的密码无效",
|
||||||
|
"invalidRegisterPassword": "密码必须至少包含 6 个字符",
|
||||||
|
"usernameAlreadyUsed": "提供的用户名已被使用",
|
||||||
|
"accountNonExistent": "提供的用户不存在",
|
||||||
|
"unmatchingPassword": "提供的密码不匹配",
|
||||||
|
"passwordNotMatchingConfirmPassword": "密码必须与确认密码一致",
|
||||||
|
"confirmPassword": "确认密码",
|
||||||
|
"registrationAgeWarning": "注册即表示您确认您已年满 13 岁。",
|
||||||
|
"backToLogin": "返回登录",
|
||||||
|
"failedToLoadSaveData": "读取存档数据失败。请重新加载页面。如果问题仍然存在,请联系管理员。",
|
||||||
|
"sessionSuccess": "会话加载成功。",
|
||||||
|
"failedToLoadSession": "无法加载您的会话数据。它可能已损坏。",
|
||||||
|
"boyOrGirl": "你是男孩还是女孩?",
|
||||||
|
"boy": "男孩",
|
||||||
|
"girl": "女孩",
|
||||||
|
"dailyRankings": "每日排名",
|
||||||
|
"weeklyRankings": "每周排名",
|
||||||
|
"noRankings": "无排名",
|
||||||
|
"loading": "加载中…",
|
||||||
|
"playersOnline": "在线玩家",
|
||||||
|
"empty": "空",
|
||||||
|
"yes": "是",
|
||||||
|
"no": "否",
|
||||||
|
} as const;
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,10 @@
|
||||||
|
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||||
|
|
||||||
|
export const pokeball: SimpleTranslationEntries = {
|
||||||
|
"pokeBall": "精灵球",
|
||||||
|
"greatBall": "超级球",
|
||||||
|
"ultraBall": "高级球",
|
||||||
|
"rogueBall": "肉鸽球",
|
||||||
|
"masterBall": "大师球",
|
||||||
|
"luxuryBall": "豪华球",
|
||||||
|
} as const;
|
|
@ -0,0 +1,16 @@
|
||||||
|
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||||
|
|
||||||
|
export const pokemonStat: SimpleTranslationEntries = {
|
||||||
|
"HP": "最大HP",
|
||||||
|
"HPshortened": "最大HP",
|
||||||
|
"ATK": "攻击",
|
||||||
|
"ATKshortened": "攻击",
|
||||||
|
"DEF": "防御",
|
||||||
|
"DEFshortened": "防御",
|
||||||
|
"SPATK": "特攻",
|
||||||
|
"SPATKshortened": "特攻",
|
||||||
|
"SPDEF": "特防",
|
||||||
|
"SPDEFshortened": "特防",
|
||||||
|
"SPD": "速度",
|
||||||
|
"SPDshortened": "速度"
|
||||||
|
} as const;
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,32 @@
|
||||||
|
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The menu namespace holds most miscellaneous text that isn't directly part of the game's
|
||||||
|
* contents or directly related to Pokemon data. This includes menu navigation, settings,
|
||||||
|
* account interactions, descriptive text, etc.
|
||||||
|
*/
|
||||||
|
export const starterSelectUiHandler: SimpleTranslationEntries = {
|
||||||
|
"confirmStartTeam":'使用这些宝可梦开始游戏吗?',
|
||||||
|
"growthRate": "成长速度:",
|
||||||
|
"ability": "特性:",
|
||||||
|
"passive": "被动:",
|
||||||
|
"nature": "性格:",
|
||||||
|
"eggMoves": '蛋招式',
|
||||||
|
"start": "开始",
|
||||||
|
"addToParty": "加入队伍",
|
||||||
|
"toggleIVs": '切换个体值',
|
||||||
|
"manageMoves": '管理招式',
|
||||||
|
"useCandies": '使用糖果',
|
||||||
|
"selectMoveSwapOut": "选择要替换的招式。",
|
||||||
|
"selectMoveSwapWith": "选择要替换成的招式",
|
||||||
|
"unlockPassive": "解锁被动",
|
||||||
|
"reduceCost": "降低花费",
|
||||||
|
"cycleShiny": "R: 切换闪光",
|
||||||
|
"cycleForm": 'F: 切换形态',
|
||||||
|
"cycleGender": 'G: 切换性别',
|
||||||
|
"cycleAbility": 'E: 切换特性',
|
||||||
|
"cycleNature": 'N: 切换性格',
|
||||||
|
"cycleVariant": 'V: 切换变种',
|
||||||
|
"enablePassive": "启用被动",
|
||||||
|
"disablePassive": "禁用被动"
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
import { SimpleTranslationEntries } from "#app/plugins/i18n";
|
||||||
|
|
||||||
|
export const tutorial: SimpleTranslationEntries = {
|
||||||
|
"intro": `欢迎来到宝可梦:PokéRogue!这是一款以战斗为核心的宝可梦同人游戏,融合了 roguelite 元素。
|
||||||
|
$本游戏未进行商业化,我们不拥有宝可梦或使用的版权资产的所有权。
|
||||||
|
$游戏仍在开发中,但已可完整游玩。\n如需报告错误,请使用 Discord 社区。
|
||||||
|
$如果游戏运行缓慢,请确保在浏览器设置中打开了“硬件加速”。`,
|
||||||
|
|
||||||
|
"accessMenu": `在等待输入时,按 M 或 Escape 键可访问菜单。\n菜单包含设置和各种功能。`,
|
||||||
|
|
||||||
|
"menu": `在此菜单中,您可以访问设置。
|
||||||
|
$在设置中,您可以更改游戏速度、窗口样式和其他选项。
|
||||||
|
$这里还有各种其他功能,请务必全部查看!`,
|
||||||
|
|
||||||
|
"starterSelect": `在此屏幕中,您可以选择您的初始宝可梦。\n这些是您最初的队伍成员。
|
||||||
|
$每个初始宝可梦都有一个价值。您的队伍最多可以拥有\n6 名成员,只要总价值不超过 10。
|
||||||
|
$您还可以根据\n您捕获或孵化的变种选择性别、特性和形态。
|
||||||
|
$一个物种的个体值也是您捕获或孵化的所有宝可梦中最好的,所以尽量获得更多同种宝可梦!`,
|
||||||
|
|
||||||
|
"pokerus": `每天随机 3 个可选的初始宝可梦会有紫色边框。
|
||||||
|
$如果您看到您拥有的初始宝可梦带有紫色边框,\n请尝试将其添加到您的队伍中。请务必查看其摘要!`,
|
||||||
|
|
||||||
|
"statChange": `只要您的宝可梦没有被召回,属性变化就会在战斗中持续存在。
|
||||||
|
$在训练家战斗之前和进入新的生物群落之前,您的宝可梦会被召回。
|
||||||
|
$您还可以通过按住 C 或 Shift 键来查看场上宝可梦的属性变化。`,
|
||||||
|
|
||||||
|
"selectItem": `每次战斗后,您都可以选择 3 个随机物品。\n您只能选择其中一个。
|
||||||
|
$这些物品包括消耗品、宝可梦携带物品和被动永久物品。
|
||||||
|
$大多数非消耗品的效果会以各种方式叠加。
|
||||||
|
$某些物品只有在可以使用时才会出现,例如进化物品。
|
||||||
|
$您还可以使用转移选项在宝可梦之间转移携带物品。
|
||||||
|
$一旦您获得了携带物品,转移选项就会出现在右下角。
|
||||||
|
$您可以用金钱购买消耗品,并且随着您游戏的深入,将会有更多种类的消耗品可供选择。
|
||||||
|
$请务必在选择随机物品之前购买这些消耗品,因为一旦您选择,游戏就会进入下一场战斗。`,
|
||||||
|
|
||||||
|
"eggGacha": `在此屏幕中,您可以使用您的兑换券兑换\n宝可梦蛋。
|
||||||
|
$蛋需要孵化,并且在每场战斗后都会更接近孵化。稀有蛋需要更长时间才能孵化。
|
||||||
|
$孵化的宝可梦也不会被添加到您的队伍中,它们将被添加到您的初始宝可梦中。
|
||||||
|
$从蛋中孵化的宝可梦通常比\n野生宝可梦具有更好的个体值。
|
||||||
|
$有些宝可梦甚至只能从蛋中获得。
|
||||||
|
$有 3 种不同的机器可供选择,每种机器都有不同的\n奖励,请选择最适合您的!`,
|
||||||
|
} as const;
|
|
@ -6,6 +6,7 @@ import { enConfig } from '#app/locales/en/config.js';
|
||||||
import { esConfig } from '#app/locales/es/config.js';
|
import { esConfig } from '#app/locales/es/config.js';
|
||||||
import { frConfig } from '#app/locales/fr/config.js';
|
import { frConfig } from '#app/locales/fr/config.js';
|
||||||
import { itConfig } from '#app/locales/it/config.js';
|
import { itConfig } from '#app/locales/it/config.js';
|
||||||
|
import { chsConfig } from '#app/locales/chs/config.js';
|
||||||
|
|
||||||
export interface SimpleTranslationEntries {
|
export interface SimpleTranslationEntries {
|
||||||
[key: string]: string
|
[key: string]: string
|
||||||
|
@ -58,7 +59,7 @@ export function initI18n(): void {
|
||||||
i18next.use(LanguageDetector).init({
|
i18next.use(LanguageDetector).init({
|
||||||
lng: lang,
|
lng: lang,
|
||||||
fallbackLng: 'en',
|
fallbackLng: 'en',
|
||||||
supportedLngs: ['en', 'es', 'fr', 'it', 'de'],
|
supportedLngs: ['en', 'es', 'fr', 'it', 'de', 'chs'],
|
||||||
debug: true,
|
debug: true,
|
||||||
interpolation: {
|
interpolation: {
|
||||||
escapeValue: false,
|
escapeValue: false,
|
||||||
|
@ -78,6 +79,9 @@ export function initI18n(): void {
|
||||||
},
|
},
|
||||||
de: {
|
de: {
|
||||||
...deConfig
|
...deConfig
|
||||||
|
},
|
||||||
|
chs: {
|
||||||
|
...chsConfig
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -198,6 +198,10 @@ export function setSetting(scene: BattleScene, setting: Setting, value: integer)
|
||||||
label: 'Deutsch',
|
label: 'Deutsch',
|
||||||
handler: () => changeLocaleHandler('de')
|
handler: () => changeLocaleHandler('de')
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: 'Simplified Chinese',
|
||||||
|
handler: () => changeLocaleHandler('chs')
|
||||||
|
},
|
||||||
{
|
{
|
||||||
label: 'Cancel',
|
label: 'Cancel',
|
||||||
handler: () => cancelHandler()
|
handler: () => cancelHandler()
|
||||||
|
|
Loading…
Reference in New Issue