Como o uso do gettext pode me ajudar aqui?

Estou tentando criar uma maneira de permitir que os membros traduzam strings para outros idiomas. Você pode ver um exemplo aqui:TESTE DE TRADUÇÕES

Alguém recomendou que eu use a função gettext () nativa do php para isso, em vez do que eu já estou usando para carregar os arquivos de idioma, que é este:

function loadLanguageFile($language, $file) {

    $temp = array();

    $data = file_get_contents('./'.$language.'/'.$file.'.'.$language.'.php');

    $codes = array (
        '/(\'\s*\.\s*\$)(.+?)(\s*\.\s*\')/',
        '/(=\s*\$)(.+?)(\s*\.\s*\')/',
        '/(\'\s*\.\s*\$)(.+?)(;)/',
        '/(\[\')(.+?)(\'\])/',
        '/<\?php/s', '/\?>/s', '/<\?/s'
    );
    $html = array (
        '{$2}',
        '= \'{$2}',
        '{$2}\';',
        '[$2]',
        '',
    );
    // Since we don't have the values for the vars.
    $data = preg_replace($codes, $html, $data);

    // We must change this because they are global.
    $data = str_replace('$txt', '$langEditor_txt', $data);
    $data = str_replace('$helptxt', '$langEditor_helptxt', $data);

    eval($data);

    if (isset($langEditor_txt)) {
        $temp['txt'] = $langEditor_txt;
        unset($GLOBALS['langEditor_txt']);
    }
    if (isset($langEditor_helptxt)) {
        $temp['helptxt'] = $langEditor_helptxt;
        unset($GLOBALS['langEditor_helptxt']);
    }

    return $temp;
}

As strings estão contidas em um arquivo com o seguinte nome: ManageDPModules.english.php DreamPortal.english.php etc.

Esses arquivos podem ter a seguinte aparência, quando abertos em qualquer editor de php, e podem ter muitas dessas variáveis $ txt:

<?php 
// Dream Portal (c) 2009-2010 Dream Portal Team 
// DreamPortal.english.php; @1.1 

global $scripturl, $context; 

// General Strings 
$txt['forum'] = 'Forum'; 
$txt['dream_portal'] = 'Dream Portal'; 
$txt['dp_core_modules'] = 'Collapse or Expand this Module'; 
$txt['dp_who_forum'] = 'Viewing the forum index of <a href="' . $scripturl . '?action=forum">' . $context['forum_name'] . '</a>.'; 
$txt['dp_who_portal'] = 'Viewing the portal index of <a href="' . $scripturl . '">' . $context['forum_name'] . '</a>.'; 
$txt['dp_who_page'] = 'Viewing the page &quot;<a href="' . $scripturl . '?page=%1$s">%2$s</a>&quot;.'; 
?>

Estou usando a seguinte função para salvar as traduções:

function langSave($lang, $file) {

    // We just don't get values from the form, they have to exist in the english files to be taken seriously.
    $default = loadLanguageFile('english', $file);

    if ($default['txt']) {
        foreach ($default['txt'] as $key=>$string) {
            if (isset($_REQUEST['txt'.$key]) && str_replace(' ', '', $_REQUEST['txt'.$key]) != '') {
                $data.='$txt[\''.$key.'\'] = \''.str_replace("'", "\'", $_REQUEST['txt'.$key]).'\';'."\n";
            }
        }
    }
    if ($default['helptxt']) {
        foreach ($default['helptxt'] as $key=>$string) {
            if (isset($_REQUEST['helptxt'.$key]) && str_replace(' ', '', $_REQUEST['helptxt'.$key]) != '') {
                $data.='$helptxt[\''.$key.'\'] = \''.str_replace("'", "\'", $_REQUEST['helptxt'.$key]).'\';'."\n";
            }
        }
    }

    if (isset($data)) {
        $codes = array (// '' . $test . '
            '/(\{)(.+?)(\})/',
            '/(\'\' \. \$)(.+?)( \. \')/',
            '/(\' \. \$)(.+?)( \. \'\')/',
            '/(\[\')(.+?)(\'\])/',
            '/(\[)(.+?)(\])/',
        );
        $html = array (
            '\' . \$2 . \'',
            '\$2 . \'',
            '\' . \$2',
            '[$2]',
            '[\'$2\']',
        );
        // Convert the data back to normal.
        $data = preg_replace($codes, $html, $data);

        $data = '<?php'."\n".$data.'?>';
        file_put_contents('./'.$lang.'/'.$file.'.'.$lang.'.php', $data);
    }
    languageHome();
} 

Função de linguagem:

function languageHome() {

    $languages = loadLanguageList();

    echo '
    Language List
        <table>';
    foreach ($languages as $language) {
        echo '
            <tr>
                <td>
                    '.$language.'
                </td>
                <td>
                    <a href="index.php?op=langView&lang='.$language.'">View</a>
                </td>
            </tr>';
    }
    echo '
        </table>';

}

