2013-04-16 2 views
0

내가 가지고있는 ?setLang 매개 변수는 URL

if (isSet($_GET["setLang"])) { 
    setcookie("lang",$_GET["setLang"]); 
} 

if (!isSet($_COOKIE["lang"])) { 
    //negociate language and set locale 
}else{ 
    //set locale to cookie 
} 

//translate with gettex 

내가 이동에있을 때 쿠키를 설정이 PHP 코드 website.com/?setLand=en 정확히 예상대로 작동합니다. gettext를 번역가 작동하지 않는 링크를 통해,

<a href="?setLang=en">en</a> 

나는 그것을 클릭하면 (직접 이동하지 않음) : 내가 website.com에서이 형태로 URL에 연결할 때

문제는 그렇지 않으면 예상대로 작동합니다.

내 첫번째 생각은 내가 새로 고침의 어떤 종류를 강제해야한다고, 그래서 내가 그랬어 :

<a href="?setLang=en" onClick="window.location.reload(true);">en</a> 

그러나 그것은 작동하지 않습니다.

코드를 검사했는데 링크를 클릭하면 쿠키가 설정되어 사실을 더욱 혼란스럽게합니다.



단지의 경우에 전체 코드는 다음

<?php 
if (isSet($_GET["setLang"])) { 
    setcookie("lang",$_GET["setLang"]); 
} 
if (!isSet($_COOKIE["lang"])) { 
    $langs = array(
     'en-US',// default 
     'fr', 
     'fr-FR', 
     'de', 
     'de-DE', 
     'de-AT', 
     'de-CH', 
    ); 
    $locale = substr(http_negotiate_language($langs), 0, 2); 
}else{ 
    $locale = $_COOKIE["lang"]; 
} 

//if (isSet($_GET["locale"])) $locale = $_GET["locale"]; 
if($locale == "en") 
    $locale = "en_US.utf8"; 
if($locale == "de") 
    $locale = "de_DE.utf8"; 
if($locale == "fr") 
    $locale = "fr_FR.utf8"; 

putenv("LC_ALL=$locale"); 
setlocale(LC_ALL, $locale); 

// Specify location of translation tables 
bindtextdomain("translation", "locale"); 

// Choose domain 
textdomain("translation"); 

// Translation is looking for in ./locale/de_DE/LC_MESSAGES/myPHPApp.mo now 

// Print a test message 
//echo _("title"); 
?> 

및 링크 : 당신이 링크가있을 때

... 
<a href="?setLang=en" onClick="window.location.reload(true);">en</a> 
... 
+0

쿠키는 website.com에서 작동하지만 localhost 또는 FQDN없이 링크를 사용할 때 할당 된 IP가 아닙니다. // 또 다른 디버깅/테스트 방법은 모든 쿠키를 보는 것입니다. print_r ($ _ COOKIE); ' – ndasusers

+0

흥미로 우며, 서버에서 직접 시도해 보겠습니다. 내가 검사 할 때 쿠키가 랑 (lang)이라고 불리는 것으로 설정되어 있지만 $ _COOKIE를 인쇄하면 표시되지 않습니다 ... – Trufa

+0

@ndasusers 그래서 나는 행운이없는 서버에서, $ _COOKIE를 출력 할 때 다음과 같은 결과를 얻었습니다. 메인 도메인에 도착했을 때 :'Array ([force_locale] => en [hl] => en)' 링크를 클릭하면'Array ([force_locale] => en [hl] => en)'(변경 없음)하고 링크를 직접 새로 고치거나 입력 할 때'Array ([lang] => de [force_locale] = > ko [hl] => ko)' – Trufa

답변

1

setcookie() 출력에 헤더를 추가하고 $_COOKIE 자동 전역을 변경하지 않습니다.

if (isSet($_GET['setLang'])) { 
    $locale = $_GET['setLang']; 
    setcookie('lang', $locale); 
} elseif (isSet($_COOKIE['lang'])) { 
    $locale = $_COOKIE['lang']; 
} else { 
    $langs = array('en-US', 'fr', 'fr-FR', 'de', 'de-DE', 'de-AT', 'de-CH'); 
    $locale = substr(http_negotiate_language($langs), 0, 2); 
} 

원하는대로 할 수 있습니다.

+0

그래서 내가 한 것은 우연히도 맞을 것입니까? 내가 설정 한 쿠키 만 만들어졌다.'$ _COOKIE [ 'lang'] = $ _ GET [ 'setLang']; setcookie ("lang", $ _ GET [ 'setLang']);'?? – Trufa

+0

작동 할 수도 있지만 요청 변수에는 쓰지 말아야합니다. '$ locale'에 값을 넣으므로 올바른 해결책이됩니다. – nibra

+0

흠, 당신에게 해결책을 시도해 보겠습니다. – Trufa

0

당신이 다시로드 할 필요가 없습니다를 아무 것도 없기 때문에 링크가 기본값이됩니다 (그렇지 않은 경우) 다른 페이지로 연결됩니다.

올바른 파일을 가리키고 있습니까? 예를 들어 같은 URL에 당신이 그것을 proccessing있는 정확한 파일을 전송과 같은 몇 가지 디버깅을 시도해보십시오

<a href="home.php?setLang=en">en</a> 

propuses 디버깅을 위해, 당신은 당신이 $ _GET을에서지고 이해하는 데 도움이됩니다 PHP의 인 print_r를 사용할 수 있습니다.

그냥 PHP 코드의 시작에서이 작업을 수행 :

<?php 
print_r($_GET); 
//the rest of your code 
?> 
+0

좋아, 나는 당신이 말한대로 결과는 다음과 같다 : 올바른 언어로 텍스트를 표시하지 않고 시작 부분에 빈 배열을 표시 한 다음 'Array ([setLang] => de)'를 예상대로 클릭한다. – Trufa

+0

클릭하면 올바른 언어로 된 텍스트가 올바르게 표시됩니까? setcookie ("lang", $ _ GET [ "setLang"]); $ _COOKIE [ 'lang'] = $ _GET [ 'setLang'];을 해보십시오. –

+0

잠깐, 그냥 한 번만했지만 다시는 안된다. 잠깐만, 나는 분명히 이상한 일을하고있다. – Trufa

관련 문제