gpt4 book ai didi

php - 在这里使用 gettext 如何帮助我?

转载 作者:可可西里 更新时间:2023-11-01 12:44:43 24 4
gpt4 key购买 nike

我正在尝试建立一种方法,允许成员将字符串翻译成其他语言。你可以在这里看到一个例子:TRANSLATIONS TEST

有人建议我为此使用 php 的 native gettext() 函数,而不是我已经用来加载语言文件的函数,这是:

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

字符串包含在一个命名如下的文件中:
ManageDPModules.english.php
DreamPortal.english.php
等等。

这些文件在任何 php 编辑器中打开时可能如下所示,并且可以包含许多 $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;.';
?>

我正在使用以下功能来保存翻译:
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();
}

语言功能:
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>';

}

我看不出 gettext 将如何提供帮助。如果不每次都重新启动服务器,就无法更新文本目录。也许有人可以为我创建一个演示?

另外,希望它支持UTF-8。数据应该是一致的。

那么这个实现有什么问题呢??为什么要使用gettext??它如何用于改进翻译以同时适用于 UTF-8 和非 UTF-8 语言字符串,以便它可以被翻译。?

编辑:
请注意,这些文件最终需要重命名为: ManageDPModules.[language].php , DreamPortal.[language].php等,以便翻译工作。那么,在这方面,目录如何帮助我?如果您想查看可能的 END-RESULT 翻译,您可以下载位于 here 的语言包。并打开 .german.php 语言文件,看看在成员逐个文件提交语言后它应该是什么样子。请注意,其中一些包具有 UTF-8 字符串,而有些则没有。包的文件名让您知道这一点。如果我也能让它支持 UTF-8 就好了,但这不是必需的。请注意,我不是要在这里创建完整的包。我只想创建 languagefile.[language].php ,其中包含所有已翻译的字符串(我的代码已经这样做了)。

好的,我将为此提供整个 index.php 文件,以便您在进行翻译时可以看到它的作用。这是 index.php为此,您需要一些英文文件: DreamPortal.english.php , ManageDPModules.english.php , 和 DreamHelp.english-utf8.php .现在,为了看到这一点,您需要上传到服务器 index.php,在 index.php 所在的位置创建几个文件夹,调用 1 个英语,并在其中为您想要的每种其他语言创建一个文件夹(我做了 2文件夹(西类牙语和法语),然后将 3 种语言文件上传到英语文件夹中。在浏览器中运行 index.php,您将看到它正在运行。

现在,我如何使用这种相同的方法将 gettext 用于目录。我需要启用文件的在线翻译。我需要以相同的样式创建翻译的 PHP 文件,即 .english.php 文件的前缀与 .english.php 之前的相同。 ,我需要将文件名中的语言更改为为文件夹名称定义的相同语言。在线翻译是唯一可用的方法。翻译人员只需要专注于翻译字符串。他们不应该专注于安装程序、打包、重命名文件等。这使得这个过程尽可能轻松,允许它在线完成。我知道有一种方法可以做到这一点,甚至可以支持 UTF-8。但我正在使用目前我知道的最佳方法。但是你们中的很多人在这方面比我聪明得多,所以我向你们寻求帮助。

有没有人可以告诉我更好的方法?像我在这个问题中给你的例子一样吗?

我需要允许翻译人员在线完成翻译,并且还希望它支持 UTF-8 文件以及非 UTF-8 文件。 我喜欢我为上面提供的链接 ( TRANSLATIONS TEST ) 设置的方式,这样翻译人员就可以在线进行翻译而不必担心其他任何事情,并且它会自动创建所需的文件。这将与第一个 之后带有文件夹名称(代表语言)的语言的英文文件名相同。 . (点)并且它需要具有扩展名 .php(就像我当前使用的代码中那样)。所以基本上,我需要对当前的 index.php 进行改编,以支持所有或大多数语言的 UTF-8 和非 UTF-8,并被告知使用 gettext() 和目录文件将对此有所帮助。

寻找我当前的 index.php 的修改版本,以支持大多数(如果不是全部)语言和翻译的方式使用 gettext()。我为 preg_replace 使用的 REGEX 并不完全令人满意,因为它似乎在保存/提交翻译时在双引号前放置了一个正斜杠。因此,也许还需要对 preg_replace 进行改进。

顺便说一下,我提供了一个带有实际代码的完整示例。我希望有人使用我提供的 CODE 来更改此示例,以改为使用 GETTEXT 并支持 UTF-8。或者实际上为我提供一个实际的方法来自己做。不是在寻找我自己可以找到的一堆链接!

谢谢你!

最佳答案

为什么要重新发明轮子?
也许我不明白,但我很确定你想要做的事情以前已经做过了。

只需使用众多现有解决方案中的一种即可。

  • 访问每个并过滤掉不相关的项目
  • 了解其他之间的差异并选择最适合您的
  • 在现有项目的基础上继续开发和定制您自己的需求
  • 如果您发现了一个错误,或者您认为原始项目将从您的添加中受益,请联系作者并通知他

  • 在做出决定时,需要考虑以下几点:
  • 项目使用的语言
  • 能够根据自己的需要扩展、添加功能和自定义
  • 它是一项服务吗?或者你可以在自己的服务器上下载和使用的开源
  • 它支持复数翻译吗?
  • 此项目可用的社区和资源
  • 它还带有您所要求的基于 Web 的用户界面吗?

  • 以下是一些(随机排序):
  • entrans
  • pootle
  • glotpress
  • rosetta
  • globalsight
  • tcktranslator
  • kartouche
  • subtitrans
  • tmsphp
  • i18nedit
  • Open Translation Engine
  • GNU GetText Translator
  • SiteTranslator
  • phptrans
  • myGengo's String
  • NetBabel
  • translatewiki

  • 祝你好运!

    更新:谢谢,El Yobo。我已将此标记为社区维基,如果他发现其他内容,欢迎任何人编辑或回复其他项目。

    关于php - 在这里使用 gettext 如何帮助我?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4401307/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com