Feat: i18n text

This commit is contained in:
wangkun 2023-12-12 11:25:01 +08:00
parent 2c3b02c768
commit fc44b8ef80
13 changed files with 315 additions and 157 deletions

View File

@ -228,7 +228,7 @@ export function getLayoutCardPool() {
permission: ROLE.GUEST,
meta: {},
type: "Carousel",
title: t("走马灯"),
title: t("TXT_CODE_5a196078"),
width: 4,
description: t("TXT_CODE_6ef5195f"),
height: LayoutCardHeight.SMALL,

View File

@ -1010,67 +1010,67 @@ export const configData: {
// "mcdr/permission.yml": {},
// "mcdr/config.yml": {},
"tshock/config.json": {
desc: t("此配置文件为 Tshock 服务端常见的配置文件。"),
desc: t("TXT_CODE_68821d80"),
config: {
Settings: {
ServerPassword: t("加入服务器所需的密码"),
ServerPort: t("服务器端口"),
ServerPassword: t("TXT_CODE_448df2bd"),
ServerPort: t("TXT_CODE_a379038f"),
MaxSlots: t(
"最大同时连接数。如果你想让玩家被踢出“服务器已满”的设定请将其设置为你设置的最大玩家数然后将泰拉瑞亚的最大玩家设置为2个或以上"
),
ReservedSlots: t("预留插槽。超过最大服务器插槽数的保留玩家可以加入的保留插槽数"),
ServerName: t("服务器名称。如果 UseServerName 为 true则在会话期间替换世界名称"),
UseServerName: t("是否使用 ServerName 代替世界名称"),
LogPath: t("日志路径"),
DebugLogs: t("启用调试日志"),
DisableLoginBeforeJoin: t("阻止用户在完成连接之前登录"),
IgnoreChestStacksOnLoad: t("允许箱子中物品的堆叠在世界加载期间超出堆叠限制"),
ReservedSlots: t("TXT_CODE_369a4a22"),
ServerName: t("TXT_CODE_60e3c342"),
UseServerName: t("TXT_CODE_8a924345"),
LogPath: t("TXT_CODE_447a9fc4"),
DebugLogs: t("TXT_CODE_a8b402a9"),
DisableLoginBeforeJoin: t("TXT_CODE_c4430fa6"),
IgnoreChestStacksOnLoad: t("TXT_CODE_d9b7a6a3"),
WorldTileProvider: "",
AutoSave: t("自动保存"),
AnnounceSave: t("保存时是否发出公告"),
ShowBackupAutosaveMessages: t("显示备份自动保存消息"),
BackupInterval: t("备份之间的间隔(以分钟为单位)。备份存储在 tshock/backups 文件夹中"),
BackupKeepFor: t("备份的保留时间(以分钟为单位)"),
SaveWorldOnCrash: t("如果服务器因未经处理的异常而崩溃,是否保存世界"),
SaveWorldOnLastPlayerExit: t("在最后一个玩家断开连接时保存世界"),
InvasionMultiplier: t("入侵事件的大小"),
DefaultMaximumSpawns: t("每波生成的默认最大生物数。越高意味着那一波中的生物更多"),
DefaultSpawnRate: t("波之间的延迟。值越低,生物越多"),
InfiniteInvasion: t("启用永无止境的入侵事件"),
PvPMode: t("设置 PvP 模式。有效类型为“normal”、“always”和“disabled”"),
SpawnProtection: t("防止默认瓷砖生成在生成保护半径内"),
SpawnProtectionRadius: t("生成保护半径"),
RangeChecks: t("根据玩家与其瓷砖位置之间的距离启用或禁用反作弊范围检查"),
HardcoreOnly: t("仅允许 hardcore 玩家连接"),
MediumcoreOnly: t("阻止 softcore 玩家连接"),
SoftcoreOnly: t("阻止 non-softcore 玩家连接"),
DisableBuild: t("禁用放置、移动瓷砖"),
DisableHardmode: t("禁用困难模式"),
DisableDungeonGuardian: t("防止地牢守卫在将玩家送往其出生点时生成"),
DisableClownBombs: t("禁用小丑炸弹生成"),
DisableSnowBalls: t("禁用雪球生成"),
DisableTombstones: t("禁用玩家死亡时掉落墓碑"),
DisablePrimeBombs: t("禁用 PrimeBombs"),
ForceTime: t("强制世界时间为正常时间,白天或黑"),
DisableInvisPvP: t("禁用隐身药水的效果"),
MaxRangeForDisabled: t("禁止玩家可以移动的最大距离(以瓷砖为单位)"),
RegionProtectChests: t("区域保护是否应适用于箱子"),
RegionProtectGemLocks: t("区域保护是否适用于钻石宝石锁"),
IgnoreProjUpdate: t("忽略检查以查看玩家是否“可以”更新射弹"),
IgnoreProjKill: t("忽略检查玩家是否“可以”杀死射弹"),
AllowCutTilesAndBreakables: t("允许玩家打破无法建造的临时瓷砖(草、花盆等)"),
AllowIce: t("允许玩家在无法建造的地方放置冰"),
AllowCrimsonCreep: t("当世界处于困难模式时,允许 CrimsonCreep"),
AllowCorruptionCreep: t("当世界处于困难模式时,允许腐败蔓延"),
AutoSave: t("TXT_CODE_9cefd73"),
AnnounceSave: t("TXT_CODE_2c194599"),
ShowBackupAutosaveMessages: t("TXT_CODE_cd3ae89e"),
BackupInterval: t("TXT_CODE_40c2c2ee"),
BackupKeepFor: t("TXT_CODE_255606fb"),
SaveWorldOnCrash: t("TXT_CODE_bec3d0ea"),
SaveWorldOnLastPlayerExit: t("TXT_CODE_f7f57aec"),
InvasionMultiplier: t("TXT_CODE_3e252bc9"),
DefaultMaximumSpawns: t("TXT_CODE_7d874fad"),
DefaultSpawnRate: t("TXT_CODE_2033383b"),
InfiniteInvasion: t("TXT_CODE_226b6c9e"),
PvPMode: t("TXT_CODE_85b01e01"),
SpawnProtection: t("TXT_CODE_7b759c13"),
SpawnProtectionRadius: t("TXT_CODE_965360cd"),
RangeChecks: t("TXT_CODE_443ac54f"),
HardcoreOnly: t("TXT_CODE_d092c3b"),
MediumcoreOnly: t("TXT_CODE_1a6d30de"),
SoftcoreOnly: t("TXT_CODE_b5ce1069"),
DisableBuild: t("TXT_CODE_c8c91afc"),
DisableHardmode: t("TXT_CODE_3f739f9c"),
DisableDungeonGuardian: t("TXT_CODE_c9e4d5c1"),
DisableClownBombs: t("TXT_CODE_f51ce97e"),
DisableSnowBalls: t("TXT_CODE_115e891f"),
DisableTombstones: t("TXT_CODE_90912e04"),
DisablePrimeBombs: t("TXT_CODE_ce953a4"),
ForceTime: t("TXT_CODE_b0b67785"),
DisableInvisPvP: t("TXT_CODE_584af0ab"),
MaxRangeForDisabled: t("TXT_CODE_d764908b"),
RegionProtectChests: t("TXT_CODE_3b346a65"),
RegionProtectGemLocks: t("TXT_CODE_603cbc35"),
IgnoreProjUpdate: t("TXT_CODE_33c223c"),
IgnoreProjKill: t("TXT_CODE_da65ecbd"),
AllowCutTilesAndBreakables: t("TXT_CODE_8c2ad2cb"),
AllowIce: t("TXT_CODE_ba1a222b"),
AllowCrimsonCreep: t("TXT_CODE_b30daa03"),
AllowCorruptionCreep: t("TXT_CODE_372e97f4"),
AllowHallowCreep: "",
StatueSpawn200: t("在停止生成之前,雕像可以在 200 像素内生成多少个 NPC。默认值 3"),
StatueSpawn600: t("在停止生成之前,雕像可以在 600 像素内生成多少个 NPC。默认值 6"),
StatueSpawnWorld: t("雕像在停止生成之前可以生成多少个 NPC。默认值 10。"),
PreventBannedItemSpawn: t("阻止违禁物品生成或通过命令调出"),
PreventDeadModification: t("阻止玩家在死亡时与世界互动"),
PreventInvalidPlaceStyle: t("防止玩家放置样式无效的瓷砖"),
ForceXmas: t("强制全年举办仅限圣诞节的活动"),
ForceHalloween: t("强制全年举办仅限万圣节的活动"),
StatueSpawn200: t("TXT_CODE_66820e23"),
StatueSpawn600: t("TXT_CODE_32bf92a1"),
StatueSpawnWorld: t("TXT_CODE_3b4260f8"),
PreventBannedItemSpawn: t("TXT_CODE_cd62c9d4"),
PreventDeadModification: t("TXT_CODE_ed9bab79"),
PreventInvalidPlaceStyle: t("TXT_CODE_fe82609a"),
ForceXmas: t("TXT_CODE_b649a71a"),
ForceHalloween: t("TXT_CODE_ac52ad06"),
AllowAllowedGroupsToSpawnBannedItems: t(
"允许禁止项目允许列表中的组生成被禁止的项目,即使 PreventBannedItemSpawn 设置为 true"
),
@ -1080,97 +1080,97 @@ export const configData: {
RespawnBossSeconds: t(
"如果附近有 Boss玩家在重生之前必须等待的秒数。有效范围0默认值到 30 秒。使用风险自负"
),
AnonymousBossInvasions: t("是否广播 Boss 生成或入侵开始"),
MaxHP: t("在装备增益之前,玩家可以拥有的最大生命值"),
MaxMP: t("在装备增益之前,玩家可以拥有的最大 MP"),
BombExplosionRadius: t("炸弹从爆炸点开始可以影响瓷砖的射程(以格为单位)"),
AnonymousBossInvasions: t("TXT_CODE_87e18bb5"),
MaxHP: t("TXT_CODE_3f470950"),
MaxMP: t("TXT_CODE_95dfd5bd"),
BombExplosionRadius: t("TXT_CODE_f71475e2"),
GiveItemsDirectly: t(
"如果设置为 true则给予玩家的物品将直接插入到他们的物品栏中。否则给予玩家的物品将作为掉落的物品生成。实验性功能可能无法正常工作或导致物品丢失"
),
DefaultRegistrationGroupName: t("新注册玩家的默认组名称"),
DefaultGuestGroupName: t("未注册玩家的默认组名称"),
RememberLeavePos: t("根据玩家的 IP 记录玩家下线的地方。服务器重新启动后会清空"),
MaximumLoginAttempts: t("玩家登录失败次数,超过则直接踢"),
DefaultRegistrationGroupName: t("TXT_CODE_cfd64e73"),
DefaultGuestGroupName: t("TXT_CODE_90896d08"),
RememberLeavePos: t("TXT_CODE_52b31aef"),
MaximumLoginAttempts: t("TXT_CODE_3e98e22f"),
KickOnMediumcoreDeath: "",
MediumcoreKickReason: "",
BanOnMediumcoreDeath: "",
MediumcoreBanReason: "",
DisableDefaultIPBan: t("如果未向 ban 命令传递任何参数,则取消 IP 封禁"),
EnableWhitelist: t("启用白名单"),
WhitelistKickReason: t("玩家不在白名单上时被踢出的原因"),
ServerFullReason: t("服务器人满时加入提示"),
DisableDefaultIPBan: t("TXT_CODE_3855e22f"),
EnableWhitelist: t("TXT_CODE_d0e37f20"),
WhitelistKickReason: t("TXT_CODE_f160d877"),
ServerFullReason: t("TXT_CODE_4ff6a125"),
ServerFullNoReservedReason: t(
"在服务器已满且没有可用预留插槽的情况下踢出试图加入的玩家时给出的原因"
),
KickOnHardcoreDeath: t("是否踢出硬核玩家"),
HardcoreKickReason: t("踢出硬核玩家的原因"),
BanOnHardcoreDeath: t("禁止硬核玩家死亡"),
HardcoreBanReason: t("禁止硬核玩家死亡的原因"),
KickProxyUsers: t("如果启用了 GeoIP将踢出被标识为使用代理的玩家"),
RequireLogin: t("所有玩家在游戏之前必须注册或登录"),
AllowLoginAnyUsername: t("允许玩家登录任何帐户,即使用户名与其角色名称不匹配"),
AllowRegisterAnyUsername: t("允许玩家注册与其角色名称不一定匹配"),
MinimumPasswordLength: t("新玩家帐户的最小密码长度。不能低于 4"),
KickOnHardcoreDeath: t("TXT_CODE_95340802"),
HardcoreKickReason: t("TXT_CODE_129475a7"),
BanOnHardcoreDeath: t("TXT_CODE_8ab0cc1a"),
HardcoreBanReason: t("TXT_CODE_b7c8eb9f"),
KickProxyUsers: t("TXT_CODE_78223e62"),
RequireLogin: t("TXT_CODE_cb1fef78"),
AllowLoginAnyUsername: t("TXT_CODE_f2577f17"),
AllowRegisterAnyUsername: t("TXT_CODE_206f0c11"),
MinimumPasswordLength: t("TXT_CODE_ab7672dd"),
BCryptWorkFactor: "",
DisableUUIDLogin: t("阻止玩家使用其客户端 UUID 登录"),
KickEmptyUUID: t("踢出不向服务器发送 UUID 的客户端"),
TilePaintThreshold: t("如果在 1 秒内绘制了此数量的瓷砖,则封禁玩家"),
KickOnTilePaintThresholdBroken: t("当玩家超过 TilePaint 阈值时,是否踢出"),
MaxDamage: t("玩家 / NPC 可以造成的最大伤害"),
MaxProjDamage: t("射弹可以造成的最大伤害"),
KickOnDamageThresholdBroken: t("当玩家超过 MaxDamage 阈值时是否踢出"),
TileKillThreshold: t("如果 1 秒内破坏超过此数量的瓷砖,则封禁玩家并恢复其操作"),
KickOnTileKillThresholdBroken: t("当玩家超过 TileKill 阈值时是否踢出玩家"),
TilePlaceThreshold: t("如果在 1 秒内放置了此数量的瓷砖,则封禁玩家"),
KickOnTilePlaceThresholdBroken: t("当玩家超过 TilePlace 阈值时是否踢出玩家"),
DisableUUIDLogin: t("TXT_CODE_94002354"),
KickEmptyUUID: t("TXT_CODE_7141866a"),
TilePaintThreshold: t("TXT_CODE_6d912e27"),
KickOnTilePaintThresholdBroken: t("TXT_CODE_192078c6"),
MaxDamage: t("TXT_CODE_5e6e46bb"),
MaxProjDamage: t("TXT_CODE_e1af7c8b"),
KickOnDamageThresholdBroken: t("TXT_CODE_57417f60"),
TileKillThreshold: t("TXT_CODE_4fb66c81"),
KickOnTileKillThresholdBroken: t("TXT_CODE_4aba9745"),
TilePlaceThreshold: t("TXT_CODE_17cbacf6"),
KickOnTilePlaceThresholdBroken: t("TXT_CODE_617701dc"),
TileLiquidThreshold: "",
KickOnTileLiquidThresholdBroken: t("当玩家超过 TileLiquid 阈值时是否踢出玩家"),
ProjIgnoreShrapnel: t("是否忽略水晶子弹的弹片以计算弹丸阈值"),
ProjectileThreshold: t("如果在 1 秒内创建了此数量的射弹,则封禁玩家"),
KickOnProjectileThresholdBroken: t("当玩家超过投射物阈值时是否踢出玩家"),
HealOtherThreshold: t("如果在 1 秒内发送了此数量的 HealOtherPlayer 数据包,则禁用玩家"),
KickOnHealOtherThresholdBroken: t("当玩家超过 HealOther 阈值时是否踢出玩家"),
KickOnTileLiquidThresholdBroken: t("TXT_CODE_9394aadf"),
ProjIgnoreShrapnel: t("TXT_CODE_c9c27711"),
ProjectileThreshold: t("TXT_CODE_6d6c7e9a"),
KickOnProjectileThresholdBroken: t("TXT_CODE_946d4401"),
HealOtherThreshold: t("TXT_CODE_449efd26"),
KickOnHealOtherThresholdBroken: t("TXT_CODE_e0643e6f"),
SuppressPermissionFailureNotices: t(
"禁止来自区域、重生点或服务器编辑失败的生成权限失败的警告"
),
DisableModifiedZenith: t("禁止将Zenith射弹与不同的物体一起使用而不是武器"),
DisableCustomDeathMessages: t("防止创建带有死亡信息的自定义消息的保护机制"),
DisableModifiedZenith: t("TXT_CODE_d4b058a9"),
DisableCustomDeathMessages: t("TXT_CODE_5143c584"),
CommandSpecifier: t(
"指定哪个字符串作为命令的起始部分。如果长度大于1则可能无法正常工作。"
),
CommandSilentSpecifier: t("服务器是否应输出与系统操作相关的调试级别消息"),
DisableSpewLogs: t("禁止将日志作为消息发送给具有日志权限的玩家"),
DisableSecondUpdateLogs: t("阻止 OnSecondUpdate 检查将内容写入日志文件"),
SuperAdminChatRGB: t("超级管理员组的聊天颜色"),
SuperAdminChatPrefix: t("超级管理员组聊天前缀"),
SuperAdminChatSuffix: t("超级管理员组聊天后缀"),
EnableGeoIP: t("在加入时根据玩家的 IP 广播玩家的地理位置"),
DisplayIPToAdmins: t("向具有日志权限的玩家显示玩家加入时的 IP"),
CommandSilentSpecifier: t("TXT_CODE_1049cbd1"),
DisableSpewLogs: t("TXT_CODE_f29d5d2"),
DisableSecondUpdateLogs: t("TXT_CODE_ef97db20"),
SuperAdminChatRGB: t("TXT_CODE_b3127cba"),
SuperAdminChatPrefix: t("TXT_CODE_24843187"),
SuperAdminChatSuffix: t("TXT_CODE_5bc16b9a"),
EnableGeoIP: t("TXT_CODE_6bf4665b"),
DisplayIPToAdmins: t("TXT_CODE_1b763e24"),
ChatFormat: t(
"更改游戏内聊天格式:{0} = 群组名称,{1} = 群组前缀,{2} = 玩家名称,{3} = 群组后缀,{4} = 聊天消息。"
),
ChatAboveHeadsFormat: t(
"更改在头顶聊天时使用的玩家名称。以方括号包裹的玩家名称开头,格式与 Terraria 的一致。与 ChatFormat 相同的格式,但不包括消息。"
),
EnableChatAboveHeads: t("是否在玩家头顶上方显示聊天消息"),
BroadcastRGB: t("用于广播消息颜色的 RGB 值"),
StorageType: t("存储数据时使用的数据库类型sqlite或mysql"),
SqliteDBPath: t("sqlite db 的路径"),
MySqlHost: t("MySQL 数据库地址"),
MySqlDbName: t("MySQL 数据库名称"),
MySqlUsername: t("MySQL 数据库用户名"),
MySqlPassword: t("MySQL 数据库密码"),
UseSqlLogs: t("将日志保存到 SQL 数据库而不是文本文件。默认 false"),
RevertToTextLogsOnSqlFailures: t("SQL日志在插入记录失败多少次后将回退到文本日志"),
RestApiEnabled: t("启用或禁用 REST API"),
RestApiPort: t("REST API 使用的端口"),
LogRest: t("记录 REST API 连接信息"),
EnableTokenEndpointAuthentication: t("要求使用公共REST API端点时进行令牌身份验证"),
RESTMaximumRequestsPerInterval: t("在拒绝请求之前,存储桶中的最大 REST 请求数。最小值为 5"),
EnableChatAboveHeads: t("TXT_CODE_9c39c7ae"),
BroadcastRGB: t("TXT_CODE_11d2ab6b"),
StorageType: t("TXT_CODE_8e5f865e"),
SqliteDBPath: t("TXT_CODE_90f00679"),
MySqlHost: t("TXT_CODE_17f1f440"),
MySqlDbName: t("TXT_CODE_d0b40386"),
MySqlUsername: t("TXT_CODE_929a9ee4"),
MySqlPassword: t("TXT_CODE_3a5b3d2d"),
UseSqlLogs: t("TXT_CODE_ce99026b"),
RevertToTextLogsOnSqlFailures: t("TXT_CODE_2ba4bf6f"),
RestApiEnabled: t("TXT_CODE_6683b887"),
RestApiPort: t("TXT_CODE_daca92c1"),
LogRest: t("TXT_CODE_fdd1a61"),
EnableTokenEndpointAuthentication: t("TXT_CODE_b9d7fe43"),
RESTMaximumRequestsPerInterval: t("TXT_CODE_8298bfde"),
RESTRequestBucketDecreaseIntervalMinutes: t(
"REST 请求存储桶减少 1 的频率(以分钟为单位)。最小值为 1 分钟"
),
ApplicationRestTokens: t("外部应用程序可用于对服务器进行查询的 REST 令牌字典")
ApplicationRestTokens: t("TXT_CODE_f0ca2761")
}
}
}

View File

@ -36,7 +36,7 @@ export enum ROLE {
const originRouterConfig: RouterConfig[] = [
{
path: "/install",
name: t("安装界面"),
name: t("TXT_CODE_82d650be"),
component: InstallPage,
meta: {
permission: ROLE.GUEST,
@ -197,7 +197,7 @@ const originRouterConfig: RouterConfig[] = [
},
{
path: "/404",
name: t("页面不存在"),
name: t("TXT_CODE_393c816c"),
component: LayoutContainer,
meta: {
permission: ROLE.GUEST,
@ -216,7 +216,7 @@ const originRouterConfig: RouterConfig[] = [
},
{
path: "/login",
name: t("登录页"),
name: t("TXT_CODE_24873a8a"),
component: LoginPage,
meta: {
permission: ROLE.GUEST,
@ -225,7 +225,7 @@ const originRouterConfig: RouterConfig[] = [
},
{
path: "/_open_page",
name: t("开放页"),
name: t("TXT_CODE_2cf59872"),
component: LayoutContainer,
meta: {
permission: ROLE.ADMIN, // open page without permission

View File

@ -302,7 +302,7 @@ export const INSTANCE_CONFIGS: InstanceConfigs[] = [
{
fileName: "[Tshock] config.json",
type: "yml",
info: t("Tshock 服务端配置文件"),
info: t("TXT_CODE_1cd8f9d2"),
path: "tshock/config.json",
redirect: "tshock/config.json",
category: [TYPE_TERRARIA]

View File

@ -63,7 +63,7 @@ export function useQuickStartFlow() {
icon: AppstoreAddOutlined
},
{
title: t("泰拉瑞亚游戏服务器"),
title: t("TXT_CODE_dbefcc6c"),
key: QUICKSTART_ACTION_TYPE.Terraria,
icon: AppstoreAddOutlined
},

View File

@ -24,13 +24,13 @@ const myAddr = `${window.location.href}`;
<div v-if="isAdmin" class="admin-text">
<a-typography-paragraph>
<p>
{{ t("1. 此页面所有人均可以访问,您也可以放置任何权限的卡片。") }}
{{ t("TXT_CODE_2c7bcdfa") }}
</p>
<p>
{{ t("2. 访问者没有登录或者权限不足,依然会无法加载卡片。") }}
{{ t("TXT_CODE_da579edc") }}
</p>
<p>
{{ t("3. 设计完成后,您可以使用已登录的状态直接访问。") }}
{{ t("TXT_CODE_4d50f316") }}
</p>
<pre>{{ myAddr }}</pre>
@ -39,7 +39,7 @@ const myAddr = `${window.location.href}`;
<div v-else>
<a-typography-paragraph>
<p>
{{ t("此页面无内容。") }}
{{ t("TXT_CODE_e15e5006") }}
</p>
</a-typography-paragraph>
</div>

View File

@ -178,13 +178,13 @@ const editDialog = ref({
<a-input-group compact>
<a-select v-model:value="currentStatus" style="width: 100px">
<a-select-option value="all">
{{ t("所有") }}
{{ t("TXT_CODE_c48f6f64") }}
</a-select-option>
<a-select-option :value="true">
{{ t("在线") }}
{{ t("TXT_CODE_823bfe63") }}
</a-select-option>
<a-select-option :value="false">
{{ t("离线") }}
{{ t("TXT_CODE_66ce073e") }}
</a-select-option>
</a-select>
<a-input

View File

@ -186,7 +186,7 @@ const userDialog = ref({
uuid: formData.value.uuid
}
});
message.success(t("编辑成功"));
message.success(t("TXT_CODE_27efac3b"));
}
userDialog.value.status = false;
formData.value = _.cloneDeep(formDataOrigin);
@ -215,8 +215,8 @@ const formRef = ref<FormInstance>();
const formData = ref<EditUserInfo>(_.cloneDeep(formDataOrigin));
const baseRules: Record<string, Rule[]> = {
userName: [
{ required: true, message: t("请输入用户名") },
{ min: 3, max: 12, message: t("长度只能 3 ~ 12 个字符"), trigger: "blur" }
{ required: true, message: t("TXT_CODE_2695488c") },
{ min: 3, max: 12, message: t("TXT_CODE_3f477ec"), trigger: "blur" }
],
permission: [{ required: true, message: t("TXT_CODE_3bb646e4") }]
};
@ -225,14 +225,14 @@ const addUserRules: Record<string, Rule[]> = {
passWord: [
{
required: true,
message: t("请输入密码")
message: t("TXT_CODE_25c895d5")
},
{
min: 9,
max: 36,
validator: async (_rule: Rule, value: string) => {
if (!/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[0-9A-Za-z]{9,}$/.test(value))
throw new Error(t("9 到 36 个字符,必须包含大小写字母和数字"));
throw new Error(t("TXT_CODE_6032f5a3"));
},
trigger: "blur"
}
@ -249,7 +249,7 @@ const editUserRules: Record<string, Rule[]> = {
max: 36,
validator: async (_rule: Rule, value: string) => {
if (value && !/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[0-9A-Za-z]{9,}$/.test(value))
throw new Error(t("9 到 36 个字符,必须包含大小写字母和数字"));
throw new Error(t("TXT_CODE_6032f5a3"));
},
trigger: "blur"
}
@ -266,7 +266,7 @@ const handleAddUser = async () => {
// Edit user
const handleEditUser = (user: BaseUserInfo) => {
userDialog.value.title = t("编辑用户");
userDialog.value.title = t("TXT_CODE_79f9a172");
formData.value = _.cloneDeep(user);
isAddMode.value = false;
userDialog.value.show();
@ -306,7 +306,7 @@ onMounted(async () => {
<a-typography-title :level="5">{{ t("TXT_CODE_5c605130") }}</a-typography-title>
<a-typography-paragraph>
<a-typography-text type="secondary">
{{ !isAddMode ? t("不填写则不更变原有值") : t("TXT_CODE_1f2062c7") }}
{{ !isAddMode ? t("TXT_CODE_af1f921d") : t("TXT_CODE_1f2062c7") }}
</a-typography-text>
</a-typography-paragraph>
<a-input v-model:value="formData.passWord" :placeholder="t('TXT_CODE_4ea93630')" />
@ -382,7 +382,7 @@ onMounted(async () => {
<a-input-group compact>
<a-select v-model:value="currentRole" style="width: 100px" @change="reload()">
<a-select-option value="">
{{ t("所有") }}
{{ t("TXT_CODE_c48f6f64") }}
</a-select-option>
<a-select-option v-for="(p, i) in permissionList" :key="i" :value="i">
{{ p }}

View File

@ -219,9 +219,9 @@ const save = async () => {
</a-form-item>
</a-form>
<template #footer>
<a-button @click="close">{{ t("关闭") }}</a-button>
<a-button @click="close">{{ t("TXT_CODE_b1dedda3") }}</a-button>
<a-button type="primary" @click="save">
{{ t("保存") }}
{{ t("TXT_CODE_abfe9512") }}
</a-button>
</template>
</a-modal>

View File

@ -117,12 +117,12 @@ const close = () => {
</a-button>
</a-upload>
<a-typography class="mt-20">
<a-typography-title :level="5">{{ t("温馨提示") }}</a-typography-title>
<a-typography-title :level="5">{{ t("TXT_CODE_e112412a") }}</a-typography-title>
<a-typography-paragraph>
<ol>
<li>{{ t("上传后将自动保存") }}</li>
<li>{{ t("点击关闭按钮可取消上传") }}</li>
<li>{{ t("你可以通过 “重置布局” 来清空你上传的所有文件") }}</li>
<li>{{ t("TXT_CODE_2bcc4e34") }}</li>
<li>{{ t("TXT_CODE_498cd5c5") }}</li>
<li>{{ t("TXT_CODE_c1320e08") }}</li>
</ol>
</a-typography-paragraph>
</a-typography>
@ -132,9 +132,9 @@ const close = () => {
</a-tab-pane>
</a-tabs>
<template #footer>
<a-button @click="close()">{{ t("关闭") }}</a-button>
<a-button @click="close()">{{ t("TXT_CODE_b1dedda3") }}</a-button>
<a-button v-if="activeKey === 'url'" type="primary" @click="save">
{{ t("保存") }}
{{ t("TXT_CODE_abfe9512") }}
</a-button>
</template>
</a-modal>

View File

@ -1513,5 +1513,164 @@
"TXT_CODE_1a499109": "文件不存在",
"TXT_CODE_e4d6cc20": "请求体错误",
"TXT_CODE_d37f0418": "面板已经安装!",
"TXT_CODE_42036f92": "------ 用户登录事件 ------"
"TXT_CODE_42036f92": "------ 用户登录事件 ------",
"TXT_CODE_5a196078": "走马灯",
"TXT_CODE_68821d80": "此配置文件为 Tshock 服务端常见的配置文件。",
"TXT_CODE_448df2bd": "加入服务器所需的密码",
"TXT_CODE_e304faa": "最大同时连接数。如果你想让玩家被踢出“服务器已满”的设定请将其设置为你设置的最大玩家数然后将泰拉瑞亚的最大玩家设置为2个或以上",
"TXT_CODE_369a4a22": "预留插槽。超过最大服务器插槽数的保留玩家可以加入的保留插槽数",
"TXT_CODE_60e3c342": "服务器名称。如果 UseServerName 为 true则在会话期间替换世界名称",
"TXT_CODE_8a924345": "是否使用 ServerName 代替世界名称",
"TXT_CODE_447a9fc4": "日志路径",
"TXT_CODE_a8b402a9": "启用调试日志",
"TXT_CODE_c4430fa6": "阻止用户在完成连接之前登录",
"TXT_CODE_d9b7a6a3": "允许箱子中物品的堆叠在世界加载期间超出堆叠限制",
"TXT_CODE_9cefd73": "自动保存",
"TXT_CODE_2c194599": "保存时是否发出公告",
"TXT_CODE_cd3ae89e": "显示备份自动保存消息",
"TXT_CODE_40c2c2ee": "备份之间的间隔(以分钟为单位)。备份存储在 tshock/backups 文件夹中",
"TXT_CODE_255606fb": "备份的保留时间(以分钟为单位)",
"TXT_CODE_bec3d0ea": "如果服务器因未经处理的异常而崩溃,是否保存世界",
"TXT_CODE_f7f57aec": "在最后一个玩家断开连接时保存世界",
"TXT_CODE_3e252bc9": "入侵事件的大小",
"TXT_CODE_7d874fad": "每波生成的默认最大生物数。越高意味着那一波中的生物更多",
"TXT_CODE_2033383b": "波之间的延迟。值越低,生物越多",
"TXT_CODE_226b6c9e": "启用永无止境的入侵事件",
"TXT_CODE_85b01e01": "设置 PvP 模式。有效类型为“normal”、“always”和“disabled”",
"TXT_CODE_7b759c13": "防止默认瓷砖生成在生成保护半径内",
"TXT_CODE_965360cd": "生成保护半径",
"TXT_CODE_443ac54f": "根据玩家与其瓷砖位置之间的距离启用或禁用反作弊范围检查",
"TXT_CODE_d092c3b": "仅允许 hardcore 玩家连接",
"TXT_CODE_1a6d30de": "阻止 softcore 玩家连接",
"TXT_CODE_b5ce1069": "阻止 non-softcore 玩家连接",
"TXT_CODE_c8c91afc": "禁用放置、移动瓷砖",
"TXT_CODE_3f739f9c": "禁用困难模式",
"TXT_CODE_c9e4d5c1": "防止地牢守卫在将玩家送往其出生点时生成",
"TXT_CODE_f51ce97e": "禁用小丑炸弹生成",
"TXT_CODE_115e891f": "禁用雪球生成",
"TXT_CODE_90912e04": "禁用玩家死亡时掉落墓碑",
"TXT_CODE_ce953a4": "禁用 PrimeBombs",
"TXT_CODE_b0b67785": "强制世界时间为正常时间,白天或黑",
"TXT_CODE_584af0ab": "禁用隐身药水的效果",
"TXT_CODE_d764908b": "禁止玩家可以移动的最大距离(以瓷砖为单位)",
"TXT_CODE_3b346a65": "区域保护是否应适用于箱子",
"TXT_CODE_603cbc35": "区域保护是否适用于钻石宝石锁",
"TXT_CODE_33c223c": "忽略检查以查看玩家是否“可以”更新射弹",
"TXT_CODE_da65ecbd": "忽略检查玩家是否“可以”杀死射弹",
"TXT_CODE_8c2ad2cb": "允许玩家打破无法建造的临时瓷砖(草、花盆等)",
"TXT_CODE_ba1a222b": "允许玩家在无法建造的地方放置冰",
"TXT_CODE_b30daa03": "当世界处于困难模式时,允许 CrimsonCreep",
"TXT_CODE_372e97f4": "当世界处于困难模式时,允许腐败蔓延",
"TXT_CODE_66820e23": "在停止生成之前,雕像可以在 200 像素内生成多少个 NPC。默认值 3",
"TXT_CODE_32bf92a1": "在停止生成之前,雕像可以在 600 像素内生成多少个 NPC。默认值 6",
"TXT_CODE_3b4260f8": "雕像在停止生成之前可以生成多少个 NPC。默认值 10。",
"TXT_CODE_cd62c9d4": "阻止违禁物品生成或通过命令调出",
"TXT_CODE_ed9bab79": "阻止玩家在死亡时与世界互动",
"TXT_CODE_fe82609a": "防止玩家放置样式无效的瓷砖",
"TXT_CODE_b649a71a": "强制全年举办仅限圣诞节的活动",
"TXT_CODE_ac52ad06": "强制全年举办仅限万圣节的活动",
"TXT_CODE_3f3e734b": "允许禁止项目允许列表中的组生成被禁止的项目,即使 PreventBannedItemSpawn 设置为 true",
"TXT_CODE_288830f4": "玩家在重生之前必须等待的秒数。有效范围0默认值到 15 秒。使用风险自负",
"TXT_CODE_b45e73fb": "如果附近有 Boss玩家在重生之前必须等待的秒数。有效范围0默认值到 30 秒。使用风险自负",
"TXT_CODE_87e18bb5": "是否广播 Boss 生成或入侵开始",
"TXT_CODE_3f470950": "在装备增益之前,玩家可以拥有的最大生命值",
"TXT_CODE_95dfd5bd": "在装备增益之前,玩家可以拥有的最大 MP",
"TXT_CODE_f71475e2": "炸弹从爆炸点开始可以影响瓷砖的射程(以格为单位)",
"TXT_CODE_260d96a0": "如果设置为 true则给予玩家的物品将直接插入到他们的物品栏中。否则给予玩家的物品将作为掉落的物品生成。实验性功能可能无法正常工作或导致物品丢失",
"TXT_CODE_cfd64e73": "新注册玩家的默认组名称",
"TXT_CODE_90896d08": "未注册玩家的默认组名称",
"TXT_CODE_52b31aef": "根据玩家的 IP 记录玩家下线的地方。服务器重新启动后会清空",
"TXT_CODE_3e98e22f": "玩家登录失败次数,超过则直接踢",
"TXT_CODE_3855e22f": "如果未向 ban 命令传递任何参数,则取消 IP 封禁",
"TXT_CODE_d0e37f20": "启用白名单",
"TXT_CODE_f160d877": "玩家不在白名单上时被踢出的原因",
"TXT_CODE_4ff6a125": "服务器人满时加入提示",
"TXT_CODE_5f23008": "在服务器已满且没有可用预留插槽的情况下踢出试图加入的玩家时给出的原因",
"TXT_CODE_95340802": "是否踢出硬核玩家",
"TXT_CODE_129475a7": "踢出硬核玩家的原因",
"TXT_CODE_8ab0cc1a": "禁止硬核玩家死亡",
"TXT_CODE_b7c8eb9f": "禁止硬核玩家死亡的原因",
"TXT_CODE_78223e62": "如果启用了 GeoIP将踢出被标识为使用代理的玩家",
"TXT_CODE_cb1fef78": "所有玩家在游戏之前必须注册或登录",
"TXT_CODE_f2577f17": "允许玩家登录任何帐户,即使用户名与其角色名称不匹配",
"TXT_CODE_206f0c11": "允许玩家注册与其角色名称不一定匹配",
"TXT_CODE_ab7672dd": "新玩家帐户的最小密码长度。不能低于 4",
"TXT_CODE_94002354": "阻止玩家使用其客户端 UUID 登录",
"TXT_CODE_7141866a": "踢出不向服务器发送 UUID 的客户端",
"TXT_CODE_6d912e27": "如果在 1 秒内绘制了此数量的瓷砖,则封禁玩家",
"TXT_CODE_192078c6": "当玩家超过 TilePaint 阈值时,是否踢出",
"TXT_CODE_5e6e46bb": "玩家 / NPC 可以造成的最大伤害",
"TXT_CODE_e1af7c8b": "射弹可以造成的最大伤害",
"TXT_CODE_57417f60": "当玩家超过 MaxDamage 阈值时是否踢出",
"TXT_CODE_4fb66c81": "如果 1 秒内破坏超过此数量的瓷砖,则封禁玩家并恢复其操作",
"TXT_CODE_4aba9745": "当玩家超过 TileKill 阈值时是否踢出玩家",
"TXT_CODE_17cbacf6": "如果在 1 秒内放置了此数量的瓷砖,则封禁玩家",
"TXT_CODE_617701dc": "当玩家超过 TilePlace 阈值时是否踢出玩家",
"TXT_CODE_9394aadf": "当玩家超过 TileLiquid 阈值时是否踢出玩家",
"TXT_CODE_c9c27711": "是否忽略水晶子弹的弹片以计算弹丸阈值",
"TXT_CODE_6d6c7e9a": "如果在 1 秒内创建了此数量的射弹,则封禁玩家",
"TXT_CODE_946d4401": "当玩家超过投射物阈值时是否踢出玩家",
"TXT_CODE_449efd26": "如果在 1 秒内发送了此数量的 HealOtherPlayer 数据包,则禁用玩家",
"TXT_CODE_e0643e6f": "当玩家超过 HealOther 阈值时是否踢出玩家",
"TXT_CODE_decf21ee": "禁止来自区域、重生点或服务器编辑失败的生成权限失败的警告",
"TXT_CODE_d4b058a9": "禁止将Zenith射弹与不同的物体一起使用而不是武器",
"TXT_CODE_5143c584": "防止创建带有死亡信息的自定义消息的保护机制",
"TXT_CODE_235cd293": "指定哪个字符串作为命令的起始部分。如果长度大于1则可能无法正常工作。",
"TXT_CODE_1049cbd1": "服务器是否应输出与系统操作相关的调试级别消息",
"TXT_CODE_f29d5d2": "禁止将日志作为消息发送给具有日志权限的玩家",
"TXT_CODE_ef97db20": "阻止 OnSecondUpdate 检查将内容写入日志文件",
"TXT_CODE_b3127cba": "超级管理员组的聊天颜色",
"TXT_CODE_24843187": "超级管理员组聊天前缀",
"TXT_CODE_5bc16b9a": "超级管理员组聊天后缀",
"TXT_CODE_6bf4665b": "在加入时根据玩家的 IP 广播玩家的地理位置",
"TXT_CODE_1b763e24": "向具有日志权限的玩家显示玩家加入时的 IP",
"TXT_CODE_2374966e": "更改游戏内聊天格式:{0} = 群组名称,{1} = 群组前缀,{2} = 玩家名称,{3} = 群组后缀,{4} = 聊天消息。",
"TXT_CODE_97535446": "更改在头顶聊天时使用的玩家名称。以方括号包裹的玩家名称开头,格式与 Terraria 的一致。与 ChatFormat 相同的格式,但不包括消息。",
"TXT_CODE_9c39c7ae": "是否在玩家头顶上方显示聊天消息",
"TXT_CODE_11d2ab6b": "用于广播消息颜色的 RGB 值",
"TXT_CODE_8e5f865e": "存储数据时使用的数据库类型sqlite或mysql",
"TXT_CODE_90f00679": "sqlite db 的路径",
"TXT_CODE_17f1f440": "MySQL 数据库地址",
"TXT_CODE_d0b40386": "MySQL 数据库名称",
"TXT_CODE_929a9ee4": "MySQL 数据库用户名",
"TXT_CODE_3a5b3d2d": "MySQL 数据库密码",
"TXT_CODE_ce99026b": "将日志保存到 SQL 数据库而不是文本文件。默认 false",
"TXT_CODE_2ba4bf6f": "SQL日志在插入记录失败多少次后将回退到文本日志",
"TXT_CODE_6683b887": "启用或禁用 REST API",
"TXT_CODE_daca92c1": "REST API 使用的端口",
"TXT_CODE_fdd1a61": "记录 REST API 连接信息",
"TXT_CODE_b9d7fe43": "要求使用公共REST API端点时进行令牌身份验证",
"TXT_CODE_8298bfde": "在拒绝请求之前,存储桶中的最大 REST 请求数。最小值为 5",
"TXT_CODE_5b190bc4": "REST 请求存储桶减少 1 的频率(以分钟为单位)。最小值为 1 分钟",
"TXT_CODE_f0ca2761": "外部应用程序可用于对服务器进行查询的 REST 令牌字典",
"TXT_CODE_82d650be": "安装界面",
"TXT_CODE_393c816c": "页面不存在",
"TXT_CODE_24873a8a": "登录页",
"TXT_CODE_2cf59872": "开放页",
"TXT_CODE_1cd8f9d2": "Tshock 服务端配置文件",
"TXT_CODE_dbefcc6c": "泰拉瑞亚游戏服务器",
"TXT_CODE_2c7bcdfa": "1. 此页面所有人均可以访问,您也可以放置任何权限的卡片。",
"TXT_CODE_da579edc": "2. 访问者没有登录或者权限不足,依然会无法加载卡片。",
"TXT_CODE_4d50f316": "3. 设计完成后,您可以使用已登录的状态直接访问。",
"TXT_CODE_e15e5006": "此页面无内容。",
"TXT_CODE_c48f6f64": "所有",
"TXT_CODE_4a56836d": "设置图片列表",
"TXT_CODE_9900f79e": "图片",
"TXT_CODE_7ec87e8a": "取消上传",
"TXT_CODE_e112412a": "温馨提示",
"TXT_CODE_2bcc4e34": "上传后将自动保存",
"TXT_CODE_498cd5c5": "点击关闭按钮可取消上传",
"TXT_CODE_c1320e08": "你可以通过 “重置布局” 来清空你上传的所有文件",
"TXT_CODE_ba42d467": "网络URL",
"TXT_CODE_27efac3b": "编辑成功",
"TXT_CODE_3f477ec": "长度只能 3 ~ 12 个字符",
"TXT_CODE_25c895d5": "请输入密码",
"TXT_CODE_6032f5a3": "9 到 36 个字符,必须包含大小写字母和数字",
"TXT_CODE_79f9a172": "编辑用户",
"TXT_CODE_af1f921d": "不填写则不更变原有值",
"TXT_CODE_cea5dba1": "程序已收到退出信号,正在准备关闭中...",
"TXT_CODE_b0aa2db9": "已关闭!",
"TXT_CODE_eb579d63": "用户资源管理",
"TXT_CODE_1f925226": "登录页面",
"TXT_CODE_463375d2": "关于本页面"
}

View File

@ -55,11 +55,10 @@ function setupHttp(koaApp: Koa, port: number, host?: string) {
async function processExit() {
try {
console.log("");
logger.warn("Program received EXIT command.");
logger.info("Exit.");
logger.warn($t("TXT_CODE_cea5dba1"));
logger.warn($t("TXT_CODE_b0aa2db9"));
} catch (err) {
logger.error("ERROR:", err);
logger.error(err);
} finally {
process.exit(0);
}

View File

@ -330,7 +330,7 @@ function getDefaultFrontendLayoutConfig(): IPageLayoutConfig[] {
id: getRandomId(),
meta: {},
type: "UserAccessSettings",
title: t("用户资源管理"),
title: t("TXT_CODE_eb579d63"),
width: 12,
height: LayoutCardHeight.AUTO,
disableDelete: true
@ -526,7 +526,7 @@ function getDefaultFrontendLayoutConfig(): IPageLayoutConfig[] {
id: getRandomId(),
meta: {},
type: "LoginCard",
title: t("登录页面"),
title: t("TXT_CODE_1f925226"),
width: 4,
height: LayoutCardHeight.AUTO,
disableDelete: true
@ -554,7 +554,7 @@ function getDefaultFrontendLayoutConfig(): IPageLayoutConfig[] {
id: getRandomId(),
meta: {},
type: "DefaultCard",
title: t("关于本页面"),
title: t("TXT_CODE_463375d2"),
width: 6,
height: LayoutCardHeight.SMALL
}