Kaynağa Gözat

翻译,进房退上一个房

DoggyZhang 1 gün önce
ebeveyn
işleme
24c720e0bc

+ 3 - 1
module/room/src/main/java/com/adealink/weparty/room/sdk/controller/impl/JoinController.kt

@@ -181,7 +181,9 @@ open class JoinController(override val ctx: IRoomContext, serialHandler: Handler
             }
 
             //先尝试退上次未退出的房间,然后再进房,重进房不执行退房逻辑
-            leaveLastRoom(RoomLocalService.lastEnterRoomId, reason = LeaveRoomReason.ENTER_OTHER_ROOM, false)
+            if (RoomLocalService.lastEnterRoomId != req.roomId) {
+                leaveLastRoom(RoomLocalService.lastEnterRoomId, reason = LeaveRoomReason.ENTER_OTHER_ROOM, false)
+            }
 
             joiningRoomId = null
             joinedRoomInfo = (joinRoomRes as Rlt.Success).data

+ 10 - 0
module/room/src/main/res/values-in/strings.xml

@@ -67,4 +67,14 @@
     <string name="room_close_tips">Menutup ruang akan menghapus semua pengguna di ruang~</string>
     <string name="room_unsupported_room_type">Jenis ruang tidak didukung, tidak dapat masuk ruang, tingkatkan APP</string>
     <string name="room_list_dispatch_center_title">Ruang Dispatch</string>
+    <string name="room_gift_send_to">Kirim ke :</string>
+    <string name="room_gift_diamond_less">Berlian Tidak Cukup</string>
+    <string name="room_gift_coin_available">Koin Tersedia: [coin]%s</string>
+    <string name="room_gift_exchange_rate">Nilai Tukar: [coin]1=[diamond]1000</string>
+    <string name="room_gift_exchange_never_remind_today">Jangan ingatkan saya lagi hari ini</string>
+    <string name="room_send_gift_message">%1$s Kirim %2$s</string>
+    <string name="room_send_gift_to_uids_empty">Silakan pilih kepada siapa akan dikirim</string>
+    <string name="room_send_gift_gift_no_select">Silakan pilih hadiah yang akan dikirim</string>
+    <string name="room_send_gift_count_empty">Setidaknya ada satu hadiah untuk dikirim</string>
+    <string name="room_send_gift_balance_not_enough">Berlian tidak cukup, ingin menambah?</string>
 </resources>

+ 10 - 0
module/room/src/main/res/values-zh/strings.xml

@@ -67,4 +67,14 @@
     <string name="room_close_tips">关闭房间将清空房间人员哦~</string>
     <string name="room_unsupported_room_type">不支持的房间类型,无法进入房间,请升级APP</string>
     <string name="room_list_dispatch_center_title">派单厅</string>
+    <string name="room_gift_send_to">送给:</string>
+    <string name="room_gift_diamond_less">钻石不足</string>
+    <string name="room_gift_coin_available">可用金币:[coin]%s</string>
+    <string name="room_gift_exchange_rate">兑换比例: [coin]1=[diamond]1000</string>
+    <string name="room_gift_exchange_never_remind_today">今日不再提醒</string>
+    <string name="room_send_gift_message">%1$s送给%2$s</string>
+    <string name="room_send_gift_to_uids_empty">请选择要送给谁</string>
+    <string name="room_send_gift_gift_no_select">请选择要赠送的礼物</string>
+    <string name="room_send_gift_count_empty">至少赠送一个礼物</string>
+    <string name="room_send_gift_balance_not_enough">钻石不足,是否去充值?</string>
 </resources>

+ 8 - 8
module/room/src/main/res/values/strings.xml

@@ -69,13 +69,13 @@
     <string name="room_unsupported_room_type">Unsupported room type, cannot enter the room, please upgrade the APP</string>
     <string name="room_list_dispatch_center_title">Dispatch Hall</string>
     <string name="room_gift_send_to">Send to :</string>
-    <string name="room_gift_diamond_less">钻石不足</string>
-    <string name="room_gift_coin_available">可用金币:[coin]%s</string>
-    <string name="room_gift_exchange_rate">兑换比例: [coin]1=[diamond]1000</string>
-    <string name="room_gift_exchange_never_remind_today">今日不再提醒</string>
+    <string name="room_gift_diamond_less">Insufficient Diamonds</string>
+    <string name="room_gift_coin_available">Available Coins: [coin]%s</string>
+    <string name="room_gift_exchange_rate">Exchange Rate: [coin]1=[diamond]1000</string>
+    <string name="room_gift_exchange_never_remind_today">Don\'t remind me again today</string>
     <string name="room_send_gift_message">%1$s Send %2$s</string>
