feat(locale): configure Chinese (zh) localization for client and align with 40250 server
This commit is contained in:
+54
-2
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user