【问题标题】:Replace variables extracted from database with theirs values用它们的值替换从数据库中提取的变量
【发布时间】:2017-02-16 22:02:00
【问题描述】:

我想将一个 perl 网站翻译成多种语言。我搜索并尝试了很多想法,但我认为最好的方法是将所有翻译保存在 mySQL 数据库中。但是我遇到了一个问题...

当从数据库中提取的句子包含变量(标量)时,它会以标量形式打印在网页上:

You have $number new messages.

是否有适当的方法重新分配$number 的实际值?

感谢您的帮助!

【问题讨论】:

  • 这不是仅仅填写占位符文本的简单问题。在许多语言中,句子的其他部分也会根据占位符的值而改变。例如,“您有 0 个新消息es。”与“您有 1 条新消息e。”其他语言有不同的规则。
  • 感谢您的评论,但我可以在数据库中进行管理。例如英语 You have $number new messages 和法语 $number nouveaux messages en attente。但我无法打印$number...的值...
  • It's not that simple.(那篇文章有点过时了,但问题的描述还是准确的。另见On the state of i18n in Perl。)
  • 再次感谢您,但如果有人可以帮助我解决上面提出的具体问题?...

标签: mysql perl variables cgi


【解决方案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)

【讨论】:

  • 很好的解决方案!非常感谢!!
  • 您要求 OP 更改其整个数据库以支持 printf 格式。我不认为这是一个很好的答案
猜你喜欢
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
相关资源
最近更新 更多