XLSForm / pyxform

A Python package to create XForms for ODK Collect.
BSD 2-Clause "Simplified" License
80 stars 136 forks source link

Make default attribute (`model/itext/translation[@default]`) behaviour more consistent #587

Open lindsay-stevens opened 2 years ago

lindsay-stevens commented 2 years ago

The XForms spec says this about languages:

<itext>
    <translation lang="[language name]" default="true()">

A default=”” attribute can be added to a to make it the default language, otherwise the first listed is used as the default

So the attribute is optional. In a multi-language form with no default_language setting, the first encountered language in the model would be used as the default for Collect, while Enketo would default to the browser locale first.

The following table describes current pyxform behaviour in various scenarios as of f4cbc674 (~v1.7.0). Many of these scenarios correspond to tests in test_translations.py, the rest were checked manually.

The assumed problem is that the @default="true" attribute is not set in a minority of cases, when it could be set for consistency. The proposed change would be to set @default="true" for (en) for cases 5, 7, 15, 17, and 19. For case 15, this may be dependent on #584 to ensure that the (en) lang has itext for the label.

Alternatively, it may be assumed that the problem is that pyxform emits a @default="true" when no default_language setting is present. In which case the proposed change would be to ensure that cases 3, 9, 11, 13, 15 do not set @default="true" for any language.

case langs cols default_lang @default="true()"
1 unnamed label + hint none none (no itext)
2 unnamed label + hint unnamed none (no itext)
3 unnamed label + hint + media::image none unnamed
4 unnamed label + hint + media::image unnamed unnamed
5 (en) label::en + hint::en none none
6 (en) label::en + hint::en (en) (en)
7 (en) label::en + hint::en + media::image::en none none
8 (en) label::en + hint::en + media::image::en (en) (en)
9 unnamed + (en) label + label::en none unnamed
10 unnamed + (en) label + label::en (en) (en)
11 unnamed + (en) label + label::en + media::image none unnamed
12 unnamed + (en) label + label::en + media::image (en) (en)
13 (en) + unnamed label::en + label none (en)
14 (en) + unnamed label::en + label (en) (en)
15 (en) + unnamed label::en + label + media::image none unnamed
16 (en) + unnamed label::en + label + media::image (en) (en)
17 (en) + (fr) label::en + label::fr none none
18 (en) + (fr) label::en + label::fr (en) (en)
19 (en) + (fr) label::en + label::fr + media::image::en none none
20 (en) + (fr) label::en + label::fr + media::image::en (en) (en)