##Messages

`Messages`信息是对内容提供翻译的外部文本片段。revel提供了组织每一种语言文本片段的message文件、自动区域查找、基于cookie覆盖的消息嵌套和参数。

术语表:

Locale: 语言和区域的组合,表示一个用户首选语言, 例如 en-US
Language: 一个区域的语言部分, 例如 en. 预期为 ISO 639-1 编码
Region: 地区, 例如. US. 地区预期为 ISO 3166-1 alpha-2 编码

##示例程序

revel处理message文件和国际化和其他的web框架差不多,在`revel/samples/i18n`示例中可以了解详尽的使用方法。

##Message文件

`Messages`被定义在message文件,这些文件的message文本将被用于渲染模板(或程序中其他所期望的地方)。

创建一个新的meesage文件,需要记住一下几点:

1、所有message文件应当存储在程序根目录下的`meesages`目录中

2、文件扩展名必须是当前语言的 ISO 639-1 编码

3、message文件应当是`UTF-8`编码. 虽然这不是强制要求,但这是最佳实践

4、没一个message文件实际上是`goconfig`格式的文件,它支持`goconfig`的所有功能

##组织Message文件

Message文件对名称没有任何限制,只要具有有效的扩展名。每一种语言也没有限定Message文件的数量。在程序启动时,revel会解析`messages`目录中所有的文件,并按它们的语言分别合并到一起。这意味着可以按自己想要的方式来组织message文件。

例如,按传统的方式每一种语言定义单独的message文件:

/app
/messages
messages.en
messages.fr
...

或者另一种方法,同一种语言按类型创建多个不同的message文件:

/app
/messages
labels.en
warnings.en
labels.fr
warnings.fr
...

注意,在同一语言中定义相同键的多个message,这样虽然在技术上是可行的,但会带来不可预知的行为。在同一种语言使用多个message文件时,注意保持键的唯一,免得被后面同名key的值覆盖。

##Message键值对

message文件本质上是一个`goconfig`文件,这意味着它必须严格的遵守键值对格式:

key=value

例如:

greeting=Hello
greeting.name=Rob
greeting.suffix=, welcome to Revel!

##分段

一个 `goconfig`文件可以备份为若干段,默认段总是存在并包含没有被定义进任何分段的键值对。例如:

key=value

[SECTION]
key2=value2

Message文件的所有message应被定义进默认分段,除非他们属于这个语言的某个特定`Region`地区。

##地区

特定区域的message应以相同的名称定义在不同的分段中。假如,要对所有英语用户说"你好",英国用户应为"Hey",美国用户应为"Howdy",为了做到这点,我们定义如下message文件:

greeting=Hello

[GB]
greeting=Hey

[US]
greeting=Howdy

如果用户已经定义了自己的首选语言,revel会自动的使用相应语言来“问好”。

只有在特定情况下,用户的区域被明确定义为`en-GB`或`en-US`,问候消息才会使用特定的message解决。

如果一个Meesage定义在一个无效的分段里,虽然技术上可行,但是它们永远不会被使用。

##引用和参数

**引用**

Meesage文件中的message,可以引用其他message。这使得用户可以从一个或多个Message组成一个单一的message。引用其他message的语法为`%(key)s`。例如:

greeting=Hello
greeting.name=Rob
greeting.suffix=, welcome to Revel!
greeting.full=%(greeting)s %(greeting.name)s%(greeting.suffix)s

注:goconfig文件支持引用,由于message文件支持合并,所以可以从其他相同语言的message文件进行引用。

**参数**

Message支持一个或多个参数。参数使用go `fmt`包中同样的规则解析。例如:

greeting.name_arg=Hello %s!

参数按照给定的顺序来解析。

##解析客户端语言环境

为了弄清楚客户端的首选语言,revel会在以下地方寻找:

1、语言cookie

revel会在没一个请求的cookie中寻找程序配置的i18n字段(`i18n.cookie`),如果找到,那么这个字段的值就被认为是客户端当前的语言环境。

