golang字符串国际化

xiaoxiaogo · 2021-03-15 10:48:34 · 877 次点击 · 预计阅读时间 2 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2021-03-15 10:48:34 的文章,其中的信息可能已经有所发展或是发生改变。

gostrings

这是一个go字符串国际化库,根据xml资源文件自动生成go文件,便于字符串统一管理。

背景

  • 代码中对字符串硬编码不方便管理。
  • 有多语言的需求。

功能特点

  • 字符串资源统一放在strings文件夹中,便于管理。
  • xml配置字符串,便于复用、管理、多语言对比。
  • 编译前用户调用命令,自动生成go文件,运行时效率更好

安装

执行go get github.com/xingliuhua/gostrings

使用

  1. 在项目根目录创建strings文件夹。
  2. 在strings文件夹中创建.xml文件(必须是sting[语言].xml格式,语言简称不限制);比如string.xml、string-en.xml、string-en-us.xml、string-zh.xml、string-unknown.xml等。
  3. .xml文件中可以放普通字符串和字符串数组。具体格式可以参考: string.xml
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
     <string name="confirm">confirm</string>
     <string name="cancel">cancel</string>
     <string_array name="city">
         <item>beijing</item>
         <item>new York</item>
         <item>Hong Kong</item>
     </string_array>
    </resources>
    
    string-zh.xml
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
     <string name="confirm">确定</string>
     <string name="cancel">取消</string>
     <string_array name="city">
         <item>北京</item>
         <item>纽约</item>
         <item>香港</item>
     </string_array>
    </resources>
    
  4. 切换到项目根目录下执行"gostrings"命令(记得把gopath/bin加入到path环境变量中),会自动生成r文件夹和里面的go文件,不要动里面的文件。
  5. 代码中查询
     str, err := r.GetString("", r.Cancel) // 获取string.xml下的cancel对应的字符串
     str, err := r.GetString("unknown", r.Cancel) // 获取string-unknown.xml下的cancel对应的字符串
     str, err := r.GetString("zh", r.Cancel) // 获取string-zh.xml下的cancel对应的字符串
     strArray, err := r.GetStringArray("en-us", r.City) // 获取string-en-us.xml下的city对应的字符串切片
    
    在实际的开发中,可以根据http参数或Accept-Language头字段选择语言。

最后附上github地址:https://github.com/xingliuhua/gostrings


有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

877 次点击  ∙  1 赞  
加入收藏 微博
5 回复  |  直到 2021-04-20 14:30:04
liangmanlin
liangmanlin · #1 · 4年之前

我认为,服务器应该从一开始的设计里面就不能包含文字,所有的文字应该由前端读取配置显示。后端只负责填入文字的ID

jarlyyn
jarlyyn · #2 · 4年之前

……

为啥需要生成go文件……

这种不是应该直接用po文件,或者维护一个文件夹下的json/xml/toml文件吗……

xiaoxiaogo
xiaoxiaogo · #3 · 4年之前

@jarlyyn 是的,这里也是使用xml文件,不过xml文件变化后应该重新生成go文件

xiaoxiaogo
xiaoxiaogo · #4 · 4年之前

@liangmanlin 这个想法也不错

jarlyyn
jarlyyn · #5 · 4年之前
xiaoxiaogoxiaoxiaogo #3 回复

@jarlyyn 是的,这里也是使用xml文件,不过xml文件变化后应该重新生成go文件

通用的做法是不需要生成源代码重新编译的……

为啥要重新编译呢?

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传