跳转至

SOUI 国际化

本章节介绍 SOUI 框架的国际化功能。您将了解如何在应用程序中实现多语言支持,以及如何使用 SOUI 的翻译系统。

本章内容

  • 国际化概述:了解 SOUI 国际化的基本概念和重要性
  • 多语言支持:详细介绍多语言翻译系统的实现和使用

重要概念

  1. 翻译管理器(TranslatorMgr)
  2. 翻译器(Translator)
  3. 翻译资源文件
  4. 上下文翻译
  5. 动态语言切换

核心功能

  • XML布局文本翻译
  • 代码中的文本翻译
  • 多语言资源管理
  • 动态语言切换支持

国际化简介

国际化(Internationalization,简称i18n)是指设计和开发软件时,使其能够适应不同语言和地区的过程。SOUI框架提供了完整的国际化支持,使应用程序能够轻松实现多语言界面。

国际化的重要性

  1. 扩大用户群
  2. 支持多个地区用户
  3. 提升用户体验
  4. 增加市场竞争力

  5. 维护便利性

  6. 集中管理文本资源
  7. 减少硬编码文本
  8. 便于后期更新

  9. 开发效率

  10. 统一的翻译机制
  11. 简化本地化流程
  12. 减少重复工作

SOUI 国际化特性

1. 核心功能

  • 完整的翻译系统
  • 上下文支持
  • 动态语言切换
  • XML资源本地化
  • 代码文本翻译

2. 技术优势

  • 低耦合设计
  • 高性能实现
  • 灵活的配置
  • 易于扩展

3. 使用场景

  • 多语言应用程序
  • 跨地区部署
  • 动态语言切换
  • 本地化需求

实现方式

1. 基本架构

SOUI国际化系统
├── 翻译管理器 (TranslatorMgr)
├── 翻译器 (Translator)
└── 翻译资源
    ├── XML文件
    └── 其他资源

2. 关键组件

  1. 翻译管理器
  2. 管理多个翻译器
  3. 处理语言切换
  4. 资源加载管理

  5. 翻译器

  6. 文本翻译
  7. 上下文处理
  8. 格式化支持

  9. 资源文件

  10. XML格式
  11. 分类管理
  12. 易于维护

多语言支持概述

SOUI框架提供了一套完整的多语言翻译机制,类似于Qt的翻译系统。本文将详细介绍如何在SOUI中实现应用程序的国际化。

特点

  • 布局XML无需修改
  • 程序代码无需调整
  • 只需提供翻译文件
  • 支持上下文翻译

翻译文件

1. 文件结构

<?xml version="1.0" encoding="utf-8"?>
<language name="ch" guid="{0DAEDE3C-6B94-4a81-9A55-C304FDD69D98}">
    <context>
        <!-- 无上下文的翻译 -->
    </context>
    <context name="editmenu">
        <message>
            <source>copy</source>
            <translation>复制</translation>
        </message>
        <!-- 更多翻译项 -->
    </context>
</language>

2. 文件组成

  • language节点:根节点
  • name:语言标识
  • guid:唯一标识符

  • context节点:翻译上下文

  • name:上下文名称(可选)

  • message节点:翻译项

  • source:原文
  • translation:译文

实现多语言支持

1. 初始化翻译系统

// 创建翻译管理器
CAutoRefPtr<ITranslatorMgr> transMgr;
transLoader.CreateInstance("translator.dll", (IObjRef**)&transMgr);

if(transMgr) {
    // 设置翻译管理器
    theApp->SetTranslator(transMgr);

    // 加载翻译文件
    pugi::xml_document xmlLang;
    if(theApp->LoadXmlDocment(xmlLang, _T("lang_cn"), _T("translator"))) {
        // 创建翻译器
        CAutoRefPtr<ITranslator> langCN;
        transMgr->CreateTranslator(&langCN);

        // 加载翻译数据
        langCN->Load(&xmlLang.child(L"language"), 1); // 1=LD_XML

        // 安装翻译器
        transMgr->InstallTranslator(langCN);
    }
}

2. XML中使用翻译

菜单示例

<editmenu trCtx="editmenu" iconSkin="_skin.sys.icons">
    <item id="1">cut</item>
    <item id="2">copy</item>
    <item id="3">paste</item>
