2012-05-09 4 views
0

프로젝트 작업 중이며 사용자 번역이 필요합니다. 그래서 PHP에서 gettext를 사용하기로 결정했지만 때로는 작동합니다.Gettext 가끔씩 작동합니다.

그래서 나는라는 이름의 폴더 LNG이에 내 랭 내 페이지를 번역하기 위해 파일을 호출하는 PHP 파일이에 있습니다. 'EN'또는 'FR'하지만 그는 내 파일 내가 돈을 번역하지 않습니다

<?php 
if(isset($_GET['lang']) != '') 
{ 
    setcookie('lang',$_GET['lang'], time() + 365*24*3600, null, null, false, true); 
    $_SESSION['lang'] = $_GET['lang']; 
    $language = $_GET['lang']; 
} 
else if(isset($_SESSION['lang']) != '') 
{ 
    $language = $_SESSION['lang']; 
} 
else if(isset($_COOKIE['lang']) != '') 
{ 
    $_SESSION['lang'] = $_COOKIE['lang']; 
    $language = $_SESSION['lang']; 
}else{ 
    $language = 'fr'; 
} 

    putenv("LANG=$language"); 
    setlocale(LC_MESSAGES, $language); 

    $domain = 'trad'; 
    bindtextdomain($domain, 'locale/'); 
    textdomain($domain); 
?> 

그래서 내 $에 _SESSION와 $ _COOKIE를 확인하실 수 있습니다, 그는 줘 아무 문제 : 다음

코드입니다 이유를 모르겠습니다. 그것의 LNG의 폴더에 대한

: 로케일/EN/LC_MESSAGES/trad.po (또는 .mo). LC_ALL 및 LC_MESSAGES를 사용해 보았지만 그 결과는 변경되지 않습니다.

내가 뭔가를 놓치거나 잘못 되었나요?

고맙습니다.

제이

+0

'$ domain'은 ...인가요? –

+0

$ domain은 확장자가없는 파일 이름입니다. 여기 코드로 작업합니다. http://onlamp.com/pub/a/php/2002/06/13/php.html –

+0

그러면 "트레이드"가됩니까? –

답변

0

창을 사용하고 있지 않습니까? 그렇다면 windows locale names을 사용해야합니다. 다음은 리눅스와 윈도우에서 작동하는 클래스의 일부입니다 (단순히 로케일 이름의 옵션이 더 많습니다) :

... 
private function setLocaleByLang($lang) 
{ 
    $map = array(
     'cs' => array('cs_CZ.UTF-8', 'cs_CZ', 'cs', 'czech'), 
     'en' => array('en_US.UTF-8', 'en_US', 'en', 'english'), 
     'de' => array('de_DE.UTF-8', 'de_DE', 'de', 'german'), 
     'pl' => array('pl_PL.UTF-8', 'pl_PL', 'pl', 'polish'), 
     'sk' => array('sk_SK.UTF-8', 'sk_SK', 'sk', 'slovak') 
    ); 

    $locale = key_exists($lang, $map) ? $map[$lang] : $lang; 
    setlocale(LC_ALL, $locale); 
    putenv('LC_ALL=' . $lang); // for windows and gettext 
} 
... 
0

동일한 오류가 발생합니다. 내 경우는 약간 다르다. 코드를 변경 한 이후에도 스레딩과 관련이 있다고 생각하기 시작했다.

<?php 
    include_once (dirname(__FILE__) . "/resources/config.php"); 
?> 

<div id='language_bar'> 
    <a style="margin-left:50px" href="./index.php?locale=es_ES"> 
     <img src='<?php echo $config['paths']['images']['lang']?>/es_ES.gif'/> 
    </a> 

    <a href="./index.php?locale=en_UK"> 
     <img src='<?php echo $config['paths']['images']['lang']?>/en_UK.gif'/> 
    </a> 

    <a href="./index.php?locale=de_DE"> 
     <img src='<?php echo $config['paths']['images']['lang']?>/de_DE.gif'/> 
    </a> 
</div> 

그리고있는 설정 파일 :

