多语言站点:URL上的语言为dir,文件位于其他位置。如何重定向

时间:2014-07-11 01:37:22

标签: php .htaccess url multilingual

到目前为止,我的网站只是一个单语言网站。

我有我的文件(假设):

www.mysite.com/files/index.php
www.mysite.com/files/header.php
www.mysite.com/files/page1.php
www.mysite.com/files/page2.php

现在我为这些文件添加了多语言支持。所有单词/文本都存储在数据库中,而php类则完成了这些内容。

到目前为止,我已经(严重地)header.php这一行:

define('LNG', 'en');

我在每个语言目录上放置了一个header.php文件:

www.mysite.com/en/header.php
www.mysite.com/de/header.php
...

然后我根据LNG常量包含文件,例如

include_once "/files/page1.php?l=".LNG

但我知道这是一个非常糟糕的做法!

我该如何解决这个问题?我会在www.mysite.com/files/...上保存我的文件,然后在URL中编写用户语言,以便文件可以从URL读取语言并从数据库中加载正确的文本和单词。

排序:

www.mysite.com/en/index.php

实际上加载了

www.mysite.com/index.php

使用正确的语言en。我可以从网址获取en并在页面上定义常量,但如果我指向www.mysite.com/en/index.php,我显然会得到404 ...

1 个答案:

答案 0 :(得分:2)

处理多语言网络应用程序

LANGUAGE CONSTANTS 可以放在语言目录中的语言文件中

/ languages
  en.php
  it.php
  ...

语言文件可能如下所示

// en.php
define("THANK_YOU", "Thank you!");
define("PRODUCTS", "Products");
define("PRODUCT", "Product");
...

// it.php
define("THANK_YOU", "Grazie!");
define("PRODUCTS", "Prodotti");
define("PRODUCT", "Prodotto");
....

或者它们可以存储到数据库中,如下所示。我已经使用了两者,但我更喜欢第一种解决方案

+------------+------------+------------+-----
| constant   | en         | it         | ...
+------------+------------+------------+-----
| THANK_YOU  | Thank you! | Grazie!    |
| PRODUCTS   | Products   | Prodotti   |
| PRODUCT    | Product    | Prodotto   |
| ...        | ...        | ...        |
+------------+------------+------------+-----

FRIENDLY URLs 可能如下所示

http://www.domain.com
http://www.domain.com/en
http://www.domain.com/it
http://www.domain.com/en/products
http://www.domain.com/it/prodotti
http://www.domain.com/en/product/our-best-product/555
http://www.domain.com/it/prodotto/il-nostro-miglior-prodotto/555

考虑应在.htaccess档案

中定义的规则
RewriteRule ^([a-z]+)(/)?$                                    index.php?lang=$1 [QSA,L]
RewriteRule ^([a-z]+)/(products|prodotti)(/)?$                index.php?lang=$1&action=$2 [NC,L]
RewriteRule ^([a-z]+)/(product|prodotto)/(.*)/([0-9]+)(/)?$   index.php?lang=$1&action=$2&id=$4&mode=details [NC,L]

# these rules are for a demonstration purpose; otherwise, all three directives 
# could be written in one singe line / rule   

或者您可以将请求(如下所示)重定向到入口点并使用parse_url()进行解析。

RewriteCond  %{REQUEST_FILENAME} !-f
RewriteCond  %{REQUEST_FILENAME} !-d
RewriteRule  ^(.*)$ index.php?param=$1 [QSA,L] 

ACCESSING THE lang VARIABLE - 在多语言项目中,变量lang具有特殊意义,否则将像使用{{1}的任何其他变量一样处理和传递},GETPOSTCOOKIEXMLHttpRequestHTTP headersHTTP refererURL hash parameterdatabase session。 ..

如果您关心APC (Alternative PHP Cache)UXSEO变量应该写在网址中。我更喜欢使用$ _SESSION或$ _GET,并且应该指出上面提到的某些方法不能始终工作或者可能被代理阻止。

下面的代码段显示了如何使用$ _SESSION或$ _GET

访问它
lang

// config.php // ... $cfgObj->default_language = "en"; // ... $_SESSION["lang"] = isset($_GET["lang"]) ? $_GET["lang"] : $cfgObj->default_lang; include($cfgObj->dir_languages . $_SESSION["lang"] . ".php"); // index.php switch(isset($_GET["action"]) ? $_GET["action"] : "default"){ case PRODUCTS: case PRODUCT: case 3: // deal with products break: case ARTICLES: case ARTICLE: case 5: // deal with articles break: default: // deal with short-links // domain.com/3/555 <-- this would retrieve product with id 555 break; } 可以设计如下

DATABASE SCHEMA