在PHP中使用Multilanguage创建一个网页

时间:2009-04-22 11:43:12

标签: php html

我想在PHP中开发一个多语言页面,例如英语/德语/日语..所以当我点击德语时,页面语言将变为德语,然后我点击英语将其更改为英语。请指导我这样做。提前谢谢....

10 个答案:

答案 0 :(得分:8)

奇怪的是,很多php开发人员似乎都认为所有自然语言都有相同的语法。制作一个没有参数的翻译框架是不可能的。虽然字符串$lang['welcomeTo'] $sitename可能会针对大多数语言正确翻译(欢迎使用stackoverflow),但它对土耳其语来说是失败的,例如它应该是$sitename $lang['welcomeTo'](stackoverflow'a hos geldiniz)或者德语,无论哪种方式都是可能(Willkommen auf stackoverflow /StackoverflowheißtSiewillkommen)。当你试图用多个变量翻译句子时,这会变得更糟。

唯一的选择是使用参数化翻译(例如:函数)

Language::getCurrentLanguage()->translate('welcomeTo', array('sitename' => $sitename));

# Translation file for english (configfile-style):
welcomeTo=Welcome to $sitename

# Translation file for turkish:
welcomeTo=$sitename'a hos geldiniz

# Translation file for german:
welcomeTo=Willkommen auf $sitename
# Or
welcomeTo=$sitename heißt sie willkommen

简而言之:如果你想要真正的i18n,请使用函数来检索你的翻译,而不是变量。您可能也想查看php的intl扩展名。

答案 1 :(得分:7)

我们使用http://php.net/manual/en/intro.gettext.php方式。工作正常,我们在其他项目(非PHP项目)中已经与http://www.gnu.org/software/gettext/manual/gettext.html一起工作。所以很容易开始。

我认为正确的方法取决于谁翻译文本!如果是开发人员,您可以为每种语言提供自己的视图。但是如果你有其他人翻译文本,那么像gettext(翻译在专用文件中,有工具可以使用这种文件)是正确的选择!

答案 2 :(得分:2)

您可以使用会话来存储用户设置的语言。

$_SESSION["lang"] = "en";
$_SESSION["lang"] = $_GET["lang"]; 
// or this way, then you can do example.com/?lang=en

然后创建一个包含翻译数组的文件。

$lang["en"]["welcome"] = "Welcome to the site";

然后另一个文件可能有德语翻译

$lang["de"]["welcome"] = "Willkommen auf der Webseite";

然后你只需用会话

调用$ lang数组
echo $lang[$_SESSION["lang"]]["welcome"];

这是此的简化版本,您还可以使用对象来存储翻译。 但我不建议使用数据库存储翻译,因为这涉及非常大的SELECT或非常多。

答案 3 :(得分:1)

通常您需要启用UTF-8的网站。这是通过文件的标题设置的。 (可以通过header())函数设置。

然后我猜你想要用英文和中文网站。然后我建议有一个语言文件。可能是存储要在站点上显示的段落的数组或对象。然后你就打印出那段。

然后要知道用户要求的语言,我会使用$ _SESSION来存储用户选择的语言。

然后您的语言文件可能如下所示

$lang["en"]["Welcome"] = "Welcome to the site";

然后中文欢迎文件就会有这样的内容

$lang["ch"]["Welcome"] = "歡迎";

然后在您要打印出来的位置。你会做的

echo $lang[$_SESSION["lang"]]["Welcome"];

答案 4 :(得分:1)

构建多语言网站的一种有效方法是不使用硬编码标签,而是从相应的语言文件中检索它们,因为基本上您需要做的是在您的网站上定位不同的用户。如果您显示了存储在数据库中的数据,则可以考虑添加一些存储不同语言翻译的数据库表。例如,要在C#中完成一些工作,可以使用存储标签值的资源文件。

答案 5 :(得分:0)

大多数框架都会有帮助您的帮助。对于初学者来说,这里是CodeignitercakePHP

答案 6 :(得分:0)

您只需在您喜欢的任何字符集中键入HTML的内容部分即可。请务必set the charset and content encoding properly。例如,将其设置为UTF-8以获得简单的unicode。

答案 7 :(得分:0)

Rails处理它well。您可能需要查看有关如何执行此操作的建议。

答案 8 :(得分:0)

正如格雷戈尔所说; gettext对我来说是专业的方式......

这是一篇好文章link

但我想补充一些重点

I-使用这种方法,如果你在windows下创建一个po文件,你将不得不使用.po和.mo文件,你不能在linux下使用它。或者在linux下创建的.po文件不能在windows下使用。

II-linux可以自己创建.po文件但是在windows中我建议你使用像poedit这样的程序(你可以从它的网站上获取它:http://www.poedit.net/

III-某些区域设置存在字符问题。但我不记得他们是哪一个?:(

答案 9 :(得分:-2)

我个人翻译我的完整观点。因此,您将拥有如下文件结构:

application/
 someScript.php
views/
 de/
  someView.php
 en/
  someView.php
models/
 someModel.php

然后正如Olafur所建议的那样,将语言存储在会话变量中并执行类似的操作。

 session_start(); //dont forget to call this somewhere
 $_SESSION['lang'] = 'en';
 //and then in somewehere else:
 include 'views/'.$_SESSION['lang'].'/someView.php'; //or whatever method is used to include views.

修改
您应该从脚本中分离输出。因此,您将拥有一个脚本来执行某些脚本编写工作,例如获取当前的UNIX时间戳,这将是上面示例中的someScript.php:

  //someScript.php
  $timestamp = time();

现在我们可以在下面直接添加所有输出,但这样可维护性非常难,所以我们在不同的文件中输出,这里是someView.php文件。所以'en'文件夹中的someView.php将是:

<html>
<head>
<title>Currect UNIX timestamp!</title>
</head>
<body>
<p>The current UNIX timestamp is: <?php echo $timestamp; ?> seconds</p>
</body></html>

在'de'文件夹中,它实际上是相同的文件,但所有文本都是德语。

现在我们需要做的就是在someScript.php中包含这些输出文件,因此我们将以下行添加到该脚本的底部:

 include '../views/'.$_SESSION['lang'].'/someView.php';

您应该在这里阅读更多关于MVC的内容:http://www.onlamp.com/pub/a/php/2005/09/15/mvc_intro.html

注意:这个例子不是严格的MVC,但这应该给你一个想法。