当前位置: 首页 > news >正文

beego的模块篇 - I18n国际化

1. i18n 安装导入

安装该模块:

go get github.com/beego/i18n

导入引用包:

import ("github.com/beego/i18n"
)

 conf 目录下就有 locale_en-US.ini 和 locale_zh-CN.ini 两个本地化文件。

本地化文件的文件名和后缀是随意的,不过建议采用与 beego 官网相同的风格来对它们命名。

2. 最简实例

2.1 i18n多语言配置

conf/locale_en-US.ini

hi = hello
bye = goodbye

conf/locale_zh-CN.ini

hi = 您好
bye = 再见

conf/app.conf:

## 本地化配置
[lang]
types = en-US|zh-CN

2.2 controller多语言加载

简单配置一个测试Controller,正式项目肯定会抽出一个BaseController,这里简单测试就MainController了

对于每个请求,beego 都会采用单独的 goroutine 来处理,因此可以对每个控制器匿名嵌入一个 i18n.Locale 结构用于处理当前请求的本地化响应。

接受请求之后,在 baseController 的 Prepare 方法内进行语言处理,这样便可应用后所有其它控制器内而无需重复编写代码。

import ("fmt"beego "github.com/beego/beego/v2/server/web""github.com/beego/i18n""strings"
)type MainController struct {beego.Controlleri18n.Locale
}// 初始化
func init() {// 自定义错误处理器beego.ErrorController(&ErrorController{})// 本地化设置setLocales()
}func (b *MainController) Prepare() {setLang(b)
}// 变量
// 指定、Cookies 和浏览器 Accept-Language 来获取用户语言选项,然后设置控制器级别的语言。
var (lang           = "lang"types          = "types"acceptLanguage = "Accept-Language"
)// 设置本地化
func setLocales() {SMH := "::"SX := "|"langTypes, _ := beego.AppConfig.String(lang + SMH + types)langTypeArr := strings.Split(langTypes, SX)for _, lang := range langTypeArr {if err := i18n.SetMessage(lang, "conf/"+"locale_"+lang+".ini"); err != nil {fmt.Println("本地化文件设置失败")return}}
}// 设置本地化语言
func setLang(b *MainController) {// 从url参数获取lang,url中没有,从请求头获取lang := b.GetString(lang)if len(lang) == 0 {al := b.Ctx.Request.Header.Get(acceptLanguage)if len(al) > 4 {lang = al[:5]}}// 检查lang是否在i18n中存在if !i18n.IsExist(lang) {lang = ""}// 默认为中文if len(lang) == 0 {lang = "zh-CN"}b.Lang = lang
}
func (c *MainController) Get() {fmt.Println(i18n.Tr(c.Lang, "hi"))c.Data["Website"] = "beego.vip " + i18n.Tr(c.Lang, "hi")c.Data["Email"] = "astaxie@gmail.com"c.TplName = "index.tpl"
}

ErrorController

// 自定义错误 API
type ErrorController struct {web.Controller
}func (e *ErrorController) Error400() {e.Data["json"] = "{}"e.ServeJSON()
}func (e *ErrorController) Error401() {e.Data["json"] = "{}"e.ServeJSON()
}func (e *ErrorController) Error404() {e.Data["json"] = "{}"e.ServeJSON()
}func (e *ErrorController) Error500() {e.Data["json"] = "{}"e.ServeJSON()
}

2.3 访问网页

​​​​​​​

3. 分区功能

针对不同页面,同一个键的名称很可能会对应不同的含义。因此,i18n 模块还利用 INI 格式配置文件的节特性来实现分区功能。

例如,同样是键名 about,在首页需要显示为 关于,而在关于页面需要显示为 关于我们,则可以通过分区功能来实现。

本地化文件中的内容:

about = About[about]
about = About Us

相关文章:

  • MFC 序列化机制
  • el-table样式错乱解决方案
  • 鸿蒙开发系列教程(五)--ArkTS语言:组件开发
  • Java SE入门及基础(23)
  • 力扣hot100 最长有效括号 动态规划
  • Blendshape 表情控件
  • RenderDoc 增加 DXBC to HLSL 的 shader viewer
  • docker 的 Dockerfile 简单使用
  • 分布式ID(2):雪花算法生成ID
  • GL Logger和CANFDLog-OTL-128两款记录仪都是如何实现高效的报文录制的?
  • 跟着cherno手搓游戏引擎【6】ImGui和ImGui事件
  • MyBatis 使用报错:org.xml.sax.SAXParseException 元素内容必须由格式正确的字符数据或标记组成
  • OpenHarmony 应用开发入门 (一、环境搭建及第一个Hello World)
  • 数据结构之二叉搜索树
  • 尚硅谷Nginx高级配置笔记
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 2017-09-12 前端日报
  • Docker下部署自己的LNMP工作环境
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Java比较器对数组,集合排序
  • Laravel Mix运行时关于es2015报错解决方案
  • Laravel 中的一个后期静态绑定
  • Phpstorm怎样批量删除空行?
  • SwizzleMethod 黑魔法
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 基于组件的设计工作流与界面抽象
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 微信支付JSAPI,实测!终极方案
  • 项目管理碎碎念系列之一:干系人管理
  • 小试R空间处理新库sf
  • 携程小程序初体验
  • 新版博客前端前瞻
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #Z0458. 树的中心2
  • #数学建模# 线性规划问题的Matlab求解
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (11)MATLAB PCA+SVM 人脸识别
  • (14)Hive调优——合并小文件
  • (zhuan) 一些RL的文献(及笔记)
  • (笔试题)合法字符串
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (四) Graphivz 颜色选择
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (一)UDP基本编程步骤
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET Core 成都线下面基会拉开序幕
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法