2014-06-13 2 views
1

는 현재 내가 설정하고 (즉, 레거시 코드) 우리 시스템의 다른 부분에 영향을 미치는 것입니다 세계적으로 setlocale를 사용하는 경우PHP gettext에()는

그래서 우리가 사용해야하기 때문에 기능을 번역 내에서 로케일을 복원해야 ..

function translate($text, $locale) { 

    $original = getenv('LC_ALL'); 

    putenv('LC_ALL=' . $locale); 
    setlocale(LC_ALL, $locale); 

    $translated = _("text); 

    putenv('LC_ALL=' . $original); 
    setlocale(LC_ALL, $original); 

    return $translated; 
} 

더 좋은 방법이 있습니까?

+1

아마도 로케일에 의존하지 않는 순수한 PHP를 기반으로 PO/MO 파일 파서/gettext를 구현을 사용할 수 있습니까? – deceze

+0

[PHP Gettext Extension과 다국어 웹 사이트에서 PHP 배열 사용?] (http://stackoverflow.com/a/2319192/367456)을 통해 [php-gettext] (https://launchpad.net/php-gettext/)와 같이 입력하십시오.) – hakre

답변

1

LC_ALL을 사용하지 마십시오. LC_MESSAGES 만 사용하십시오. 이 전 세계적으로 언어를 설정하기 때문에, 물론 작업의 LC_ALL 뜻을 설정하는 동안, 그것은 단지 LC_MESSAGES을 설정하는 완벽 충분 -에만이 변수가 사용되는 번역을 위해 :

setlocale(LC_ALL, "en_US"); 
setlocale(LC_MESSAGES, "cs_CZ"); 
_("something") # you will get czech translation now, even if globally you use EN 

그래서 기존의 코드가 LC_MESSAGES 올바르게 설정 처리 할 수 ​​있다면, 당신은 괜찮아.

LC_* 변수에 대한 자세한 내용은 http://us2.php.net//manual/en/function.setlocale.php을 참조하십시오.

0

아마도 php-gettext은 옵션입니까? 그것은 gettext 기능의 PHP 구현입니다. 그것의 gettext_reader 클래스는 로켈 기능이나 다른 전역 상태에 의존하지 않고 gettext .mo 파일을 읽을 수 있습니다. php-gettext는 표준 PHP gettext API의 드롭 인 대체품을 제공 할 수도 있지만 다소 추한/위험한 것 같습니다.)

면책 조항 : 프로덕션 환경에서는이 기능을 실제로 사용하지 않았습니다.

1

나는 이것이 적절한 방법이라고 생각합니다. 몇 년 전 같은 문제가있었습니다.

// Translate 
$_SESSION['locale'] = $locale; 
\Application::GetInstance()->getLocaleManager()->refresh(); 
$output["data"][] = array(
    "text" => utf8_encode($menuItem->getLibelle()), 
    "lang" => utf8_encode(ucfirst($localeName)), 
    "translation" => utf8_encode(_($menuItem->getLibelle())) 
); 
// Restore lang 
$_SESSION['locale'] = "fr"; 
\Application::GetInstance()->getLocaleManager()->refresh(); 

새로 고침()하고있다 :

  • \ 로케일 ::을 setDefault을 ($ 로케일)
  • 은 setlocale (...) 여기

    는 당신과 비슷한 내 코드입니다
  • putenv ("LANG =". $ locale); // Windows 환경에서 필요합니다.
  • putenv ("LANGUAGE =". $ locale); // Windows 환경에서 필요
1

LC_ALL이 설정되지 않을 수 있으므로 LANG 환경 변수에서 로케일을 가져와야합니다. 이 기능은 Windows와 호환되지 않을 수 있습니다. 알려 주시면 업데이트하겠습니다.


//default locale to use when all else fails 
define('DEFAULT_LANG', 'en_US.UTF-8'); 

/** 
* returns the current locale based on the LANG environment variable. 
* Only calls getenv() once, after that uses a cached value. remove the static 
* keyword to disable this functionality. 
* 
* @return string returns the current locale, or DEFAULT_LANG on error. 
*/ 
function get_lang() { 
    static $lang; //static variable, so the resulting call to getenv() only fire once 
    if (!isset($lang) || $lang=="") { 
    $lang = getenv('LANG'); 
    if (trim($lang)=='') 
     $lang = DEFAULT_LANG;  
    } 
    return $lang; 
} 

/** 
* @param string $text string to translate 
* @param string $locale locale to translate to, i.e. de_DE 
* @param boolean $provideFallback - provide the original local as a fallback if locale is not  recognized 
* @return boolean|string returns $text translated to $locale, or FALSE on error. 
*/ 
function translate($text, $locale, $provideFallback = FALSE, $resetLocale = TRUE) { 
    if ((empty($locale) || trim($locale)=='') && !$provideFallback) 
    return FALSE; 
    if (empty($text)) 
    return $text; 

    $original = get_lang(); 

    //provide a fallback locale in case $locale is not recognized. 
    if ($provideFallback) { 
    $l = strval($locale); 
    if (empty($locale) || trim($locale)=='') 
     $l = $original; //set locale to the original locale, since none was provided. 
    $locale = array($l, $original, DEFAULT_LANG); 
    } 

    setlocale(LC_ALL, $locale); 
    $translated = _($text); 
    if ($resetLocale) { 
    setlocale(LC_ALL, $original); 
    } 
    return $translated; 
} 


echo get_lang().PHP_EOL; 
echo translate("test1", "de_DE.UTF-8") . PHP_EOL; 
echo translate("test2", "de_DE.UTF-8") . PHP_EOL;