if (isset($_GET['locale'])) { 
    $locale = $_GET['locale']; 
    setcookie('locale', $locale, time() + 60 * 60 * 24 * 30); 
} else { 
    if(isset($_COOKIE['locale'])) { 
     error_log('En _COOKIE'); 
     $locale = $_COOKIE['locale']; 
    } 
    else { 
     $locale = $config['localization']['default_locale']; 
     setcookie('locale', $locale, time() + 60 * 60 * 24 * 30); 
    } 
} 

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

error_log('setlocale->'.setlocale(LC_ALL, "0")." Env ->". getenv("LC_ALL")); 
error_log(_("Submit")); 

내 주요 페이지에 jQuery를 통해 상호 작용하는 몇 가지 div가 있으며, 폭포에서 다시로드

나는 언어 바있다. 때로는 그들 중 일부는 (임의로) 기본 문자열 값을 제공합니다. 기본적으로

, 그것은 스페인어 (ES_ES)이며, DIV 새로 고침을 강제로 몇 번의 클릭 후, 일부 문자열이 영어 (ko 페이지 원래 문자열)에 인쇄됩니다. 그리고 무엇보다. 독일어로 전환하면 (de_DE), 독일어로 모든 문자열을 가져 오는 첫 번째 새로 고침 이후 gettext는 스페인어로 문자열을 다시 시작하고 잠시 후 영어로 문자열을 다시 시작합니다.

PHP 로그에 디버그 라인을 추가했습니다. 그들은 정말 재미있다 :

가 정상적으로 작동 할 때 :

[Thu May 31 00:28:51 2012] [error] [client ::1] setlocale->es_ES Env ->es_ES 
[Thu May 31 00:28:51 2012] [error] [client ::1] Aplicar, referer: xxxxxxxx/index.php 

하지 않는 경우 :

[Thu May 31 00:29:45 2012] [error] [client ::1] setlocale->es_ES Env ->es_ES, referer: xxxxxxxxx/index.php 
[Thu May 31 00:29:45 2012] [error] [client ::1] Submit, referer: xxxxxxxx/index.php 

그래서 내가 것 같아요 _() 함수 (난 항상 별칭을 사용하고 있습니다) 실패 . 필자는 함수에 대해 10.000 번 반복했고, 변환하는 동안 10.000 건의 안타 또는 10.000 건의 실수가 있었기 때문에 전체 http 요청에 실패하거나 그렇지 않습니다.

정말 많이 쓰는 것에 사과하지만, 올바른 방향으로 나를 가리키는 데 도움이됩니다.(이 오류는 @ localhost뿐만 아니라 내 온라인 테스트 서버에서도 발생합니다.)

¿ 모든 연결에 대해 로캘을 설정한다는 것과 관련이있을 수 있습니까?

내 온라인 "놀이터"입니다 :

리눅스 server8.nixiweb.com 2.6.32-71.29.1.el6.x86_64 # 1 SMP 월 6월 27일 영국 서머 타임 19시 49분 27초 2011 x86_64에

내 서버 :

리눅스 filete 둘 것을 3.2.0-24-일반적인 # 39 - 우분투 SMP 월 세계 협정시 16시 52분 17초 월 2012 (21) x86_64에 PHP 버전 5.3.10-1ubuntu3.1

주 64bits

+0

이 문제를 해결 한 적이 있습니까? – FooBar

2

나는 똑같은 문제가있다. 재시작 아파치 서비스가 나를 위해 해결했습니다

0

같은 문제가있었습니다. 때로는 현이 번역되고 때때로 그렇지 않습니다. 나는이 응용 프로그램을위한 3 개의 서버와 5 개의 개발자 컴퓨터를 가지고 있으며 모두 동일한 문제를 가지고 있습니다.

나는 제거하여 그것을 해결 : 우분투 14.04를 사용하고

sudo ln -sf /myproject/locale/en/LC_MESSAGES/domain.mo /usr/share/locale/en/LC_MESSAGES/domain.mo 

:

bindtextdomain("domain", "/locale"); 

그리고 gettext를 기본 폴더에 직접 .mo 파일을 연결.