我想在PHP中开发一个多语言页面,例如英语/德语/日语..所以当我点击德语时,页面语言将变为德语,然后我点击英语将其更改为英语。请指导我这样做。提前谢谢....
答案 0 :(得分:8)
$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)
大多数框架都会有帮助您的帮助。对于初学者来说,这里是Codeigniter和cakePHP。
答案 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,但这应该给你一个想法。