문제

새로운 질문을하는 대신 질문이 업데이트되었습니다 ...

나는 제가 만들고있는 소셜 네트워크 사이트에서 영어와 다른 몇 가지 다른 언어를 제공하고 싶습니다. 이것은 처음으로 어떤 종류의 언어 번역을하는 것이 었습니다.
나는 연구하고 있으므로 나는 귀가 있고 아이디어에 개방적이며 이미 많은 것이있다.

1)
i18n은 무엇을 의미합니까, 나는 언어 번역을 연구 할 때 자주 그것을 본다.

2)
대부분의 사람들은 사용한다고 말합니다 getText PHP는 확장 또는 지원이 있습니다.
글쎄, 나는 그것을 연구하고 있었고, 나는이 길을 가기위한 많은 추가 작업이라고 말할 수있는 한, 나는 그것을 기본적으로 이해하고있다.
내 사이트를 사용하도록 내 사이트를 코딩하는 것을 의미합니다. 즉. _ ( 'Hello World I'm in English in Now ') 그렇지 않으면 getText ( 'Hello World I'm In English in Now ') 내가가는 경로가 필요하기 때문에 문제가되지 않습니다.
그러나 서버에 GetText를 설치하고 작동해야합니다.
그런 다음 일부 특별 편집자를 사용하여 특수 파일을 만들고 컴파일 하는가?

고통처럼 들립니다. 나는 이것이 가장 좋은 길이라는 것을 이해합니다. 모두가 말하는 것 같습니다.
그래서 누군가 이것이 왜 이것이가는 길인지 말해 줄 수 있습니까?

3)
이 접근법의 단순성을 정말 좋아합니다. 언어 배열을 구축하고 아래 예제와 같은 함수에서 필요한 문구를 호출하면 적절한 언어 배열이있는 파일을 포함시킵니다.

내가 정말로 알고 싶은 것은 GetText를 사용하는 것과 비교하여 높은 트래픽과 상당히 큰 사이트에서 덜 더 나은 성능 방법이 될 것입니다. 그렇다면 이유를 설명해 주시겠습니까?

<?PHP
//Have seperate language files for each language I add, this would be english file
function lang($phrase){
    static $lang = array(
        'NO_PHOTO' => 'No photo\'s available',
        'NEW_MEMBER' => 'This user is new'
    );
    return $lang[$phrase];
}
//Then in application where there is text from the site and not from users I would do something like this
echo lang('NO_PHOTO');  // No photo's available would show here
?>

* 아래의 BrianReavis의 답변에서 사용 된 일부 코드

도움이 되었습니까?

해결책

바퀴를 재발 명하지 마십시오. 예를 들어 사용하십시오 getText 또는 Zend_translate.

다른 팁

언어 매핑을 처리하는 함수를 정의하는 것이 가장 좋습니다. 그렇게한다면 하다 나중에 작동하는 방식을 바꾸고 싶으시면 사용한 경우 수백 개의 스크립트를 닦을 수 없습니다. $lang[...] 그리고 그것들을 다른 것으로 바꾸십시오.

이와 같은 것이 효과가 있고 좋고 빠를 것입니다.

function lang($phrase){
    static $lang = array(
        'NO_PHOTO' => 'No photo\'s available',
        'NEW_MEMBER' => 'This user is new'
    );
    return $lang[$phrase];
}

만들다 확실한 배열이 선언됩니다 static 함수 내부에서 함수가 호출 될 때마다 재 할당되지 않습니다. 이것은 때 특히 중요합니다 $lang 정말 큽니다.

그것을 사용하려면 :

echo lang('NO_PHOTO');

여러 언어를 처리하려면이 기능을 여러 파일로 정의하십시오 ( en.php, fr.php, 등) 및 require() 사용자에게 적합한 것.

더 잘 작동 할 수 있습니다.

function _L($phrase){
static $_L = array(
    'NO_PHOTO' => 'No photo\'s available',
    'NEW_MEMBER' => 'This user is new'
);

     return (!array_key_exists($phrase,$_L)) ? $phrase : $_L[$phrase];
}

그게 내가 지금 사용하는 것입니다. 언어를 찾을 수없는 경우 오류 대신 문구를 반환합니다.

배열에는 ~ 65500 개 이상의 항목이 포함될 수 있습니다. 충분하지만 잘 말해야합니다.

다음은 사용자의 언어를 확인하는 데 사용하는 몇 가지 코드입니다.

<?php
function setSessionLanguageToDefault() {
    $ip=$_SERVER['REMOTE_ADDR'];
    $url='http://api.hostip.info/get_html.php?ip='.$ip;
    $data=file_get_contents($url);
    $s=explode (':',$data);
    $s2=explode('(',$s[1]);

    $country=str_replace(')','',substr($s2[1], 0, 3));

    if ($country=='us') {
        $country='en';
    }

    $country=strtolower(ereg_replace("[^A-Za-z0-9]", "", $country ));
    $_SESSION["_LANGUAGE"]=$country;
}

