Php 翻译网站的简单方法 问题:
我有一个相当静态的网站,只有一些基本的PHP用法。现在,客户希望翻译此网站。我确实有一个解决方案,但它很麻烦,我想知道其他人是怎么做的,标准是什么(在框架中,等等) 我的方式 我的方法(为了便于理解,我简化了一点):我从数据库中为每种语言生成一个PHP数组,并将该数组存储在一个语言文件中,如西班牙语的es.PHP 然后,我使用如下tr函数翻译HTML中的字符串:Php 翻译网站的简单方法 问题:,php,html,localization,internationalization,translation,Php,Html,Localization,Internationalization,Translation,我有一个相当静态的网站,只有一些基本的PHP用法。现在,客户希望翻译此网站。我确实有一个解决方案,但它很麻烦,我想知道其他人是怎么做的,标准是什么(在框架中,等等) 我的方式 我的方法(为了便于理解,我简化了一点):我从数据库中为每种语言生成一个PHP数组,并将该数组存储在一个语言文件中,如西班牙语的es.PHP 然后,我使用如下tr函数翻译HTML中的字符串: 之前:你好,世界 之后:这为西班牙语提供了Hola Mundo。 问题 这既麻烦又容易出错。我必须遍历每个.php文件,并用echo替
之前:
你好,世界
之后:
这为西班牙语提供了Hola Mundo
。问题 这既麻烦又容易出错。我必须遍历每个.php文件,并用echo替换所有硬编码字符串
有更好的办法吗?其他人是怎么做的?如果需要,我可以详细介绍我的实现。您应该研究PHP GETTEXT扩展,它非常快速,可以扫描PHP文件中的字符串以使用.MO和.PO文件进行翻译 然后,您可以简单地执行类似于
的操作(“Hello World”)
或者如果您已经拥有所有带有tr('Hello World')的字符串
然后您可以修改tr
函数,将其通过\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
function tr($string){
__($string)
}
你总是可以用谷歌的翻译工具来翻译
一般来说,我认为多语言网站不再是“静态”的。我用它来实现网站。它有一些非常好的功能。我想对你来说有点晚了,但万一像我这样的人偶然发现了这条线索。。。因为我现在的问题和你一样。
不幸的是,似乎没有一种“不麻烦的方式”可以用PHP实现这一点。一切似乎都涉及大量函数调用(如果有大量文本)
嗯。。。有一个方便的方法。但并不完全安全。在将输出缓冲区发送给用户之前对其进行操作:
=>
因此,您可以根据选择的语言定义一个填充有“from->to”-数据的数组,并通过循环替换缓冲区中的所有可读文本
但是当然。。。例如,如果将“send”(英语)替换为“senden”(德语),并链接到“send.html”,则会断开该链接
因此,如果一个人不仅要翻译长的、绝对唯一的字符串,还要翻译短的字符串,那么他就必须只处理用户可读的文本。也有一个解决方案——不过,它是基于JavaScript的:
=>我翻译网站的方式是什么
在doctype下,使用语言,然后选择您的语言,如下面所示,
然后创建一个php函数,通过$\u POST['get']获取该函数,
让该函数加载所选语言文件/db等,然后尝试此解决方案。它对我有用。它有法语和英语翻译
Index.php
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>How to Translate your Site in Runtime using Jquery - demo</title>
<link rel="stylesheet" href="css/main.css" type="text/css" />
<script src="js/jquery.min.js"></script>
<script src="js/main.js"></script>
</head>
<body>
<div class="example">
<h3><a href="#">How to Translate your Site in Runtime using Jquery - demo</a></h3>
<div id="content">
<div class="lang_switcher">
<button id="en" class="lang">EN</button>
<button id="fr" class="lang">FR</button>
</div>
<div style="clear:both;"></div>
<!-- nav menu start -->
<ul id="nav">
<li><a href="#nogo" key="home" class="tr">Home</a></li>
<li><a href="#nogo" key="peoples" class="tr">Peoples >></a>
<ul>
<li><a href="#nogo" key="all_list" class="tr">All list</a></li>
<li><a href="#nogo" key="online" class="tr">Online</a></li>
</ul>
</li>
<li><a href="#nogo" key="articles" class="tr">Articles >></a>
<ul>
<li><a href="#nogo" key="js" class="tr">JavaScript</a></li>
<li><a href="#nogo" key="php" class="tr">PHP</a></li>
<li><a href="#nogo" key="html" class="tr">HTML</a></li>
<li><a href="#nogo" key="css" class="tr">CSS</a></li>
</ul>
</li>
<li><a href="#nogo" key="contact_us" class="tr">Contact us</a></li>
</ul>
<!-- nav menu end -->
<div style="clear:both;"></div>
<h2 key="welcome" class="tr">Welcome guests</h2>
<hr />
<div key="a_man" class="tr">A man bribes a rabbit with wicked dentures to run away with him in a sailboat via an ambulance. Bribing Koalas to remain illegally in one place. Trees anchor me in place. / Your mom drives the ambulance, but the city is farther than it appears.</div>
</div>
</div>
</body>
</html>
还有一些css-main.css
body{background:#eee;font-family:Verdana, Helvetica, Arial, sans-serif;margin:0;padding:0}
.example{background:#FFF;width:500px;height:500px;font-size:80%;border:1px #000 solid;margin:0.5em 10% 0.5em;padding:1em 2em 2em;-moz-border-radius:3px;-webkit-border-radius:3px}
.lang_switcher{float:right;overflow:hidden;}
/* nav menu styles */
#nav,#nav ul{list-style:none;font:10px verdana, sans-serif;border:1px solid #000;background:#fff;position:relative;z-index:200;border-color:#eca #b97 #a86 #edb;border-width:1px 2px 2px 1px;margin:0;padding:0 0 5px}
#nav{height:25px;padding:0}
#nav table{border-collapse:collapse}
#nav li{float:left;padding:0 20px 0 10px}
#nav li li{float:none}
#nav li a li{float:left}
#nav li a{display:block;float:left;color:#888;height:25px;padding-right:5px;line-height:25px;text-decoration:none;white-space:nowrap}
#nav li li a{height:20px;line-height:20px;float:none}
#nav li:hover{position:relative;z-index:300;background:#fff}
#nav a:hover{position:relative;z-index:300;text-decoration:underline;color:#b75}
#nav :hover ul{left:0;top:22px}
#nav a:hover ul{left:-10px}
#nav li:hover li:hover > ul{left:-15px;margin-left:100%;top:-1px}
#nav li:hover > ul ul{position:absolute;left:-9999px;top:-9999px;width:auto}
#nav li:hover > a{text-decoration:underline;color:#b75}
#nav a:hover a:hover ul,#nav a:hover a:hover a:hover ul,#nav a:hover a:hover a:hover a:hover ul,#nav a:hover a:hover a:hover a:hover a:hover ul{left:100%;top:-1px}
#nav ul,#nav a:hover ul ul,#nav a:hover a:hover ul ul,#nav a:hover a:hover a:hover ul ul,#nav a:hover a:hover a:hover a:hover ul ul{position:absolute;left:-9999px;top:-9999px}
我上了一节课来做我的
class WILang
{
}不,这不是一个选项,因为翻译必须是专业的,网站的设计也必须是专业的,即没有一些难看的谷歌翻译和框架。这如何解决我的问题?这并没有改变我在HTML中使用翻译的方式,因为我已经实现了一个后端,我看不出有什么好处。首先,你的问题是你确实使用PHP,这是进行语言翻译的标准和最佳方式,比使用PHP数组要好得多。一个基本的搜索将支持这些陈述,但是如果你知道一个更好的解决方案,那就去吧。就像我说的,你的解决方案并不比我的好,也不会给我的问题带来任何好处。翻译就是这样做的。您可以提供一个字符串/键来直接从资源文件中查找,该文件将根据您的应用程序状态当前使用的语言检索正确的值。或者创建指定页面的副本,只需将翻译文本替换为英文文本,并将用户路由到子域(例如es.mySite.com)。这些基本上是i18n-lookup或复制代码的唯一两种方法。您建议的两个链接都不可用。
class WILang
function __construct()
{
$this->WIdb = WIdb::getInstance();
}
public static function all($jsonEncode = true) {
// determine lanuage
$language = self::getLanguage();
//echo $language;
$WIdb = WIdb::getInstance();
//$file = WILang::getFile($language);
//echo $file;
//echo $language;
if ( ! self::isValidLanguage($language) )
die('Language file doesn\'t exist!');
else {
$sql = "SELECT * FROM `wi_trans` WHERE `lang` = :file";
$query = $WIdb->prepare($sql);
$query->bindParam(':file', $language, PDO::PARAM_STR);
$query->execute();
//$result = array();
while ($result = $query->fetchAll(PDO::FETCH_ASSOC)) {
echo "{";
foreach ($result as $res) {
echo '"' .$res['keyword'] .'":"' . $res['translation'] . '",';
//return array($res['keyword'] => $res['translation'] ,);
}
echo "}";
}
}
}
public static function get($key ) //, $bindings = array()
{
// determine language
$language = self::getLanguage();
$WIdb = WIdb::getInstance();
$sql = "SELECT * FROM `wi_trans` WHERE `keyword`=:key AND lang=:lang";
$query = $WIdb->prepare($sql);
$query->bindParam(':key', $key, PDO::PARAM_STR);
$query->bindParam(':lang', $language, PDO::PARAM_STR);
$query->execute();
$res = $query->fetch(PDO::FETCH_ASSOC);
if($res > 0)
return $res['translation'];
else
return '';
}
public static function setLanguage($language)
{
// check if language is valid
if ( self::isValidLanguage($language) ) {
//set language cookie to 1 year
setcookie('wi_lang', $language, time() + 60 * 60 * 24 * 365, '/');
// update session
WISession::set('wi_lang', $language);
//refresh the page
header('Location: ' . $_SERVER['PHP_SELF']);
}
}
public static function getLanguage()
{
// check if cookie exist and language value in cookie is valid
if ( isset ( $_COOKIE['wi_lang'] ) && self::isValidLanguage ( $_COOKIE['wi_lang'] ) )
return $_COOKIE['wi_lang']; // return lang from cookie
else
return WISession::get('wi_lang', DEFAULT_LANGUAGE);
}
private static function getTrans($language)
{
$WIdb = WIdb::getInstance();
//$file = WILang::getFile($language);
//echo $file;
//echo $language;
if ( ! self::isValidLanguage($language) )
die('Language file doesn\'t exist!');
else {
//$language = include $file;
//return $language;
$sql = "SELECT * FROM `wi_trans` WHERE `lang` = :file";
$query = $WIdb->prepare($sql);
$query->bindParam(':file', $language, PDO::PARAM_STR);
$query->execute();
//$result = array();
while ($result = $query->fetchAll(PDO::FETCH_ASSOC)) {
echo "{";
foreach ($result as $res) {
echo '"' .$res['keyword'] .'":"' . $res['translation'] . '",';
//return array($res['keyword'] => $res['translation'] ,);
}
echo "}";
}
}
}
private static function getFile($language)
{
$WIdb = WIdb::getInstance();
$sql = "SELECT * FROM `wi_lang` WHERE `lang` = :file";
$query = $WIdb->prepare($sql);
$query->bindParam(':file', $language, PDO::PARAM_STR);
$query->execute();
$res = $query->fetch(PDO::FETCH_ASSOC);
//echo $res['lang'];
if ($res > 0)
return $res['lang'];
else
return '';
}
private static function isValidLanguage($lang)
{
$file = self::getFile($lang);
//echo $file;
if($file == "")
//if ( ! file_exists( $file ) )
return false;
else
return true;
}