[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#26302: [website] translations
From: |
pelzflorian (Florian Pelz) |
Subject: |
bug#26302: [website] translations |
Date: |
Thu, 19 Sep 2019 07:48:29 +0000 |
User-agent: |
NeoMutt/20180716 |
On Wed, Sep 18, 2019 at 03:57:47PM +0200, Ludovic Courtès wrote:
> Hi Florian,
>
> Could you create an account on Savannah so we can give you commit
> access?
>
Done. My username is pelzflorian.
> > +(define (sgettext x)
> > + "After choosing an identifier for marking s-expressions for
> > +translation, make it usable by defining a macro with it calling
> > +sgettext. If for example the chosen identifier is G_,
> > +use (define-syntax G_ sgettext)."
> > + (syntax-case x ()
> > + ((id exp)
> > + (let* ((msgid (sexp->msgid (syntax->datum #'exp)))
> > + (new-exp (deconstruct (syntax->datum #'exp)
> > + (gettext msgid))))
> > + (datum->syntax #'id new-exp)))))
>
> For this and other similar macros you must use ‘define-syntax’, not
> ‘define’, so that they are defined at expansion time, not at run time.
As per the above docstring, I already have a definition
(define-syntax G_ sgettext)
in (apps i18n). Possibly I should just move it here.
> (It doesn’t make any difference when you’re evaluating code since both
> phases run in the same module, but it does make a difference when these
> phases happen at different times, in different processes.)
>
> Consequently, you must arrange for ‘sexp->msgid’ and ‘deconstruct’ to be
> available at expansion time too. This can be done by wrapping their
> definition in ‘eval-when’:
>
> (eval-when (load expand eval)
> (define (sexp->msgid …) …)
> (define (deconstruct …) …))
>
> But actually it’s not clear to me why these are macros. I think they
> could be regular procedures and it’d work just fine, no?
>
I do not understand. sexp->msgid and deconstruct are procedures, not
syntax transformers. I can add eval-when, but the current code runs
as expected for me.
> > +(define %plural-numbers
> > + ;; Hard-coded list of input numbers such that for each language’s
> > + ;; plural formula, for each possible output grammatical number,
> > + ;; there is an n among %plural-numbers that yields this output
> > + ;; (cf. section Plural forms in the gettext manual), except 1 is
> > + ;; omitted from this list because it is a special case for
> > + ;; sngettext. That is, calling ngettext with each number from
> > + ;; %plural-numbers and with 1 in any locale is guaranteed to return
> > + ;; each plural form at least once. It would be more resilient
> > + ;; towards new languages if instead of hard-coding we computed this
> > + ;; from the Plural-Forms in the MO file header entry, but that is
> > + ;; not worth the incurred code complexity.
> > + '(0 2 3 11 100))
>
> I don’t understand this: are these the only plural numbers in all
> languages, or…?
>
Yes, in all languages for which a plural= formula is documented in the
gettext manual.
For example, Arabic has
Plural-Forms: nplurals=6; \
plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3
\
: n%100>=11 ? 4 : 5;
with input plural numbers 0, 1, 2, 3, 11, 100 mapping to all outputs
0, 1, 2, 3, 4, 5.
Maybe I should add this example to the code comment.
Regards,
Florian
signature.asc
Description: PGP signature