Page MenuHomePhabricator

Make WMF translations extension pass `bin/i18n validate`
Open, Needs TriagePublic

Event Timeline

Change #1217873 had a related patch set uploaded (by Pppery; author: Pppery):

[phabricator/translations@wmf/stable] Add an internal translation file for this repo's own strings

https://gerrit.wikimedia.org/r/1217873

Change #1217872 had a related patch set uploaded (by Pppery; author: Pppery):

[phabricator/translations@wmf/stable] Rm "translations" into English

https://gerrit.wikimedia.org/r/1217872

Change #1217873 merged by Aklapper:

[phabricator/translations@wmf/stable] Add an internal translation file for this repo's own strings

https://gerrit.wikimedia.org/r/1217873

Change #1217872 merged by Aklapper:

[phabricator/translations@wmf/stable] Rm "translations" into English

https://gerrit.wikimedia.org/r/1217872

Pppery changed the task status from Open to Stalled.Dec 26 2025, 8:07 PM

There is more to do here (adding locale files for a bunch of languages), but there's no point in doing it until WMF pulls in the upstream that actually contains bin/i18n validate so I have a steady state to base it off of.

Change #1221224 had a related patch set uploaded (by Pppery; author: Pppery):

[phabricator/translations@wmf/stable] [Don't merge yet] Add locales for all remaining languages

https://gerrit.wikimedia.org/r/1221224

Pppery changed the task status from Stalled to Open.Jun 10 2026, 10:38 PM

(This is still nowhere close to done; it needs, in addition to the above patch being merged, an import/export on the translatewiki.net side, probably a bit of manual cleanup of stuff on my side, and another export)

Change #1221224 merged by Aklapper:

[phabricator/translations@wmf/stable] Add locales for all remaining languages

https://gerrit.wikimedia.org/r/1221224

Current validation errors: P94100

Still needs another export/generate cycle.

I also see a few more missing locales, and a few malformed strings.

As of https://gerrit.wikimedia.org/r/c/phabricator/translations/+/1309254:

1The following validation errors were found:
2The locale `ar` defines a translation for the string "Standard Phabricator.", however that string does not appear to be referenced by the codebase.
3The locale `ca` defines a translation for the string "Standard Phabricator.", however that string does not appear to be referenced by the codebase.
4The locale `ca` defines a translation for the string "Enable expert mode to reveal additional "advanced" options in the Phabricator UI.", however that string does not appear to be referenced by the codebase.
5The locale `ca` defines a translation for the string "Expert Mode.", however that string does not appear to be referenced by the codebase.
6The locale `ca` defines a translation for the string "Create custom access control policy objects.", however that string does not appear to be referenced by the codebase.
7The locale `ca` defines a translation for the string "Expert Mode", however that string does not appear to be referenced by the codebase.
8The locale `de_DE` defines a translation for the string "Standard Phabricator.", however that string does not appear to be referenced by the codebase.
9The locale `de_DE` defines a translation for the string "Expert Mode", however that string does not appear to be referenced by the codebase.
10The locale `es_ES` defines a translation for the string "Enable expert mode to reveal additional "advanced" options in the Phabricator UI.", however that string does not appear to be referenced by the codebase.
11The locale `fa` defines a translation for the string "Expert Mode", however that string does not appear to be referenced by the codebase.
12The locale `fi` defines a translation for the string "Standard Phabricator.", however that string does not appear to be referenced by the codebase.
13The locale `fi` defines a translation for the string "Expert Mode.", however that string does not appear to be referenced by the codebase.
14The locale `fi` defines a translation for the string "Create custom access control policy objects.", however that string does not appear to be referenced by the codebase.
15The locale `fi` defines a translation for the string "Expert Mode", however that string does not appear to be referenced by the codebase.
16The locale `fr_FR` defines a translation for the string "Standard Phabricator.", however that string does not appear to be referenced by the codebase.
17The locale `fr_FR` defines a translation for the string "Enable expert mode to reveal additional "advanced" options in the Phabricator UI.", however that string does not appear to be referenced by the codebase.
18The locale `fr_FR` defines a translation for the string "Expert Mode.", however that string does not appear to be referenced by the codebase.
19The locale `fr_FR` defines a translation for the string "Create custom access control policy objects.", however that string does not appear to be referenced by the codebase.
20The locale `fr_FR` defines a translation for the string "Expert Mode", however that string does not appear to be referenced by the codebase.
21The locale `ja` defines a translation for the string "Standard Phabricator.", however that string does not appear to be referenced by the codebase.
22The locale `ko_KR` defines a translation for the string "Standard Phabricator.", however that string does not appear to be referenced by the codebase.
23The locale `ko_KR` defines a translation for the string "Supported values for `objectType` (some object types might not be supported
24if the corresponding application is not available to the user):
25
26%s
27
28Supported values for `default`: `%s`, `%s`.
29
30Values for `policy` must be arrays which include an `action` (either `%s` or
31`%s`), a `rule` (PolicyRule class), and a `value` array (e.g. PHIDs).
32", however that string does not appear to be referenced by the codebase.
33The locale `ko_KR` defines a translation for the string "Enable expert mode to reveal additional "advanced" options in the Phabricator UI.", however that string does not appear to be referenced by the codebase.
34The locale `ko_KR` defines a translation for the string "Expert Mode.", however that string does not appear to be referenced by the codebase.
35The locale `ko_KR` defines a translation for the string "Create custom access control policy objects.", however that string does not appear to be referenced by the codebase.
36The locale `ko_KR` defines a translation for the string "Expert Mode", however that string does not appear to be referenced by the codebase.
37The locale `lb` defines a translation for the string "Expert Mode.", however that string does not appear to be referenced by the codebase.
38The locale `lb` defines a translation for the string "Expert Mode", however that string does not appear to be referenced by the codebase.
39The locale `nl` defines a translation for the string "Standard Phabricator.", however that string does not appear to be referenced by the codebase.
40The locale `nl` defines a translation for the string "Enable expert mode to reveal additional "advanced" options in the Phabricator UI.", however that string does not appear to be referenced by the codebase.
41The locale `nl` defines a translation for the string "Expert Mode.", however that string does not appear to be referenced by the codebase.
42The locale `nl` defines a translation for the string "Create custom access control policy objects.", however that string does not appear to be referenced by the codebase.
43The locale `nl` defines a translation for the string "Expert Mode", however that string does not appear to be referenced by the codebase.
44The locale `pt_BR` defines a translation for the string "Standard Phabricator.", however that string does not appear to be referenced by the codebase.
45The locale `pt_BR` defines a translation for the string "Enable expert mode to reveal additional "advanced" options in the Phabricator UI.", however that string does not appear to be referenced by the codebase.
46The locale `pt_BR` defines a translation for the string "Expert Mode.", however that string does not appear to be referenced by the codebase.
47The locale `pt_BR` defines a translation for the string "Create custom access control policy objects.", however that string does not appear to be referenced by the codebase.
48The locale `pt_BR` defines a translation for the string "Expert Mode", however that string does not appear to be referenced by the codebase.
49The locale `ru` defines a translation for the string "Expert Mode.", however that string does not appear to be referenced by the codebase.
50The locale `ru` defines a translation for the string "Expert Mode", however that string does not appear to be referenced by the codebase.
51The locale `sl` defines a translation for the string "Expert Mode.", however that string does not appear to be referenced by the codebase.
52The locale `sl` defines a translation for the string "Expert Mode", however that string does not appear to be referenced by the codebase.
53The locale `tr` defines a translation for the string "Standard Phabricator.", however that string does not appear to be referenced by the codebase.
54The locale `tr` defines a translation for the string "Enable expert mode to reveal additional "advanced" options in the Phabricator UI.", however that string does not appear to be referenced by the codebase.
55The locale `tr` defines a translation for the string "Expert Mode.", however that string does not appear to be referenced by the codebase.
56The locale `tr` defines a translation for the string "Create custom access control policy objects.", however that string does not appear to be referenced by the codebase.
57The locale `tr` defines a translation for the string "Expert Mode", however that string does not appear to be referenced by the codebase.
58The locale `uk` defines a translation for the string "Standard Phabricator.", however that string does not appear to be referenced by the codebase.
59The locale `uk` defines a translation for the string "Enable expert mode to reveal additional "advanced" options in the Phabricator UI.", however that string does not appear to be referenced by the codebase.
60The locale `uk` defines a translation for the string "Expert Mode.", however that string does not appear to be referenced by the codebase.
61The locale `uk` defines a translation for the string "Expert Mode", however that string does not appear to be referenced by the codebase.
62Translations are defined for the locale `ky`, which is not recognized.
63Translations are defined for the locale `se`, which is not recognized.
64Translations are defined for the locale `yi`, which is not recognized.
65Translations are defined for the locale `af`, which is not recognized.
66Translations are defined for the locale `ban`, which is not recognized.
67Translations are defined for the locale `ig`, which is not recognized.
68Translations are defined for the locale `ms_Arab`, which is not recognized.
69Translations are defined for the locale `sd`, which is not recognized.
70Translations are defined for the locale `smn`, which is not recognized.
71Translations are defined for the locale `uz`, which is not recognized.
72Translations are defined for the locale `gcr`, which is not recognized.
73Translations are defined for the locale `dga`, which is not recognized.
74Translations are defined for the locale `mos`, which is not recognized.
75Translations are defined for the locale `kab`, which is not recognized.
76Translations are defined for the locale `bg`, which is not recognized.
77Translations are defined for the locale `fy`, which is not recognized.
78Translations are defined for the locale `tly`, which is not recognized.
79Translations are defined for the locale `bs`, which is not recognized.
80Translations are defined for the locale `ha`, which is not recognized.
81Translations are defined for the locale `kum`, which is not recognized.
82Translations are defined for the locale `be`, which is not recognized.
83Translations are defined for the locale `et`, which is not recognized.
84Translations are defined for the locale `hyw`, which is not recognized.
85Translations are defined for the locale `mdf`, which is not recognized.
86Translations are defined for the locale `kaa`, which is not recognized.
87Translations are defined for the locale `az`, which is not recognized.
88Translations are defined for the locale `nn`, which is not recognized.
89Translations are defined for the locale `ur`, which is not recognized.
90Translations are defined for the locale `tcy`, which is not recognized.
91Translations are defined for the locale `yue_Hant`, which is not recognized.
92Translations are defined for the locale `zgh`, which is not recognized.
93Translations are defined for the locale `mnc`, which is not recognized.
94Translations are defined for the locale `lv`, which is not recognized.
95Translations are defined for the locale `fit`, which is not recognized.
96Translations are defined for the locale `ti`, which is not recognized.
97Translations are defined for the locale `kiu`, which is not recognized.
98Translations are defined for the locale `sk`, which is not recognized.
99The locale `ca` defines a translation for the key `Attempting to run unit tests on a library which has not been loaded, at:
100
101 %s
102
103Make sure this library is configured to load.
104
105(In rare cases, this may be because you are attempting to run one copy of this software against a different copy of this software. This operation is not supported.)` which failed to interpolate properly. Probably it defines too many parameters.
106The locale `de_DE` defines a translation for the key `Attempting to run unit tests on a library which has not been loaded, at:
107
108 %s
109
110Make sure this library is configured to load.
111
112(In rare cases, this may be because you are attempting to run one copy of this software against a different copy of this software. This operation is not supported.)` which failed to interpolate properly. Probably it defines too many parameters.
113The locale `ru` defines a translation for the key `Attempting to run unit tests on a library which has not been loaded, at:
114
115 %s
116
117Make sure this library is configured to load.
118
119(In rare cases, this may be because you are attempting to run one copy of this software against a different copy of this software. This operation is not supported.)` which failed to interpolate properly. Probably it defines too many parameters.
120The locale `nl` defines a translation for the key `CIDR block "%s" is not formatted correctly. The IP block mask ("%s") must mask between 0 and %s bits, inclusive.`, which varies on the plurality or gender of parameter 1, however that parameter is not a number or person.
121The locale `nl` defines a translation for the key `%s added %s JIRA issue(s): %s.`, which varies on the plurality or gender of parameter 1, however that parameter is not a number or person.
122The locale `nl` defines a translation for the key `%s added %s reviewer(s): %s.`, which varies on the plurality or gender of parameter 1, however that parameter is not a number or person.
123The locale `fr_FR` defines a translation for the key `%s edited reverted change(s), added %s: %s; removed %s: %s.`, which varies on the plurality or gender of parameter 1, however that parameter is not a number or person.
124The locale `fr_FR` defines a translation for the key `%s edited reverting change(s), added %s: %s; removed %s: %s.`, which varies on the plurality or gender of parameter 1, however that parameter is not a number or person.
125The locale `nl` defines a translation for the key `%s edited task(s) for %s, added %s: %s; removed %s: %s.`, which varies on the plurality or gender of parameter 2, however that parameter is not a number or person.
126The locale `fr_FR` defines a translation for the key `%s failed remote builds in %s for %s!`, which varies on the plurality or gender of parameter 1, however that parameter is not a number or person.
127The locale `fr_FR` defines a translation for the key `%s failed remote builds in %s!`, which varies on the plurality or gender of parameter 1, however that parameter is not a number or person.
128The locale `ca` defines a translation for the key `Database host "%s" is configured to use the default minimum word length when building search indexes, which is 4. This means words which are only 3 characters long will not be indexed and can not be searched for.
129
130For example, you will not be able to find search results for words like 'SMS', 'web', or 'DOS'.
131
132You can change this setting to 3 to allow these words to be indexed. Alternatively, you can ignore this warning if you are not concerned about searching for 3-letter words. If you later plan to configure Elasticsearch, you can also ignore this warning: only MySQL fulltext search is affected.
133
134To reduce the minimum word length to 3, add this to your %s file (in the %s section) and then restart %s:
135
136%s
137` which failed to interpolate properly. Probably it defines too many parameters.
138The locale `fr_FR` defines a translation for the key `Database host "%s" is configured to use the default minimum word length when building search indexes, which is 4. This means words which are only 3 characters long will not be indexed and can not be searched for.
139
140For example, you will not be able to find search results for words like 'SMS', 'web', or 'DOS'.
141
142You can change this setting to 3 to allow these words to be indexed. Alternatively, you can ignore this warning if you are not concerned about searching for 3-letter words. If you later plan to configure Elasticsearch, you can also ignore this warning: only MySQL fulltext search is affected.
143
144To reduce the minimum word length to 3, add this to your %s file (in the %s section) and then restart %s:
145
146%s
147` which failed to interpolate properly. Probably it defines too many parameters.
148The locale `ca` defines a translation for the key `Database host "%s" is using the builtin stopword file for building search indexes. This can make the search feature less useful.
149
150Stopwords are common words which are not indexed and thus can not be searched for. The default stopword file has about 500 words, including various words which you are likely to wish to search for, such as 'various', 'likely', 'wish', and 'zero'.
151
152To make search more useful, you can use an alternate stopword file with fewer words. Alternatively, if you aren't concerned about searching for common words, you can ignore this warning. If you later plan to configure Elasticsearch, you can also ignore this warning: this stopword file only affects MySQL fulltext indexes.
153
154To choose a different stopword file, add this to your %s file (in the %s section) and then restart %s:
155
156%s
157(You can also use a different file if you prefer. The file suggested above has about 50 of the most common English words.)` which failed to interpolate properly. Probably it defines too many parameters.
158The locale `fr_FR` defines a translation for the key `Database host "%s" is using the builtin stopword file for building search indexes. This can make the search feature less useful.
159
160Stopwords are common words which are not indexed and thus can not be searched for. The default stopword file has about 500 words, including various words which you are likely to wish to search for, such as 'various', 'likely', 'wish', and 'zero'.
161
162To make search more useful, you can use an alternate stopword file with fewer words. Alternatively, if you aren't concerned about searching for common words, you can ignore this warning. If you later plan to configure Elasticsearch, you can also ignore this warning: this stopword file only affects MySQL fulltext indexes.
163
164To choose a different stopword file, add this to your %s file (in the %s section) and then restart %s:
165
166%s
167(You can also use a different file if you prefer. The file suggested above has about 50 of the most common English words.)` which failed to interpolate properly. Probably it defines too many parameters.
168The locale `dga` defines a translation for the key `Database host "%s" is using the builtin stopword file for building search indexes. This can make the search feature less useful.
169
170Stopwords are common words which are not indexed and thus can not be searched for. The default stopword file has about 500 words, including various words which you are likely to wish to search for, such as 'various', 'likely', 'wish', and 'zero'.
171
172To make search more useful, you can use an alternate stopword file with fewer words. Alternatively, if you aren't concerned about searching for common words, you can ignore this warning. If you later plan to configure Elasticsearch, you can also ignore this warning: this stopword file only affects MySQL fulltext indexes.
173
174To choose a different stopword file, add this to your %s file (in the %s section) and then restart %s:
175
176%s
177(You can also use a different file if you prefer. The file suggested above has about 50 of the most common English words.)` which failed to interpolate properly. Probably it defines too many parameters.
178The locale `nl` defines a translation for the key `Maximum token name length is %d characters.`, which varies on the plurality or gender of parameter 1, however that parameter is not a number or person.
179The locale `nl` defines a translation for the key `This object ("%s") has more than %s transactions in its most recent transaction group; this is too many.`, which varies on the plurality or gender of parameter 1, however that parameter is not a number or person.
180The locale `ca` defines a translation for the key `This request did not include a "Host" header. This may mean that your webserver (like nginx or apache) is misconfigured so the "Host" header is not making it to this software, or that you are making a raw request without a "Host" header using a tool or library.
181
182If you are using a web browser, check your webserver configuration. If you are using a tool or library, check how the request is being constructed.
183
184It is also possible (but very unlikely) that some other network device (like a load balancer) is stripping the header.
185
186Requests must include a valid "Host" header.` which failed to interpolate properly. Probably it defines too many parameters.

