为所有网站URL添加语言的聪明方法?

时间:2013-12-07 20:32:23

标签: php .htaccess translation

今年我写了一个非常大的网站,没有CMS。我是从头开始写的。今天我开始实施翻译系统。

基本上,想法是在URL中添加/language/。这意味着,当我浏览默认语言时,索引页面具有URL

http://www.racebooking.net/index.php

一旦用户点击英国国旗以查看该网站的英文版本,该网址将变为

http://www.racebooking.net/en/index.php

在.htaccess中,我有一条将/en/转换为?lang=en的规则。

问题

每个页面都有大量的链接,这意味着我的网站上有数千个<a href=".."></a>个标签。

例如,在我的index.php页面上,我有一个像这样的链接

<a href="http://www.racebooking.net/forum">Forum</a>

如果我目前正在浏览英文版本,应该指向

http://www.racebooking.net/en/forum
乍一看,我的想法是将其改为

<a href="http://www.racebooking.net/<?php echo $_GET['lang'] . '/';?>forum">Forum</a>

效果很好!但是,问题是我的网站上有数以千计的<a>标签!改变所有这些都是完全疯狂的,只需在其中添加<?php echo $_GET['lang'] . '/';?>!这将需要数天,数天和数天的工作。

那么,有没有一种聪明的方法可以将/language/添加到我的所有网站网址中?

修改

我不想使用任何js。禁用js的所有用户在浏览我的网站时都会遇到问题!

5 个答案:

答案 0 :(得分:4)

HTTP permanent redirect status code (301)完全符合您的情况。您网站的所有链接仍然有效,此外,任何书签都会更新到您的新网址路径构建。

您可以使用mod_rewrite在

中在Apache中进行设置
RewriteRule /(?!en|es|de|fr|it)(/?.*)$ http://www.mydomain.com/en/$1 [R=301,L]

这将重定向每个网址路径,该路径不以enesdefrit开头{{1 (默认)子路径。

编辑评论:

上述解决方案可以让您的所有链接都能正常工作(新旧链接)。

如果您还想更改页面上的所有链接,以便搜索引擎可以看到它们,那么您唯一的选择是在PHP / HTML代码中重写它们(使用JavaScript这是一个坏主意,原因有很多) )。

在这种情况下,最好的选择是编写辅助函数,根据当前语言为您生成链接。通过这种方式,您将拥有一个单点,您可以在其中更改链接,如果它们将来再次更改。

很遗憾,您无法一次更改所有链接。如果你有数千个,并且没有生成所有这些代码的公共代码,那么你必须逐个完成。好消息是,您不是第一个遇到此问题的人,专业IDE的开发人员已经实施了工具来帮助您。我个人的选择是商业软件,但其他开源IDE也有很好的查找/替换选项。例如,您可以编写正则表达式,它将找到您的链接并根据您提供的规则替换它们。写一个好的正则表达式替换器可能被证明是非常有益的,而不是逐个审查所有链接。

这是url helper的可能实现之一:

en

现在你必须找到所有链接被输出的地方并使用帮助器:

class UrlHelper
{
    public static function make($base, $lang = null)
    {
        if ( $lang === null ) {
            $lang = 'en';
            if ( isset($_GET['lang']) ) {
                $lang = $_GET['lang'];
            }
        }
        $url = "http://www.racebooking.net/{$lang}/{$base}";
        return $url;
    }
}

请注意,这只是它如何工作的一个例子。我实际上不建议将帮助器实现为静态方法,因为static is pure evil。对于您的实际实现,您可以考虑使用辅助对象而不是帮助方法

答案 1 :(得分:0)

编写一个小型Java程序(或您最喜欢的任何其他语言),迭代所有网站文件和更改:

<a href="http://www.racebooking.net/ ...>

in

<a href="http://www.racebooking.net/<?php echo $_GET['lang'] . '/';?>

或使用jQuery并在每个页面中包含这样的函数:

$('a').click(function () {
     var oldhref = $(this).attr('href');
     // change href string here, e.g. insert /language/
     $(this).attr('href', newhref);
});

此函数将更改页面上每个锚标记的href。

答案 2 :(得分:0)

告诫,这只是一个想法......其他人可以改进这个答案:

您可以使用jquery修改客户端上的链接。所以你有一个JS函数来使用jquery在现有标签上重建url。您只需将变量发送到每页顶部的JS。我假设你在每个页面上都有某种包含功能,所以你可以在不修改每一页的情况下添加一些代码。

例如(未经测试)......

//top of page
var lang = <?php echo $lang?>; //this is the language

//this function takes a url and adds a language variable to the end
function updateurl(url) { 
 url = url + '?lang=' + lang;
}

//this loops through each anchor on the page and adds the language to the querystring
$( "a" ).each(function( index ) {
  jquery(this).attr('href') = update(jQuery(this).attr('href'))
});

答案 3 :(得分:0)

如果您不想挑选每个链接,可以使用我的JS代码。

Javascript目前没有任何内置的输出GET值的可能性,所以你首先需要将lang-value放在一个小的HTML元素中,然后JS从中获取内容:

<div class="current-lang"><?php echo $_GET['lang']; ?></div>

如果您愿意,可以在CSS的帮助下隐藏元素。 (如示例所示。)

JS-Example: http://jsfiddle.net/leo/BH9nf/(需要jQuery)

这是很多工作,所以我希望得到积极的投票。

答案 4 :(得分:-1)

您可以尝试在会话中存储该语言,然后在您的页面上检查它,如果找不到,则可以默认为英语。

<?
start_sesssion();
$_SESSION["lang"]="en";

Other File
/*****************\
start_session();
if($_SESSION["lang"]=="en")
     english();