Pergunta

Perguntas Atualizado em vez de fazer uma nova pergunta ...

Eu realmente quero fornecer algumas linguagens alternativas outro então Inglês no meu site rede social Estou construindo, esta será a minha primeira vez fazendo qualquer tipo de tradução por isso, tenha comigo.
Estou pesquisando por isso estou al ouvido e aberto a idéias e tenho muito já aqui é são as perguntas.

1)
O que significa i18n, vejo que muitas vezes quando pesquisando tradução no SO?

2)
A maioria das pessoas dizem que o uso gettext PHP tem uma extensão ou suporte para ele,
bem, eu tenho pesquisado isso e eu ter uma compreensão básica de que, tanto quanto eu posso dizer que é um monte de trabalho extra para ir esta rota,
Quero dizer codificação meu site para usá-lo de funções, ou seja; _ ( 'Olá mundo eu estou em Inglês por agora') ou então gettext ( 'Olá mundo eu estou em Inglês por agora') não é problema como qualquer rota Eu vou vai exigir isso.
Mas então você tem que instalar gettext no seu servidor e fazê-lo funcionar,
em seguida, usar alguns editores especiais para criar arquivos especiais e compilá-los eu acho?

soa como uma dor, eu compreendo que este é suposto ser o melhor caminho para ir embora, assim todo mundo parece dizer que é.
Então, alguém pode me dizer por que este é o caminho a percorrer?

3)
Eu realmente gosto da simplicidade desta abordagem, apenas a construção de uma matriz de linguagem e chamando a frase que você precisa em uma função como no exemplo abaixo , Você iria em seguida, basta incluir um arquivo com a matriz de linguagem apropriada.

O que eu realmente quero saber é, isso seria o menos método melhor desempenho em um alto tráfego e bastante grande local em relação ao uso gettext e se assim você pode explicar por favor?

<?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
?>

* algum código usado de resposta das brianreavis abaixo

Foi útil?

Solução

Não reinventar a roda. Use por exemplo gettext ou Zend_Translate .

Outras dicas

Ele provavelmente seria melhor para definir uma função que lida com o mapeamento da linguagem. Dessa forma, se você não quer mudar a forma como ele funciona mais tarde, você não é obrigado a vasculhar centenas de roteiros para os casos em que você usou $lang[...] e substituí-los com outra coisa.

Algo como isso iria funcionar e seria bom e rápido:

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

Faça static certeza a matriz é declarada dentro da função para que ele não se realocados cada vez que a função é chamada. Isto é especialmente importante quando $lang é realmente grande.

Para usá-lo:

echo lang('NO_PHOTO');

Para lidar com vários idiomas, só tem essa função definido em vários arquivos (como en.php, fr.php, etc) e require() o mais adequado para o usuário.

Este trabalho seria melhor:

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];
}

Isso é o que eu uso para agora. Se o idioma não for encontrado, ele irá retornar a frase, em vez de um erro.

Você deve observar que um array pode conter mais de ~ 65500 itens. Deve ser suficiente, mas bem, apenas dizendo.

Aqui está algum código que eu uso para verificar se o idioma do usuário:

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

?>

A sua não é feito ainda, mas bem eu acho que isso pode ajudar muito.

Não escreva sua própria estrutura da linguagem. Use gettext . PHP tem padrão ligações que você pode instalar.

Como as outras respostas realmente não responder a todas as perguntas, eu irei para que na minha resposta mais oferecendo uma alternativa sensata.

1) I18n é curto para a Internacionalização e tem algumas semelhanças com o I-dezoito n.

2) Na minha opinião honesta gettext é um desperdício de tempo.

3) Sua abordagem parece ser bom. O que você deve procurar são variáveis ??de linguagem. Os WoltLab quadro comunitários implementos 2,0 um sistema de linguagem bidirecional. Pela primeira vez, há variáveis ??de linguagem que são salvos no banco de dados e dentro de um modelo de uma só usa o nome da variável que será então substituído com o conteúdo da variável na linguagem corrente (se disponível). A segunda parte do sistema fornece uma maneira de salvar o conteúdo gerado por usuários em vários idiomas (entrada em vários idiomas necessário).

Basicamente, você tem o texto interface que é definido pelo desenvolvedor e o conteúdo que é definida pelo usuário. O texto multilíngüe do conteúdo é salvo em variáveis ??de linguagem e o nome da variável de idioma é então usado como valor para o campo de texto na tabela de conteúdo específico (como um único idioma conteúdos também são possíveis).

A estrutura do WCF é, infelizmente, de uma forma que a reutilização de fora do código do quadro é muito difícil, mas você pode usá-lo como fonte de inspiração. O escopo do sistema depende unicamente o que você quer alcançar com o seu site. Se ele vai ser grande do que você deve definitivamente dar uma olhada no sistema WCF. Se ele é pequeno alguns arquivos de idioma dedicados (de.php, en.php, etc), a partir do qual o correto para o idioma atual está incluído, vai fazer.

Infelizmente gettext não trabalho bem e têm problemas em várias situações, como no sistema operacional diferente (Windows ou Linux) e fazer o trabalho é muito difícil.

Além disso, exigem que você monte conjunto é de variáveis ??de ambiente e domínios e isso não tem qualquer sentido.

Se um desenvolvedor quer simplesmente obter a tradução de um texto que ele só deve definir o caminho do arquivo .mo e obter a tradução com uma função como traduzir ( "Olá", "en_EN"); Com gettext isso não é possível.

Por que não você apenas torná-lo como uma matriz multi-dimensional ... como este

<?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',
    )
);

?>

Você pode fazer isso:

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

Você teria um arquivo como este para cada idioma. Para usar o texto:

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

A desvantagem é que se você adicionar uma nova constante, você tem que fazê-lo para cada arquivo langauge . Se você esquecer um, suas quebras de página para esse idioma. Isso é um pouco desagradável, mas é eficiente, uma vez que não necessita de criar uma grande matriz associativa e, possivelmente, os valores ainda se inlined.

Talvez o acesso poderia ser melhorado, por exemplo:

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;

Nós ainda evitar a matriz e confiar em constante para fazer o lookup , que eu suponho que é mais caro do que usar as constantes diretamente. O lateral-se é a pesquisa pode usar um fallback quando a chave não foi encontrado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top