如何将我的多语言网址从 example.com/index.php?lang=en 更改为 example.com/en/?
有人告诉我 example.com/en
比 example.com/index.php?lang=en
更友好。 如何将 URL 最后一部分从 ?lang=en
更改为 /en
/?
(pd:我不想使用 gettext 或任何像 zend 这样的框架来完成此任务)
这就是我国际化和本地化我的网页的方式:(
现场示例:alexchen.co.nr/)
lang.php:
<?php
function dlang($Var) {
if(empty($GLOBALS[$Var])) {
$GLOBALS[$Var]=(!empty($GLOBALS['_SERVER'][$Var]))?
$GLOBALS['_SERVER'][$Var]:
(!empty($GLOBALS['HTTP_SERVER_VARS'][$Var]))?
$GLOBALS['HTTP_SERVER_VARS'][$Var]:'';
}
}
function language() {
// Detect HTTP_ACCEPT_LANGUAGE & HTTP_USER_AGENT.
dlang('HTTP_ACCEPT_LANGUAGE');
dlang('HTTP_USER_AGENT');
$_AL=strtolower($GLOBALS['HTTP_ACCEPT_LANGUAGE']);
$_UA=strtolower($GLOBALS['HTTP_USER_AGENT']);
// Try to detect Primary language if several languages are accepted.
foreach($GLOBALS['_LANG'] as $K) {
if(strpos($_AL, $K)===0)
return $K;
}
// Try to detect any language if not yet detected.
foreach($GLOBALS['_LANG'] as $K) {
if(strpos($_AL, $K)!==false)
return $K;
}
foreach($GLOBALS['_LANG'] as $K) {
if(preg_match("/[\[\( ]{$K}[;,_\-\)]/",$_UA))
return $K;
}
// Return default language if language is not yet detected.
return $GLOBALS['_DLANG'];
}
// Define default language.
$GLOBALS['_DLANG']='zh-tw';
// Define all available languages.
// WARNING: uncomment all available languages
$GLOBALS['_LANG'] = array(
'en',
'es',
'zh-tw',
'zh-cn'
);
?>
session.php:
<?php
//proc all page display
include('lang.php'); //language detector
class Session
{
var $lang; //Username given on sign-up
var $url; //The page url current being viewed
var $referrer; //Last recorded site page viewed
/* Class constructor */
function Session() {
$this->time = time();
$this->startSession();
}
function cf($filename) { //function to clean a filename string so it is a valid filename
$fp = explode('/',$filename);
$num = count($fp);
return $fp[$num-1];
}
/**
* startSession - Performs all the actions necessary to
* initialize this session object. Tries to determine if the
* the user has logged in already, and sets the variables
* accordingly. Also takes advantage of this page load to
* update the active visitors tables.
*/
function startSession() {
session_start(); //Tell PHP to start the session
/* Set referrer page */
if(isset($_SESSION['url'])) {
$this->referrer = $search = $this->cf($_SESSION['url']);
}
else {
$this->referrer = "/";
}
/* Set current url */
$this->url = $_SESSION['url'] = $this->cf($_SERVER['PHP_SELF']);
/* Set user-determined language: */
//set up languages array:
//set cookie
$langs = array('en','es','zh-tw', 'zh-cn');
if(isset($_GET['lang'])){
if(in_array($_GET['lang'],$langs)){
$this->lang = $_SESSION['lang'] = $_GET['lang'];
setcookie("lang", $_SESSION['lang'], time() + (3600 * 24 * 30));
}
}
else if(isSet($_COOKIE['lang'])) {
$_SESSION['lang'] = $_COOKIE['lang'];
}
else {
$_SESSION['lang'] = 'zh-tw';
}
}
};
/**
* Initialize session object - This must be initialized before g
* the form object because the form uses session variables,
* which cannot be accessed unless the session has started.
*/
$session = new Session;
?>
本地化.php:
<?php
include('session.php'); //language detector
// determine the value of $lang_file according the one in $lang
$languages = array('en', 'es', 'zh-tw', 'zh-cn');
if (in_array($_SESSION['lang'], $languages)) {
$lang_file = 'lang.'.$_SESSION['lang'].'.php';
} else {
$lang_file = 'lang.zh-tw.php';
}
// translation helper function
function l($localization) {
global $lang;
return $lang[$localization]; }
// include file for final output
include_once 'languages/'.$lang_file;
?>
Somebody told me that example.com/en
is more friendly than example.com/index.php?lang=en
.
How can I change my URL last part from ?lang=en
to /en
/?
(pd: I don't want to use gettext or any framework like zend to accomplish this)
This is how I'm internationalizing and localizing my web page:
(live example: alexchen.co.nr/)
lang.php:
<?php
function dlang($Var) {
if(empty($GLOBALS[$Var])) {
$GLOBALS[$Var]=(!empty($GLOBALS['_SERVER'][$Var]))?
$GLOBALS['_SERVER'][$Var]:
(!empty($GLOBALS['HTTP_SERVER_VARS'][$Var]))?
$GLOBALS['HTTP_SERVER_VARS'][$Var]:'';
}
}
function language() {
// Detect HTTP_ACCEPT_LANGUAGE & HTTP_USER_AGENT.
dlang('HTTP_ACCEPT_LANGUAGE');
dlang('HTTP_USER_AGENT');
$_AL=strtolower($GLOBALS['HTTP_ACCEPT_LANGUAGE']);
$_UA=strtolower($GLOBALS['HTTP_USER_AGENT']);
// Try to detect Primary language if several languages are accepted.
foreach($GLOBALS['_LANG'] as $K) {
if(strpos($_AL, $K)===0)
return $K;
}
// Try to detect any language if not yet detected.
foreach($GLOBALS['_LANG'] as $K) {
if(strpos($_AL, $K)!==false)
return $K;
}
foreach($GLOBALS['_LANG'] as $K) {
if(preg_match("/[\[\( ]{$K}[;,_\-\)]/",$_UA))
return $K;
}
// Return default language if language is not yet detected.
return $GLOBALS['_DLANG'];
}
// Define default language.
$GLOBALS['_DLANG']='zh-tw';
// Define all available languages.
// WARNING: uncomment all available languages
$GLOBALS['_LANG'] = array(
'en',
'es',
'zh-tw',
'zh-cn'
);
?>
session.php:
<?php
//proc all page display
include('lang.php'); //language detector
class Session
{
var $lang; //Username given on sign-up
var $url; //The page url current being viewed
var $referrer; //Last recorded site page viewed
/* Class constructor */
function Session() {
$this->time = time();
$this->startSession();
}
function cf($filename) { //function to clean a filename string so it is a valid filename
$fp = explode('/',$filename);
$num = count($fp);
return $fp[$num-1];
}
/**
* startSession - Performs all the actions necessary to
* initialize this session object. Tries to determine if the
* the user has logged in already, and sets the variables
* accordingly. Also takes advantage of this page load to
* update the active visitors tables.
*/
function startSession() {
session_start(); //Tell PHP to start the session
/* Set referrer page */
if(isset($_SESSION['url'])) {
$this->referrer = $search = $this->cf($_SESSION['url']);
}
else {
$this->referrer = "/";
}
/* Set current url */
$this->url = $_SESSION['url'] = $this->cf($_SERVER['PHP_SELF']);
/* Set user-determined language: */
//set up languages array:
//set cookie
$langs = array('en','es','zh-tw', 'zh-cn');
if(isset($_GET['lang'])){
if(in_array($_GET['lang'],$langs)){
$this->lang = $_SESSION['lang'] = $_GET['lang'];
setcookie("lang", $_SESSION['lang'], time() + (3600 * 24 * 30));
}
}
else if(isSet($_COOKIE['lang'])) {
$_SESSION['lang'] = $_COOKIE['lang'];
}
else {
$_SESSION['lang'] = 'zh-tw';
}
}
};
/**
* Initialize session object - This must be initialized before g
* the form object because the form uses session variables,
* which cannot be accessed unless the session has started.
*/
$session = new Session;
?>
localization.php:
<?php
include('session.php'); //language detector
// determine the value of $lang_file according the one in $lang
$languages = array('en', 'es', 'zh-tw', 'zh-cn');
if (in_array($_SESSION['lang'], $languages)) {
$lang_file = 'lang.'.$_SESSION['lang'].'.php';
} else {
$lang_file = 'lang.zh-tw.php';
}
// translation helper function
function l($localization) {
global $lang;
return $lang[$localization]; }
// include file for final output
include_once 'languages/'.$lang_file;
?>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
ModRewrite 是你的朋友。将其放入您的 .htaccess 文件中。您可能希望它转到您的会话页面而不是索引,然后使用 PHP 重定向。 注意,这只适用于一个页面。
ModRewrite is your friend. Throw this in your .htaccess file. You may want it to go to your session page instead of index, then redirect with PHP. Note, this only works for one page.