PHP中使用gettext来支持多语言的方法

我们今天用一个简单的实例说明一下在PHP中的getText的用法(getText是一系列的工具和库函数,帮助程序员和翻译人员开发多语言软件的), 从而实现PHP的i18n.
现在, 我们假设要显示一个返回主页的link:


代码如下:

//home.php:
$str = 'home';
print <<<HTML
<a href="#">{$str}</a>
HTML;

下面开启我们多语言的开发之旅:
创建pot文件,pot是Portable Object Template的首字母缩写,与po对应的是mo,mo是Machine Object的首字母缩写。前者意指原始的字符串文件,一般用于给翻译人员去修改的,后者则是与机器相关的,一般是供程序读取。可以手工创建pot文件,也可以通过xgettext从代码中抽取字符串来产生。这里是用xgettext来产生的:
xgettext -a home.php -o home.pot
运行该命令后,我们发现,在当前目录下,产生了一个名home.pot的文件,打开该文件,可以看到:


代码如下:

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-07-23 20:56+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: home.php:2
msgid "home"
msgstr "

根据pot产生不同语言的po文件,这里我们先产生一个简体中文的po文件:
export LANG=zh_CN.gb2312
msginit -l zh_CN.gb2312 -i home.pot
运行该命令后,我们发现,在当前目录下,产生了一个名zh_CN.po的文件,打开该文件,可以看到:


代码如下:

# Chinese translations for PACKAGE package
# PACKAGE 软件包的简体中文翻译.
# Copyright (C) 2009 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# <huixinchen@localhost.localdomain>, 2009.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-07-23 20:56+0800\n"
"PO-Revision-Date: 2009-07-23 21:00+0800\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Chinese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=GB2312\n"
"Content-Transfer-Encoding: 8bit\n"
#: test.php:2
msgid "home"
msgstr "

翻译zh_CN.po里对应的字符串为中文:


代码如下:

# Chinese translations for PACKAGE package
# PACKAGE 软件包的简体中文翻译.
# Copyright (C) 2009 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# <huixinchen@localhost.localdomain>, 2009.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-07-23 20:56+0800\n"
"PO-Revision-Date: 2009-07-23 21:00+0800\n"
"Last-Translator: <huixinchen@localhost.localdomain>\n"
"Language-Team: Chinese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=GB2312\n"
"Content-Transfer-Encoding: 8bit\n"
#: test.php:2
msgid "home"
msgstr "主页

根据po文件生成mo文件。
msgfmt zh_CN.po -o zh_CN.mo
运行该命令后,我们发现,在当前目录下,产生了一个名zh_CN.mo的文件。它是二进制的,不能用文本编辑器打开。
安装mo文件到特定目录中:
cp -f zh_CN.mo .local/LC_MESSAGES/home.mo
修改程序。


代码如下:

setlocale(LC_ALL, 'zh_CN');
// Specify location of translation tables
bindtextdomain("home", ".");
// Choose domain
textdomain("home");
// Translation is looking for in ./locale/zh_CN/LC_MESSAGES/home.mo now
$str = gettext('home'); //也可以使用_('home')
print <<<HTML
<a href="#">{$str}</a>
HTML;

运行这个脚本, 看看, 是不是输出正确的中文了呢?
添加其它语言也很容易,不需要修改程序,只需要像对待中文一样,生成一个mo文件,并安装到系统中对应的目录即可。切换不同的语言仅仅是修改当前的locale就行了。

(0)

