Hi John,

Re: msgstr array - I think that's gonna be a good start. Let's
implement it that way and see what qooxdoo guys say. A verbose example
to make sure I understood it right:

es.po:

msgid "cow"
msgid_plural "cows"
msgstr[0] "vaca"
msgstr[1] "vacas"

ru.po:

msgid "cow"
msgid_plural "cows"
msgstr[0] "korova"
msgstr[1] "korovy"
msgstr[2] "korov"

output:

translations: {
 ...
 "es": {
  "cow": "vaca",
  "cows": "vacas"
 },
 "ru": {
  "cow": "korova",
  "cows": [ "korova", "korovy", "korov" ]
 }
}

I guess I now should fork https://github.com/johnspackman/qooxdoo/tree/
qxcompiler , make changes there and file a PR, right?

Dimitri

P.S. you can find me on #qxdev too

В Вт, 23/02/2016 в 07:38 +0000, John Spackman пишет:
> Hi Dimitri
> 
> Re multi-line: OK, I see the error now: that’s a bug in my book
> :)  I’ll get onto it
> 
> Re msgstr as array: how about if msgstr is an array only if there is
> more than one value to output?  The advantage would be that the
> generator.py can still output code which is compatible with the
> framework (even if it is not compatible with a particular
> application).  
> 
> Re outputting all translations: the reason is just to optimise the
> output, and QxCompiler is trying to mimic the result of generate.py
> so that there is a like-for-like replacement.  But it should be easy
> to add this as an option to the target, it’s on my TODO list
> 
> Cheers
> John
> 
> 
> 
> 
> 
> On 23/02/2016, 00:54, "Dimitri" <mi...@cargosoft.ru> wrote:
> 
> > 
> > John,
> > 
> > Translations seem to work fine now, thanks!
> > 
> > I'm OK with the headers approach, and I'm eager to fiddle with
> > qx.locale.* stuff. However, two things are yet to be done on the
> > side
> > of toolchain:
> > 
> > 1. (minor priority) Support multi-line headers. Typical PO header
> > for
> > Russian localization looks like that:
> > 
> > msgid ""
> > msgstr ""
> > "Project-Id-Version: hello-guile 0.19.4.73\n"
> > "Report-Msgid-Bugs-To: bug-gnu-gett...@gnu.org\n"
> > "PO-Revision-Date: 2015-06-26 08:55+0300\n"
> > "Last-Translator: Yuri Kozlov <yu...@komyakino.ru>\n"
> > "Language-Team: Russian <g...@mx.ru>\n"
> > "Language: ru\n"
> > "MIME-Version: 1.0\n"
> > "Content-Type: text/plain; charset=UTF-8\n"
> > "Content-Transfer-Encoding: 8bit\n"
> > "X-Generator: Lokalize 1.5\n"
> > "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 :
> > n%10>=2
> > && n"
> > "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
> > 
> > It's common practice to split complex expressions into several
> > lines.
> > As you see, lines should be concatenated until "\n" is encountered.
> > Tailing "\n"s should be stripped off as well. In fact, I don't see
> > why
> > a complete set of headers might be needed at runtime. The only two
> > things we need are nplurals and the formula proper. Again, ATM I'm
> > quite fine with application-side processing of headers, but later
> > we
> > can move that logic into the compiler.
> > 
> > 2. (major priority) Pass msgstr[] as array.
> > 
> > At the moment, only one plural is supported. That means, the
> > following
> > mapping takes place:
> > 
> > msgid -> msgstr[0]
> > msgid_plural -> msgstr[1]
> > 
> > With multiple plural forms (there can be up to 6 in Arabic!) we'll
> > need
> > to pass the whole msgstr array to the application. Ideally, I would
> > like to see the following in qx.$$translations:
> > 
> > translations: {
> > ...
> > "ru": {
> >  "cow": "korova",
> >  "cows": [ "korova", "korovy", "korov" ]
> > }
> > }
> > 
> > This would obviously break current qooxdoo. I can implement the
> > qooxdoo
> > side and you'll merge it into your branch, or we can temporarily
> > stick
> > to the following non-compatibility-breaking approach:
> > 
> > translations: {
> > ...
> > "ru": {
> >  "cow": "korova", // msgstr[0]
> > 
> > "cows":"korovy", // msgstr[1]
> >  "cows@plural": [ "korova", "korovy",
> > "korov" ] // whole msgstr array
> > }
> > }
> > 
> > Dimitri
> > 
> > P.S. I've noticed that both QxCompiler and generate.py do the same
> > thing: a msgid/msgstr will only make it to the qx.$$translations,
> > if it appears in the code as a string constant inside a tr*() call.
> > What's the rationale behind that? What if tr() is called on a
> > dynamically computed expression or data received from server? Why
> > not simply copy all the msgstrs unconditionally? This will simplify
> > compiler code as well. I'm not insisting that should be done this
> > way, just wondering.
> > 
> > В Пн, 22/02/2016 в 18:25 +0000, John Spackman пишет:
> > > 
> > > I think that the only thing missing from the toolchain to support
> > > this is being able to include the headers from the translation in
> > > the
> > > compiled application; I’ve just pushed a version of QxCompiler
> > > that
> > > now adds this.  
> > > 
> > > I have not done the corresponding changes to qx.locale.Manager
> > > because it’s probably easier for you to mod that :) but at least
> > > the
> > > data is ready when you have a moment.  In qx.locale.Manager, the
> > > data
> > > is available at this.__translations[locale + ":__header__"] or
> > > globally as qx.$$translations[locale + ":__header__”].
> > > 
> > > I’m not 100% sure that this is the best way to output the header
> > > information, so if you want a different layout let me know or
> > > take a
> > > look at qxcompiler.targets.Target on lines 328 to 343:
> > > function(cb) {
> > >   async.each(t.getLocales(),
> > >       function(localeId, cb) {
> > >         analyser.getTranslation(library, localeId, function(err,
> > > translation) {
> > >           if (err)
> > >             return cb(err);
> > > 
> > >           var dest = pkgdata.translations[localeId +
> > > ":__header__"] =
> > > {};
> > >           var src = translation.getHeaders();
> > >           for (var key in src)
> > >             dest[key] = src[key];
> > >           cb();
> > >         });
> > >       },
> > >       cb);
> > > },
> > > Note that there is another change in this release of QxCompiler
> > > that
> > > changes the directory names inside source-output (more on that in
> > > a
> > > moment) so it’s best to delete the source-output directory before
> > > you
> > > try again.
> > > 
> > > John
> > > 
> > > From: Dimitri <mi...@cargosoft.ru>
> > > Reply-To: qooxdoo Development <qooxdoo-de...@lists.sourceforge.ne
> > > t>
> > > Date: Monday, 22 February 2016 at 16:42
> > > To: qooxdoo Development <qooxdoo-devel@lists.sourceforge.net>
> > > Subject: [qooxdoo-devel] Supporting multiple plural forms in
> > > translations
> > > 
> > > In qooxdoo's translation mechanism, multiple plural forms are not
> > > supported. The corresponding issue has been reported almost 10
> > > years
> > > ago. Time to revise it?
> > > 
> > > This is essential for many languages, eg. of Baltic and Slavic
> > > families. Contrary to English, these languages may have, say, one
> > > plural form to denote 2, 3,4 items and another for >=5 items. For
> > > example, let's take the word "korova" ("cow" in Russian and
> > > Ukrainian):
> > > 
> > > 1 korova [singluar]
> > > 2,3,4 korovy [plural 1]
> > > 5-20 korov [plural 2]
> > > 21,31,41... korova [plural equals to singular]
> > > 22,23,24 korovy
> > > 25-30 korov etc.
> > > 
> > > The original GNU gettext (which qooxdoo's translation facility is
> > > modeled after) provides such a mechanism. There is a special
> > > "Plural-
> > > Forms" PO file header that contains:
> > > - total number of plural forms;
> > > - a formula to factorize ordinals into classes of plurals. msgstr
> > > lookup is then done based on the plural class (the result of
> > > evaluation of the formula), rather than on the ordinal itself.
> > > 
> > > For Russian, Ukrainian, Belarusian, Serbian and Croatian, the
> > > formula
> > > looks like this:
> > > 
> > > Plural-Forms: nplurals=3;plural=n%10==1 && n%100!=11 ? 0 :
> > > n%10>=2 &&
> > > n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;
> > > 
> > > With the above, the translation itself would look like this
> > > (transliterated for better perception):
> > > 
> > > msgid "cow"
> > > msgid_plural "cows"
> > > msgstr[0] "korova"
> > > msgstr[1] "korovy"
> > > msgstr[2] "korov"
> > > 
> > > Per specification, the formula should be a valid C language
> > > expression, limited to one variable (n).
> > > 
> > > It would be nice to have it implemented in qooxdoo. However, that
> > > would require changes in both framework and toolchain. At the
> > > moment,
> > > internal translations structure looks like that:
> > > 
> > > translations: {
> > >  ...
> > >  "ru": {
> > >   "cow": "korova",
> > >   "cows": "korovy"
> > >  }
> > > }
> > > 
> > > This could be changed to:
> > > 
> > > translations: {
> > >  ...
> > >  "ru": {
> > >   "cow": "korova",
> > >   "cows": [ "korova", "korovy", "korov" ]
> > >  }
> > > }
> > > 
> > > and locales structure could contain a function to compute plural
> > > form
> > > from ordinal, created from a Plural-Forms PO header by the
> > > compiler.
> > > A valid C expression will be a valid JavaScript expression, too,
> > > and
> > > we can benefit from this. I've examined several gettext
> > > implementations for JavaScript; those that do support Plural-
> > > Forms
> > > simply evaluate this expression unchanged as JavaScript. For
> > > security
> > > purposes, we could validate the expression first, to make sure it
> > > is
> > > restricted to arithmetic, logical and ternary operators.
> > > 
> > > I think that we could start with implementing minimal, non-
> > > breaking
> > > changes in framework, namely internal structure for translations,
> > > plural classifier in locales, translation logic in tr*()
> > > functions.
> > > Meanwhile, we could experiment with John Spackman's QxCompiler to
> > > introduce Plural-Form parsing. As soon as POC is ready, it can be
> > > ported to generate.py or Grunt based toolchain, whichever becomes
> > > mainstream at that moment.
> > > 
> > > John, guys, what do you think?
> > > 
> > > Dimitri
> > > ---------------------------------------------------------------
> > > ----
> > > ----------- Site24x7 APM Insight: Get Deep Visibility into
> > > Application Performance APM + Mobile APM + RUM: Monitor 3 App
> > > instances at just $35/Month Monitor end-to-end web transactions
> > > and
> > > take corrective actions now Troubleshoot faster and improve end-
> > > user
> > > experience. Signup Now! http://pubads.g.doubleclick.net/gampad/cl
> > > k?id
> > > =272487151&iu=/4140______________________________________________
> > > _
> > > qooxdoo-devel mailing list qooxdoo-devel@lists.sourceforge.net
> > > https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel
> > > ---------------------------------------------------------------
> > > ----
> > > -----------
> > > Site24x7 APM Insight: Get Deep Visibility into Application
> > > Performance
> > > APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
> > > Monitor end-to-end web transactions and take corrective actions
> > > now
> > > Troubleshoot faster and improve end-user experience. Signup Now!
> > > http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140
> > > _______________________________________________
> > > qooxdoo-devel mailing list
> > > qooxdoo-devel@lists.sourceforge.net
> > > https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel
> > -----------------------------------------------------------------
> > -------------
> > Site24x7 APM Insight: Get Deep Visibility into Application
> > Performance
> > APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
> > Monitor end-to-end web transactions and take corrective actions now
> > Troubleshoot faster and improve end-user experience. Signup Now!
> > http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140
> > _______________________________________________
> > qooxdoo-devel mailing list
> > qooxdoo-devel@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel
> 
> 
> -------------------------------------------------------------------
> -----------
> Site24x7 APM Insight: Get Deep Visibility into Application
> Performance
> APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
> Monitor end-to-end web transactions and take corrective actions now
> Troubleshoot faster and improve end-user experience. Signup Now!
> http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140
> _______________________________________________
> qooxdoo-devel mailing list
> qooxdoo-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel

------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140
_______________________________________________
qooxdoo-devel mailing list
qooxdoo-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel

Reply via email to