2、`Accept-Language`请求头

revel会自动解析每个请求头中的`Accept-Language`, 每个`Accept-Language`都会被保存在`Request`实例中,用于在以后的各种message函数中确定当前语言环境。

3、默认语言

当上面所有的方法都没有正确查找到客户端的语言环境时,revel会将程序配置文件中定义的`i18n.default_language`值作为默认语言。

当请求的message无法得到时,会返回一个包含原始信息的特定字符串。

注:每次请求的`Accept-Language`请求头都会被解析并存储在`Request`实例中,即使cookie中已经定义了语言。在这种情况下,它的值虽然不会被message解析函数使用,但我们仍然可以在程序中使用它。

**获取当前的语言环境**

程序可以通过`Request.Locale`从当前的请求中获取被设置的语言环境。

例如:

func (c App) Index() revel.Result {
currentLocale := c.Request.Locale
c.Render(currentLocale)
}

在模板中,可以从传入的`renderArgs`对象获取当前语言环境:

Current preferred locale: {{.currentLocale}}

##解析`Accept-Language`HTTP头

如果程序要访问`Accept-Language`HTTP请求头,可以通过controller的`Request`实例来获得。`AcceptLanguages`是一个`AcceptLanguage`的切片对象,包含了从相应的头字段中解析出来的值,按其含义的标识价值来排序。

func (c App) Index() revel.Result {
// 获得 AcceptLanguages的字符串表示
c.RenderArgs["acceptLanguageHeaderParsed"] = c.Request.AcceptLanguages.String()
// 获得最有价值的 AcceptLanguage 实例
c.RenderArgs["acceptLanguageHeaderMostQualified"] = c.Request.AcceptLanguages[0]

c.Render()
}

##解析Message

Message可以从任意一个controller或view视图模板解析。

**Controller**

任何控制器都有`Message(message string, args ...interface{})`方法来讲message解析为当前语言。如:

func (c App) Index() revel.Result {
c.RenderArgs["controllerGreeting"] = c.Message("greeting")
c.Render()
}

**模板**

在模板中,可以使用模板函数`msg`来讲message解析为当前语言:

Greetings without arguments: {{msg . "greeting"}}

Greetings: {{msg . "greeting.full.name" "Tommy Lee Jones"}}

注:模板函数`msg`的签名为 `msg . "message name" "argument" "argument"`,如果没有参数,则不会解析任何message。

##配置

文件 属性 描述
app.conf i18n.cookie cookie中语言字段的名称. 应当加上revel前缀避免冲突.
app.conf i18n.default_language 在没有任何首选语言的情况下所使用的默认语言.