That's a lot better. I see several classes of errors here:

  • Upstream deleted source strings - needs https://gerrit.wikimedia.org/r/c/phabricator/translations/+/1309254 to be deployed to translatewiki and generated.
  • Missing locale files. These need manual work, and it's going to be a pain to keep up with them but I'll manage.
  • Bad plurals in a few strings on translatewiki.
  • Bad interpolations in a few cases.

Change #1309266 had a related patch set uploaded (by Pppery; author: Pppery):

[phabricator/translations@wmf/stable] Add a bunch more locale files

https://gerrit.wikimedia.org/r/1309266

Okay, that patch deals with the missing locale files. I fixed most of the remaining cases on translatewiki. Unfortunately there's one that needs to be fixed upstream, and then this will be as done as it can be (although there are parts of it that are neverending)

Change #1309266 merged by Aklapper:

[phabricator/translations@wmf/stable] Add a bunch more locale files

https://gerrit.wikimedia.org/r/1309266

The following validation errors were found:
The locale `ar` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `be_Tarask` defines a translation for the string "Belarusian (Belarus)", however that string does not appear to be referenced by the codebase.
The locale `be_Tarask` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `br` defines a translation for the string "Belarusian (Belarus)", however that string does not appear to be referenced by the codebase.
The locale `br` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `ce` defines a translation for the string "Belarusian (Belarus)", however that string does not appear to be referenced by the codebase.
The locale `ce` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `fr_FR` defines a translation for the string "Belarusian (Belarus)", however that string does not appear to be referenced by the codebase.
The locale `fr_FR` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `ja` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `ko_KR` defines a translation for the string "Belarusian (Belarus)", however that string does not appear to be referenced by the codebase.
The locale `ko_KR` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `lb` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `nl` defines a translation for the string "Belarusian (Belarus)", however that string does not appear to be referenced by the codebase.
The locale `nl` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `pl` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `pt_PT` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `ru` defines a translation for the string "Belarusian (Belarus)", however that string does not appear to be referenced by the codebase.
The locale `ru` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `skr_Arab` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `sr_EC` defines a translation for the string "Belarusian (Belarus)", however that string does not appear to be referenced by the codebase.
The locale `sr_EC` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `uk` defines a translation for the string "Belarusian (Belarus)", however that string does not appear to be referenced by the codebase.
The locale `uk` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `zh_Hans` defines a translation for the string "Belarusian (Belarus)", however that string does not appear to be referenced by the codebase.
The locale `zh_Hans` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `ps` defines a translation for the string "Belarusian (Belarus)", however that string does not appear to be referenced by the codebase.
The locale `ps` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `vi` defines a translation for the string "Belarusian (Belarus)", however that string does not appear to be referenced by the codebase.
The locale `vi` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `kg` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `kab` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `sk` defines a translation for the string "Belarusian (Belarus)", however that string does not appear to be referenced by the codebase.
The locale `sk` defines a translation for the string "Norwegian", however that string does not appear to be referenced by the codebase.
The locale `nl` defines a translation for the key `Maximum token name length is %d characters.`, which varies on the plurality or gender of parameter 1, however that parameter is not a number or person.

