From cd7e4c9bd3904972acd53ce0c19018a4a84e5cfd Mon Sep 17 00:00:00 2001 From: notify Date: Mon, 27 Feb 2023 10:23:48 +0800 Subject: [PATCH] I18n (#57) * rotate general name when it becomes too long * remember x and y pos of window * config.language, and can change translations according to language * standard i18n (WIP) * client translation (WIP) * translation for standard cards * translate skill name and adjust UI --- lua/client/client_util.lua | 196 +--------------------- lua/client/i18n/en_US.lua | 195 +++++++++++++++++++++ lua/client/i18n/init.lua | 2 + lua/client/i18n/zh_CN.lua | 195 +++++++++++++++++++++ lua/core/engine.lua | 15 +- lua/freekill.lua | 30 +++- packages/standard/aux_skills.lua | 5 - packages/standard/i18n/en_US.lua | 142 ++++++++++++++++ packages/standard/i18n/init.lua | 2 + packages/standard/i18n/zh_CN.lua | 142 ++++++++++++++++ packages/standard/init.lua | 167 +----------------- packages/standard_cards/i18n/en_US.lua | 89 ++++++++++ packages/standard_cards/i18n/init.lua | 2 + packages/standard_cards/i18n/zh_CN.lua | 89 ++++++++++ packages/standard_cards/init.lua | 126 +------------- qml/Config.qml | 9 + qml/Pages/LobbyElement/EditProfile.qml | 13 ++ qml/Pages/RoomElement/GeneralCardItem.qml | 14 ++ qml/Pages/RoomElement/Photo.qml | 25 ++- qml/Pages/RoomElement/SkillArea.qml | 3 +- qml/Pages/RoomElement/SkillButton.qml | 6 +- qml/main.qml | 2 + 22 files changed, 963 insertions(+), 506 deletions(-) create mode 100644 lua/client/i18n/en_US.lua create mode 100644 lua/client/i18n/init.lua create mode 100644 lua/client/i18n/zh_CN.lua create mode 100644 packages/standard/i18n/en_US.lua create mode 100644 packages/standard/i18n/init.lua create mode 100644 packages/standard/i18n/zh_CN.lua create mode 100644 packages/standard_cards/i18n/en_US.lua create mode 100644 packages/standard_cards/i18n/init.lua create mode 100644 packages/standard_cards/i18n/zh_CN.lua diff --git a/lua/client/client_util.lua b/lua/client/client_util.lua index 08bdc043..f81d0002 100644 --- a/lua/client/client_util.lua +++ b/lua/client/client_util.lua @@ -367,198 +367,4 @@ function GetVirtualEquip(player, cid) } end -Fk:loadTranslationTable{ - -- Lobby - ["Room List"] = "房间列表", - ["Enter"] = "进入", - ["Observe"] = "旁观", - - ["Edit Profile"] = "编辑个人信息", - ["Username"] = "用户名", - ["Avatar"] = "头像", - ["Old Password"] = "旧密码", - ["New Password"] = "新密码", - ["Update Avatar"] = "更新头像", - ["Update Password"] = "更新密码", - ["Lobby BG"] = "大厅壁纸", - ["Room BG"] = "房间背景", - ["Game BGM"] = "游戏BGM", - - ["Create Room"] = "创建房间", - ["Room Name"] = "房间名字", - ["$RoomName"] = "%1的房间", - ["Player num"] = "玩家数目", - ["Enable free assign"] = "自由选将", - - ["Generals Overview"] = "武将一览", - ["Cards Overview"] = "卡牌一览", - ["Scenarios Overview"] = "玩法一览", - ["Replay"] = "录像", - ["About"] = "关于", - ["about_freekill_description"] = "关于FreeKill
" .. - "以便于DIY为首要目的的开源三国杀游戏。
" .. - "
项目链接: https://github.com/Notify-ctrl/FreeKill", - ["about_qt_description"] = "关于Qt
" .. - "Qt是一个C++图形界面应用程序开发框架,拥有强大的跨平台能力以及易于使用的API。
" .. - "
本程序使用Qt 6.2+,主要利用QtQuick开发UI,同时也使用Qt的网络库开发服务端程序。
" .. - "
官网: https://www.qt.io", - ["about_lua_description"] = "关于Lua
" .. - "Lua是一种小巧、灵活、高效的脚本语言,广泛用于游戏开发中。
" .. - "
本程序使用Lua 5.4,利用其完全实现了整个游戏逻辑。
" .. - "
官网: https://www.lua.org", - ["about_ossl_description"] = "关于OpenSSL
" .. - "OpenSSL是一个开源包,用来提供安全通信与各种加密支持。
" .. - "
本程序目前用到了crypto库,以获得RSA加密算法支持。
" .. - "
官网: https://www.openssl.org", - ["about_gplv3_description"] = "关于GPLv3
" .. - "GNU通用公共许可协议(简称GPL)是一个广泛使用的自由软件许可证条款,它确保广大用户自由地使用、学习、共享或修改软件。
" .. - "
由于Qt是按照GPLv3协议开源的库,与此同时本程序用到的readline库也属于GPLv3库,再加上QSanguosha也是以GPLv3协议开源的软件(从中借鉴了不少代码和思路),因此这个项目也使用GPLv3协议开源。
" .. - "
官网: https://gplv3.fsf.org", - ["about_sqlite_description"] = "关于SQLite
" .. - "SQLite是一个轻量级的数据库,具有占用资源低、运行效率快、嵌入性好等优点。
" .. - "
FreeKill使用sqlite3在服务端保存用户的各种信息。
" .. - "
官网: https://www.sqlite.org", - ["about_git2_description"] = "关于Libgit2
" .. - "Libgit2是一个轻量级的、跨平台的、纯C实现的库,支持Git的大部分核心操作,并且支持几乎任何能与C语言交互的编程语言。
" .. - "
FreeKill使用的是libgit2的C API,与此同时使用Git完成拓展包的下载、更新、管理等等功能。
" .. - "
官网: https://libgit2.org", - - ["Exit Lobby"] = "退出大厅", - - ["OK"] = "确定", - ["Cancel"] = "取消", - ["End"] = "结束", - ["Quit"] = "退出", - - ["$WelcomeToLobby"] = "欢迎进入FreeKill游戏大厅!", - - -- Room - ["$EnterRoom"] = "成功加入房间。", - ["$Choice"] = "%1:请选择", - ["$ChooseGeneral"] = "请选择 %1 名武将", - ["Fight"] = "出战", - - ["#PlayCard"] = "出牌阶段,请使用一张牌", - ["#AskForGeneral"] = "请选择 1 名武将", - ["#AskForSkillInvoke"] = "你想发动技能“%1”吗?", - ["#AskForChoice"] = "%1:请选择", - ["#choose-trigger"] = "请选择一项技能发动", - ["trigger"] = "选择技能", - ["Please arrange cards"] = "请拖拽移动卡牌", - - [" thinking..."] = " 思考中...", - ["AskForGeneral"] = "选择武将", - ["AskForGuanxiong"] = "观星", - ["AskForChoice"] = "选择", - ["PlayCard"] = "出牌", - - ["AskForCardChosen"] = "选牌", - ["#AskForChooseCard"] = "%1:请选择其一张卡牌", - ["$ChooseCard"] = "请选择一张卡牌", - ["$Hand"] = "手牌区", - ["$Equip"] = "装备区", - ["$Judge"] = "判定区", - ["#AskForUseActiveSkill"] = "请使用技能 %1", - ["#AskForUseCard"] = "请使用卡牌 %1", - ["#AskForResponseCard"] = "请打出卡牌 %1", - ["#AskForNullification"] = "是否为目标为 %dest 的 %arg 使用无懈可击?", - ["#AskForNullificationWithoutTo"] = "是否对 %src 使用的 %arg 使用无懈可击?", - - ["#AskForDiscard"] = "请弃置 %arg 张牌,最少 %arg2 张", - - ["Trust"] = "托管", - ["Sort Cards"] = "牌序", - ["Chat"] = "聊天", - ["Log"] = "战报", - ["Trusting ..."] = "托管中 ...", - ["Observing ..."] = "旁观中 ...", - - ["$GameOver"] = "游戏结束", - ["$Winner"] = "%1 获胜", - ["Back To Lobby"] = "返回大厅", -} - --- Game concepts -Fk:loadTranslationTable{ - ["lord"] = "主公", - ["loyalist"] = "忠臣", - ["rebel"] = "反贼", - ["renegade"] = "内奸", - ["lord+loyalist"] = "主忠", - - ["normal_damage"] = "无属性", - ["fire_damage"] = "火属性", - ["thunder_damage"] = "雷属性", - - ["phase_judge"] = "判定阶段", - ["phase_draw"] = "摸牌阶段", - ["phase_play"] = "出牌阶段", - ["phase_discard"] = "弃牌阶段", -} - --- related to sendLog -Fk:loadTranslationTable{ - -- game processing - ["$AppendSeparator"] = '------------------------------', - ["$GameStart"] = "== 游戏开始 ==", - ["$GameEnd"] = "== 游戏结束 ==", - - -- get/lose skill - ["#AcquireSkill"] = "%from 获得了技能“%arg”", - ["#LoseSkill"] = "%from 失去了技能“%arg”", - - -- moveCards (they are sent by notifyMoveCards) - - ["$DrawCards"] = "%from 摸了 %arg 张牌 %card", - ["$DiscardCards"] = "%from 弃置了 %arg 张牌 %card", - - -- phase - ["#PhaseSkipped"] = "%from 跳过了 %arg", - - -- useCard - ["#UseCard"] = "%from 使用了牌 %card", - ["#UseCardToTargets"] = "%from 使用了牌 %card,目标是 %to", - ["#CardUseCollaborator"] = "%from 在此次 %arg 中的子目标是 %to", - ["#UseCardToCard"] = "%from 使用了牌 %card,目标是 %arg", - ["#ResponsePlayCard"] = "%from 打出了牌 %card", - - ["#UseVCard"] = "%from 将 %card 当 %arg 使用", - ["#UseVCardToTargets"] = "%from 将 %card 当 %arg 使用,目标是 %to", - ["#UseVCardToCard"] = "%from 将 %card 当 %arg2 使用,目标是 %arg", - ["#ResponsePlayVCard"] = "%from 将 %card 当 %arg 打出", - ["#UseV0Card"] = "%from 使用了 %arg", - ["#UseV0CardToTargets"] = "%from 使用了 %arg,目标是 %to", - ["#UseV0CardToCard"] = "%from 使用了 %arg2,目标是 %arg", - ["#ResponsePlayV0Card"] = "%from 打出了 %arg", - - ["#FilterCard"] = "由于 %arg 的效果,与 %from 相关的 %arg2 被视为了 %arg3", - - -- skill - ["#InvokeSkill"] = "%from 发动了 “%arg”", - - -- judge - ["#StartJudgeReason"] = "%from 开始了 %arg 的判定", - ["#InitialJudge"] = "%from 的判定牌为 %card", - ["#ChangedJudge"] = "%from 发动“%arg”把 %to 的判定牌改为 %card", - ["#JudgeResult"] = "%from 的判定结果为 %card", - - -- turnOver - ["#TurnOver"] = "%from 将武将牌翻面,现在是 %arg", - ["face_up"] = "正面朝上", - ["face_down"] = "背面朝上", - - -- damage, heal and lose HP - ["#Damage"] = "%to 对 %from 造成了 %arg 点 %arg2 伤害", - ["#DamageWithNoFrom"] = "%from 受到了 %arg 点 %arg2 伤害", - ["#LoseHP"] = "%from 失去了 %arg 点体力", - ["#HealHP"] = "%from 回复了 %arg 点体力", - ["#ShowHPAndMaxHP"] = "%from 现在的体力值为 %arg,体力上限为 %arg2", - - -- dying and death - ["#EnterDying"] = "%from 进入了濒死阶段", - ["#KillPlayer"] = "%from [%arg] 阵亡,凶手是 %to", - ["#KillPlayerWithNoKiller"] = "%from [%arg] 阵亡,无伤害来源", - - -- misc - ["#GuanxingResult"] = "%from 的观星结果为 %arg 上 %arg2 下", -} +dofile "lua/client/i18n/init.lua" diff --git a/lua/client/i18n/en_US.lua b/lua/client/i18n/en_US.lua new file mode 100644 index 00000000..6f844dc4 --- /dev/null +++ b/lua/client/i18n/en_US.lua @@ -0,0 +1,195 @@ +Fk:loadTranslationTable({ + -- Lobby + -- ["Room List"] = "房间列表", + -- ["Enter"] = "进入", + -- ["Observe"] = "旁观", + + -- ["Edit Profile"] = "编辑个人信息", + -- ["Username"] = "用户名", + -- ["Avatar"] = "头像", + -- ["Old Password"] = "旧密码", + -- ["New Password"] = "新密码", + -- ["Update Avatar"] = "更新头像", + -- ["Update Password"] = "更新密码", + -- ["Lobby BG"] = "大厅壁纸", + -- ["Room BG"] = "房间背景", + -- ["Game BGM"] = "游戏BGM", + + -- ["Create Room"] = "创建房间", + -- ["Room Name"] = "房间名字", + ["$RoomName"] = "%1's room", + ["Player num"] = "Player Count", + -- ["Enable free assign"] = "自由选将", + + -- ["Generals Overview"] = "武将一览", + -- ["Cards Overview"] = "卡牌一览", + -- ["Scenarios Overview"] = "玩法一览", + -- ["Replay"] = "录像", + -- ["About"] = "关于", + ["about_freekill_description"] = "About FreeKill
" .. + "FreeKill is an open-source Bang!-like board game, which is aim to extensive.
" .. + "
Repo: https://github.com/Notify-ctrl/FreeKill", + ["about_qt_description"] = "About Qt
" .. + "Qt是一个C++图形界面应用程序开发框架,拥有强大的跨平台能力以及易于使用的API。
" .. + "
本程序使用Qt 6.2+,主要利用QtQuick开发UI,同时也使用Qt的网络库开发服务端程序。
" .. + "
官网: https://www.qt.io", + ["about_lua_description"] = "About Lua
" .. + "Lua是一种小巧、灵活、高效的脚本语言,广泛用于游戏开发中。
" .. + "
本程序使用Lua 5.4,利用其完全实现了整个游戏逻辑。
" .. + "
官网: https://www.lua.org", + ["about_ossl_description"] = "About OpenSSL
" .. + "OpenSSL是一个开源包,用来提供安全通信与各种加密支持。
" .. + "
本程序目前用到了crypto库,以获得RSA加密算法支持。
" .. + "
官网: https://www.openssl.org", + ["about_gplv3_description"] = "About GPLv3
" .. + "GNU通用公共许可协议(简称GPL)是一个广泛使用的自由软件许可证条款,它确保广大用户自由地使用、学习、共享或修改软件。
" .. + "
由于Qt是按照GPLv3协议开源的库,与此同时本程序用到的readline库也属于GPLv3库,再加上QSanguosha也是以GPLv3协议开源的软件(从中借鉴了不少代码和思路),因此这个项目也使用GPLv3协议开源。
" .. + "
官网: https://gplv3.fsf.org", + ["about_sqlite_description"] = "About SQLite
" .. + "SQLite是一个轻量级的数据库,具有占用资源低、运行效率快、嵌入性好等优点。
" .. + "
FreeKill使用sqlite3在服务端保存用户的各种信息。
" .. + "
官网: https://www.sqlite.org", + ["about_git2_description"] = "About Libgit2
" .. + "Libgit2是一个轻量级的、跨平台的、纯C实现的库,支持Git的大部分核心操作,并且支持几乎任何能与C语言交互的编程语言。
" .. + "
FreeKill使用的是libgit2的C API,与此同时使用Git完成拓展包的下载、更新、管理等等功能。
" .. + "
官网: https://libgit2.org", + + -- ["Exit Lobby"] = "退出大厅", + + -- ["OK"] = "确定", + -- ["Cancel"] = "取消", + -- ["End"] = "结束", + -- ["Quit"] = "退出", + + ["$WelcomeToLobby"] = "Welcome to FreeKill lobby!", + + -- Room + ["$EnterRoom"] = "Successfully entered the room.", + ["$Choice"] = "%1: Please choose", + ["$ChooseGeneral"] = "Please choose %1 general(s)", + -- ["Fight"] = "出战", + + ["#PlayCard"] = "Your turn now, please use a card", + ["#AskForGeneral"] = "", + ["#AskForSkillInvoke"] = "Do you want to use skill %1?", + ["#AskForChoice"] = "%1: Please choose", + ["#choose-trigger"] = "Please choose the skill to use", + ["trigger"] = "Trigger skill", + -- ["Please arrange cards"] = "请拖拽移动卡牌", + + -- [" thinking..."] = " 思考中...", + ["AskForGeneral"] = "Choosing general", + ["AskForGuanxing"] = "Stargazing", + ["AskForChoice"] = "Making choice", + ["PlayCard"] = "Playing card", + + ["AskForCardChosen"] = "Choosing card", + ["#AskForChooseCard"] = "%1:请选择其一张卡牌", + ["$ChooseCard"] = "请选择一张卡牌", + ["$Hand"] = "Hand", + ["$Equip"] = "Equip", + ["$Judge"] = "Judge", + ["#AskForUseActiveSkill"] = "请使用技能 %1", + ["#AskForUseCard"] = "请使用卡牌 %1", + ["#AskForResponseCard"] = "请打出卡牌 %1", + ["#AskForNullification"] = "是否为目标为 %dest 的 %arg 使用无懈可击?", + ["#AskForNullificationWithoutTo"] = "是否对 %src 使用的 %arg 使用无懈可击?", + + ["#AskForDiscard"] = "请弃置 %arg 张牌,最少 %arg2 张", + + -- ["Trust"] = "托管", + -- ["Sort Cards"] = "牌序", + -- ["Chat"] = "聊天", + ["Log"] = "Game Log", + -- ["Trusting ..."] = "托管中 ...", + -- ["Observing ..."] = "旁观中 ...", + + ["$GameOver"] = "Game Over", + ["$Winner"] = "Winner is %1", + -- ["Back To Lobby"] = "返回大厅", +}, "en_US") + +-- Game concepts +Fk:loadTranslationTable({ + ["lord"] = "Lord", + ["loyalist"] = "Loyalist", + ["rebel"] = "Rebel", + ["renegade"] = "Renegade", + ["lord+loyalist"] = "Lord and Loyalist", + + ["normal_damage"] = "Normal", + ["fire_damage"] = "Fire", + ["thunder_damage"] = "Thunder", + + ["phase_judge"] = "Judge phase", + ["phase_draw"] = "Draw phase", + ["phase_play"] = "Play phase", + ["phase_discard"] = "Discard phase", +}, "en_US") + +-- related to sendLog +Fk:loadTranslationTable({ + -- game processing + ["$AppendSeparator"] = '------------------------------', + ["$GameStart"] = "== Game Started ==", + ["$GameEnd"] = "== Game Over ==", + + -- get/lose skill + ["#AcquireSkill"] = '%from acquired the skill "%arg"', + ["#LoseSkill"] = '%from lost the skill "%arg"', + + -- moveCards (they are sent by notifyMoveCards) + + ["$DrawCards"] = "%from drew %arg card(s) %card", + ["$DiscardCards"] = "%from discarded %arg card(s) %card", + + -- phase + ["#PhaseSkipped"] = "%from skipped %arg", + + -- useCard + ["#UseCard"] = "%from used card %card", + ["#UseCardToTargets"] = "%from used card %card,and the target was %to", + ["#CardUseCollaborator"] = "%from 在此次 %arg 中的子目标是 %to", + ["#UseCardToCard"] = "%from 使用了牌 %card,目标是 %arg", + ["#ResponsePlayCard"] = "%from 打出了牌 %card", + + ["#UseVCard"] = "%from 将 %card 当 %arg 使用", + ["#UseVCardToTargets"] = "%from 将 %card 当 %arg 使用,目标是 %to", + ["#UseVCardToCard"] = "%from 将 %card 当 %arg2 使用,目标是 %arg", + ["#ResponsePlayVCard"] = "%from 将 %card 当 %arg 打出", + ["#UseV0Card"] = "%from 使用了 %arg", + ["#UseV0CardToTargets"] = "%from 使用了 %arg,目标是 %to", + ["#UseV0CardToCard"] = "%from 使用了 %arg2,目标是 %arg", + ["#ResponsePlayV0Card"] = "%from 打出了 %arg", + + ["#FilterCard"] = "由于 %arg 的效果,与 %from 相关的 %arg2 被视为了 %arg3", + + -- skill + ["#InvokeSkill"] = '%from used skill "%arg"', + + -- judge + ["#StartJudgeReason"] = "%from 开始了 %arg 的判定", + ["#InitialJudge"] = "%from 的判定牌为 %card", + ["#ChangedJudge"] = "%from 发动“%arg”把 %to 的判定牌改为 %card", + ["#JudgeResult"] = "%from 的判定结果为 %card", + + -- turnOver + ["#TurnOver"] = "%from 将武将牌翻面,现在是 %arg", + ["face_up"] = "face up", + ["face_down"] = "face down", + + -- damage, heal and lose HP + ["#Damage"] = "%to 对 %from 造成了 %arg 点 %arg2 伤害", + ["#DamageWithNoFrom"] = "%from 受到了 %arg 点 %arg2 伤害", + ["#LoseHP"] = "%from 失去了 %arg 点体力", + ["#HealHP"] = "%from 回复了 %arg 点体力", + ["#ShowHPAndMaxHP"] = "%from 现在的体力值为 %arg,体力上限为 %arg2", + + -- dying and death + ["#EnterDying"] = "%from 进入了濒死阶段", + ["#KillPlayer"] = "%from [%arg] 阵亡,凶手是 %to", + ["#KillPlayerWithNoKiller"] = "%from [%arg] 阵亡,无伤害来源", + + -- misc + ["#GuanxingResult"] = "%from 的观星结果为 %arg 上 %arg2 下", +}, "en_US") diff --git a/lua/client/i18n/init.lua b/lua/client/i18n/init.lua new file mode 100644 index 00000000..4a87adf7 --- /dev/null +++ b/lua/client/i18n/init.lua @@ -0,0 +1,2 @@ +dofile "lua/client/i18n/zh_CN.lua" +dofile "lua/client/i18n/en_US.lua" diff --git a/lua/client/i18n/zh_CN.lua b/lua/client/i18n/zh_CN.lua new file mode 100644 index 00000000..a44e9ec9 --- /dev/null +++ b/lua/client/i18n/zh_CN.lua @@ -0,0 +1,195 @@ +Fk:loadTranslationTable{ + -- Lobby + ["Room List"] = "房间列表", + ["Enter"] = "进入", + ["Observe"] = "旁观", + + ["Edit Profile"] = "编辑个人信息", + ["Username"] = "用户名", + ["Avatar"] = "头像", + ["Old Password"] = "旧密码", + ["New Password"] = "新密码", + ["Update Avatar"] = "更新头像", + ["Update Password"] = "更新密码", + ["Lobby BG"] = "大厅壁纸", + ["Room BG"] = "房间背景", + ["Game BGM"] = "游戏BGM", + + ["Create Room"] = "创建房间", + ["Room Name"] = "房间名字", + ["$RoomName"] = "%1的房间", + ["Player num"] = "玩家数目", + ["Enable free assign"] = "自由选将", + + ["Generals Overview"] = "武将一览", + ["Cards Overview"] = "卡牌一览", + ["Scenarios Overview"] = "玩法一览", + ["Replay"] = "录像", + ["About"] = "关于", + ["about_freekill_description"] = "关于FreeKill
" .. + "以便于DIY为首要目的的开源三国杀游戏。
" .. + "
项目链接: https://github.com/Notify-ctrl/FreeKill", + ["about_qt_description"] = "关于Qt
" .. + "Qt是一个C++图形界面应用程序开发框架,拥有强大的跨平台能力以及易于使用的API。
" .. + "
本程序使用Qt 6.2+,主要利用QtQuick开发UI,同时也使用Qt的网络库开发服务端程序。
" .. + "
官网: https://www.qt.io", + ["about_lua_description"] = "关于Lua
" .. + "Lua是一种小巧、灵活、高效的脚本语言,广泛用于游戏开发中。
" .. + "
本程序使用Lua 5.4,利用其完全实现了整个游戏逻辑。
" .. + "
官网: https://www.lua.org", + ["about_ossl_description"] = "关于OpenSSL
" .. + "OpenSSL是一个开源包,用来提供安全通信与各种加密支持。
" .. + "
本程序目前用到了crypto库,以获得RSA加密算法支持。
" .. + "
官网: https://www.openssl.org", + ["about_gplv3_description"] = "关于GPLv3
" .. + "GNU通用公共许可协议(简称GPL)是一个广泛使用的自由软件许可证条款,它确保广大用户自由地使用、学习、共享或修改软件。
" .. + "
由于Qt是按照GPLv3协议开源的库,与此同时本程序用到的readline库也属于GPLv3库,再加上QSanguosha也是以GPLv3协议开源的软件(从中借鉴了不少代码和思路),因此这个项目也使用GPLv3协议开源。
" .. + "
官网: https://gplv3.fsf.org", + ["about_sqlite_description"] = "关于SQLite
" .. + "SQLite是一个轻量级的数据库,具有占用资源低、运行效率快、嵌入性好等优点。
" .. + "
FreeKill使用sqlite3在服务端保存用户的各种信息。
" .. + "
官网: https://www.sqlite.org", + ["about_git2_description"] = "关于Libgit2
" .. + "Libgit2是一个轻量级的、跨平台的、纯C实现的库,支持Git的大部分核心操作,并且支持几乎任何能与C语言交互的编程语言。
" .. + "
FreeKill使用的是libgit2的C API,与此同时使用Git完成拓展包的下载、更新、管理等等功能。
" .. + "
官网: https://libgit2.org", + + ["Exit Lobby"] = "退出大厅", + + ["OK"] = "确定", + ["Cancel"] = "取消", + ["End"] = "结束", + ["Quit"] = "退出", + + ["$WelcomeToLobby"] = "欢迎进入FreeKill游戏大厅!", + + -- Room + ["$EnterRoom"] = "成功加入房间。", + ["$Choice"] = "%1:请选择", + ["$ChooseGeneral"] = "请选择 %1 名武将", + ["Fight"] = "出战", + + ["#PlayCard"] = "出牌阶段,请使用一张牌", + ["#AskForGeneral"] = "请选择 1 名武将", + ["#AskForSkillInvoke"] = "你想发动技能“%1”吗?", + ["#AskForChoice"] = "%1:请选择", + ["#choose-trigger"] = "请选择一项技能发动", + ["trigger"] = "选择技能", + ["Please arrange cards"] = "请拖拽移动卡牌", + + [" thinking..."] = " 思考中...", + ["AskForGeneral"] = "选择武将", + ["AskForGuanxing"] = "观星", + ["AskForChoice"] = "选择", + ["PlayCard"] = "出牌", + + ["AskForCardChosen"] = "选牌", + ["#AskForChooseCard"] = "%1:请选择其一张卡牌", + ["$ChooseCard"] = "请选择一张卡牌", + ["$Hand"] = "手牌区", + ["$Equip"] = "装备区", + ["$Judge"] = "判定区", + ["#AskForUseActiveSkill"] = "请使用技能 %1", + ["#AskForUseCard"] = "请使用卡牌 %1", + ["#AskForResponseCard"] = "请打出卡牌 %1", + ["#AskForNullification"] = "是否为目标为 %dest 的 %arg 使用无懈可击?", + ["#AskForNullificationWithoutTo"] = "是否对 %src 使用的 %arg 使用无懈可击?", + + ["#AskForDiscard"] = "请弃置 %arg 张牌,最少 %arg2 张", + + ["Trust"] = "托管", + ["Sort Cards"] = "牌序", + ["Chat"] = "聊天", + ["Log"] = "战报", + ["Trusting ..."] = "托管中 ...", + ["Observing ..."] = "旁观中 ...", + + ["$GameOver"] = "游戏结束", + ["$Winner"] = "%1 获胜", + ["Back To Lobby"] = "返回大厅", +} + +-- Game concepts +Fk:loadTranslationTable{ + ["lord"] = "主公", + ["loyalist"] = "忠臣", + ["rebel"] = "反贼", + ["renegade"] = "内奸", + ["lord+loyalist"] = "主忠", + + ["normal_damage"] = "无属性", + ["fire_damage"] = "火属性", + ["thunder_damage"] = "雷属性", + + ["phase_judge"] = "判定阶段", + ["phase_draw"] = "摸牌阶段", + ["phase_play"] = "出牌阶段", + ["phase_discard"] = "弃牌阶段", +} + +-- related to sendLog +Fk:loadTranslationTable{ + -- game processing + ["$AppendSeparator"] = '------------------------------', + ["$GameStart"] = "== 游戏开始 ==", + ["$GameEnd"] = "== 游戏结束 ==", + + -- get/lose skill + ["#AcquireSkill"] = "%from 获得了技能“%arg”", + ["#LoseSkill"] = "%from 失去了技能“%arg”", + + -- moveCards (they are sent by notifyMoveCards) + + ["$DrawCards"] = "%from 摸了 %arg 张牌 %card", + ["$DiscardCards"] = "%from 弃置了 %arg 张牌 %card", + + -- phase + ["#PhaseSkipped"] = "%from 跳过了 %arg", + + -- useCard + ["#UseCard"] = "%from 使用了牌 %card", + ["#UseCardToTargets"] = "%from 使用了牌 %card,目标是 %to", + ["#CardUseCollaborator"] = "%from 在此次 %arg 中的子目标是 %to", + ["#UseCardToCard"] = "%from 使用了牌 %card,目标是 %arg", + ["#ResponsePlayCard"] = "%from 打出了牌 %card", + + ["#UseVCard"] = "%from 将 %card 当 %arg 使用", + ["#UseVCardToTargets"] = "%from 将 %card 当 %arg 使用,目标是 %to", + ["#UseVCardToCard"] = "%from 将 %card 当 %arg2 使用,目标是 %arg", + ["#ResponsePlayVCard"] = "%from 将 %card 当 %arg 打出", + ["#UseV0Card"] = "%from 使用了 %arg", + ["#UseV0CardToTargets"] = "%from 使用了 %arg,目标是 %to", + ["#UseV0CardToCard"] = "%from 使用了 %arg2,目标是 %arg", + ["#ResponsePlayV0Card"] = "%from 打出了 %arg", + + ["#FilterCard"] = "由于 %arg 的效果,与 %from 相关的 %arg2 被视为了 %arg3", + + -- skill + ["#InvokeSkill"] = "%from 发动了 “%arg”", + + -- judge + ["#StartJudgeReason"] = "%from 开始了 %arg 的判定", + ["#InitialJudge"] = "%from 的判定牌为 %card", + ["#ChangedJudge"] = "%from 发动“%arg”把 %to 的判定牌改为 %card", + ["#JudgeResult"] = "%from 的判定结果为 %card", + + -- turnOver + ["#TurnOver"] = "%from 将武将牌翻面,现在是 %arg", + ["face_up"] = "正面朝上", + ["face_down"] = "背面朝上", + + -- damage, heal and lose HP + ["#Damage"] = "%to 对 %from 造成了 %arg 点 %arg2 伤害", + ["#DamageWithNoFrom"] = "%from 受到了 %arg 点 %arg2 伤害", + ["#LoseHP"] = "%from 失去了 %arg 点体力", + ["#HealHP"] = "%from 回复了 %arg 点体力", + ["#ShowHPAndMaxHP"] = "%from 现在的体力值为 %arg,体力上限为 %arg2", + + -- dying and death + ["#EnterDying"] = "%from 进入了濒死阶段", + ["#KillPlayer"] = "%from [%arg] 阵亡,凶手是 %to", + ["#KillPlayerWithNoKiller"] = "%from [%arg] 阵亡,无伤害来源", + + -- misc + ["#GuanxingResult"] = "%from 的观星结果为 %arg 上 %arg2 下", +} diff --git a/lua/core/engine.lua b/lua/core/engine.lua index 532bbeef..4201633c 100644 --- a/lua/core/engine.lua +++ b/lua/core/engine.lua @@ -8,7 +8,7 @@ ---@field generals table ---@field lords string[] ---@field cards Card[] ----@field translations table +---@field translations table> local Engine = class("Engine") function Engine:initialize() @@ -82,17 +82,20 @@ function Engine:loadPackages() end ---@param t table -function Engine:loadTranslationTable(t) +function Engine:loadTranslationTable(t, lang) assert(type(t) == "table") + lang = lang or "zh_CN" + self.translations[lang] = self.translations[lang] or {} for k, v in pairs(t) do - self.translations[k] = v + self.translations[lang][k] = v end end function Engine:translate(src) - local ret = self.translations[src] - if not ret then return src end - return ret + local lang = Config.language or "zh_CN" + if not self.translations[lang] then lang = "zh_CN" end + local ret = self.translations[lang][src] + return ret or src end ---@param skill Skill diff --git a/lua/freekill.lua b/lua/freekill.lua index 6d1be6b5..cd88c281 100644 --- a/lua/freekill.lua +++ b/lua/freekill.lua @@ -4,13 +4,6 @@ package.path = package.path .. ";./lua/lib/?.lua" .. ";./lua/?.lua" --- disable dangerous functions -os.remove = nil -os.execute = nil -os.exit = nil -os.rename = nil -io = nil - -- load libraries class = require "middleclass" @@ -33,6 +26,29 @@ UsableSkill = require "core.skill_type.usable_skill" StatusSkill = require "core.skill_type.status_skill" Player = require "core.player" +-- load config +local function loadConf() + local cfg = io.open("freekill.client.config.json") + local ret + if cfg == nil then + ret = { + language = "zh_CN", + } + else + ret = json.decode(cfg:read("a")) + cfg:close() + end + return ret +end +Config = loadConf() + +-- disable dangerous functions +os.remove = nil +os.execute = nil +os.exit = nil +os.rename = nil +io = nil + -- load packages dofile "lua/fk_ex.lua" Fk = Engine:new() diff --git a/packages/standard/aux_skills.lua b/packages/standard/aux_skills.lua index 255f1ce4..4e33383b 100644 --- a/packages/standard/aux_skills.lua +++ b/packages/standard/aux_skills.lua @@ -31,11 +31,6 @@ local choosePlayersSkill = fk.CreateActiveSkill{ max_target_num = function(self) return self.num end, } -Fk:loadTranslationTable{ - ["discard_skill"] = "弃牌", - ["choose_players_skill"] = "选择角色", -} - AuxSkills = { discardSkill, choosePlayersSkill, diff --git a/packages/standard/i18n/en_US.lua b/packages/standard/i18n/en_US.lua new file mode 100644 index 00000000..75933e75 --- /dev/null +++ b/packages/standard/i18n/en_US.lua @@ -0,0 +1,142 @@ +Fk:loadTranslationTable({ + ["standard"] = "Standard", + ["wei"] = "Wei", + ["shu"] = "Shu", + ["wu"] = "Wu", + ["qun"] = "Qun", + + ["black"] = "Black", + ["red"] = 'Red', + ["nocolor"] = 'NoColor', + + ["caocao"] = "Cao Cao", + ["jianxiong"] = "Villainous Hero", + [":jianxiong"] = "当你受到伤害后,你可以获得对你造成伤害的牌。", + + ["simayi"] = "Sima Yi", + ["guicai"] = "Demonic Talent", + [":guicai"] = "当一名角色的判定牌生效前,你可以打出一张手牌代替之。", + ["#guicai-ask"] = "是否发动“鬼才”,打出一张手牌修改 %dest 的判定?", + ["fankui"] = "Retaliation", + [":fankui"] = "当你受到伤害后,你可以获得伤害来源的一张牌。", + + ["xiahoudun"] = "Xiahou Dun", + ["ganglie"] = "Unyielding", + [":ganglie"] = "当你受到伤害后,你可以进行判定:若结果不为红桃,则伤害来源选择一项:弃置两张手牌,或受到1点伤害。", + + ["zhangliao"] = "Zhang Liao", + ["tuxi"] = "Sudden Strike", + [":tuxi"] = "摸牌阶段,你可以改为获得至多两名其他角色的各一张手牌。", + ["#tuxi-ask"] = "是否发动“突袭”,改为获得1-2名角色各一张手牌?", + + ["xuchu"] = "Xu Chu", + ["luoyi"] = "Bare Chested", + [":luoyi"] = "摸牌阶段,你可以少摸一张牌,若如此做,本回合你使用【杀】或【决斗】对目标角色造成伤害时,此伤害+1。", + + ["guojia"] = "Guo Jia", + ["tiandu"] = "Envy of Heaven", + [":tiandu"] = "当你的判定牌生效后,你可以获得之。", + ["yiji"] = "Bequeathed Strategy", + [":yiji"] = "每当你受到1点伤害后,你可以观看牌堆顶的两张牌并任意分配它们。", + + ["zhenji"] = "Zhen Ji", + ["luoshen"] = "Goddess Luo", + [":luoshen"] = "准备阶段开始时,你可以进行判定:若结果为黑色,判定牌生效后你获得之,然后你可以再次发动“洛神”。", + ["qingguo"] = "Helen of Troy", + [":qingguo"] = "你可以将一张黑色手牌当【闪】使用或打出。", + + ["liubei"] = "Liu Bei", + ["rende"] = "Benevolence", + [":rende"] = "出牌阶段,你可以将至少一张手牌任意分配给其他角色。你于本阶段内以此法给出的手牌首次达到两张或更多后,你回复1点体力。", + + ["guanyu"] = "Guan Yu", + ["wusheng"] = "Warrior Saint", + [":wusheng"] = "你可以将一张红色牌当【杀】使用或打出。", + + ["zhangfei"] = "Zhang Fei", + ["paoxiao"] = "Roar", + [":paoxiao"] = "锁定技,出牌阶段,你使用【杀】无次数限制。", + + ["zhugeliang"] = "Zhuge Liang", + ["guanxing"] = "Stargaze", + [":guanxing"] = "准备阶段开始时,你可以观看牌堆顶的X张牌,然后将任意数量的牌置于牌堆顶,将其余的牌置于牌堆底。(X为存活角色数且至多为5)", + ["kongcheng"] = "Empty Fort", + [":kongcheng"] = "锁定技,若你没有手牌,你不能被选择为【杀】或【决斗】的目标。", + + ["zhaoyun"] = "Zhao Yun", + ["longdan"] = "Dragon Heart", + [":longdan"] = "你可以将一张【杀】当【闪】使用或打出,或将一张【闪】当普通【杀】使用或打出。", + + ["machao"] = "Ma Chao", + ["mashu"] = "Horsemanship", + [":mashu"] = "锁定技。你与其他角色的距离-1。", + ["tieqi"] = "Iron Cavalry", + [":tieqi"] = "每当你指定【杀】的目标后,你可以进行判定:若结果为红色,该角色不能使用【闪】响应此【杀】。", + + ["huangyueying"] = "Huang Yueying", + ["jizhi"] = "Wisdom", + [":jizhi"] = "每当你使用一张非延时锦囊牌时,你可以摸一张牌。", + ["qicai"] = "Genius", + [":qicai"] = "锁定技。你使用锦囊牌无距离限制。", + + ["sunquan"] = "Sun Quan", + ["zhiheng"] = "Balance of Power", + [":zhiheng"] = "阶段技,你可以弃置至少一张牌然后摸等量的牌。", + + ["ganning"] = "Gan Ning", + ["qixi"] = "Surprise Raid", + [":qixi"] = "你可以将一张黑色牌当【过河拆桥】使用。", + + ["lvmeng"] = "Lv Meng", + ["keji"] = "Self Mastery", + [":keji"] = "若你未于出牌阶段内使用或打出【杀】,你可以跳过弃牌阶段。", + + ["huanggai"] = "Huang Gai", + ["kurou"] = "Self Injury", + [":kurou"] = "出牌阶段,你可以失去1点体力然后摸两张牌。", + + ["zhouyu"] = "Zhou Yu", + ["yingzi"] = "Handsome", + [":yingzi"] = "摸牌阶段,你可以多摸一张牌。", + ["fanjian"] = "Sow Dissension", + [":fanjian"] = "阶段技。你可以令一名其他角色选择一种花色,然后正面朝上获得你的一张手牌。若此牌花色与该角色所选花色不同,你对其造成1点伤害。", + + ["daqiao"] = "Da Qiao", + ["guose"] = "National Beauty", + [":guose"] = "你可以将一张方块牌当【乐不思蜀】使用。", + ["liuli"] = "Shirk", + [":liuli"] = "每当你成为【杀】的目标时,你可以弃置一张牌并选择你攻击范围内为此【杀】合法目标(无距离限制)的一名角色:若如此做,该角色代替你成为此【杀】的目标。", + ["#liuli-target"] = "流离:你可以弃置一张牌,将【杀】的目标转移给一名其他角色", + + ["luxun"] = "Lu Xun", + ["qianxun"] = "Humility", + [":qianxun"] = "锁定技,你不能被选择为【顺手牵羊】与【乐不思蜀】的目标。", + ["lianying"] = "One After Another", + [":lianying"] = "每当你失去最后的手牌后,你可以摸一张牌。", + + ["sunshangxiang"] = "Sun Shangxiang", + ["xiaoji"] = "Warrior Lady", + [":xiaoji"] = "每当你失去一张装备区的装备牌后,你可以摸两张牌。", + ["jieyin"] = "Marriage", + [":jieyin"] = "阶段技,你可以弃置两张手牌并选择一名已受伤的男性角色:若如此做,你和该角色各回复1点体力。", + + ["huatuo"] = "Hua Tuo", + ["qingnang"] = "Green Salve", + [":qingnang"] = "阶段技,你可以弃置一张手牌并选择一名已受伤的角色:若如此做,该角色回复1点体力。", + ["jijiu"] = "First Aid", + [":jijiu"] = "你的回合外,你可以将一张红色牌当【桃】使用。", + + ["lvbu"] = "Lv Bu", + + ["diaochan"] = "Diao Chan", + ["lijian"] = "Seed of Animosity", + [":lijian"] = "阶段技,你可以弃置一张牌并选择两名其他男性角色,后选择的角色视为对先选择的角色使用了一张不能被无懈可击的决斗。", + ["biyue"] = "Envious by Moon", + [":biyue"] = "结束阶段开始时,你可以摸一张牌。", +}, "en_US") + +-- aux skills +Fk:loadTranslationTable{ + ["discard_skill"] = "Discard", + ["choose_players_skill"] = "Choose players", +} diff --git a/packages/standard/i18n/init.lua b/packages/standard/i18n/init.lua new file mode 100644 index 00000000..34288c01 --- /dev/null +++ b/packages/standard/i18n/init.lua @@ -0,0 +1,2 @@ +dofile "packages/standard/i18n/zh_CN.lua" +dofile "packages/standard/i18n/en_US.lua" diff --git a/packages/standard/i18n/zh_CN.lua b/packages/standard/i18n/zh_CN.lua new file mode 100644 index 00000000..e41b887a --- /dev/null +++ b/packages/standard/i18n/zh_CN.lua @@ -0,0 +1,142 @@ +Fk:loadTranslationTable{ + ["standard"] = "标准包", + ["wei"] = "魏", + ["shu"] = "蜀", + ["wu"] = "吴", + ["qun"] = "群", + + ["black"] = "黑色", + ["red"] = '红色', + ["nocolor"] = '无色', + + ["caocao"] = "曹操", + ["jianxiong"] = "奸雄", + [":jianxiong"] = "当你受到伤害后,你可以获得对你造成伤害的牌。", + + ["simayi"] = "司马懿", + ["guicai"] = "鬼才", + [":guicai"] = "当一名角色的判定牌生效前,你可以打出一张手牌代替之。", + ["#guicai-ask"] = "是否发动“鬼才”,打出一张手牌修改 %dest 的判定?", + ["fankui"] = "反馈", + [":fankui"] = "当你受到伤害后,你可以获得伤害来源的一张牌。", + + ["xiahoudun"] = "夏侯惇", + ["ganglie"] = "刚烈", + [":ganglie"] = "当你受到伤害后,你可以进行判定:若结果不为红桃,则伤害来源选择一项:弃置两张手牌,或受到1点伤害。", + + ["zhangliao"] = "张辽", + ["tuxi"] = "突袭", + [":tuxi"] = "摸牌阶段,你可以改为获得至多两名其他角色的各一张手牌。", + ["#tuxi-ask"] = "是否发动“突袭”,改为获得1-2名角色各一张手牌?", + + ["xuchu"] = "许褚", + ["luoyi"] = "裸衣", + [":luoyi"] = "摸牌阶段,你可以少摸一张牌,若如此做,本回合你使用【杀】或【决斗】对目标角色造成伤害时,此伤害+1。", + + ["guojia"] = "郭嘉", + ["tiandu"] = "天妒", + [":tiandu"] = "当你的判定牌生效后,你可以获得之。", + ["yiji"] = "遗计", + [":yiji"] = "每当你受到1点伤害后,你可以观看牌堆顶的两张牌并任意分配它们。", + + ["zhenji"] = "甄姬", + ["luoshen"] = "洛神", + [":luoshen"] = "准备阶段开始时,你可以进行判定:若结果为黑色,判定牌生效后你获得之,然后你可以再次发动“洛神”。", + ["qingguo"] = "倾国", + [":qingguo"] = "你可以将一张黑色手牌当【闪】使用或打出。", + + ["liubei"] = "刘备", + ["rende"] = "仁德", + [":rende"] = "出牌阶段,你可以将至少一张手牌任意分配给其他角色。你于本阶段内以此法给出的手牌首次达到两张或更多后,你回复1点体力。", + + ["guanyu"] = "关羽", + ["wusheng"] = "武圣", + [":wusheng"] = "你可以将一张红色牌当【杀】使用或打出。", + + ["zhangfei"] = "张飞", + ["paoxiao"] = "咆哮", + [":paoxiao"] = "锁定技,出牌阶段,你使用【杀】无次数限制。", + + ["zhugeliang"] = "诸葛亮", + ["guanxing"] = "观星", + [":guanxing"] = "准备阶段开始时,你可以观看牌堆顶的X张牌,然后将任意数量的牌置于牌堆顶,将其余的牌置于牌堆底。(X为存活角色数且至多为5)", + ["kongcheng"] = "空城", + [":kongcheng"] = "锁定技,若你没有手牌,你不能被选择为【杀】或【决斗】的目标。", + + ["zhaoyun"] = "赵云", + ["longdan"] = "龙胆", + [":longdan"] = "你可以将一张【杀】当【闪】使用或打出,或将一张【闪】当普通【杀】使用或打出。", + + ["machao"] = "马超", + ["mashu"] = "马术", + [":mashu"] = "锁定技。你与其他角色的距离-1。", + ["tieqi"] = "铁骑", + [":tieqi"] = "每当你指定【杀】的目标后,你可以进行判定:若结果为红色,该角色不能使用【闪】响应此【杀】。", + + ["huangyueying"] = "黄月英", + ["jizhi"] = "集智", + [":jizhi"] = "每当你使用一张非延时锦囊牌时,你可以摸一张牌。", + ["qicai"] = "奇才", + [":qicai"] = "锁定技。你使用锦囊牌无距离限制。", + + ["sunquan"] = "孙权", + ["zhiheng"] = "制衡", + [":zhiheng"] = "阶段技,你可以弃置至少一张牌然后摸等量的牌。", + + ["ganning"] = "甘宁", + ["qixi"] = "奇袭", + [":qixi"] = "你可以将一张黑色牌当【过河拆桥】使用。", + + ["lvmeng"] = "吕蒙", + ["keji"] = "克己", + [":keji"] = "若你未于出牌阶段内使用或打出【杀】,你可以跳过弃牌阶段。", + + ["huanggai"] = "黄盖", + ["kurou"] = "苦肉", + [":kurou"] = "出牌阶段,你可以失去1点体力然后摸两张牌。", + + ["zhouyu"] = "周瑜", + ["yingzi"] = "英姿", + [":yingzi"] = "摸牌阶段,你可以多摸一张牌。", + ["fanjian"] = "反间", + [":fanjian"] = "阶段技。你可以令一名其他角色选择一种花色,然后正面朝上获得你的一张手牌。若此牌花色与该角色所选花色不同,你对其造成1点伤害。", + + ["daqiao"] = "大乔", + ["guose"] = "国色", + [":guose"] = "你可以将一张方块牌当【乐不思蜀】使用。", + ["liuli"] = "流离", + [":liuli"] = "每当你成为【杀】的目标时,你可以弃置一张牌并选择你攻击范围内为此【杀】合法目标(无距离限制)的一名角色:若如此做,该角色代替你成为此【杀】的目标。", + ["#liuli-target"] = "流离:你可以弃置一张牌,将【杀】的目标转移给一名其他角色", + + ["luxun"] = "陆逊", + ["qianxun"] = "谦逊", + [":qianxun"] = "锁定技,你不能被选择为【顺手牵羊】与【乐不思蜀】的目标。", + ["lianying"] = "连营", + [":lianying"] = "每当你失去最后的手牌后,你可以摸一张牌。", + + ["sunshangxiang"] = "孙尚香", + ["xiaoji"] = "枭姬", + [":xiaoji"] = "每当你失去一张装备区的装备牌后,你可以摸两张牌。", + ["jieyin"] = "结姻", + [":jieyin"] = "阶段技,你可以弃置两张手牌并选择一名已受伤的男性角色:若如此做,你和该角色各回复1点体力。", + + ["huatuo"] = "华佗", + ["qingnang"] = "青囊", + [":qingnang"] = "阶段技,你可以弃置一张手牌并选择一名已受伤的角色:若如此做,该角色回复1点体力。", + ["jijiu"] = "急救", + [":jijiu"] = "你的回合外,你可以将一张红色牌当【桃】使用。", + + ["lvbu"] = "吕布", + + ["diaochan"] = "貂蝉", + ["lijian"] = "离间", + [":lijian"] = "阶段技,你可以弃置一张牌并选择两名其他男性角色,后选择的角色视为对先选择的角色使用了一张不能被无懈可击的决斗。", + ["biyue"] = "闭月", + [":biyue"] = "结束阶段开始时,你可以摸一张牌。", +} + +-- aux skills +Fk:loadTranslationTable{ + ["discard_skill"] = "弃牌", + ["choose_players_skill"] = "选择角色", +} diff --git a/packages/standard/init.lua b/packages/standard/init.lua index 8503c48c..7411661c 100644 --- a/packages/standard/init.lua +++ b/packages/standard/init.lua @@ -3,20 +3,6 @@ extension.metadata = require "packages.standard.metadata" dofile "packages/standard/game_rule.lua" dofile "packages/standard/aux_skills.lua" -Fk:loadTranslationTable{ - ["standard"] = "标准包", - ["wei"] = "魏", - ["shu"] = "蜀", - ["wu"] = "吴", - ["qun"] = "群", -} - -Fk:loadTranslationTable{ - ["black"] = "黑色", - ["red"] = '红色', - ["nocolor"] = '无色', -} - local jianxiong = fk.CreateTriggerSkill{ name = "jianxiong", anim_type = "masochism", @@ -36,11 +22,6 @@ local jianxiong = fk.CreateTriggerSkill{ } local caocao = General:new(extension, "caocao", "wei", 4) caocao:addSkill(jianxiong) -Fk:loadTranslationTable{ - ["caocao"] = "曹操", - ["jianxiong"] = "奸雄", - [":jianxiong"] = "当你受到伤害后,你可以获得对你造成伤害的牌。", -} local guicai = fk.CreateTriggerSkill{ name = "guicai", @@ -87,14 +68,6 @@ local fankui = fk.CreateTriggerSkill{ local simayi = General:new(extension, "simayi", "wei", 3) simayi:addSkill(guicai) simayi:addSkill(fankui) -Fk:loadTranslationTable{ - ["simayi"] = "司马懿", - ["guicai"] = "鬼才", - [":guicai"] = "当一名角色的判定牌生效前,你可以打出一张手牌代替之。", - ["#guicai-ask"] = "是否发动“鬼才”,打出一张手牌修改 %dest 的判定?", - ["fankui"] = "反馈", - [":fankui"] = "当你受到伤害后,你可以获得伤害来源的一张牌。", -} local ganglie = fk.CreateTriggerSkill{ name = "ganglie", @@ -131,11 +104,6 @@ local ganglie = fk.CreateTriggerSkill{ } local xiahoudun = General:new(extension, "xiahoudun", "wei", 4) xiahoudun:addSkill(ganglie) -Fk:loadTranslationTable{ - ["xiahoudun"] = "夏侯惇", - ["ganglie"] = "刚烈", - [":ganglie"] = "当你受到伤害后,你可以进行判定:若结果不为红桃,则伤害来源选择一项:弃置两张手牌,或受到1点伤害。", -} local tuxi = fk.CreateTriggerSkill{ name = "tuxi", @@ -180,12 +148,6 @@ local tuxi = fk.CreateTriggerSkill{ } local zhangliao = General:new(extension, "zhangliao", "wei", 4) zhangliao:addSkill(tuxi) -Fk:loadTranslationTable{ - ["zhangliao"] = "张辽", - ["tuxi"] = "突袭", - [":tuxi"] = "摸牌阶段,你可以改为获得至多两名其他角色的各一张手牌。", - ["#tuxi-ask"] = "是否发动“突袭”,改为获得1-2名角色各一张手牌?", -} local luoyi = fk.CreateTriggerSkill{ name = "luoyi", @@ -217,11 +179,6 @@ local luoyi = fk.CreateTriggerSkill{ } local xuchu = General:new(extension, "xuchu", "wei", 4) xuchu:addSkill(luoyi) -Fk:loadTranslationTable{ - ["xuchu"] = "许褚", - ["luoyi"] = "裸衣", - [":luoyi"] = "摸牌阶段,你可以少摸一张牌,若如此做,本回合你使用【杀】或【决斗】对目标角色造成伤害时,此伤害+1。", -} local tiandu = fk.CreateTriggerSkill{ name = "tiandu", @@ -257,13 +214,6 @@ local yiji = fk.CreateTriggerSkill{ local guojia = General:new(extension, "guojia", "wei", 3) guojia:addSkill(tiandu) guojia:addSkill(yiji) -Fk:loadTranslationTable{ - ["guojia"] = "郭嘉", - ["tiandu"] = "天妒", - [":tiandu"] = "当你的判定牌生效后,你可以获得之。", - ["yiji"] = "遗计", - [":yiji"] = "每当你受到1点伤害后,你可以观看牌堆顶的两张牌并任意分配它们。", -} local luoshen = fk.CreateTriggerSkill{ name = "luoshen", @@ -323,13 +273,6 @@ local qingguo = fk.CreateViewAsSkill{ local zhenji = General:new(extension, "zhenji", "wei", 3, 3, General.Female) zhenji:addSkill(luoshen) zhenji:addSkill(qingguo) -Fk:loadTranslationTable{ - ["zhenji"] = "甄姬", - ["luoshen"] = "洛神", - [":luoshen"] = "准备阶段开始时,你可以进行判定:若结果为黑色,判定牌生效后你获得之,然后你可以再次发动“洛神”。", - ["qingguo"] = "倾国", - [":qingguo"] = "你可以将一张黑色手牌当【闪】使用或打出。", -} local rendetrig = fk.CreateTriggerSkill{ name = "#rendetrig", @@ -375,11 +318,6 @@ local rende = fk.CreateActiveSkill{ rende:addRelatedSkill(rendetrig) local liubei = General:new(extension, "liubei", "shu", 4) liubei:addSkill(rende) -Fk:loadTranslationTable{ - ["liubei"] = "刘备", - ["rende"] = "仁德", - [":rende"] = "出牌阶段,你可以将至少一张手牌任意分配给其他角色。你于本阶段内以此法给出的手牌首次达到两张或更多后,你回复1点体力。", -} local wusheng = fk.CreateViewAsSkill{ name = "wusheng", @@ -400,11 +338,6 @@ local wusheng = fk.CreateViewAsSkill{ } local guanyu = General:new(extension, "guanyu", "shu", 4) guanyu:addSkill(wusheng) -Fk:loadTranslationTable{ - ["guanyu"] = "关羽", - ["wusheng"] = "武圣", - [":wusheng"] = "你可以将一张红色牌当【杀】使用或打出。", -} local paoxiaoAudio = fk.CreateTriggerSkill{ name = "#paoxiaoAudio", @@ -435,11 +368,6 @@ local paoxiao = fk.CreateTargetModSkill{ paoxiao:addRelatedSkill(paoxiaoAudio) local zhangfei = General:new(extension, "zhangfei", "shu", 4) zhangfei:addSkill(paoxiao) -Fk:loadTranslationTable{ - ["zhangfei"] = "张飞", - ["paoxiao"] = "咆哮", - [":paoxiao"] = "锁定技,出牌阶段,你使用【杀】无次数限制。", -} local guanxing = fk.CreateTriggerSkill{ name = "guanxing", @@ -491,13 +419,6 @@ kongcheng:addRelatedSkill(kongchengAudio) local zhugeliang = General:new(extension, "zhugeliang", "shu", 3) zhugeliang:addSkill(guanxing) zhugeliang:addSkill(kongcheng) -Fk:loadTranslationTable{ - ["zhugeliang"] = "诸葛亮", - ["guanxing"] = "观星", - [":guanxing"] = "准备阶段开始时,你可以观看牌堆顶的X张牌,然后将任意数量的牌置于牌堆顶,将其余的牌置于牌堆底。(X为存活角色数且至多为5)", - ["kongcheng"] = "空城", - [":kongcheng"] = "锁定技,若你没有手牌,你不能被选择为【杀】或【决斗】的目标。", -} local longdan = fk.CreateViewAsSkill{ name = "longdan", @@ -524,11 +445,6 @@ local longdan = fk.CreateViewAsSkill{ } local zhaoyun = General:new(extension, "zhaoyun", "shu", 4) zhaoyun:addSkill(longdan) -Fk:loadTranslationTable{ - ["zhaoyun"] = "赵云", - ["longdan"] = "龙胆", - [":longdan"] = "你可以将一张【杀】当【闪】使用或打出,或将一张【闪】当普通【杀】使用或打出。", -} local mashu = fk.CreateDistanceSkill{ name = "mashu", @@ -562,13 +478,6 @@ local tieqi = fk.CreateTriggerSkill{ local machao = General:new(extension, "machao", "shu", 4) machao:addSkill(mashu) machao:addSkill(tieqi) -Fk:loadTranslationTable{ - ["machao"] = "马超", - ["mashu"] = "马术", - [":mashu"] = "锁定技。你与其他角色的距离-1。", - ["tieqi"] = "铁骑", - [":tieqi"] = "每当你指定【杀】的目标后,你可以进行判定:若结果为红色,该角色不能使用【闪】响应此【杀】。", -} local jizhi = fk.CreateTriggerSkill{ name = "jizhi", @@ -596,13 +505,6 @@ local qicai = fk.CreateTargetModSkill{ local huangyueying = General:new(extension, "huangyueying", "shu", 3, 3, General.Female) huangyueying:addSkill(jizhi) huangyueying:addSkill(qicai) -Fk:loadTranslationTable{ - ["huangyueying"] = "黄月英", - ["jizhi"] = "集智", - [":jizhi"] = "每当你使用一张非延时锦囊牌时,你可以摸一张牌。", - ["qicai"] = "奇才", - [":qicai"] = "锁定技。你使用锦囊牌无距离限制。", -} local zhiheng = fk.CreateActiveSkill{ name = "zhiheng", @@ -620,11 +522,6 @@ local zhiheng = fk.CreateActiveSkill{ } local sunquan = General:new(extension, "sunquan", "wu", 4) sunquan:addSkill(zhiheng) -Fk:loadTranslationTable{ - ["sunquan"] = "孙权", - ["zhiheng"] = "制衡", - [":zhiheng"] = "阶段技,你可以弃置至少一张牌然后摸等量的牌。", -} local qixi = fk.CreateViewAsSkill{ name = "qixi", @@ -645,11 +542,6 @@ local qixi = fk.CreateViewAsSkill{ } local ganning = General:new(extension, "ganning", "wu", 4) ganning:addSkill(qixi) -Fk:loadTranslationTable{ - ["ganning"] = "甘宁", - ["qixi"] = "奇袭", - [":qixi"] = "你可以将一张黑色牌当【过河拆桥】使用。", -} local keji = fk.CreateTriggerSkill{ name = "keji", @@ -687,11 +579,6 @@ local keji = fk.CreateTriggerSkill{ } local lvmeng = General:new(extension, "lvmeng", "wu", 4) lvmeng:addSkill(keji) -Fk:loadTranslationTable{ - ["lvmeng"] = "吕蒙", - ["keji"] = "克己", - [":keji"] = "若你未于出牌阶段内使用或打出【杀】,你可以跳过弃牌阶段。", -} local kurou = fk.CreateActiveSkill{ name = "kurou", @@ -709,11 +596,6 @@ local kurou = fk.CreateActiveSkill{ } local huanggai = General:new(extension, "huanggai", "wu", 4) huanggai:addSkill(kurou) -Fk:loadTranslationTable{ - ["huanggai"] = "黄盖", - ["kurou"] = "苦肉", - [":kurou"] = "出牌阶段,你可以失去1点体力然后摸两张牌。", -} local yingzi = fk.CreateTriggerSkill{ name = "yingzi", @@ -752,13 +634,6 @@ local fanjian = fk.CreateActiveSkill{ local zhouyu = General:new(extension, "zhouyu", "wu", 3) zhouyu:addSkill(yingzi) zhouyu:addSkill(fanjian) -Fk:loadTranslationTable{ - ["zhouyu"] = "周瑜", - ["yingzi"] = "英姿", - [":yingzi"] = "摸牌阶段,你可以多摸一张牌。", - ["fanjian"] = "反间", - [":fanjian"] = "阶段技。你可以令一名其他角色选择一种花色,然后正面朝上获得你的一张手牌。若此牌花色与该角色所选花色不同,你对其造成1点伤害。", -} local guose = fk.CreateViewAsSkill{ name = "guose", @@ -816,14 +691,6 @@ local liuli = fk.CreateTriggerSkill{ local daqiao = General:new(extension, "daqiao", "wu", 3, 3, General.Female) daqiao:addSkill(guose) daqiao:addSkill(liuli) -Fk:loadTranslationTable{ - ["daqiao"] = "大乔", - ["guose"] = "国色", - [":guose"] = "你可以将一张方块牌当【乐不思蜀】使用。", - ["liuli"] = "流离", - [":liuli"] = "每当你成为【杀】的目标时,你可以弃置一张牌并选择你攻击范围内为此【杀】合法目标(无距离限制)的一名角色:若如此做,该角色代替你成为此【杀】的目标。", - ["#liuli-target"] = "流离:你可以弃置一张牌,将【杀】的目标转移给一名其他角色", -} local qianxun = fk.CreateProhibitSkill{ name = "qianxun", @@ -857,13 +724,6 @@ local lianying = fk.CreateTriggerSkill{ local luxun = General:new(extension, "luxun", "wu", 3) luxun:addSkill(qianxun) luxun:addSkill(lianying) -Fk:loadTranslationTable{ - ["luxun"] = "陆逊", - ["qianxun"] = "谦逊", - [":qianxun"] = "锁定技,你不能被选择为【顺手牵羊】与【乐不思蜀】的目标。", - ["lianying"] = "连营", - [":lianying"] = "每当你失去最后的手牌后,你可以摸一张牌。", -} local xiaoji = fk.CreateTriggerSkill{ name = "xiaoji", @@ -934,13 +794,6 @@ local jieyin = fk.CreateActiveSkill{ local sunshangxiang = General:new(extension, "sunshangxiang", "wu", 3, 3, General.Female) sunshangxiang:addSkill(xiaoji) sunshangxiang:addSkill(jieyin) -Fk:loadTranslationTable{ - ["sunshangxiang"] = "孙尚香", - ["xiaoji"] = "枭姬", - [":xiaoji"] = "每当你失去一张装备区的装备牌后,你可以摸两张牌。", - ["jieyin"] = "结姻", - [":jieyin"] = "阶段技,你可以弃置两张手牌并选择一名已受伤的男性角色:若如此做,你和该角色各回复1点体力。", -} local qingnang = fk.CreateActiveSkill{ name = "qingnang", @@ -993,18 +846,8 @@ local jijiu = fk.CreateViewAsSkill{ local huatuo = General:new(extension, "huatuo", "qun", 3) huatuo:addSkill(qingnang) huatuo:addSkill(jijiu) -Fk:loadTranslationTable{ - ["huatuo"] = "华佗", - ["qingnang"] = "青囊", - [":qingnang"] = "阶段技,你可以弃置一张手牌并选择一名已受伤的角色:若如此做,该角色回复1点体力。", - ["jijiu"] = "急救", - [":jijiu"] = "你的回合外,你可以将一张红色牌当【桃】使用。", -} local lvbu = General:new(extension, "lvbu", "qun", 4) -Fk:loadTranslationTable{ - ["lvbu"] = "吕布", -} local lijian = fk.CreateActiveSkill{ name = "lijian", @@ -1049,12 +892,8 @@ local biyue = fk.CreateTriggerSkill{ local diaochan = General:new(extension, "diaochan", "qun", 3, 3, General.Female) diaochan:addSkill(lijian) diaochan:addSkill(biyue) -Fk:loadTranslationTable{ - ["diaochan"] = "貂蝉", - ["lijian"] = "离间", - [":lijian"] = "阶段技,你可以弃置一张牌并选择两名其他男性角色,后选择的角色视为对先选择的角色使用了一张不能被无懈可击的决斗。", - ["biyue"] = "闭月", - [":biyue"] = "结束阶段开始时,你可以摸一张牌。", -} + +-- load translations of this package +dofile "packages/standard/i18n/init.lua" return extension diff --git a/packages/standard_cards/i18n/en_US.lua b/packages/standard_cards/i18n/en_US.lua new file mode 100644 index 00000000..0721e7db --- /dev/null +++ b/packages/standard_cards/i18n/en_US.lua @@ -0,0 +1,89 @@ +Fk:loadTranslationTable({ + ["standard_cards"] = "Standard", + + ["unknown_card"] = 'Unknown card', + ["log_spade"] = "♠", + ["log_heart"] = '', + ["log_club"] = "♣", + ["log_diamond"] = '', + ["log_nosuit"] = "No suit", + ["nosuit"] = "No suit", + ["spade"] = "Spade", + ["heart"] = "Heart", + ["club"] = "Club", + ["diamond"] = "Diamond", + + ["slash"] = "Slash", + ["#slash-jink"] = "%src used Slash to you, please use %arg Jink(s)", + + ["jink"] = "Jink", + + ["peach"] = "Peach", + + ["dismantlement"] = "Dismantlement", + ["dismantlement_skill"] = "Dismantlement", + + ["snatch"] = "Snatch", + ["snatch_skill"] = "Snatch", + + ["duel"] = "Duel", + + ["collateral"] = "Collateral", + + ["ex_nihilo"] = "Ex Nihilo", + + ["nullification"] = "Nullification", + + ["savage_assault"] = "Savage Assault", + + ["archery_attack"] = "Archery Attach", + + ["god_salvation"] = "God Salvation", + + ["amazing_grace"] = "Amazing_grace", + + ["lightning"] = "Lighining", + + ["indulgence"] = "Indulgence", + + ["crossbow"] = "Crossbow", + + ["qinggang_sword"] = "Qinggang Sword", + + ["ice_sword"] = "Ice Sword", + ["#ice_sword_skill"] = "Ice Sword", + + ["double_swords"] = "Double Sword", + ["#double_swords_skill"] = "Double Sword", + + ["blade"] = "Blade", + ["#blade_skill"] = "Blade", + ["#blade_slash"] = "You can use Blade to use Slash to %src again", + + ["spear"] = "Spear", + ["spear_skill"] = "Spear", + + ["axe"] = "Axe", + ["#axe_skill"] = "Axe", + + ["halberd"] = "Halberd", + + ["kylin_bow"] = "Kylin Bow", + ["#kylin_bow_skill"] = "Kylin Bow", + + ["eight_diagram"] = "Eight Diagram", + + ["nioh_shield"] = "Nioh Shield", + + ["dilu"] = "Di Lu", + + ["jueying"] = "Jue Ying", + + ["zhuahuangfeidian"] = "Zhua Huang Fei Dian", + + ["chitu"] = "Chi Tu", + + ["dayuan"] = "Da Yuan", + + ["zixing"] = "Zi Xing", +}, "en_US") diff --git a/packages/standard_cards/i18n/init.lua b/packages/standard_cards/i18n/init.lua new file mode 100644 index 00000000..f655dc82 --- /dev/null +++ b/packages/standard_cards/i18n/init.lua @@ -0,0 +1,2 @@ +dofile "packages/standard_cards/i18n/zh_CN.lua" +dofile "packages/standard_cards/i18n/en_US.lua" diff --git a/packages/standard_cards/i18n/zh_CN.lua b/packages/standard_cards/i18n/zh_CN.lua new file mode 100644 index 00000000..882ce100 --- /dev/null +++ b/packages/standard_cards/i18n/zh_CN.lua @@ -0,0 +1,89 @@ +Fk:loadTranslationTable{ + ["standard_cards"] = "标+EX", + + ["unknown_card"] = '未知牌', + ["log_spade"] = "♠", + ["log_heart"] = '', + ["log_club"] = "♣", + ["log_diamond"] = '', + ["log_nosuit"] = "无花色", + ["nosuit"] = "无花色", + ["spade"] = "黑桃", + ["heart"] = "红桃", + ["club"] = "梅花", + ["diamond"] = "方块", + + ["slash"] = "杀", + ["#slash-jink"] = "%src 对你使用了杀,请使用 %arg 张闪", + + ["jink"] = "闪", + + ["peach"] = "桃", + + ["dismantlement"] = "过河拆桥", + ["dismantlement_skill"] = "过河拆桥", + + ["snatch"] = "顺手牵羊", + ["snatch_skill"] = "顺手牵羊", + + ["duel"] = "决斗", + + ["collateral"] = "借刀杀人", + + ["ex_nihilo"] = "无中生有", + + ["nullification"] = "无懈可击", + + ["savage_assault"] = "南蛮入侵", + + ["archery_attack"] = "万箭齐发", + + ["god_salvation"] = "桃园结义", + + ["amazing_grace"] = "五谷丰登", + + ["lightning"] = "闪电", + + ["indulgence"] = "乐不思蜀", + + ["crossbow"] = "诸葛连弩", + + ["qinggang_sword"] = "青釭剑", + + ["ice_sword"] = "寒冰剑", + ["#ice_sword_skill"] = "寒冰剑", + + ["double_swords"] = "雌雄双股剑", + ["#double_swords_skill"] = "雌雄双股剑", + + ["blade"] = "青龙偃月刀", + ["#blade_skill"] = "青龙偃月刀", + ["#blade_slash"] = "你可以发动“青龙偃月刀”对 %src 再使用一张杀", + + ["spear"] = "丈八蛇矛", + ["spear_skill"] = "丈八矛", + + ["axe"] = "贯石斧", + ["#axe_skill"] = "贯石斧", + + ["halberd"] = "方天画戟", + + ["kylin_bow"] = "麒麟弓", + ["#kylin_bow_skill"] = "麒麟弓", + + ["eight_diagram"] = "八卦阵", + + ["nioh_shield"] = "仁王盾", + + ["dilu"] = "的卢", + + ["jueying"] = "绝影", + + ["zhuahuangfeidian"] = "爪黄飞电", + + ["chitu"] = "赤兔", + + ["dayuan"] = "大宛", + + ["zixing"] = "紫骍", +} diff --git a/packages/standard_cards/init.lua b/packages/standard_cards/init.lua index beef5204..3e0208e3 100644 --- a/packages/standard_cards/init.lua +++ b/packages/standard_cards/init.lua @@ -1,24 +1,6 @@ local extension = Package:new("standard_cards", Package.CardPack) extension.metadata = require "packages.standard_cards.metadata" -Fk:loadTranslationTable{ - ["standard_cards"] = "标+EX" -} - -Fk:loadTranslationTable{ - ["unknown_card"] = '未知牌', - ["log_spade"] = "♠", - ["log_heart"] = '', - ["log_club"] = "♣", - ["log_diamond"] = '', - ["log_nosuit"] = "无花色", - ["nosuit"] = "无花色", - ["spade"] = "黑桃", - ["heart"] = "红桃", - ["club"] = "梅花", - ["diamond"] = "方块", -} - local slashSkill = fk.CreateActiveSkill{ name = "slash_skill", max_phase_use_time = 1, @@ -52,10 +34,6 @@ local slash = fk.CreateBasicCard{ suit = Card.Spade, skill = slashSkill, } -Fk:loadTranslationTable{ - ["slash"] = "杀", - ["#slash-jink"] = "%src 对你使用了杀,请使用 %arg 张闪", -} extension:addCards({ slash, @@ -110,9 +88,6 @@ local jink = fk.CreateBasicCard{ number = 2, skill = jinkSkill, } -Fk:loadTranslationTable{ - ["jink"] = "闪", -} extension:addCards({ jink, @@ -161,9 +136,6 @@ local peach = fk.CreateBasicCard{ number = 3, skill = peachSkill, } -Fk:loadTranslationTable{ - ["peach"] = "桃", -} extension:addCards({ peach, @@ -205,10 +177,6 @@ local dismantlement = fk.CreateTrickCard{ number = 3, skill = dismantlementSkill, } -Fk:loadTranslationTable{ - ["dismantlement"] = "过河拆桥", - ["dismantlement_skill"] = "过河拆桥", -} extension:addCards({ dismantlement, @@ -251,10 +219,6 @@ local snatch = fk.CreateTrickCard{ number = 3, skill = snatchSkill, } -Fk:loadTranslationTable{ - ["snatch"] = "顺手牵羊", - ["snatch_skill"] = "顺手牵羊", -} extension:addCards({ snatch, @@ -319,9 +283,6 @@ local duel = fk.CreateTrickCard{ number = 1, skill = duelSkill, } -Fk:loadTranslationTable{ - ["duel"] = "决斗", -} extension:addCards({ duel, @@ -364,9 +325,6 @@ local collateral = fk.CreateTrickCard{ number = 12, skill = collateralSkill, } -Fk:loadTranslationTable{ - ["collateral"] = "借刀杀人", -} extension:addCards({ collateral, @@ -390,9 +348,6 @@ local exNihilo = fk.CreateTrickCard{ number = 7, skill = exNihiloSkill, } -Fk:loadTranslationTable{ - ["ex_nihilo"] = "无中生有", -} extension:addCards({ exNihilo, @@ -418,9 +373,6 @@ local nullification = fk.CreateTrickCard{ number = 11, skill = nullificationSkill, } -Fk:loadTranslationTable{ - ["nullification"] = "无懈可击", -} extension:addCards({ nullification, @@ -471,9 +423,6 @@ local savageAssault = fk.CreateTrickCard{ number = 7, skill = savageAssaultSkill, } -Fk:loadTranslationTable{ - ["savage_assault"] = "南蛮入侵", -} extension:addCards({ savageAssault, @@ -521,9 +470,6 @@ local archeryAttack = fk.CreateTrickCard{ number = 1, skill = archeryAttackSkill, } -Fk:loadTranslationTable{ - ["archery_attack"] = "万箭齐发", -} extension:addCards({ archeryAttack, @@ -558,9 +504,6 @@ local godSalvation = fk.CreateTrickCard{ number = 1, skill = godSalvationSkill, } -Fk:loadTranslationTable{ - ["god_salvation"] = "桃园结义", -} extension:addCards({ godSalvation, @@ -586,9 +529,6 @@ local amazingGrace = fk.CreateTrickCard{ number = 3, skill = amazingGraceSkill, } -Fk:loadTranslationTable{ - ["amazing_grace"] = "五谷丰登", -} extension:addCards({ amazingGrace, @@ -649,9 +589,6 @@ local lightning = fk.CreateDelayedTrickCard{ number = 1, skill = lightningSkill, } -Fk:loadTranslationTable{ - ["lightning"] = "闪电", -} extension:addCards({ lightning, @@ -698,9 +635,6 @@ local indulgence = fk.CreateDelayedTrickCard{ number = 6, skill = indulgenceSkill, } -Fk:loadTranslationTable{ - ["indulgence"] = "乐不思蜀", -} extension:addCards({ indulgence, @@ -742,9 +676,6 @@ local crossbow = fk.CreateWeapon{ attack_range = 1, equip_skill = crossbowSkill, } -Fk:loadTranslationTable{ - ["crossbow"] = "诸葛连弩", -} extension:addCards({ crossbow, @@ -757,9 +688,6 @@ local qingGang = fk.CreateWeapon{ number = 6, attack_range = 2, } -Fk:loadTranslationTable{ - ["qinggang_sword"] = "青釭剑", -} extension:addCards({ qingGang, @@ -793,10 +721,6 @@ local iceSword = fk.CreateWeapon{ attack_range = 2, equip_skill = iceSwordSkill, } -Fk:loadTranslationTable{ - ["ice_sword"] = "寒冰剑", - ["#ice_sword_skill"] = "寒冰剑", -} extension:addCards({ iceSword, @@ -828,10 +752,6 @@ local doubleSwords = fk.CreateWeapon{ attack_range = 2, equip_skill = doubleSwordsSkill, } -Fk:loadTranslationTable{ - ["double_swords"] = "雌雄双股剑", - ["#double_swords_skill"] = "雌雄双股剑", -} extension:addCards({ doubleSwords, @@ -870,11 +790,6 @@ local blade = fk.CreateWeapon{ attack_range = 3, equip_skill = bladeSkill, } -Fk:loadTranslationTable{ - ["blade"] = "青龙偃月刀", - ["#blade_skill"] = "青龙偃月刀", - ["#blade_slash"] = "你可以发动“青龙偃月刀”对 %src 再使用一张杀", -} extension:addCards({ blade, @@ -905,10 +820,6 @@ local spear = fk.CreateWeapon{ attack_range = 3, equip_skill = spearSkill, } -Fk:loadTranslationTable{ - ["spear"] = "丈八蛇矛", - ["spear_skill"] = "丈八矛", -} extension:addCards({ spear, @@ -940,10 +851,6 @@ local axe = fk.CreateWeapon{ attack_range = 3, equip_skill = axeSkill, } -Fk:loadTranslationTable{ - ["axe"] = "贯石斧", - ["#axe_skill"] = "贯石斧", -} extension:addCards({ axe, @@ -982,9 +889,6 @@ local halberd = fk.CreateWeapon{ attack_range = 4, equip_skill = halberdSkill, } -Fk:loadTranslationTable{ - ["halberd"] = "方天画戟", -} extension:addCards({ halberd, @@ -1031,10 +935,6 @@ local kylinBow = fk.CreateWeapon{ attack_range = 5, equip_skill = kylinBowSkill, } -Fk:loadTranslationTable{ - ["kylin_bow"] = "麒麟弓", - ["#kylin_bow_skill"] = "麒麟弓", -} extension:addCards({ kylinBow, @@ -1045,9 +945,6 @@ local eightDiagram = fk.CreateArmor{ suit = Card.Spade, number = 2, } -Fk:loadTranslationTable{ - ["eight_diagram"] = "八卦阵", -} extension:addCards({ eightDiagram, @@ -1073,9 +970,6 @@ local niohShield = fk.CreateArmor{ number = 2, equip_skill = niohShieldSkill, } -Fk:loadTranslationTable{ - ["nioh_shield"] = "仁王盾", -} extension:addCards({ niohShield, @@ -1104,9 +998,6 @@ local diLu = fk.CreateDefensiveRide{ suit = Card.Club, number = 5, } -Fk:loadTranslationTable{ - ["dilu"] = "的卢", -} extension:addCards({ diLu, @@ -1117,9 +1008,6 @@ local jueYing = fk.CreateDefensiveRide{ suit = Card.Spade, number = 5, } -Fk:loadTranslationTable{ - ["jueying"] = "绝影", -} extension:addCards({ jueYing, @@ -1130,9 +1018,6 @@ local zhuaHuangFeiDian = fk.CreateDefensiveRide{ suit = Card.Heart, number = 13, } -Fk:loadTranslationTable{ - ["zhuahuangfeidian"] = "爪黄飞电", -} extension:addCards({ zhuaHuangFeiDian, @@ -1143,9 +1028,6 @@ local chiTu = fk.CreateOffensiveRide{ suit = Card.Heart, number = 5, } -Fk:loadTranslationTable{ - ["chitu"] = "赤兔", -} extension:addCards({ chiTu, @@ -1156,9 +1038,6 @@ local daYuan = fk.CreateOffensiveRide{ suit = Card.Spade, number = 13, } -Fk:loadTranslationTable{ - ["dayuan"] = "大宛", -} extension:addCards({ daYuan, @@ -1169,12 +1048,11 @@ local ziXing = fk.CreateOffensiveRide{ suit = Card.Diamond, number = 13, } -Fk:loadTranslationTable{ - ["zixing"] = "紫骍", -} extension:addCards({ ziXing, }) +dofile "packages/standard_cards/i18n/init.lua" + return extension diff --git a/qml/Config.qml b/qml/Config.qml index 1386ee65..4e34469e 100644 --- a/qml/Config.qml +++ b/qml/Config.qml @@ -2,6 +2,8 @@ import QtQuick QtObject { // Client configuration + property real winX + property real winY property real winWidth property real winHeight property var conf: ({}) @@ -10,6 +12,7 @@ QtObject { property string lobbyBg property string roomBg property string bgmFile + property string language // Player property of client property string serverAddr @@ -25,6 +28,8 @@ QtObject { function loadConf() { conf = JSON.parse(Backend.loadConf()); + winX = conf.winX || 100; + winY = conf.winY || 100; winWidth = conf.winWidth || 960; winHeight = conf.winHeight || 540; lastLoginServer = conf.lastLoginServer || "127.0.0.1"; @@ -32,9 +37,12 @@ QtObject { lobbyBg = conf.lobbyBg || AppPath + "/image/background"; roomBg = conf.roomBg || AppPath + "/image/gamebg"; bgmFile = conf.bgmFile || AppPath + "/audio/system/bgm.mp3"; + language = conf.language || "zh_CN"; } function saveConf() { + conf.winX = realMainWin.x; + conf.winY = realMainWin.y; conf.winWidth = realMainWin.width; conf.winHeight = realMainWin.height; conf.lastLoginServer = lastLoginServer; @@ -42,6 +50,7 @@ QtObject { conf.lobbyBg = lobbyBg; conf.roomBg = roomBg; conf.bgmFile = bgmFile; + conf.language = language; Backend.saveConf(JSON.stringify(conf, undefined, 2)); } diff --git a/qml/Pages/LobbyElement/EditProfile.qml b/qml/Pages/LobbyElement/EditProfile.qml index d79341ff..3679cf50 100644 --- a/qml/Pages/LobbyElement/EditProfile.qml +++ b/qml/Pages/LobbyElement/EditProfile.qml @@ -143,6 +143,19 @@ Item { } } } + + RowLayout { + anchors.rightMargin: 8 + spacing: 16 + Text { + text: "Language" + } + ComboBox { + model: ["zh_CN", "en_US"] + currentIndex: model.indexOf(config.language) + onCurrentTextChanged: { config.language = currentText; } + } + } } FileDialog { diff --git a/qml/Pages/RoomElement/GeneralCardItem.qml b/qml/Pages/RoomElement/GeneralCardItem.qml index ac32b15b..a3cbc9a2 100644 --- a/qml/Pages/RoomElement/GeneralCardItem.qml +++ b/qml/Pages/RoomElement/GeneralCardItem.qml @@ -58,6 +58,7 @@ CardItem { x: 2 y: lineCount > 6 ? 30 : 34 text: Backend.translate(name) + visible: Backend.translate(name).length <= 6 color: "white" font.family: fontLibian.name font.pixelSize: 18 @@ -66,6 +67,19 @@ CardItem { wrapMode: Text.WrapAnywhere } + Text { + x: 0 + y: 12 + rotation: 90 + transformOrigin: Item.BottomLeft + text: Backend.translate(name) + visible: Backend.translate(name).length > 6 + color: "white" + font.family: fontLibian.name + font.pixelSize: 18 + style: Text.Outline + } + onNameChanged: { let data = JSON.parse(Backend.callLuaFunction("GetGeneralData", [name])); kingdom = data.kingdom; diff --git a/qml/Pages/RoomElement/Photo.qml b/qml/Pages/RoomElement/Photo.qml index 409e6018..cadff7e4 100644 --- a/qml/Pages/RoomElement/Photo.qml +++ b/qml/Pages/RoomElement/Photo.qml @@ -127,6 +127,22 @@ Item { text: "" } + Text { + id: longGeneralName + x: 5 + y: 6 + font.family: fontLibian.name + font.pixelSize: 22 + rotation: 90 + transformOrigin: Item.BottomLeft + opacity: 0.7 + horizontalAlignment: Text.AlignHCenter + lineHeight: 18 + lineHeightMode: Text.FixedHeight + color: "white" + text: "" + } + HpBar { id: hp x: 8 @@ -471,7 +487,14 @@ Item { onGeneralChanged: { if (!roomScene.isStarted) return; - generalName.text = Backend.translate(general); + let text = Backend.translate(general); + if (text.length > 6) { + generalName.text = ""; + longGeneralName.text = text; + } else { + generalName.text = text; + longGeneralName.text = ""; + } let data = JSON.parse(Backend.callLuaFunction("GetGeneralData", [general])); kingdom = data.kingdom; } diff --git a/qml/Pages/RoomElement/SkillArea.qml b/qml/Pages/RoomElement/SkillArea.qml index 2da05d48..ad97505b 100644 --- a/qml/Pages/RoomElement/SkillArea.qml +++ b/qml/Pages/RoomElement/SkillArea.qml @@ -8,7 +8,8 @@ Flickable { clip: true contentWidth: panel.width contentHeight: panel.height - width: panel.width + contentX: contentWidth - width + width: Math.min(150, panel.width) height: Math.min(180, panel.height) flickableDirection: Flickable.AutoFlickIfNeeded diff --git a/qml/Pages/RoomElement/SkillButton.qml b/qml/Pages/RoomElement/SkillButton.qml index 177fccf7..0696542c 100644 --- a/qml/Pages/RoomElement/SkillButton.qml +++ b/qml/Pages/RoomElement/SkillButton.qml @@ -13,8 +13,8 @@ Item { pressed = false; } - width: type === "active" ? 120 * 0.66 : 72 * 0.66 - height: type === "active" ? 55 * 0.66 : 36 * 0.66 + width: type === "active" ? Math.max(80, skill.width + 8) : skill.width + height: type === "active" ? 36 : 24 Image { x: -13 - 120 * 0.166 @@ -29,7 +29,7 @@ Item { anchors.centerIn: parent id: skill font.family: fontLi2.name - font.pixelSize: 36 * 0.66 + font.pixelSize: Math.max(26 - text.length, 18) visible: false } diff --git a/qml/main.qml b/qml/main.qml index 32b4da05..c3b9b9a2 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -206,6 +206,8 @@ Item { mainStack.push(webinit); } if (OS !== "Android" && OS !== "Web") { + x = config.winX; + y = config.winY; width = config.winWidth; height = config.winHeight; }