</editmenu>

布局示例

<window trCtx="mainwindow">
    <text>Hello</text>
    <button tip="close">Close</button>
</window>

3. 代码中使用翻译

// 使用TR宏
SStringT strText = TR(L"Hello World", L"mainwindow");

// 直接调用翻译函数
SStringT strText = SApplication::getSingleton().GetTranslator()
    ->tr(L"Hello World", L"mainwindow");

最佳实践

1. 翻译文件组织

res/
└── translator/
    ├── lang_en.xml
    ├── lang_zh.xml
    └── lang_ja.xml

2. 翻译上下文规划

<!-- 按功能模块组织上下文 -->
<language>
    <!-- 通用翻译 -->
    <context name="common">
        <!-- 通用文本 -->
    </context>

    <!-- 编辑器相关 -->
    <context name="editor">
        <!-- 编辑器文本 -->
    </context>

    <!-- 特定对话框 -->
    <context name="dialog_settings">
        <!-- 设置对话框文本 -->
    </context>
</language>

3. 动态翻译实现

class CMultiLangUI {
public:
    void UpdateLanguage(const SStringW& langFile) {
        // 加载新的语言文件
        CAutoRefPtr<ITranslator> newLang;
        transMgr->CreateTranslator(&newLang);

        // 加载翻译数据
        pugi::xml_document xmlLang;
        if(LoadLanguageFile(langFile, xmlLang)) {
            newLang->Load(&xmlLang.child(L"language"), 1);

            // 更新翻译器
            transMgr->UninstallTranslator(oldLang);
            transMgr->InstallTranslator(newLang);

            // 刷新UI
            UpdateAllWindows();
        }
    }

private:
    void UpdateAllWindows() {
        // 通知所有窗口更新文本
        // 实现窗口文本刷新逻辑
    }
};

高级用法

1. 条件翻译

// 根据条件选择不同的翻译
SStringT GetMessage(int code) {
    switch(code) {
        case 0:
            return TR(L"Success", L"common");
        case 1:
            return TR(L"Error", L"common");
        default:
            return TR(L"Unknown", L"common");
    }
}

2. 格式化翻译

// 带参数的翻译
SStringT FormatMessage(int count) {
    SStringT format = TR(L"Found %d items", L"common");
    SStringT result;
    result.Format(format, count);
    return result;
}

3. 动态切换语言

void SwitchLanguage(const SStringW& langId) {
    // 保存当前语言设置
    SaveCurrentLanguage();

    // 加载新语言
    LoadLanguage(langId);

    // 更新UI
    UpdateUILanguage();
}

调试技巧

1. 翻译检查

void VerifyTranslation() {
    auto trans = SApplication::getSingleton().GetTranslator();

    // 检查翻译是否存在
    SStringT text = trans->tr(L"test", L"common");
    SASSERT(text != L"test"); // 如果返回原文,说明没有翻译
}

2. 上下文验证

void ValidateContext() {
    // 验证上下文是否正确
    SWindow *pWnd = FindChildByName(L"test");
    SStringT ctx = pWnd->GetTrCtx();
    SASSERT(!ctx.IsEmpty()); // 确保设置了翻译上下文
}

开发流程

  1. 规划
  2. 确定支持语言
  3. 设计文件结构
  4. 规划翻译流程

  5. 实现

  6. 集成翻译系统
  7. 提取待翻译文本
  8. 创建翻译文件

  9. 测试

  10. 功能验证
  11. 性能测试
  12. 用户体验评估

  13. 维护

  14. 更新翻译
  15. 添加新语言
  16. 优化性能

注意事项

  1. 文件编码
  2. 使用UTF-8编码
  3. 注意BOM标记

  4. 翻译管理

  5. 及时更新翻译文件
  6. 保持翻译一致性
  7. 注意文本长度变化

  8. 性能考虑

  9. 合理使用上下文
  10. 避免频繁切换语言
  11. 缓存常用翻译

设计原则

  • 分离关注点
  • 统一管理
  • 灵活配置
  • 易于维护

开发建议

  • 使用统一的翻译API
  • 避免硬编码文本
  • 合理组织翻译文件
  • 注意性能优化

测试要点

  • 完整性检查
  • 正确性验证
  • 性能评估
  • 用户体验测试