##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文件,须要记住一下几点: 一、全部message文件应当存储在程序根目录下的`meesages`目录中 二、文件扩展名必须是当前语言的 ISO 639-1 编码 三、message文件应当是`UTF-8`编码. 虽然这不是强制要求,但这是最佳实践 四、没一个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会在如下地方寻找: 一、语言cookie revel会在没一个请求的cookie中寻找程序配置的i18n字段(`i18n.cookie`),若是找到,那么这个字段的值就被认为是客户端当前的语言环境。 二、`Accept-Language`请求头 revel会自动解析每一个请求头中的`Accept-Language`, 每一个`Accept-Language`都会被保存在`Request`实例中,用于在之后的各类message函数中肯定当前语言环境。 三、默认语言 当上面全部的方法都没有正确查找到客户端的语言环境时,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}}web
##解析`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"}}cookie
Greetings: {{msg . "greeting.full.name" "Tommy Lee Jones"}}app
注:模板函数`msg`的签名为 `msg . "message name" "argument" "argument"`,若是没有参数,则不会解析任何message。 ##配置 文件 属性 描述 app.conf i18n.cookie cookie中语言字段的名称. 应当加上revel前缀避免冲突. app.conf i18n.default_language 在没有任何首选语言的状况下所使用的默认语言.