-    <string name="room_send_gift_to_uids_empty">请选择要送给谁</string>
-    <string name="room_send_gift_gift_no_select">请选择要赠送的礼物</string>
-    <string name="room_send_gift_count_empty">至少总赠送一个礼物</string>
-    <string name="room_send_gift_balance_not_enough">钻石不足,是否去充值?</string>
+    <string name="room_send_gift_to_uids_empty">Please select who to send to</string>
+    <string name="room_send_gift_gift_no_select">Please select the gift to send</string>
+    <string name="room_send_gift_count_empty">At least one gift to send</string>
+    <string name="room_send_gift_balance_not_enough"> Insufficient diamonds, wish to top up?</string>
 </resources>

+ 0 - 255
pull_and_fill_translations.py

@@ -1,255 +0,0 @@
-import os
-import shutil
-import subprocess
-import xml.dom.minidom as minidom
-import xml.etree.ElementTree as ET
-from collections import OrderedDict
-import re
-import requests
-
-SUPPORTED_LANGUAGES = [
-    "zh", "en", "ar"
-]
-TOLGEE_PATH = "./tolgee_json"
-TOLGEE_API_URL = "http://47.236.31.243:8090/api"
-TOLGEE_API_KEY = "tgpak_hbpxgyltnryguy3lonyxiyrtgruta4rroryhiolooe3q"
-PROJECT_ID = "8"
-HEADERS = {
-    "X-Api-Key": TOLGEE_API_KEY,
-    "Content-Type": "application/json"
-}
-
-
-def fetch_all_cdata_keys():
-    dataList = [] #key是name,value是id
-    page = 0
-    page_size = 1000
-    while True:
-        url = f"{TOLGEE_API_URL}/v2/projects/{PROJECT_ID}/keys?page={page}&size={page_size}"
-        r = requests.get(url, headers=HEADERS)
-        if r.status_code != 200:
-            print(f"❌ 拉取失败: {r.status_code} -> {r.text}")
-            break
-
-        data = r.json()
-        # print(data)
-
-        dataList.extend(data['_embedded']['keys'])
-
-
-        if data['page']['totalPages'] == page +1 :  # 最后一页
-            break
-        page += 1
-    print(f"✅ 已拉取 {len(dataList)} 个 Tolgee keys")
-    # print(dataList)
-    # 只保留包含 CDATA 的 keys,'custom': {'_androidWrapWithCdata': True}
-    dataList = [item for item in dataList if
-                item['custom'] and '_androidWrapWithCdata' in item['custom'] and item['custom'][
-                    '_androidWrapWithCdata']]
-    # 提取name
-    dataList = [item['name'] for item in dataList if 'name' in item]
-    print(f"🔍 找到 {len(dataList)} 个包含 CDATA 的 keys")
-    print(dataList)
-    return dataList
-
-def run_tolgee_pull():
-    os.makedirs(TOLGEE_PATH, exist_ok=True)
-    cmd = [
-              "tolgee", "pull",
-              "--format", "ANDROID_XML",
-              "--path", TOLGEE_PATH,
-              "--languages"
-          ] + SUPPORTED_LANGUAGES + [
-              "--empty-dir",
-          ]
-    print(f"📥 拉取 Tolgee 翻译中...")
-    subprocess.run(cmd, check=True)
-    print(f"✅ Tolgee 拉取完成:{TOLGEE_PATH}")
-
-
-def find_en_strings_files():
-    en_files = []
-    for root, dirs, files in os.walk("."):
-        normalized_root = root.replace("\\", "/")
-        if "lite" in normalized_root or "lite" in files:
-            continue
-        if "/build/" in normalized_root or normalized_root.endswith("/build"):
-            continue
-        if "strings.xml" in files and "/res/values" in root.replace("\\", "/"):
-            if "values-" not in root:  # 只取英文
-                en_files.append(os.path.join(root, "strings.xml"))
-    return en_files
-
-
-def parse_strings_file(file_path):
-    try:
-        tree = ET.parse(file_path)
-        root = tree.getroot()
-        result = OrderedDict()
-        for e in root.findall("string"):
-            if 'name' in e.attrib:
-                result[e.attrib['name']] = e.text or ""
-        return result
-    except Exception as e:
-        print(f"❌ 解析失败: {file_path} -> {e}")
-        return OrderedDict()
-
-
-# 解析 Tolgee 拉取的翻译,并合并到现有的 strings.xml 中
-def merge_translations(lang, base_dict: dict, pulled_dict: dict, existing_dict: dict,
-                       translatable_false_keys):
-    merged = OrderedDict()
-
-    # 先添加原有 key,保持顺序
-    # 只有en才会有translatable_false_keys的数据
-    for key in existing_dict:
-        merged[key] = existing_dict[key]
-        # if lang == "en" and key in translatable_false_keys:
-        #     merged[key] = pulled_dict.get(key) or existing_dict[key] or base_dict.get(key) or ""
-        # else:
-        #     merged[key] = pulled_dict.get(key) or existing_dict[key] or ""
-
-
-    # 再补充新 key(存在于 base_dict,但不在原文件中)
-    for key in base_dict:
-        #如果 key 不在 pulled_dict 中,跳过
-        if key not in pulled_dict:
-            continue
-        if key in translatable_false_keys and lang != "en":
-            # 如果是非英文语言且在translatable_false_keys中,则不添加,并且移除掉
-            merged.pop(key, None)
-            continue
-        if pulled_dict.get(key) is not None:
-            merged[key] = pulled_dict.get(key)
-
-    return merged
-
-
-def find_translatable_false_keys():
-    result = []
-    for root, dirs, files in os.walk("."):
-        normalized_root = root.replace("\\", "/")
-        if normalized_root.endswith("/res/values") and "strings.xml" in files:
-            file_path = os.path.join(root, "strings.xml")
-            try:
-                tree = ET.parse(file_path)
-                root_elem = tree.getroot()
-                for elem in root_elem.findall("string"):
-                    if elem.attrib.get("translatable") == "false":
-                        result.append(elem.attrib["name"])
-            except Exception as e:
-                print(f"⚠️ 解析失败:{file_path} -> {e}")
-    print(f"🔍 找到 {len(result)} 个 translatable=false 的 key")
-    # print(result)
-    return result
-
-def write_strings_xml(file_path, data: dict,translatable_false_keys,cdata_keys):
-    if data is None or not data:
-        print(f"⚠️ 跳过写入:{file_path},没有数据")
-        return
-
-    os.makedirs(os.path.dirname(file_path), exist_ok=True)
-    cdata_map = {}
-
-    # 创建 <resources> 根节点
-    resources = ET.Element("resources")
-
-    # 遍历 key,构建 string 元素
-    for key, value in data.items():
-        attributes = {"name": key}
-        text = value
-
-        if key in translatable_false_keys:
-            attributes["translatable"] = "false"
-
-        if isinstance(value, dict):
-            text = value.get("value", "")
-            for attr in ["translatable", "formatted", "product"]:
-                if attr in value:
-                    attributes[attr] = value[attr]
-
-        string_elem = ET.SubElement(resources, "string", attrib=attributes)
-        if key in cdata_keys:
-            placeholder = f"__CDATA__{key}__"
-            string_elem.text = placeholder
-            cdata_map[key] = text
-        else:
-            string_elem.text = text
-
-    # 格式化 + 替换 CDATA
-    rough_string = ET.tostring(resources, encoding="utf-8")
-    pretty_xml = minidom.parseString(rough_string).toprettyxml(indent="   ")
-    pretty_xml = "\n".join([line for line in pretty_xml.split("\n") if line.strip()])
-
-    # 替换默认声明为标准的 XML 头部
-    if pretty_xml.startswith('<?xml version="1.0" ?>'):
-        pretty_xml = pretty_xml.replace(
-            '<?xml version="1.0" ?>',
-            '<?xml version="1.0" encoding="utf-8"?>',
-            1
-        )
-
-    for key in cdata_map:
-        placeholder = f"__CDATA__{key}__"
-        cdata_value = cdata_map[key]
-        pretty_xml = pretty_xml.replace(placeholder, f"<![CDATA[{cdata_value}]]>")
-
-    with open(file_path, "w", encoding="utf-8") as f:
-        f.write(pretty_xml + "\n")
-
-
-def get_module_base_path(en_file_path):
-    return os.path.dirname(os.path.dirname(en_file_path))  # 到 src/main/res
-
-
-
-def main():
-    run_tolgee_pull()
-    en_files = find_en_strings_files()
-    translatable_false_keys = find_translatable_false_keys()
-    cdata_keys = fetch_all_cdata_keys()
-
-    for en_path in en_files:
-        print(en_path)
-        en_strings = parse_strings_file(en_path)
-        if not en_strings:
-            continue
-
-        module_res_path = get_module_base_path(en_path)
-        print(f"处理模块:{module_res_path}")
-        for lang in SUPPORTED_LANGUAGES:
-            if lang == "en":
-                lang_dir = "values"
-            elif lang == "id":
-                lang_dir = "values-in"
-            else:
-                lang_dir = f"values-{lang}"
-            pulled_path = os.path.join(TOLGEE_PATH, f"values-{lang}", "strings.xml")
-            out_path = os.path.join(module_res_path, lang_dir, "strings.xml")
-            print(f"处理语言:{lang} → {out_path}, 源:{pulled_path}")
-
-            pulled_translations = parse_strings_file(pulled_path)
-
-            if not pulled_translations:
-                print(f"⚠️ 跳过:{pulled_path},没有可用翻译")
-                continue
-            # print(f"已拉取翻译:{pulled_translations}")
-
-            existing_translations = parse_strings_file(out_path)
-            # print(f"现有翻译:{existing_translations}")
-            merged = merge_translations(
-                lang=lang,
-                base_dict=en_strings,
-                pulled_dict=pulled_translations,
-                existing_dict=existing_translations,
-                translatable_false_keys=translatable_false_keys
-            )
-            write_strings_xml(out_path, merged,translatable_false_keys,cdata_keys)
-    # ✅ 删除中间产物
-    if os.path.exists(TOLGEE_PATH):
-        shutil.rmtree(TOLGEE_PATH)
-        print(f"🧹 已删除中间目录:{TOLGEE_PATH}")
-
-
-if __name__ == "__main__":
-    main()

