2013-06-10 15 views
6

Niedawno zacząłem wdrażać opcje językowe dla mojej witryny. Oto, jak to działa:Dynamiczne przełączanie języka PHP, JavaScript, jQuery UI

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; 

Ładuje odpowiedni plik językowy u góry każdej strony w mojej witrynie. Jednak problemy zaczynają się pojawiać podczas korzystania z datepicker jQuery's UI. Znalazłem plik regionalnego ustawienia dla datepicker online i stworzyliśmy osobny plik dla niego:

///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']); 
}); 

Zagadnienie to muszę dynamicznie ładować jquery.ui.datepicker-fr.js gdy zmiana języka jest wykrywany, tak że moje przełączniki Datepicker na francuski. Zastanawiałem się nad utworzeniem funkcji PHP, którą wstawiłbym do swojego pliku <head>, która mogłaby wywołać echo mojego pliku, ale problem polega na tym, że nie wszystkie moje strony są PHP i nie uważam tego za bardzo skuteczną metodę. Jakieś inne pomysły, jak to zrobić?

+1

Dlaczego nie czytać pliku cookie w javascript, a następnie na podstawie tego pobrać prawidłowy plik lokalizacyjny? –

+0

Myślę, że efektywną metodą może być wyodrębnianie informacji 'lang cookie' przez' datepicker.js' i ładowanie odpowiednio – progrrammer

+0

Hmm, ładowanie ciasteczka byłoby opcją .. – Dimitri

Odpowiedz

1

Musisz umieścić czek w header.php które będą idzie tak:

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

Tak będzie automatycznie wykryć datepicker pliku w zależności od parametru języka.

0

Co sądzisz o tym podejściu?

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(); 

Funkcje znajdowałby się we wspólnym pliku JS i chciałbym wywołać funkcję getLang() na wszystkich moich stron ...

0

Jak na temat korzystania .change() i .post()? Dodajesz id języka do formularza, w którym użytkownik może zmienić język.

$('#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; 
}); 
0

Możesz użyć wtyczki do ciasteczek jQuery, dobrej. Następnie wykonaj tę samą procedurę z jQuery, co w przypadku php. Jeśli język podany jako parametr url - ustaw plik cookie z wtyczką (pobierz wartość języka za pomocą funkcji getBaseURL() powyżej). W przeciwnym razie załaduj plik cookie, a następnie załaduj odpowiedni plik javascript. Coś takiego jak $('head').append('<script..'); powinno wykonać zadanie.

Upewnij się, aby uruchomić ten cały skrypt na stronie obciążenia z $(function() { /* code here */ });

Chociaż jest to możliwe do wykonania zadania w ten sposób, to bardzo polecam włączenie wszystkich stron do PHP, gdyż upraszcza rzeczy jak ten.

1

chciałbym zrobić w ten sposób, mieć oddzielny plik PHP odpowiedzialny za uzyskanie poprawny plik JS, ten sposób można go używać na stronach HTML programu, jak również ...

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

Ulepszona wersja odpowiedzi Moeed za :



Musisz umieścić czek w header.php które będą idzie tak:

<script src="/js/<?php echo 'datepicker-' . *COOKIE/SESSION VALUE, LIKE en* . '.js'; ?>"></script> 

ten będzie dynamicznie wybrać datepicker-???.js WH ere ??? to wartość reprezentowana przez plik cookie/plik cookie sesji.