相关推荐

  • php实现获取及设置用户访问页面语言类

    本文实例讲述了php实现获取及设置用户访问页面语言类,分享给大家供大家参考.具体分析如下: 该实例User Language Class 获取/设置用户访问的页面语言,如果用户没有设置访问语言,则读取Accept-Language.根据用户选择的语言显示对应的页面(英文,简体中文,繁体中文) UserLang.class.php类文件如下: <?php /** User Language Class 获取/设置用户访问的页面语言,如果用户没有设置访问语言,则读取Accept-Language *

  • php根据用户语言跳转相应网页

    当来访者浏览器语言是中文就进入中文版面,国外的用户默认浏览器不是中文的就跳转英文页面. <?php $lan = substr( $HTTP_ACCEPT_LANGUAGE,0,5); if ($lan == "zh-cn") print("<meta http-equiv='refresh' content = '0;URL = gb/index.htm'>"); else print("<meta http-equiv='ref

  • thinkphp实现多语言功能(语言包)

    1.在Home(你取的项目名)的config.php中添加如下配置 复制代码 代码如下: <?phpreturn array(    //'配置项'=>'配置值'        'LANG_SWITCH_ON'     =>     true,    //开启语言包功能                'LANG_AUTO_DETECT'     =>     true, // 自动侦测语言        'DEFAULT_LANG'         =>     'zh-cn

  • ThinkPHP多语言支持与多模板支持概述

    本文以实例形式简述了ThinkPHP的多语言支持与多模板支持.是ThinkPHP中非常重要的技巧,分享给大家供大家参考.具体如下: 一.ThinkPHP多语言支持: config.php配置文件中添加: //多语言支持设置 'LANG_SWITCH_ON'=>true, 'DEFAULT_LANG'=>'zh-cn', 'LANG_AUTO_DETECT'=>true, 'LANG_LIST'=>'en-us,zh-cn,zh-tw', Home/Lang/文件夹下建立三个文件夹,

  • php简单实现多语言切换的方法

    本文实例讲述了php简单实现多语言切换的方法.分享给大家供大家参考,具体如下: 1.主程序代码: <?php include "lib/function.php"; ?> <script src="js/language.js"></script> <?php if(isset($_GET["language"])){ $_SESSION["language"] = $_GET[&qu

  • Thinkphp搭建包括JS多语言的多语言项目实现方法

    本文实例讲述了Thinkphp搭建包括JS多语言的多语言项目实现方法.分享给大家供大家参考.具体实现方法如下: 一.问题: 项目需要开发英文版,于是需要搭建多语言项目. 项目使用Thinkphp框架,隐约记得Thinkphp有多语言设置,翻看了帮助手册,果然有,这就边实验边开始: 二.实现方法: Thinkphp采用app_begain来检测和切换语言包,语言包和项目相关,构架等都比较简单,具体的这里:http://www.thinkphp.cn/info/188.html 搭建好了,就可以使用

  • PHP检测用户语言的方法

    本文实例讲述了PHP检测用户语言的方法.分享给大家供大家参考.具体如下: function getPreferredLanguage() { $langs = array(); if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { // break up string into pieces (languages and q factors) preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\

  • PHP中使用gettext来支持多语言的方法

    我们今天用一个简单的实例说明一下在PHP中的getText的用法(getText是一系列的工具和库函数,帮助程序员和翻译人员开发多语言软件的), 从而实现PHP的i18n. 现在, 我们假设要显示一个返回主页的link: 复制代码 代码如下: //home.php: $str = 'home'; print <<<HTML <a href="#">{$str}</a> HTML; 下面开启我们多语言的开发之旅: 创建pot文件,pot是Port

  • Android编程实现动态支持多语言的方法

    本文实例讲述了Android编程实现动态支持多语言的方法.分享给大家供大家参考,具体如下: 资源文件values/strings.xml中添加 <string name="current_language">English</string> <string name="test">test</string> 创建values-en文件夹,添加资源文件 strings.xml: <resources> <

  • PHP中file_exists函数不支持中文名的解决方法

    一般来说PHP中常使用file_exists()判断某个文件或者文件夹是否存在,如果存在则返回true,否则返回false.但是该函数在网页使用UTF8编码的情况下,对于中文的文件名或者文件夹名不能返回正确值,始终返回false.经测试之后得出解决方法,分析造成这一情况的原因应该是编码不同而导致的PHP不能正确判断. 下面这段代码是不能够返回正确值的代码,无论文件是否在都返回不在: <?php; $file="/attachment/21/0/中文.rar"; $newfile

  • 详解基于webpack&gettext的前端多语言方案

    gettext 是GNU 提供的一套 国际化与本地化 处理的相关函数库.大多数语言都有对应的gettext实现.本文主要使用jed来实现gettext 一系列方法对应的功能. pot/po文件 pot文件 是po文件的模板文件,一般是通过 xgettext 程序生成出来的. po文件 是根据pot文件通过msginit程序,设置对应的国家语言生成用于填写实际翻译内容的文件. xgettext/msginit/msgmerge xgettext 程序可以扫描指定的代码文件,取出其中gettext部

  • jsp页面中表达式语言中的$符号不起作用的解决方法

    今天myeclipse里部署了之前做的一个测试项目,发现jsp里的$符号tomcat启动后页面上显示出来了,百度搜了下别人也有类似的问题出现过.经提醒原来是web.xml配置的version设置的是2.5而我tomcat5启动的.是tomcat的版本低于web的版本,从而导致$符号不能正常使用. 后将tomcat5改用tomcat6.jdk采用1.6 启动spring2.5项目.$显示问题解决. 以下是网上摘录的详细说明: 在jsp页面中用表达式语言中的$符号,如${pageScope.titl

  • 查看Java所支持的语言及相应的版本信息

    /* *Java语言作为第一种支持国际化的语言,在Internet从一开始就具有其他语言无与伦比的国际化的本质特性:*用Unicode来编写所有的字符串.可是理论与实际总是不能完全谋和的,因为Unicode本身也在不断变化.* 在J2SE(TM) 5.0中,主要的变化是对java.lang,java.text, java.util.regex等包进行调整,使整个字*符处理基于Unicode4.0的标准之上,同时加强了对增补字符的支持(欲了解更多信息请参照:* <Supplementary Cha

  • Vue中使用vue-i18插件实现多语言切换功能

    在基于vue-cli项目开发过程中,多语言切换功能可使用vue-i18插件,具体实现方法如下: step1: 在项目中安装vue-i18插件 cnpm install vue-i18n --save-dev step2:在项目的入口文件main.js中引入vue-i18n插件  import Vue from 'vue' import router from './router' import VueI18n from 'vue-i18n' Vue.use(VueI18n) const i18n

  • VS Code 中安装运行、编写C语言程序的详细教程

    目录 1.下载 安装VS Code 2.安装VS code中2个插件 3.下载mingb64 4.配置系统的环境变量 5.C语言配置 6.编写一个测试程序 1.下载 安装VS Code 去官网下载:https://code.visualstudio.com/Download 直接下载,安装即可. 2.安装VS code中2个插件 打开软件运行,在扩展商店中分别搜索安装 C/C++ 和 code runner 插件 3.下载mingb64 官网下载 https://sourceforge.net/

  • Idea中添加Maven项目支持scala的详细步骤

    目录 一.Scala环境搭建 1.安装步骤 二.Scala插件安装 1.插件离线安装步骤 三.HelloWorld案例 1.IDEA环境创建 四.关联Scala源码 五.官方编程指南 一.Scala环境搭建 1.安装步骤 (1)首先确保jdk1.8安装成功 (2)下载对应的Scala安装文件scala-2.11.8.zip,下载地址:https://pan.baidu.com/s/1D7KxZOLZReXK46LNo_jiGA 提取码:l4s1 (3)解压scala-2.11.8.zip,我这里

  • Go语言中嵌入C语言的方法

    本文实例讲述了Go语言中嵌入C语言的方法.分享给大家供大家参考.具体分析如下: Go语言官方带了一个工具叫cgo,可以很方便的在Go语言代码中内嵌C代码或做C和Go代码的集成.下面是一段简单的在Go中内嵌C的实验代码: 复制代码 代码如下: package main /* #include <stdio.h> #include <stdlib.h> void say_hello() {         printf("Hello World!\n"); } */

随机推荐