+ 0 - 207
push_translations.py

@@ -1,207 +0,0 @@
-import os
-import json
-import re
-import subprocess
-import xml.etree.ElementTree as ET
-import requests
-
-# 可配置支持的语言
-SUPPORTED_LANGUAGES = [
-    "zh", "en", "ar"
-]
-
-TOLGEE_API_URL = "http://47.236.31.243:8090/api"
-TOLGEE_API_KEY = "tgpak_hbpxgyltnryguy3lonyxiyrtgruta4rroryhiolooe3q"
-PROJECT_ID = "8"
-
-def find_strings_files(root_dir="."):
-    result = []
-    for root, dirs, files in os.walk(root_dir):
-        normalized_root = root.replace("\\", "/")
-        if "lite" in normalized_root or "lite" in files:
-            continue
-        if "/build/" in normalized_root or normalized_root.endswith("/build"):
-            continue
-
-        if "strings.xml" in files and "/src/" in normalized_root:
-            full_path = os.path.join(root, "strings.xml")
-            rel_path = os.path.relpath(full_path, root_dir).replace("\\", "/")
-            result.append({
-                "path": rel_path
-            })
-    return result
-
-def extract_language_from_path(path):
-    """
-    从 Android 的 values[-xx[-rYY]] 路径中提取语言代码。
-    - 默认返回 'en'
-    - 特殊处理:'in' → 'id'
-    """
-    match = re.search(r'values(?:-([a-zA-Z-]+))?/', path)
-    if match:
-        lang = match.group(1)
-        if not lang:
-            return "en"
-        lang = lang.replace("-r", "-")
-        if lang == "in":
-            return "id"
-        return lang
-    return "en"
-
-def generate_tolgee_config():
-    files = find_strings_files(".")
-
-    push_files = []
-
-    for f in files:
-        lang = extract_language_from_path(f["path"])
-        if lang in SUPPORTED_LANGUAGES:
-            push_files.append({
-                "path": f["path"],
-                "language": lang
-            })
-
-    config = {
-        "apiUrl": TOLGEE_API_URL,
-        "apiKey": TOLGEE_API_KEY,
-        "projectId": PROJECT_ID,
-        "format": "ANDROID_XML",
-        "convertPlaceholdersTo": "icu",
-        "structureDelimiter": ".",
-        "push": {
-            "files": push_files
-        }
-    }
-
-    with open(".tolgeerc", "w", encoding="utf-8") as f:
-        json.dump(config, f, indent=2)
-
-    print(f"✅ Tolgee 配置已生成,共 {len(push_files)} 个语言文件")
-
-def run_tolgee_push():
-    print("🚀 正在执行 tolgee push ...")
-    try:
-        subprocess.run(["tolgee", "push", "--force-mode", "KEEP","--verbose"], check=True)
-        print("✅ 推送成功")
-    except subprocess.CalledProcessError as e:
-        print("❌ 推送失败", e)
-
-
-HEADERS = {
-    "X-Api-Key": TOLGEE_API_KEY,
-    "Content-Type": "application/json"
-}
-
-def fetch_all_keys():
-    dataList = [] #key是name,value是id
-    page = 0
-    page_size = 1000
-    while True:
-        url = f"{TOLGEE_API_URL}/v2/projects/{PROJECT_ID}/keys?page={page}&size={page_size}"
-        r = requests.get(url, headers=HEADERS)
-        if r.status_code != 200:
-            print(f"❌ 拉取失败: {r.status_code} -> {r.text}")
-            break
-
-        data = r.json()
-        # print(data)
-
-        dataList.extend(data['_embedded']['keys'])
-
-
-        if data['page']['totalPages'] == page +1 :  # 最后一页
-            break
-        page += 1
-    print(f"✅ 已拉取 {len(dataList)} 个 Tolgee keys")
-    # print(dataList)
-    return dataList
-
-def find_translatable_false_keys():
-    result = []
-    for root, dirs, files in os.walk("."):
-        normalized_root = root.replace("\\", "/")
-        if normalized_root.endswith("/res/values") and "strings.xml" in files:
-            file_path = os.path.join(root, "strings.xml")
-            try:
-                tree = ET.parse(file_path)
-                root_elem = tree.getroot()
-                for elem in root_elem.findall("string"):
-                    if elem.attrib.get("translatable") == "false":
-                        result.append(elem.attrib["name"])
-            except Exception as e:
-                print(f"⚠️ 解析失败:{file_path} -> {e}")
-    print(f"🔍 找到 {len(result)} 个 translatable=false 的 key")
-    # print(result)
-    return result
-
-def get_key_id_by_name(key_name):
-    url = f"{TOLGEE_API_URL}/v2/projects/{PROJECT_ID}/keys?search={key_name}"
-    try:
-        resp = requests.get(url, headers=HEADERS)
-        data = resp.json()
-        print(f"🔍 查询 key ID:{key_name} -> {data}")
-        if isinstance(data, list) and data:
-            return data[0]["id"]
-    except Exception as e:
-        print(f"❌ 查询 key ID 失败:{key_name} -> {e}")
-    return None
-
-def fetch_language_ids():
-    print("📥 拉取 Tolgee 语言信息...")
-    url = f"{TOLGEE_API_URL}/v2/projects/{PROJECT_ID}/languages"
-    r = requests.get(url, headers=HEADERS)
-    if not r.ok:
-        print(f"❌ 获取 languages 失败:{r.status_code} -> {r.text}")
-        return []
-
-    languages = r.json()['_embedded']['languages']
-    print(languages)
-    # result = {}
-    # for lang in languages:
-    #     result[lang["tag"]] = lang["id"]
-    # print(f"✅ 拉取语言: {result}")
-    return {lang["tag"]: lang["id"] for lang in languages}
-
-def mark_keys_as_disabled(keys: list):
-    print(f"🔧 准备禁用 {len(keys)} 个不可翻译的 key")
-    all_keys = fetch_all_keys()
-    all_languages = fetch_language_ids()
-    disabled_lang_ids = [
-        lang_id for tag, lang_id in all_languages.items() if tag != 'en'
-    ]
-    print(f"🔍 禁用语言 ID: {disabled_lang_ids}")
-
-    key_map = {item["name"]: item["id"] for item in all_keys}
-    for key in keys:
-        key_id = key_map.get(key)
-        if not key_id:
-            print(f"⚠️ 跳过:{key},未找到 keyId")
-            continue
-
-        url = f"{TOLGEE_API_URL}/v2/projects/{PROJECT_ID}/keys/{key_id}/disabled-languages"
-
-        payload = json.dumps({
-            "languageIds": disabled_lang_ids
-        })
-
-        try:
-            resp =  requests.request("PUT", url, headers=HEADERS, data=payload)
-            if resp.status_code == 200:
-                print(f"✅ 已禁用:{key}")
-            else:
-                print(f"❌ 禁用失败:{key} -> {resp.status_code}: {resp.text}")
-        except Exception as e:
-            print(f"❌ 异常:{key} -> {e}")
-
-
-
-def main():
-    generate_tolgee_config()
-    run_tolgee_push()
-    # 处理 translatable=false 的 key
-    false_keys = find_translatable_false_keys()
-    if false_keys:
-        mark_keys_as_disabled(false_keys)
-
-if __name__ == "__main__":
-    main()