【问题标题】:Dynamically switching language PHP,Javascript, jQuery UI动态切换语言 PHP,Javascript, jQuery UI
【发布时间】:2013-06-05 15:10:34
【问题描述】:

我最近开始为我的网站实施语言选项。以下是它的基本工作原理:

if(isset($_GET['lang']))
{
    $langr= $_GET['lang'];
    $_SESSION['lang'] = $langr;
    setcookie('lang', $langr, time() + (3600 * 24 * 30));
}
elseif(isset($_SESSION['lang']))
{
    $langr = $_SESSION['lang'];
}
elseif(isset($_COOKIE['lang']))
{
    $langr = $_COOKIE['lang'];
}
else
{
    $langr = 'en';
}
switch ($langr) 
{
  case 'en':
  $lang_file = $_SERVER['DOCUMENT_ROOT']."/includes/lang/en.php";
     break;
  case 'fr':
  setlocale (LC_ALL, 'fr_FR.utf8','fra'); 
  $lang_file = $_SERVER['DOCUMENT_ROOT']."/includes/lang/fr.php";
     break;

  default:
  $lang_file = $_SERVER['DOCUMENT_ROOT']."/includes/lang/en.php";

}
include_once $lang_file;

它会在我网站的每个页面顶部加载适当的语言文件。但是,使用 jQuery 的 UI 日期选择器时开始出现问题。我在网上找到了 datepicker 的区域设置文件,并为它创建了一个单独的文件:

///jquery.ui.datepicker-fr.js  file

jQuery(function($){
    $.datepicker.regional['fr'] = {
        closeText: 'Fermer',
        prevText: 'Précédent',
        nextText: 'Suivant',
        currentText: 'Aujourd\'hui',
        monthNames: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin',
            'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],
        monthNamesShort: ['janv.', 'févr.', 'mars', 'avril', 'mai', 'juin',
            'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],
        dayNames: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],
        dayNamesShort: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],
        dayNamesMin: ['D','L','M','M','J','V','S'],
        weekHeader: 'Sem.',
        dateFormat: 'dd/mm/yy',
        firstDay: 1,
        isRTL: false,
        showMonthAfterYear: false,
        yearSuffix: ''};
    $.datepicker.setDefaults($.datepicker.regional['fr']);
});

问题是我需要在检测到语言更改时动态加载jquery.ui.datepicker-fr.js,以便我的日期选择器切换到法语。我在想的是创建一个 PHP 函数,我将其放入我的 <head> 中,它会回显我的文件,但问题是并非我的所有网页都是 PHP,我认为这不是一个非常有效的方法.关于如何做到这一点的任何其他想法?

【问题讨论】:

  • 为什么不让 javascript 读取 cookie,然后在此基础上下载正确的本地化文件?
  • 我认为有效的方法是通过datepicker.js提取lang cookie信息并相应加载
  • 嗯,加载 cookie 将是一个选项..
  • 我假设无法使用 PHP 制作所有页面,您唯一的其他选择是使用 javascript 加载特定于语言的文件。
    here is an artical on redirecting from the htaccess。您可以根据 cookie 将 en 文件重定向到 fr 文件,也可以根据 get 值重定向!祝你好运,让我知道你过得怎么样!

标签: php javascript jquery jquery-ui


【解决方案1】:

您需要在 header.php 中进行检查,如下所示:

<script type="text/javascript>" src="/js/<?php if($_SESSION['lang'] == "en"){ echo 'datepicker-en.js'}else echo 'datepicker-fr.js'; ?>"></script>

所以它会根据你的语言参数自动检测datepicker文件。

【讨论】:

    【解决方案2】:

    我会这样做,有一个单独的 PHP 文件负责获取正确的 JS 文件, 这样你也可以在计划的 HTML 页面中使用它......

    <script type="text/javascript" src="/getCorrectJsFile.php"></script>
    

    【讨论】:

      【解决方案3】:

      您如何看待这种方法?

      function getBaseURL()
      {
          var url = location.href;
          var baseURL = url.substring(0, url.indexOf('/', 14));
          if (baseURL.indexOf('http://localhost') != -1)
          {
              var url = location.href; 
              var pathname = location.pathname;  
              var index1 = url.indexOf(pathname);
              var index2 = url.indexOf("/", index1 + 1);
              var baseLocalUrl = url.substr(0, index2);
              return baseLocalUrl + "/";
          }
          else
          {
              return baseURL + "/";
          }
      }
      
      function getCookie(c_name)
      {
          var i,x,y,ARRcookies=document.cookie.split(";");
          for (i=0;i<ARRcookies.length;i++)
          {
              x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
              y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
              x=x.replace(/^\s+|\s+$/g,"");
              if (x==c_name)
              {
                  return unescape(y);
              }
         }
      }
      
      
      function getLang()
      {
          var lang = getCookie("lang");
          switch(lang)
          {
              case "fr":
                  document.write("<script src='"+getBaseURL()+"js/lang/jquery.ui.datepicker-"+lang+".js'></script>");
                  break;
              default:
                  document.write("");
          }
      }
      getLang();
      

      这些函数将位于一个通用 js 文件中,我会在我的所有页面上调用 getLang() 函数...

      【讨论】:

        【解决方案4】:

        使用 .change() 和 .post() 怎么样?您将 lang 的 id 添加到用户可以更改语言的表单中。

        $('#lang').change(function(){
                   //link to your php file
            var findlangfile = "<?php echo index.php/findlang.php;?>
            $.post(findlangfile, {
                lang: $('#lang').val(),
            }, function(response){
                // you do things
            });
            return false;
        });
        

        【讨论】:

          【解决方案5】:

          你可以使用 jQuery cookie 插件,一个不错的插件。然后用 jQuery 和 php 做同样的过程。如果语言作为 url 参数提供 - 使用插件设置 cookie(使用上面的 getBaseURL() 函数获取语言值)。否则加载 cookie,然后加载适当的 javascript 文件。 $('head').append('&lt;script..'); 之类的东西应该可以完成这项任务。

          确保在页面加载时使用$(function() { /* code here */ }); 运行整个脚本

          虽然可以通过这种方式完成任务,但我强烈建议您将所有页面切换到 php,因为这样可以简化类似这样的操作。

          【讨论】:

            【解决方案6】:

            Moeed 回答的改进版:



            您需要在 header.php 中进行检查,如下所示:
            <script src="/js/<?php echo 'datepicker-' . *COOKIE/SESSION VALUE, LIKE en* . '.js'; ?>"></script>
            

            这将动态选择datepicker-???.js,其中??? 是cookie/session-cookie 表示的值。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多