feat(locale): configure Chinese (zh) localization for client and align with 40250 server

This commit is contained in:
shen
2026-09-19 18:47:00 -07:00
parent f22c0f8e31
commit 4a2b953a4f
315 changed files with 14997 additions and 17 deletions
+54 -2
View File
@@ -3,23 +3,75 @@
# 用 preload("res://locale.gd").new()setup() 后 t("KEY", [args]).
extends RefCounted
var _lang := "en"
var _lang := "zh"
var _tab := {} # KEY -> value
var _item_names := {} # int vnum -> String name
var _mob_names := {} # int vnum -> String name
var _base := ""
func setup(assets_root: String, lang := "en") -> void:
static func get_default_lang() -> String:
var env_lang := OS.get_environment("MT_LOCALE").strip_edges().to_lower()
if not env_lang.is_empty():
return env_lang
return "zh"
func setup(assets_root: String, lang := "") -> void:
_base = assets_root.path_join("locale/locale")
if lang.is_empty():
lang = get_default_lang()
set_lang(lang)
func set_lang(lang: String) -> void:
_lang = lang
_tab.clear()
_item_names.clear()
_mob_names.clear()
var dir := _base.path_join(lang)
if not DirAccess.dir_exists_absolute(dir):
push_warning("[locale] no such lang: " + dir)
return
for f in ["locale_interface.txt", "locale_game.txt", "itemdesc.txt", "skilldesc.txt"]:
_load_table(dir.path_join(f))
_load_name_table(dir.path_join("item_names.txt"), _item_names)
_load_name_table(dir.path_join("mob_names.txt"), _mob_names)
func _load_name_table(path: String, target_dict: Dictionary) -> void:
if not FileAccess.file_exists(path):
return
var fa := FileAccess.open(path, FileAccess.READ)
if fa == null:
return
while not fa.eof_reached():
var line := fa.get_line().strip_edges()
if line.is_empty() or line.begins_with("#") or line.begins_with("VNUM"):
continue
var tab := line.find("\t")
if tab < 0:
tab = line.find(" ")
if tab < 0:
continue
var k_str := line.substr(0, tab).strip_edges()
var val := line.substr(tab + 1).strip_edges()
if k_str.is_valid_int():
var vnum := int(k_str)
target_dict[vnum] = val
_tab["ITEM_%d" % vnum] = val
func item_name(vnum: int, fallback: String = "") -> String:
if _item_names.has(vnum):
return String(_item_names[vnum])
return fallback if not fallback.is_empty() else ("物品 #%d" % vnum)
func mob_name(vnum: int, fallback: String = "") -> String:
if _mob_names.has(vnum):
return String(_mob_names[vnum])
return fallback if not fallback.is_empty() else ("怪物 #%d" % vnum)
func has_item_name(vnum: int) -> bool:
return _item_names.has(vnum)
func has_mob_name(vnum: int) -> bool:
return _mob_names.has(vnum)
func _load_table(path: String) -> void:
if not FileAccess.file_exists(path):