beego的模块篇 - I18n国际化

news2024/9/24 17:41:19

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.Controller
	i18n.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1397501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++_Lambda表达式的完整介绍

目录 1. 什么是Lambda表达式 1.1 四种表达式的含义 1.2 lambda表达式各个成员的解释 2. 捕获列表 3. 编译器如何看待Lambda表达式 参考文章 参考: C Lambda表达式的完整介绍 - 知乎 c在c11标准中引入了lambda表达式,一般用于定义匿名函数,使得代码…

超过GPT3.5?Mixtral 8*7B 模型结构分析

Datawhale干货 作者:宋志学,Datawhale成员 前言 2023年12月11日,Mistral AI团队发布了一款高质量的稀疏专家混合模型Mixtral 8x7B。 Mistral AI继续致力于向开发者社区提供最优秀的开放模型。在人工智能领域向前发展,需要采取超越…

关于SpringBoot项目整合Log4j2实现自定义日志打印失效原因

主要的原因是因为,SpringBoot的logback包的存在,会导致Spring Boot项目优先实现logback的日志设置,所以导致我们用Log4j2实现自定义日志失效。 先找l哪个包引用了logback包 进入之后查询logback 然后双击包 发现是spring-boot-starter-loggin…

UVa1318/LA2797 Monster Trap

题目链接 本题是2003年ICPC亚洲区域赛会津(日本)赛区的H题 题意 给出一些线段障碍,你的任务是判断怪物能否逃到无穷远处。如下图所示,左图无法逃出,右图的可以逃出。 输入包含多组数据。每组数据第一行为整数n(1≤n≤100&#xf…

C++编写、生成、调用so库详解(一)

开发中经常会用到so库,大多是调用第三方的so库,偶尔也需要自己封装一个so库给别人调用,这边就记录一下开发so库的一个过程. 首先我们这边是在Android Studio中开发的,所以仅描述在Android环境下开发过程,当然也可以用其他工具开发. 目录 1.第一步新建项目,配置需要的工具 2…

插件分享 Chrome浏览器实现外语翻译自由

【有道灵动翻译】使用有道翻译大模型,沉浸式网页翻译的首选工具! 实时对照翻译:让任何网页变成对照。输入框即时翻译:输入中文轻松变英文。 🔥功能亮点🔥: 实时对照翻译:使用有道翻译大模型,无…

了解Vue中日历插件Fullcalendar

实现效果如下图: 月视图 周视图 日视图 官方文档地址:Vue Component - Docs | FullCalendar 1、安装与FullCalendar相关的依赖项 npm install --save fullcalendar/vue fullcalendar/core fullcalendar/daygrid fullcalendar/timegrid fullcalend…

MySQL复合查询 内外连接

目录 前言: 多表查询: 显示部门号为10的部门名,员工名和工资 : 显示各个员工的姓名,工资,及工资级别: 自连接 显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号) 子查询 单行子查询&#…

IPv6自动隧道---6to4中继

6to4中继 普通IPv6网络需要与6to4网络通过IPv4网络互通,这可以通过6to4中继路由器方式实现。所谓6to4中继,就是通过6to4隧道转发的IPv6报文的目的地址不是6to4地址,但转发的下一跳是6to4地址,该下一跳为路由器我们称之为6to4中继。隧道的IPv4目的地址依然从下一跳的6to4地…

电池容量常见测试方法分享 -纳米软件

电池容量是衡量电池性能的重要指标之一,它是指电池在一定条件下放出的电量,可以用于帮助评估电池的性能和寿命。那么如何快速测试电池容量呢? 一、用万用表测试 用万用表测试电池容量,需要将万用表调整到电容模式,然后连接电池到…

鸿蒙HarmonyOS实战-ArkTS语言(基本语法)

🚀一、ArkTS语言基本语法 🔎1.简介 HarmonyOS的ArkTS语言是一种基于TypeScript开发的语言,它专为HarmonyOS系统开发而设计。ArkTS语言结合了JavaScript的灵活性和TypeScript的严谨性,使得开发者能够快速、高效地开发出高质量的Har…

mac PyCharm 上传文件到远程服务器+远程服务器下载到本地

1 部署配置 选择SFTP name:test6 输入ssh账号和密码。保存密码和30s心跳。 2 目录映射 Local path(本地mac机器):/Users/clevercode/PycharmProjects/test6 Root path(远程服务机器):/home/…

Redis持久化方案RDB和AOF

Redis两种持久化方案 RDB持久化AOF持久化 RDB持久化 RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文…

【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!)

【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器 注:本学习笔记基于stm32f4系列 使用的开发板为正点原子stmf407ZGT6探索者开发板 GPIO引脚使用时,可输入或输出数字信号 例如: 检测按键输入信号(Read_Pin)输出信号(W…

PHP面试小结(20240108)

PHP 部分 1. php的包管理工具是如何实现自动加载的 换句话问:composer 实现原理是什么?spl_autoload_register() 首先,Composer 是 PHP 的一个包管理和包依赖管理的工具 , 打开安装之后生成的 "vendor" 文件, 里面有个…

Spring Boot 的约定优于配置,你的理解是什么?

对于 Spring Boot 约定优于配置 这个问题,看看高手是如何回答的? 一、问题解析 我从 4 个点方面来回答。 1. 首先, 约定优于配置是一种软件设计的范式,它的核心思想是减少软件开发人员对于配置项的维护,从而让开发人…

Windows如何给已经启动的Docker容器添加或者修改端口映射(通过修改配置文件实现)

需求:已经启动的Docker容器添加或者修改端口映射 找到配置文件: \wsl.localhost\docker-desktop-data*data*\docker\containers[hash_of_the_container] 有些版本在: \wsl$\docker-desktop-data*version-pack-data*\community\docker\contai…

Linux编辑器---vim

目录 1、vim的基本概念 2正常/普通/命令模式(Normal mode) 2、1命令模式下一些命令(不用进入插入模式) 3插入模式(Insert mode) 4末行/底行模式(last line mode) 4、1底行模式下的一些命令 5、普通用户无法进行sudo提权的解决方案 6、vim配置问题 6、1配…

计算机找不到msvcr100.dll无法继续执行的5种解决方法,实测有效

“msvcr100.dll文件丢失这一问题,时常给计算机用户带来诸多困扰与不便。作为Microsoft Visual C运行库中的一个关键动态链接库文件,msvcr100.dll在系统和应用程序的正常运行中扮演着不可或缺的角色。一旦该文件发生丢失或损坏,可能会引发一系…

基于easyexcel实现导出excel,包括导出图片以及导出下拉框

基于easyexcel实现导出excel&#xff0c;包括导出图片以及导出下拉框 1.最基本的导出excel 1.引入maven <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version> </dependen…