We add new array for plural forms. We use the msgid as the identifier translatable strings with a plural form. This is the same as done for .mo files, from [1]:
> However, only the singular of the original string takes part in the > hash table lookup. We also obtain the plural forms and the number of plural forms directly from the $LANG.po file, this requires the file to have a Plural-Forms header that is valid, otherwise it would fail to evaluated by the ngettext function when calling `Number($plural_forms)`. Regarding the fallback to the original string, from [2]: > The parameter n is used to determine the plural form. If no message > catalog is found msgid1 is returned if n == 1, otherwise msgid2. We default to the non-translated singular/plural depending on whether n==1. Regarding the default for $nplurals and $plural_forms: We select the values for "Two forms, singular used for one only" from [2], this would match with germanic and latin families. This partially restores commit 2235ad7c7c79e29f09d3f3205ad86e862b5ac14c. [1] https://www.gnu.org/software/gettext/manual/html_node/MO-Files.html [2] https://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html Signed-off-by: Maximiliano Sandoval <m.sando...@proxmox.com> --- po2js.pl | 52 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/po2js.pl b/po2js.pl index c5268d7..d5a78a6 100755 --- a/po2js.pl +++ b/po2js.pl @@ -35,6 +35,10 @@ sub fnv31a { } my $catalog = {}; +my $plurals_catalog = {}; + +my $nplurals = 2; +my $plural_forms = "n!=1"; foreach my $filename (@ARGV) { my $href = Locale::PO->load_file_ashash($filename) @@ -49,6 +53,11 @@ foreach my $filename (@ARGV) { die "unable to get charset\n" if !$charset; } + if ($header =~ m|^Plural-Forms:\s+nplurals\s?=\s?([123456]);\s+plural=(.*);$|im) { + $nplurals = $1 + 0; + $plural_forms = $2; + } + foreach my $k (keys %$href) { my $po = $href->{$k}; next if $po->fuzzy(); # skip fuzzy entries @@ -64,23 +73,37 @@ foreach my $filename (@ARGV) { my $qmsgid = decode($charset, $po->msgid); my $msgid = $po->dequote($qmsgid); - my $qmsgstr = decode($charset, $po->msgstr); - my $msgstr = $po->dequote($qmsgstr); + my $qmsgid_plural = decode($charset, $po->msgid_plural); + my $msgid_plural = $po->dequote($qmsgid_plural); - next if !length($msgid); # skip header - - next if !length($msgstr); # skip untranslated entries + next if !length($msgid) && !length($msgid_plural); # skip header my $digest = fnv31a($msgid); die "duplicate digest" if $catalog->{$digest}; - $catalog->{$digest} = [$msgstr]; - # later, we can add plural forms to the array + if (defined($po->msgstr)) { + my $qmsgstr = decode($charset, $po->msgstr); + my $msgstr = $po->dequote($qmsgstr); + + next if !length($msgstr); # skip untranslated entries + $catalog->{$digest} = [$msgstr]; + } + + if (defined(my $plurals = $po->msgstr_n)) { + for my $case (sort { $a <=> $b } keys $plurals->%*) { + my $qmsgstr_n = decode($charset, $plurals->{$case}); + my $msgstr_n = $po->dequote($qmsgstr_n); + + next if !length($msgstr_n); # skip untranslated entries + push $plurals_catalog->{$digest}->@*, $msgstr_n; + } + } } } my $json = to_json($catalog, { canonical => 1, utf8 => 1 }); +my $plurals_json = to_json($plurals_catalog, { canonical => 1, utf8 => 1 }); my $version = $options->{v} // ("dev-build " . localtime()); my $content = "// $version\n"; # write version to the beginning to better avoid stale cache @@ -91,6 +114,7 @@ $content .= "// Proxmox Message Catalog: $outfile\n" if $outfile; $content .= <<__EOD; __proxmox_i18n_msgcat__ = $json; +__proxmox_i18n_plurals_msgcat__ = $plurals_json; function fnv31a(text) { var len = text.length; @@ -112,6 +136,20 @@ function gettext(buf) { } return data[0] || buf; } + +function ngettext(singular, plural, n) { + const msg_idx = Number($plural_forms); + const digest = fnv31a(singular); + const translation = __proxmox_i18n_plurals_msgcat__[digest]; + if (!translation[msg_idx]) { + if (n === 1) { + return singular; + } else { + return plural; + } + } + return translation[msg_idx]; +} __EOD if ($outfile) { -- 2.47.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel