PHP gettext使用方法 附加奇怪bug一枚

心血来潮,突然想研究下php多语言。

看下了自己公司的项目和wordpress都是用的gettext()来进行多语言化的。

于是打开php手册复制了下面一段

<?php
// Set language to German
putenv(‘LC_ALL=de_DE‘);
setlocale(LC_ALL, ‘de_DE‘);

// Specify location of translation tables
bindtextdomain("myPHPApp", "./locale");

// Choose domain
textdomain("myPHPApp");

// Translation is looking for in ./locale/de_DE/LC_MESSAGES/myPHPApp.mo now

// Print a test message
echo gettext("Welcome to My PHP Application");

// Or use the alias _() for gettext()
echo _("Have a nice day");
?>

然后网上下了个POedit用来编译mo文件

结果过程中投了个懒,将mo文件名改成了test,将代码里的textdomin值赋值成test

呵呵.....结果就悲剧了

gettext()函数弄死翻译不了了

然后各种尝试以下是不科学的实验过程(函数要求textdomain值需要与mo文件名一致)

textdomain值 mo文件名 gettext运行状态 注释
he he.mo 正常  
heh heh.mo 正常  
test test.mo 扑街  
zh_CN zh_CN.mo 扑街  
zh_CN zh__CN.mo 正常 中间是两条下划线
hehe hehe.mo 扑街  
heheh heheh.mo 正常 从存字符长度大于等于5时开始正常
hehehehe hehehehe.mo 正常  
heheheheh heheheheh.mo 正常  
hehehehehe hehehehehe.mo 正常  
myPHPApp  myPHPApp.mo 正常  
myphpapp  myphpapp.mo 正常  
translations translations.mo 正常  

结论:gettext翻译函数对应textdomain的值在等于4个字符(或添加一个下划线)的时候,会出现读取错误的bug(注:当textdomain值与mo文件名不能对应时,系统会尝试在缓存中寻找,如果有缓存,则gettext能正常工作。

时间: 2024-10-24 03:49:45

PHP gettext使用方法 附加奇怪bug一枚的相关文章

Java编程:枚举enum中,将方法附加到枚举常量

package 枚举; //将方法附加到枚举常量 public class UnitsConverter { private static double numberToConvert = 0; public static void main(String[] args) { // TODO Auto-generated method stub if(args.length == 0) { System.out.println("Usage:java UnitsConverter<weig

jquery 通过 live() 方法附加的事件处理程序适用于匹配选择器的当前及未来的元素(比如由脚本创建的新元素)

jquery 通过 live() 方法附加的事件处理程序适用于匹配选择器的当前及未来的元素(比如由脚本创建的新元素) $("ul").append("<li class='name'>名称</li>"); [错误] 然后通过下面的方式, 这样是不能获取的 : $(".name").click(function (){    alert("获取到append后的节点"); }) [正确] 正确的方法是:

JS完成页面跳转并传参的方法|附加:循环遍历对象

此方法只能传递较少参数 方法如下: <a href='page/index.html'>跳转</a> 以上是正常写法,如果要传参按一下写法: <!--参数写在?后面,多个参数用&隔开,下面传的参数为name=lemon,age=18--> <a href='page/index.html?name=lemon&age=18'></a> 当跳转到页面的时候这个页面的地址栏就会跟你写的那个一样,这时候你只需要获取地址栏的内容并进行采取

QPrinter 的 setPaperSize 方法似乎有 bug

这两天在写一个程序,需要控制打印机打印些内容,利用的是Qt 的QPrinter 类,在设置纸张大小时却出了个问题. printer.setPaperSize(QSizeF(70, 50), QPrinter::Millimeter); 结果纸张大小完全不是我设置的值. 把上面那个尺寸修改一下: printer.setPaperSize(QSizeF(70, 50.3), QPrinter::Millimeter); 输出的结果就正确了. 看样子像是 Qt 的bug.当然也可能是打印机驱动有问题.

这两天自己模仿写的一个Asp.Net的显示分页方法 附加实体转换和存储过程

之前自己一直用Aspnetpager控件来显示项目中的分页,但是每次都要拖一个aspnetpager的控件进去,感觉很不舒服,因为现在自己写的webform都不用服务器控件了,所以自己仿照aspnetpager写了一个精简实用的返回分页显示的html方法,其他话不说了,直接上代码. 分页显示信息的实体类:  public class Pager    {        private string _firstPageText;        /// <summary>        ///

TestNg监听器(一)-----监听器的类型和配置使用的方法---附加META-INF详解

TestNg提供了监听器和拦截器的几个接口供我们自己开发扩展,通过实现这些接口,来自定义我们在测试中想要的行为 接口列表: IAnnotationTransformer (doc, javadoc) IAnnotationTransformer2 (doc, javadoc) IHookable (doc, javadoc) IInvokedMethodListener (doc, javadoc) IMethodInterceptor (doc, javadoc) IReporter (doc

Android实际开发中的bug总结与解决方法(一)

                                                                             Android实际开发中的bug总结与解决方法(一) Android开发中有很多bug,我们是完全可以在线下避免的,不要等到线上报的BUG的再去修复.下面是我在实际开发中遇到过的bug和解决方法. BUG 1: java.lang.RuntimeException: Unable to start activity ComponentInfo

【译文】不是所有的 bug 都值得修复的

原文作者:KRISTINE PINEDO 译者:白乐航 欢迎访问网易云社区,了解更多网易技术产品运营经验. 作为软件开发者,您只需要为客户编写和交付出色的产品和功能. 但您也知道软件开发并不总是那么容易,因为进行迭代时候可能会引入bug. 毕竟,“如果调试是删除软件bug的过程,那么编程肯定就是将bug放入去的过程”,正如Edsger Dijkstra(译者注:著名荷兰计算机科学家,我们熟知有向图最短路径算法--迪杰斯特拉算法就是他的),所说. 因为这些问题将会影响你的客户,所以你可能会感到修复

.net基础扫盲-小例子串委托、匿名方法、lamuda表达式

我把委托理解为:委托是一种方法的格式,当然他也是一种类型. 只要是方法的格式跟委托定义的格式是一样的,那么就可以把该方法附加给该委托.看以下demo 声明委托: <p style="margin:0in;font-family:微软雅黑;font-size:12.0pt"></p><pre name="code" class="csharp">public delegate void Add(int a,int