Go Revel - i18n(国际化)的更多相关文章

  1. Django1.9开发博客(12)- i18n国际化

    国际化与本地化的目的为了能为各个不同的用户以他们最熟悉的语言和格式来显示网页. Django能完美支持文本翻译.日期时间和数字的格式化.时区. 另外,Django还有两点优势: 允许开发者和模板作者指 ...

  2. Bootstrap-datepicker3官方文档中文翻译---I18N/国际化(原文链接 http://bootstrap-datepicker.readthedocs.io/en/latest/index.html)

    I18N/国际化 这个插件支持月份和星期名以及weekStart选项的国际化.默认是英语(“en”); 其他有效的译本语言在 js/locales/ 目录中, 只需在插件后包含您想要的地区. 想要添加 ...

  3. i18n(国际化) 和l18n(本地化)时的地域标识代码

    i18n(国际化) 和l18n(本地化)时的地域标识代码 格式如 zh-CN(语言-国家) i18n(国际化) 和l18n(本地化)时的地域标识代码 格式如 zh-CN(语言-国家) 国家说明 语言说 ...

  4. i18n,国际化翻译,excel与js互转

    背景 公司开发新产品时,要求适配多国语言,采用i18n国际化工具,但翻译字典(js的json)还是需要前端自己写的.字典最终需要转换成excel给专业人员翻译,翻译完成后再转换成js字典文件. 如果手 ...

  5. 【JavaWeb】i18n 国际化

    i18n 国际化 什么是 i18n 国际化(Internationalization)指的是同一个网站可以支持多种不同的语言,以方便不同国家,不同语种的用户访问. 希望相同的一个网站,不同人访问的时候 ...

  6. I18N 国际化

    http://blog.sina.com.cn/s/blog_6c7e59770101p7w9.html 一.I18N 在 J2EE 中的应用 [转载:http://blog.csdn.net/cha ...

  7. Web---JSTL(Java标准标签库)-Core核心标签库、I18N国际化、函数库

    前面为JSTL中的常用EL函数,后面的为具体演示实例! JSTL简介: JSTL(Java Standard Tag Library) –Java标准标签库. SUN公司制定的一套标准标签库的规范. ...

  8. Struts2 学习笔记17 I18N国际化

    讲解一下国际化的内容,比如书有些大的网站可以一键切换语言,例如中英切换,这时候就会用到国际化.但是由于struts2大多数是用来写后台,国际化并不是十分重要,而且用国际化开发会减慢开发的速度,大家只要 ...

  9. Struts2之i18N国际化

    对于i18n其实没有太多内容,一般的公司用不到这些内容,除非是跨国公司,但即便是跨国公司也不一定会使用i18n来进行国际化处理,所以本篇内容仅供大家了解,不做深入的探讨,希望通过本篇内容,可以帮助大家 ...

随机推荐

  1. codeforces-1114F-线段树练习

    https://www.cnblogs.com/31415926535x/p/10391639.html 概述 这是一道用线段树维区间值的一道题,,题意很简单,,就是对于给定的一个序列,,初始时每个数 ...

  2. C++中的智能指针

    一.动态内存管理 通常我们创建动态内存的时候,需要自己管理好内存,也就是说,new出来的对象一定要注意释放掉.下面通过例子可以看到这个问题所在: struct BBE{ int X; int Y; v ...

  3. flask第十篇——url_for【3】

      继续url_for的知识点 # coding: utf-8 from flask import Flask, url_forimport flask app = Flask(__name__)   ...

  4. 潭州课堂25班:Ph201805201 爬虫基础 第二课 fidder (课堂笔记)

    通过浏览器访问百度的详细过程? 一.通过dns获取百度IP地址.二.通过百度IP访问百度服务器, 三,返回数据. 四,通过渲染显示内容, fidder设置 tf 信任证书

  5. unity中HideFlags的利用

    HideFlags主要用于控制物体在hierarchy,Inspector视图的显示销毁等的bit mask~ None:默认情况,正常可见对象~ API: HideInHierarchy:在Hier ...

  6. Java 数组元素倒序的三种方式

    将数组元素反转有多种实现方式,这里介绍常见的三种. 直接数组元素对换 @Test public void testReverseSelf() throws Exception { System.out ...

  7. android: 实现强制下线功能

    强制下线功能应该算是比较常见的了,很多的应用程序都具备这个功能,比如你的 QQ 号在别处登录了,就会将你强制挤下线.其实实现强制下线功能的思路也比较简单,只需要 在界面上弹出一个对话框,让用户无法进行 ...

  8. ASP.NET Core入门系列教程

    微软把这个新的框架叫:Razor Pages,以下文中我们将频繁提及—Razor Pages. 项目目录结构 wwwroot静态资源文件夹首先,Razor Pages项目中多了一个wwwroot的文件 ...

  9. ASP.net教程]启用WebApi 2里的Api描述信息(Help下的Description

    环境:vs2013+web api 2 问题:默认情况下新建的Web Api 2项目,自带的Help页下会显示Api的相关信息,但Description那一栏无法获取到数据,如下图所示: 解决: 1. ...

  10. MATLAB 统计数据并画出统计直方图

    统计FilmTrust(0.5-4.0分).CiaoDVD(1-5分).MovieLens(1-5分) 等 rating 数据集分值的分布:  以 统计FilmTrust(0.5-4.0分) 为例: ...