Não consigo ver como o gettext ajudará. Não há como atualizar o catálogo de texto sem reiniciar o servidor todas as vezes. Talvez se alguém puder criar uma demonstração disso para mim?

Além disso, gostaria que ele suportasse UTF-8. Os dados devem ser consistentes.

Então, o que há de errado com esta implementação? Por que usar gettext ?? Como ele pode ser usado para melhorar as traduções para trabalhar com as sequências de idiomas UTF-8 e não UTF-8 para que possam ser traduzidas.?

EDITAR: Observe que os arquivos precisarão ser renomeados para:ManageDPModules.[language].php, DreamPortal.[language].php, etc., etc., para que as traduções funcionem. Então, como os catálogos me ajudariam nesse sentido? Se você deseja ver possíveis traduções de RESULTADO FINAL, pode fazer o download de um pacote de idiomas localizadoaqui e abra os arquivos de idioma .german.php para ver como deve ser depois que o membro enviar um idioma arquivo por arquivo. Observou que alguns desses pacotes têm sequências UTF-8 e outras não. O nome do arquivo dos pacotes informa isso. Seria bom se eu também puder fazer com que ele suporte UTF-8, mas isso não é um requisito. Observe que não estou tentando criar pacotes completos aqui. Eu só quero criar o languagefile. [Language] .php com todas as strings traduzidas dentro delas (o que meu código já faz).

OK, fornecerei o arquivo index.php INTEIRO para isso, para que você possa ver exatamente o que ele faz quando faz traduções. Aqui está oindex.php arquivo para isso e você precisará de alguns arquivos em inglês:DreamPortal.english.php, ManageDPModules.english.phpeDreamHelp.english-utf8.php. Agora, para ver isso, você precisa fazer o upload para um servidor, index.php, criar algumas pastas em que index.php está, chamar 1 inglês e criar uma pasta para cada idioma adicional que você quiser (eu fiz 2 pastas, espanhol e francês), depois carregue os arquivos de 3 idiomas na pasta em inglês. Execute o index.php no seu navegador e você verá que está funcionando.

Agora, como eu poderia usar o gettext para catálogos com essa mesma abordagem. Preciso ativar a tradução online de arquivos. Eu preciso criar arquivos PHP das traduções no mesmo estilo que os arquivos .english.php estão com o mesmo PREFIX que antes.english.php, e preciso alterar o idioma no nome do arquivo para o mesmo idioma definido para o nome da pasta. Traduções online é o ÚNICO método disponível. O tradutor precisa se concentrar SOMENTE na tradução das strings. Eles não deveriam se concentrar em instalar programas, empacotá-los, renomear os arquivos etc. etc. Isso torna esse processo o mais simples possível, permitindo que ele seja feito online. E eu sei que há uma maneira de fazer isso, e até mesmo para o suporte UTF-8. Mas estou usando o melhor método que sei no momento. Mas muitos de vocês são MUITO mais espertos com esse tipo de coisa do que eu, então peço ajuda a vocês.

Existe alguém que possa me mostrar uma maneira melhor? Um exemplo como o que eu lhe dei nesta pergunta?

Eu preciso permitir que as traduções sejam feitas ONLINE a partir de tradutores e também gostaria que ele suportasse arquivos UTF-8, bem como arquivos não UTF-8. Gosto da maneira como o configurei para o link fornecido acima (TESTE DE TRADUÇÕES), para que os tradutores possam fazer as traduções on-line e não precisem se preocupar com mais nada, e criariam automaticamente os arquivos necessários. Que seria o mesmo que o nome do arquivo em inglês do idioma com o nome da pasta (representando o idioma) após o primeiro. (ponto) e precisa ter a extensão .php (como no código que estou usando no momento). Então, basicamente, eu preciso de uma adaptação do index.php atual para suportar UTF-8 e não UTF-8 para todos ou para a maioria dos idiomas, e foi informado que o uso de gettext () e arquivos de catálogo ajudaria nisso.

Procurando por uma versão modificada do meu index.php atual para usar gettext () de uma maneira que suporte a maioria, se não todos, os idiomas e traduções. O REGEX que eu escrevi para preg_replace não é completamente satisfatório porque parece colocar uma barra na frente de aspas duplas ao salvar / enviar as traduções. Portanto, talvez seja necessário melhorar também o preg_replace.

Forneci um exemplo completo com CÓDIGO REAL, por sinal. Gostaria que alguém alterasse este exemplo, com o código que forneci para USE GETTEXT e suporte UTF-8. Ou, na verdade, forneça um MÉTODO REAL para eu fazer isso sozinho. Não estou procurando um monte de links que eu possa encontrar sozinho!

Obrigado!

questionAnswers(2)

yourAnswerToTheQuestion