## 多语言使用说明

### 文件

```
src
├── multilanguage.h
└── multilanguage.c
```

### 定义
```c
// 翻译文件路径
#define MULTILANGUAGE_MO_PATH "/app/global/language" 
// 翻译文件名
#define MULTILANGUAGE_MO_FILE "language"

// 翻译文件路径由库函数依照系统语言自动合并得出, 路径为 
// `/app/global/language/+/LC_MESSAGES/language.mo`
// 其中+为语言, 中文为 zh_CN
// 则英译中语言文件路径为  `/app/global/language/zh_CN/LC_MESSAGES/language.mo`

// 默认语言
#define MULTILANGUAGE_DEFAULT "zh_CN"

// 翻译宏 
#define _(string) gettext(string) 

// 程序中需要翻译的字符串需要使用 gettext(string) 函数进行翻译，简化为_(string)
// 如果该字符串翻译文件中没有，则返回原字符串，内存空间由gettext(string) 函数管理, 不需要释放
```

### 函数说明

```c
// 功能：初始化多语言
// 参数：无
// 返回值：无
// 注意: 该函数在程序启动时优先调用
void init_multilanguage(void); 

// 功能：设置系统语言
// 参数：lang: 语言, 如 zh_CN
// 返回值：0: 成功, 其他: 失败
int set_sys_language(char* lang);

// 功能：翻译全集变量中的字符串
// 参数：无
// 返回值：无
void global_init_by_sys_language(void);
// 翻译的全局变量有:
    extern ems_base_variant_t ems_base_variant[];
    extern ems_base_variant_t cab_variant[];
    extern cabinet_info_tab_t cabinet_info_tab[];
    extern self_diagnosis_it factory_it[];
    extern self_diagnosis_it charge_it[];
    extern ems_base_variant_t lc_base_variant[];

```

### 使用说明

1. 在程序启动时调用 `init_multilanguage()` 函数
2. 在程序中需要翻译的字符串使用 `_(string)` 宏进行翻译
3. 在程序中需要翻译的全局变量使用 `global_init_by_sys_language()` 函数进行翻译, 该函数在 `init_multilanguage()` 调用
4. 在UA中设置系统语言时调用 `set_sys_language(lang)` 函数
##### !
5. 需要展示的webUI/UA上的字符串、包括代码中的点位、交互展示的字符串等等均需要翻译
6. 需要翻译的字符串，使用 `_(string)` 宏
7. 无法使用 `_(string)` 宏，需要手动添加至 `po` 文件中，如全局变量中的英文字段
8. `po` 文件位于files文件夹中
9. 使用make po 指令, 将代码中使用 `_(string)` 宏的地方会自动更新至 `po` 文件
10. `po` 文件中新增的翻译需要手动翻译
11. 编译时, 会自动将po文件编译为 `mo` 文件, mo文件为二进制文件 命令位置 src/install.sh/update_mo()
