ZendFramework2学习笔记 国际化、多语言

ZF2的网站语言配置项是module.config.hp中的“translator”项:

<span style="font-size:18px;">    'translator' => array(
        'locale' => 'zh_CN',//中文简体是zf_CN,英文是en_US
        'translation_file_patterns' => array(
            array(
                'type'     => 'gettext',
                'base_dir' => __DIR__ . '/../language',
                'pattern'  => '%s.mo',//该语言文件是手动生成的骨架应用中一些使用的字符串的语言配置
            ),
        ),
    ),
</span>

其中,"locale"指定项目使用哪个国家的语言,之后在‘translation_file_patterns‘中的‘pattern‘  => ‘%s.mo‘,自动映射为的‘pattern‘  => ‘zh_CN.mo’。该文件保存/在module/Application/language/目录下。同时,可以看到,该目录下也包含有其他国家语言的文件,例如,"en_US.mo"、"zh_TW.mo"等。另外,还可以看到该目录下,每个*.mo文件都对应有一个*.po文件,打开可以看到*.po文件中包含实际我们看到的字符串。

*.po是GNU gettext项目的一套应用规范,GNU gettext项目是一个软件包,是为了使软件实现国际化支持而产生的。*.po文件是面向用户的,可编辑的文件,用户可以直接编辑,或者使用poedit.exe软件进行编辑。*.mo文件是gettext软件包通过*.po文件编译而成的面向计算机的二进制文件。

我们可以通过poedit.exe软件编辑zh_CN.po文件,添加、修改、删除zf2项目中使用的字符串。例如可以在zh_CN.po文件中添加一个字符串,字符串key为"My message!",字符串值为"我的消息",那么我们就可以在layout.phtml或者view中直接这样输出字符串:“$this->translate("My message!");”。

除了gettext,ZF2项目还支持php数组作为字符串输入。具体方法是,编写一个php文件,例如:my_zh_CN.php如下,

<?php

//module/Test/language/my_zh_CN.php

return array(
    "My message id" => "你好!",
);

然后,在/module/Test/config/module.config.php中添加一个translator的配置项:

/module/Test/config/module.config.php

    'translator' => array(
        'translation_files' => array(
            array(
                'type'     => 'phparray',
                'filename'  => __DIR__ . '/../language/my_zh_CN.php',
            ),
        ),
    ),

之后,就可以在layout或者view中直接输出这条中文字符串了:

echo $this->translate('My message id');

ZF2库的组件中,有很多表单检验组件Zend\Validator\xxxx或者Zend\I18n\Validator\xxx等等,这些表单检验组件在检验不通过的时候,我们会从这些组件获取一些提示字符串输出到页面,而这些字符串是validator通过其自身的translator成员获取的。默认情况下,validator的translator成员是null,因此提示字符串实际上输出的是字符串的key。

实际上,要让validator的提示字符串显示正常的文字,需要做2个工作,一是为validator设置默认的translaotr,二是将validator的语言配置文件引入zf2项目(默认情况下,只引入了zf2骨架应用的语言文件“zh_CN.mo”!!!)。

一)为validtor指定translator:我们需要在application模块的onBootstrap函数中添加代码如下,

//module/Application/module.php

    public function onBootstrap(MvcEvent $e)
    {
       //......

       \Zend\Validator\AbstractValidator::setDefaultTranslator($e->getApplication()->getServiceManager()->get('translator'));//为validator组件添加translator组件
    }

二)将validator的语言配置文件引入zf2项目:我们需要在application模块的module.config.php中添加translator配置项,

//module/Application/config/module.config.php

    'translator' => array(
        'translation_files' => array(
            array(
                'type'     => 'phparray',
                'filename'  => __DIR__ . '/../../../vendor/ZF2/resources/languages/zh/Zend_Validate.php',
            ),
            array(
                'type'     => 'phparray',
                'filename'  => __DIR__ . '/../../../vendor/ZF2/resources/languages/zh/Zend_Captcha.php',
            ),
        ),
    ),

做了以上一些修改后,就可以为zf2项目配置指定国家的语言了。

如果要网站能根据浏览器语言或者其他信息动态改变网站语言的话,就仅仅需要在项目启动阶段,加载不同配置文件即可。



时间: 2024-10-29 11:14:49

ZendFramework2学习笔记 国际化、多语言的相关文章

Java学习笔记(Java语言规范,API,JDK,IDE)

Java语言规范:java.sun.com/docs/books/jls 三个版本的API:J2SE J2EE J2ME 1. J2SE 客户端独立应用程序或者applet 2. J2EE 服务端应用程序 [Java Servlets&JavaServer Page] 3. J2ME 移动设备变成 JDK为Java开发提供一个开发环境(IDE) Java学习笔记(Java语言规范,API,JDK,IDE)

Go语言学习笔记(一) [Go语言的HelloWorld]

