3

我正在设计一个多语言网站,它同时支持ltrrtl.

  1. 语言:

    我将语言存储在这样的数组中$lan=array('browse'=>'تصفح','add'=>'إضافة','signin'=>'تسجيل دخول');,并将它们保存在单独的 php 文件中,我include选择了语言。我在 HTML 代码中使用它,例如<?php echo $lan['browse'];?>

  2. 方向:

    大部分方向问题都可以通过 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;
    }  
    

这种技术有缺点吗?例如,大尺寸数组会产生不良影响吗?

4

3 回答 3

4

您可能会发现的唯一问题是,如果您没有明确翻译您正在回显的文本的每个部分。

例如,您可以echo $lan['this is some text'];,但如果您还没有翻译此文本怎么办?如果您没有为要使用的默认文本设置某种回退,这将在屏幕上显示为空白。

我使用的 PHP 多语言网站的最佳系统之一是gettext,您可以在以下链接的 PHP 手册中查看它:

http://php.net/manual/en/book.gettext.php

我承认当我第一次开始使用它时,它的设置并不那么直观,你需要一些额外的工具来让它运行,但是一旦你学会了它并设置它,在我看来它工作得很好,你会您的弓上也有一根新弦,以备将来制作。

例如,您基本上将所有文本包装在函数__()中,__('This is some text')然后它会搜索您的翻译文件并显示相关文本。

这会将所有内容分成单独的文件,然后您可以使用这些文件轻松翻译文本。这对于交给翻译公司/朋友/隔壁邻居的猫进行翻译也很有用,而无需他们接触您的任何实际应用程序文件。

此外,如果它没有找到您指定文本的翻译字符串,那么它只会按照__()函数内部提供的方式输出它。

它使得随着时间的推移添加新语言变得非常可扩展。

我认为您也可以查看其他选项,并且您的选项也可以,但是对于行业接受的、可扩展的方法来说,看看gettext.

于 2013-03-21T09:46:21.073 回答
3

您缺少的是用于处理翻译的适当工具链。你的数组支持复数吗?语境?域?类别?评论?最重要的是:它们是否支持自动提取

如果您只是手动将每个新字符串添加到数组中,那么您添加的每个新字符串都会有大量工作。翻译系统支持全自动提取字符串很重要。您只需在源代码中标记字符串,运行脚本并自动获取带有可翻译字符串的文件。每次运行它时,文件都会更新并与源代码中的最新更改合并。没有这个,这个过程很快就会变得难以管理。

此外,由于您将来可能不得不与外部的非技术翻译人员合作,因此具有多种工具支持的格式的字符串很重要。

正如@Peter 指出的那样,gettext 和类似的已建立工具具有所有这些。你的数组没有。

于 2013-03-21T09:54:23.000 回答
1

使用语言数组的想法很好。但是根据经验,我建议使用 2 种技术:

语言配置文件。所以你会说 en_gb.php 和 arabaic.php 并且每个都包含一个翻译数组。然后可以根据用户的语言偏好或 IP 地址预加载这些文件,这种技术非常无限,因为翻译保存在一个中心位置,您可以添加任意多种语言,即 french.php

一个数据库。您可以按照自己的意愿进行设计,但理想情况下,您将拥有一个表格,其中包含模板词列和每个翻译列。由于此表不太可能经常更改,因此您可以使用基于磁盘或基于内存的缓存来提高速度。

使用上述任何一种技术,您只需使用模板系统并在页面加载时插入相应的翻译。但是根据经验,我建议用两种语言彻底测试网站,因为不可能逐字翻译语言。以一种语言显示需要 200 像素的内容,在另一种语言中可能需要 400 像素。所以网站的设计必须考虑到这一点。

于 2013-03-21T09:50:21.257 回答