我想用多种语言翻译perl网站。我搜索并尝试了很多想法,但我认为最好的方法是将所有翻译保存在mySQL数据库中。但我遇到了问题...
当从数据库中提取的句子包含变量(标量)时,它会在网页上以标量打印:
You have $number new messages.
是否有正确的方法来重新分配$number
其实际值?
感谢您的帮助!
答案 0 :(得分:-1)
您可以在数据库中使用printf
格式字符串,并将值传入其中。
printf
允许您指定参数的位置,因此只知道参数列表“$ number”的位置。
例如
#!/usr/bin/perl
use strict;
my $Details = {
'Name' => 'Mr Satch',
'Age' => '31',
'LocationEn' => 'England',
'LocationFr' => 'Angleterre',
'NewMessages' => 20,
'OldMessages' => 120,
};
my $English = q(
Hello %1$s, I see you are %2$s years old and from %3$s
How are you today?
You have %5$i new messages and %6$i old messages
Have a nice day
);
my $French = q{
Bonjour %1$s, je vous vois d'%4$s et âgés de %2$s ans.
Comment allez-vous aujourd'hui?
Vous avez %5$i nouveaux messages et %6$i anciens messages.
Bonne journée.
};
printf($English, @$Details{qw/Name Age LocationEn LocationFr NewMessages OldMessages/});
printf($French, @$Details{qw/Name Age LocationEn LocationFr NewMessages OldMessages/});
这将是一个维护的噩梦,所以另一种选择可能是在数据库中包含一个参数列表:
#!/usr/bin/perl
use strict;
sub fetch_row {
return {
'Format' => 'You have %i new messages and %i old messages' . "\n",
'Arguments' => 'NewMessages OldMessages',
}
}
sub PrintMessage {
my ($info,$row) = @_;
printf($row->{'Format'},@$info{split(/ +/,$row->{'Arguments'})});
}
my $Details = {
'Name' => 'Mr Satch',
'Age' => '31',
'LocationEn' => 'England',
'LocationFr' => 'Angleterre',
'NewMessages' => 20,
'OldMessages' => 120,
};
my $row = fetch_row();
PrintMessage($Details,$row)