到目前为止,我的网站只是一个单语言网站。
我有我的文件(假设):
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
...
答案 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}的任何其他变量一样处理和传递},GET
,POST
,COOKIE
,XMLHttpRequest
,HTTP headers
,HTTP referer
,URL hash parameter
,database session
。 ..
如果您关心APC (Alternative PHP Cache)
和UX
,SEO
变量应该写在网址中。我更喜欢使用$ _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