1

我有一个供用户选择的菜单。它由 PHP 变量填充,这些变量都是语言变量。例如:

$word = $lang['word'];
$select = array($word);

因此,选择菜单选项将根据用户选择的语言而改变。我需要能够相互比较用户的选择。例如:

if($user1word == $user2word) ... 

但是由于语言文件,这不起作用。显然 "one" != "Uno" 即使它们是相同的。我的第一个解决方法是在将所有内容发布到数据库之前将其更改为数值。例子:

if($_POST['word'] == $lang['word']) { $userWord = 1 }

这对所有单词都非常有效,除了那些包含特殊字符(å、æ、é...)的单词,我所做的一切都无法解决这个问题(我尝试了规范化器;表单的语言特定的 accept-char onchange 事件;utf8_encode。它是绝望。

目前,所有内容都以文本形式保存到数据库中,具体取决于用户使用的语言。因此,如果“语言”是一个选项,但您使用的是挪威语,它会保存为“Språk”。

我需要一个不会让我心碎的简单解决方案——我是 PHP 新手。

4

2 回答 2

1

目前,所有内容都以文本形式保存到数据库中,具体取决于用户使用的语言。

在我看来,这是一个设计缺陷。理想情况下,您的数据将尽可能与语言无关,并且仅使用诸如gettext之类的工具为 UI 执行翻译。通常,选择值之类的项目将与键或 ID 一起存储。

于 2013-10-16T01:41:18.853 回答
0

使用基于通用索引的地图,该索引可以是英文、西班牙文或数字。我建议使用数字。将数字索引存储在数据库中。

在正确方向迈出的一步:

$lang['en'][0] = 'Hello';
$lang['de'][0] = 'Hallo';
$lang['es'][0] = 'Hola';

$lang['en'][1] = 'Sup?';
$lang['de'][1] = 'Wie gehts?';
$lang['es'][1] = 'Que pasa?';

$userLang = 'en';

// show the select
echo '<select name="word">';
foreach ( $lang[$userLang] as $index => $word {
    echo '<option value="'.$index.'">'.$word.'</option>';
}
echo '</select>';

// show the selected word:
echo 'You chose to say "'.$lang[$userLang][$_POST['word']].'".';

// compare the word to what is in the db
if ( $_POST['word'] === $dbRow['word'] ) {
    // expression matches!
    // assume a column in the db "language" describes the language the user chose, e.g. 'en', 'de', or 'es'
    echo 'You previously chose "'.$lang[$dbRow['language']][$dbRow['word']].'" in the language "'.$dbRow['language'].'".;
}

根据您的组织方式,您可能更喜欢按短语分组而不是按语言分组,即:

$lang[0]['en'] = 'Hello';
$lang[0]['de'] = 'Hallo';
$lang[0]['es'] = 'Hola';
于 2013-10-16T01:44:23.970 回答