if (!isset($_SESSION["_LANGUAGE"])) {
    setSessionLanguageToDefault();
}

if (file_exists(APP_DIR.'/language/'.$_SESSION["_LANGUAGE"].'.php')) {
    include(APP_DIR.'/language/'.$_SESSION["_LANGUAGE"].'.php');
} else {
    include(APP_DIR.'/language/'.DEFAULT_LANG.'.php');
}

?>

아직 끝나지 않았지만 글쎄, 나는 이것이 많은 도움이 될 것이라고 생각합니다.

자신의 언어 프레임 워크를 작성하지 마십시오. 사용 getText. PHP에는 표준이 있습니다 바인딩 설치할 수 있습니다.

다른 답변이 실제로 모든 질문에 대답하지 않기 때문에, 나는 내 대답으로 현명한 대안을 제공 할 것입니다.

1) I18N은 국제화가 부족하며 i-eighteen-n과 유사합니다.

2) 솔직한 견해로는 GetText는 시간 낭비입니다.

3) 귀하의 접근 방식이 좋아 보입니다. 당신이 찾아야 할 것은 언어 변수입니다. 그만큼 Woltlab 커뮤니티 프레임 워크 2.0 양방향 언어 시스템을 구현합니다. 한 번은 데이터베이스와 템플릿 내부에 저장된 언어 변수가 있으면 변수의 이름 만 사용하여 현재 언어의 변수 내용으로 대체됩니다 (사용 가능한 경우). 시스템의 두 번째 부분은 사용자 생성 컨텐츠를 여러 언어로 저장하는 방법을 제공합니다 (여러 언어로 입력).

기본적으로 개발자가 정의하는 인터페이스 텍스트와 사용자가 정의하는 컨텐츠가 있습니다. 컨텐츠의 다국어 텍스트는 언어 변수로 저장되며 언어 변수의 이름은 특정 콘텐츠 테이블의 텍스트 필드의 값으로 사용됩니다 (단일 언어 내용도 가능함).

WCF의 구조는 슬프게도 프레임 워크 외부의 코드를 재사용하는 것이 매우 어렵지만 영감으로 사용할 수 있습니다. 시스템의 범위는 사이트에서 달성하고자하는 것에만 달려 있습니다. 그것이 당신보다 커질 경우 WCF 시스템을 확실히 살펴 봐야합니다. 작은 언어 파일이 작다면 현재 언어의 올바른 파일이 포함 된 전용 언어 파일 (de.php, en.php 등)이 포함됩니다.

안타깝게도 getText 잘 작동하지 않고 다른 OS (Windows 또는 Linux)와 같은 다양한 상황에서 문제가 있으며 작동하게하는 것은 매우 어렵습니다.

또한 많은 환경 변수와 도메인을 설정해야하며 이는 의미가 없습니다.

개발자가 단순히 텍스트의 번역을 받기를 원한다면 .mo 파일 경로 만 설정하고 번역 ( "hello", "en_en")과 같은 하나의 함수로 번역을 가져와야합니다. getText를 사용하면 불가능합니다.

왜 당신은 단지 그것을 다중 다임 배열로 만들지 않습니까?

<?php

$lang = array(
    'EN'=> array(
        'NO_PHOTO'=>'No photo\'s avaiable',
        'NEW_MEMBER'=>'This user is new',
    ),
    'MY'=> array(
        'NO_PHOTO'=>'Tiada gambar',
        'NEW_MEMBER'=>'Ini adalah pengguna baru',
    )
);

?>

당신은 이것을 할 수 있습니다 :

class T {
const language = "English";
const home = "Home";
const blog = "Blog";
const forum = "Forum";
const contact = "Support";
}

각 언어마다 이와 같은 파일이있을 것입니다. 텍스트를 사용하려면 :

There is no place like <?=T::home?>.

단점은 새로운 상수를 추가하면 모든 langauge 파일. 당신이 하나를 잊어 버리면, 당신의 페이지는 그 언어에 대한 휴식을 취합니다. 그것은 약간 불쾌하지만, 큰 연관 배열을 만들 필요가없고 값이 끊어 질 필요가 없기 때문에 효율적입니다.

액세스가 개선 될 수 있습니다.

class T {
    const home = "home";

    public static function _ ($name) {
        $value = @constant("self::$name");
        return $value ? $value : $name;
    }

    // Or maybe through an instance:
    public function __get ($name) {
        $value = @constant("self::$name");
        return $value ? $value : $name;
    }
}
echo "There is no " . T::_("place") . " like " . T::_("home");
$T = new T();
echo "There is no " . $T->place . " like " . $T->home;

우리는 여전히 배열을 피하고 의존합니다 끊임없는 조회를하기 위해 상수를 직접 사용하는 것보다 비싸다고 생각합니다. 위쪽은 키를 찾을 수 없을 때 조회가 폴백을 사용할 수 있다는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top