我正在设计一个多语言网站,它同时支持ltr
和rtl
。
语言:
我将语言存储在像$lan=array('browse'=>'تصفح','add'=>'إضافة','signin'=>'تسجيل دخول');
这样的数组中,并将它们保存在单独的php文件中,并include
选定的语言。我在HTML代码中使用它,如<?php echo $lan['browse'];?>
方向:
大多数方向问题都可以通过CSS属性dir
来解决。但是,有时您需要为不同的方向指定不同的属性。因此,我给了一个类名称为“rtl”或“ltr”的主体,然后我将其用作以下内容:
.brs_search_box{
display: inline-block;
width: 199px;
border: 1px solid #d3d3d3;
height: 500px;
}
.rtl .brs_search_box{
border-left: 0;
}
.ltr .brs_search_box{
border-right: 0;
}
这种技术有缺点吗?例如,大尺寸阵列会产生不良影响吗?
答案 0 :(得分:4)
您可能会发现的唯一问题是,如果您没有明确翻译您正在回复的文本的每个部分。
例如,您可以echo $lan['this is some text'];
但是如果您还没有翻译此文本呢?如果您没有为要使用的默认文本设置某种回退,这将在屏幕上显示为空白。
我使用过的PHP多语言网站最好的系统之一是gettext
,您可以在以下链接的PHP手册中查看:
http://php.net/manual/en/book.gettext.php
我承认,当我第一次开始使用它时,设置并不是那么直观,你需要一些额外的工具来实现它,但是一旦你学会了它并设置它,我觉得它非常好用并且你还可以在你的弓上有一个新的弦以供将来生产。
您基本上将所有文字都包裹在__()
函数中,例如__('This is some text')
,然后搜索您的翻译文件并显示相关文字。
将所有内容分隔成单独的文件,然后您可以使用这些文件轻松翻译文本。这对于交给翻译公司/朋友/隔壁邻居猫来翻译也没有用,无需触及任何实际的应用程序文件。
此外,如果找不到指定文本的翻译字符串,那么它只会按照__()
函数中的提供输出它。
随着时间的推移,它可以非常灵活地添加新语言。
我认为还有其他选项可供您查看,而您的工作也可以使用,但对于业界公认的可扩展方法,最好查看gettext
。
答案 1 :(得分:3)
您缺少的是用于处理翻译的正确工具链。你的阵列支持复数吗?语境?域名?分类?评论?最重要的是:他们是否支持自动提取?
如果您只是手动将每个新字符串添加到数组中,那么您添加的每个新字符串都需要大量工作。翻译系统支持全自动提取字符串非常重要。您只需在源代码中标记字符串,运行脚本并自动获取带有可翻译字符串的文件。每次运行时,文件都会更新并与源代码中的最新更改合并。如果没有这个,这个过程就会很快变得无法管理。
此外,由于您可能需要在将来的某个时间与外部非技术翻译人员合作,因此使用各种工具支持的格式的字符串非常重要。
正如@Peter指出的那样,gettext和类似的已建立的工具具备了这一切。你的数组没有。
答案 2 :(得分:1)
使用语言数组的想法很好。但根据经验,我建议使用两种技术:
语言配置文件。所以你会说en_gb.php和arabaic.php,每个都包含一系列翻译。然后可以根据用户语言首选项或IP地址预加载这些文件,这种技术非常无限,因为翻译保存在一个中心位置,您可以添加任意数量的语言,即french.php
数据库。您可以根据需要进行设计,但理想情况下,您将拥有一个表格,其中包含用于模板单词的列和用于每个翻译的列。由于此表不太可能经常更改,因此您可以使用基于磁盘或基于内存的缓存来提高速度。
使用上述任一技术,您只需使用模板系统并在页面加载时插入相应的翻译。但是根据我的经验,我会建议用两种语言彻底测试网站,因为语言不可能逐字翻译。以一种语言显示需要200px的内容可能需要另外400px。因此,该网站必须考虑到这一点。