【问题标题】:How can I change my multilingual urls from this example.com/index.php?lang=en to this example.com/en/?如何将我的多语言 URL 从这个 example.com/index.php?lang=en 更改为这个 example.com/en/?
【发布时间】:2011-03-11 11:23:43
【问题描述】:

有人告诉我example.com/enexample.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;
?>

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;
?>

【问题讨论】:

  • 您的 LiteSpeed 网络服务器提供Apache compatible mod-rewrite support,所以这就是要走的路。
  • 您应该注意 Accept-Language 是加权值列表。附加的 q 参数告诉您该值的偏好,而不是它的顺序。事实上,0q 值意味着该选项根本不被接受。这意味着您应该更好地解析列表,按它们的 q 值对值进行排序并找到最佳匹配。

标签: php url .htaccess mod-rewrite


【解决方案1】:

ModRewrite 是你的朋友。将其放入您的 .htaccess 文件中。您可能希望它转到您的会话页面而不是索引,然后使用 PHP 重定向。 注意,这只适用于一个页面。

RewriteEngine On
RewriteBase /

# Redirect languages
RewriteRule ^(en|es|zh\-tw|zh\-cn)/?$ index.php?lang=$1 [L]

【讨论】:

  • @Jason McCreary 感谢您的回复。但是你怎么做呢? -> “您可能希望它转到您的会话页面而不是索引”?
  • 我不知道你的网站结构,所以我想你可能想在会话中设置它们的语言。你有一个多页的网站吗?这将简单地将请求重定向到语言子目录到 index.php 并动态设置 lang 参数。
  • @Jason McCreary 是的,我的页面只有 index.php,但是我怎样才能为具有多个 php 文件的页面实现相同的效果?
  • 架构有所不同。有些具有每种语言的物理目录和在每种语言中复制的文件。有些使用子域,有些可能使用 mod_rewrite。这取决于。以上是特定于您当前的一页网站。对于多页站点,您需要更强大的RewriteRule。它需要剥离语言并将其附加到查询字符串中,同时保持原始请求。
  • @Marcel Korpel Weird,我测试了 mod_rewrite 是否在我的 WAMP 中工作(它有效),并且完全按照你说的做了。但是网址还是 index.php?lang=something.
猜你喜欢
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 2021-08-25
相关资源
最近更新 更多