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 "<a href="' . $scripturl . '?page=%1$s">%2$s</a>".';
?>
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!