in fluent/migrate/transforms.py [0:0]
def __call__(self, ctx):
element = super().__call__(ctx)
selector = ctx.evaluate(self.selector)
keys = ctx.plural_categories
forms = [FTL.TextElement(part.strip()) for part in element.value.split(";")]
# The default CLDR form should be the last we have in DEFAULT_ORDER,
# usually `other`, but in some cases `many`. If we don't have a variant
# for that, we'll append one, using the, in CLDR order, last existing
# variant in the legacy translation. That may or may not be the last
# variant.
default_key = [key for key in reversed(self.DEFAULT_ORDER) if key in keys][0]
# Match keys to legacy forms in the order they are defined in Gecko's
# PluralForm.jsm. Filter out empty forms.
pairs = [(key, var) for key, var in zip(keys, forms) if var.value]
# A special case for legacy translations which don't define any
# plural forms.
if len(pairs) == 0:
return Transform.pattern_of()
# A special case for languages with one plural category or one legacy
# variant. We don't need to insert a SelectExpression for them.
if len(pairs) == 1:
_, only_form = pairs[0]
only_variant = ctx.evaluate(self.foreach(only_form))
return Transform.pattern_of(only_variant)
# Make sure the default key is defined. If it's missing, use the last
# form (in CLDR order) found in the legacy translation.
pairs.sort(key=lambda pair: self.DEFAULT_ORDER.index(pair[0]))
last_key, last_form = pairs[-1]
if last_key != default_key:
pairs.append((default_key, last_form))
def createVariant(key, form):
# Run the legacy plural form through `foreach` which returns an
# `FTL.Node` describing the transformation required for each
# variant. Then evaluate it to a migrated FTL node.
value = ctx.evaluate(self.foreach(form))
return FTL.Variant(
key=FTL.Identifier(key), value=value, default=key == default_key
)
select = FTL.SelectExpression(
selector=selector,
variants=[createVariant(key, form) for key, form in pairs],
)
return Transform.pattern_of(select)