日期:2014年7月18日 1.简介 Go 编程语言是一个使得程序员更加有效率的开源项目.Go 是有表达力.简 洁.清晰和有效率的.它的并行机制使其很容易编写多核和网络应用,而新奇的类型系统允许构建有性的模块化程序.Go 编译到机器码非常快 速,同时具有便利的垃圾回收和强大的运行时反射.它是快速的.静态类型编译语言,但是感觉上是动态类型的,解释型语言. Go 是第一个实现了简单的(或更加简单的)并行开发,且跨平台的类 C 语言. 2.Go语言文档查看 安装好Go语言之后,其文档可以通过go do

[Python学习笔记1]Python语言基础 数学运算符 字符串 列表

这个系列是我在学习Python语言的过程中记录的笔记,主要是一些知识点汇总,而非学习教程,可供有一定编程基础者参考.文中偏见和不足难以避免,仅供参考,欢迎批评指正. 本系列笔记主要参考文献是官网文档:http://docs.python.org/.在此向文档编辑者致谢.请勿将本文用于商业用途. 一.Python语言介绍 首先,Python是一种广泛应用的通用高级编程语言,具有较高的抽象层次,支持面向对象的编程方法.其具有高级的数据结构和许多方便的库文件,可以完成文件IO.系统调用.网络编程,甚至

魏兆辉的IOS基础学习笔记之四 C语言基础-04 函数

1. 数组作为函数参数 函数是我们学习程序设计语言最基本的东西了,我在此不再赘述.只讨论一种特殊情况,就是数组作为函数的参数传递. 我们都知道,其实在传递数组的时候,实际上是传递了数组首元素的指针.明确了这一点之后,我们就可以思考下面的问题. 既然他只是传递了数组首元素的指针,那么他必然无法知道整个数组的大小,因此,我们如果希望在函数中用到数组的长度,必须要进行显式传递. int Sum(int a[],int size){ int i ,sum=0; for(i=0;i<size;i++) {

java学习笔记—国际化(41)

国际化:internationalization即I18N. 举例: 本科高校的网站,一般的都有中文和英文两种页面风格.因此将这种根据不同用户群体显示不同的页面风格的方式称之为页面的国际化. 翻译 VS 国际化 翻译:Chrome 国际化:主要做的是页面的显示信息的国际化,至于文件等其他的资源是无法进行国际化. 1  国际化的原理 获取用户的本地信息 Locale通过静态属性获取区域对象. 准备不同区域国家的需要显示的资源 全部使用properties配置文件进行实现.但是文件名需要按照指定的规

Java学习笔记-2.Java语言基础

一.命名规则 1.Java标识符 Java所有的组成部分都需要名字.类名.变量名以及方法名都被称为标识符. 关于Java标识符,有以下几点需要注意: 所有的标识符都应该以字母(A-Z或者a-z),美元符($).或者下划线(_)开始 首字符之后可以是任何字符的组合 关键字不能用作标识符 标识符是大小写敏感的 合法标识符举例:age.$salary._value.__1_value 非法标识符举例:123abc.-salary 2.注意: 大小写敏感:Java是大小写敏感的,这就意味着标识符Hell

23 DesignPatterns学习笔记:C++语言实现 --- 2.7 Proxy

2016-07-18 (www.cnblogs.com/icmzn) 模式理解   1. Proxy 代理模式    为其他对象提供一种代理可以间接控制这个对象的访问.    又称为“委托模式”,其他设计模式也是在代理模式的基础上扩展的,如“策略模式”“状态模式”“访问者模式”,代理模式的特殊应用.在Spring的AOP技术,以及Struts的From元素映射就是代理行为.    一般代理具有多种版本(扩展)如:普通代理模式,强制代理模式,动态代理模式    一般代理的角色:    (1)CAb

23 DesignPatterns学习笔记:C++语言实现 --- 1.5 Prototype

2016-07-21 (www.cnblogs.com/icmzn) 模式理解 1. Prototype  原型模式定义    提供了类的自我复制的能力,即通过已有对象进行新对象的创建.因为原型模式实在内存中进行二进制流的拷贝,所以比直接通过new 一个对象性能好.不同的实现方式与具体的语言相关. 2. 原型模式的优点(1)性能优良,实在内存中基于二进制的拷贝(2)在进行原型模式的时候,并不通过构造函数. 3. 原型模式的适用场景(1)需要根据已有对象创建大量的对象:(2)某个对象的创建需要有大

学习笔记之C语言概述

一.C语言发展简史 C语言于1972年发明,首次使用是用于重写UINX操作系统(UNIX以前是用汇编写的) 随着UNIX操作系统的成功,C语言也得到了大幅度地推广,至今还是世界上最流行.使用最广泛的高级程序设计语言之一 C语言是一门面向过程的语言,非面向对象的语言 从UNIX操作系统的成功后,C语言得到了广 泛地应用,从大型主机到小型微机,都有C语言活跃的身影,也衍生了很多个版本的C语言.长期以往,C语言将可能成为一门有多个变种.松散的语言.一门正式 的语言,肯定要有个标准才行,不然就乱套了.为