Still having more problems with the world shifting out from under me as source strings are added or removed. Hopefully the next set of patches will get it down to just the last entry (which is pending WMF pulling in next upstream, although I will probably close this as "close enough" when that's the only one left)

After next update

Translations are defined for the locale `kw`, which is not recognized.
Translations are defined for the locale `ro`, which is not recognized.
The locale `sk` defines a translation for the key `%d day(s)`, which varies on the plurality or gender of parameter 1, however that parameter is not a number or person.
The locale `sk` defines a translation for the key `%d month(s)`, which varies on the plurality or gender of parameter 1, however that parameter is not a number or person.
The locale `sk` defines a translation for the key `%d week(s)`, which varies on the plurality or gender of parameter 1, however that parameter is not a number or person.
The locale `sk` defines a translation for the key `Dashboard names must not be longer than %s characters.`, which varies on the plurality or gender of parameter 1, however that parameter is not a number or person.
The locale `nl` defines a translation for the key `Maximum token name length is %d characters.`, which varies on the plurality or gender of parameter 1, however that parameter is not a number or person.
The locale `sk` defines a translation for the key `Panel names must not be longer than %s characters.`, which varies on the plurality or gender of parameter 1, however that parameter is not a number or person.
The locale `sk` defines a translation for the key `Portal names must not be longer than %s characters.`, which varies on the plurality or gender of parameter 1, however that parameter is not a number or person.

Isn't chasing moving targets fun?

Change #1325535 had a related patch set uploaded (by Pppery; author: Pppery):

[phabricator/translations@wmf/stable] Add two new locale files

https://gerrit.wikimedia.org/r/1325535

Okay, added the two missing locale files. The rest of these look like upstream problems.

Above patch deals with

The locale `sk` defines a translation for the key `%d day(s)`, which varies on the plurality or gender of parameter 1, however that parameter is not a number or person.
The locale `sk` defines a translation for the key `%d month(s)`, which varies on the plurality or gender of parameter 1, however that parameter is not a number or person.
The locale `sk` defines a translation for the key `%d week(s)`, which varies on the plurality or gender of parameter 1, however that parameter is not a number or person.

which aren't actually upstream. And once that is merged we'll need another update-and-generate cycle.

Change #1325535 merged by Aklapper:

[phabricator/translations@wmf/stable] Add two new locale files

https://gerrit.wikimedia.org/r/1325535