# Translation restructuring on crowdin for new-versioning-strategy

**URL:** https://meta.discourse.org/t/translation-restructuring-on-crowdin-for-new-versioning-strategy/394453
**Category:** Translations
**Created:** [January 27, 2026, 4:05pm UTC](https://meta.discourse.org/t/translation-restructuring-on-crowdin-for-new-versioning-strategy/394453 "2026-01-27T16:05:51Z")
**Posts on this page:** 8
**Page:** 1

<div class="post-metadata">

### Author: ![Moin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/moin/32/554653_2.png) [@Moin](https://meta.discourse.org/u/Moin)
#### Post date: [January 27, 2026, 4:05pm UTC](https://meta.discourse.org/t/translation-restructuring-on-crowdin-for-new-versioning-strategy/394453/1 "2026-01-27T16:05:51Z")

</div>

> [@RFC: A new versioning strategy for Discourse](https://meta.discourse.org/t/rfc-a-new-versioning-strategy-for-discourse/383536/1):
>
> ## Translations
> 
> At the moment, the `stable` and `tests-passed` branches can be translated in CrowdIn, and the results are regularly integrated. In the new system, we initially plan for `latest` and `release` to be translatable in CrowdIn.
> 
> Ideally, by the time `release` becomes `release-previous` or `esr`, translations will have settled. If there is demand for continuous translations of those versions, then that’s something which could be considered in future.

I noticed that the file structure was recently changed on Crowdin. I’m a little confused now; it feels like, especially after not translating for a few weeks, there is much more work to be done than necessary.

Before, if a text was added and I introduced pluralization for it in a PR, I only needed to translate the new version. Now I also end up translating texts from the prior release. This means that because the plural was missing in December, I now see that text alongside the new one with pluralization. I also don’t see any visual indicator showing that it makes more sense to translate

 ![image](https://global.discourse-cdn.com/meta/original/4X/e/4/1/e413502bc5efdeeb929e45229ffbc537bc8bf668.png)  
than  
 ![image](https://global.discourse-cdn.com/meta/original/4X/2/a/7/2a7afedfe0cc99c9bbef76a324b9acb5f27d950e.png)

or that I should focus on translating

 ![image](https://global.discourse-cdn.com/meta/original/4X/7/2/5/7254145cdadc5c40fafb97e23bd0a3af99a06525.png)  
instead of  
 ![image](https://global.discourse-cdn.com/meta/original/4X/9/c/1/9c1de72c644de5559adfabe7301b26bd3cb86107.png)

It might be obvious when you see them next to each other, but there are currently more than 300 untranslated texts, so checking each time whether there is a similar newer one probably takes more time than translating the ones that are no longer needed.

But actually, since there is so much to translate, I would like to focus on the texts that are used in the latest version of Discourse first. For me, those matter more. It’s less likely that admins using the last release will update before a new release is available, so I would like the next release to be as complete as possible.

But it feels like this has become more difficult. If I remember correctly, previously almost all texts were in the “main” folder on Crowdin, and only those where the English text had changed were duplicated into the “stable” folder. But I am not sure. Usually, the translation for “stable” was complete when there was a release because the paid proofreaders worked on them then, too. But even if they didn’t, I tried to get the translation as complete as possible when there was a release coming up. It’s more difficult to do that for every release.

Now, however, not everything new is in the “latest” folder, and only those that require a previous version are in “release.” It seems to be exactly the opposite: everything except what was added after the last release is in “release.”

Because of this, to focus on texts that will be part of the next release and to avoid double translations, I can’t simply translate everything in the “latest” folder as was previously possible with “main.”

---

<div class="post-metadata">

### Author: ![gerhard](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gerhard/32/119479_2.png) [@gerhard](https://meta.discourse.org/u/gerhard)
#### Post date: [January 27, 2026, 5:02pm UTC](https://meta.discourse.org/t/translation-restructuring-on-crowdin-for-new-versioning-strategy/394453/4 "2026-01-27T17:02:37Z")

</div>

I’ll take a look if we can switch it around during the release again.

---

<div class="post-metadata">

### Author: ![gerhard](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gerhard/32/119479_2.png) [@gerhard](https://meta.discourse.org/u/gerhard)
#### Post date: [February 9, 2026, 11:31am UTC](https://meta.discourse.org/t/translation-restructuring-on-crowdin-for-new-versioning-strategy/394453/5 "2026-02-09T11:31:32Z")

</div>

@moin Now that you’ve had some time to work with it, do you still feel the current Crowdin structure is worse than the old one?

 ![image](https://global.discourse-cdn.com/meta/original/4X/d/0/2/d02be1b309c5ece8f2d8042b5e60097bfd0f054c.png)

There are 15,162 strings in the `release` branch and 86 strings in the `latest` branch. The `latest` branch builds on top of `release`, so those 86 strings are ones that were either added or changed since the last release.

From a technical perspective, this structure makes more sense than the previous one. That said, if it creates extra busywork or makes translation more cumbersome for you, please let me know. I’m happy to look for a way to support the new release strategy while keeping things as smooth as possible on Crowdin.

---

<div class="post-metadata">

### Author: ![Moin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/moin/32/554653_2.png) [@Moin](https://meta.discourse.org/u/Moin)
#### Post date: [February 9, 2026, 3:00pm UTC](https://meta.discourse.org/t/translation-restructuring-on-crowdin-for-new-versioning-strategy/394453/6 "2026-02-09T15:00:37Z")

</div>

> [@gerhard](#):
>
> Now that you’ve had some time to work with it, do you still feel the current Crowdin structure is worse than the old one?

Yes. It still feels like I am translating stuff barely anyone will ever see, and it’s very difficult to focus on translating one plugin like ‘chat’ because I can no longer just work on that folder because some texts are in `latest/chat` and others are in `release/chat`. Adjusting the filter by first limiting it to only filter by identifier and searching for `chat` still returns everything for the chat integration plugin in addition to everything for the chat plugin.

There are also other points in this workflow that concern me, but I am unable to write them down in an organized manner at the moment.

---

<div class="post-metadata">

### Author: ![gerhard](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gerhard/32/119479_2.png) [@gerhard](https://meta.discourse.org/u/gerhard)
#### Post date: [February 9, 2026, 3:02pm UTC](https://meta.discourse.org/t/translation-restructuring-on-crowdin-for-new-versioning-strategy/394453/7 "2026-02-09T15:02:19Z")

</div>

Thanks for the feedback, I’ll get this sorted.

---

<div class="post-metadata">

### Author: ![Moin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/moin/32/554653_2.png) [@Moin](https://meta.discourse.org/u/Moin)
#### Post date: [February 9, 2026, 3:38pm UTC](https://meta.discourse.org/t/translation-restructuring-on-crowdin-for-new-versioning-strategy/394453/8 "2026-02-09T15:38:04Z")

</div>

> [@RFC: A new versioning strategy for Discourse](https://meta.discourse.org/t/rfc-a-new-versioning-strategy-for-discourse/383536/1):
>
> Ideally, by the time `release` becomes `release-previous` or `esr`, translations will have settled. If there is demand for continuous translations of those versions, then that’s something which could be considered in future.

How is this expected to work?  
You merge security fixes that contain text changes right before a new version is released.

That worked when there was main and stable which were supported and both were available on Crowdin. But it wasn’t possible to translate the latest security fixes for 2025.12 because the release of 2026.1 happened at the same time. In this case, it isn’t that much of a problem because it seems no text was edited, only new ones were added that stay untranslated, since 2025.12 isn’t supported for that long, I think that isn’t an issue. But what if a text would have been edited? Then the existing translations won’t be removed because translations are no longer updated. And while this is probably somehow still not that much of an issue because there aren’t many forums expected to stay that long on 2025.12 after 2026.1 is released, I am worried about how it will work with the ESR.  
In summer, we had a broken text for the solution on hosted forums for weeks because the placeholder was changed in the code, but the translations still used the old one because this hadn’t been officially merged, so the text wasn’t changed by Crowdin. I am worried the same will happen with the ESR. It will receive all those security fixes, but after 2026.2 is released, translations won’t be updated. If you change a text in one of these fixes, the translations won’t be updated through Crowdin. So the text containing a placeholder that is no longer provided by core will stay unchanged.

Also, in general, the feeling that translations need to be perfect within the next few weeks because after that I will lose the chance to improve them, doesn’t feel good. Before, it felt like “well, whatever I add will help everyone who updates their Discourse after these are merged, and if I notice something I’d like to improve, they will all receive those improvements;” now this soon excludes everyone using ESR. They won’t receive updates once 2026.2 becomes the release.

Therefore, there are translations for each release which results in texts that were rewritten after a few weeks because the interface was refined, needing translations for both versions. I translate  
`js.category.visibility.more_options_hint`: `More permissions available in <a href>advanced settings</a>.`  
and  
`js.category.visibility.more_options_hint`: `More permissions available in` `js.category.visibility.more_options_hint_link`: `advanced settings.`

In this case, I would assume the latter is the one needed for the ESR, so I guess there will be forums that update after a security fix is merged and actually see these translations. But what if this happened next month? How many forums do you expect to stay on 2026.2 and not just update right after it was published and there are new security fixes which notify the admin but a week or so later when I had time to translate the texts? And how long do they use them until they update to 2026.3? That is what makes me feel that I translate texts barely anyone will see.

It also feels like the translations that were removed from latest last week after the first update of the translations happened since the release of 2026.1 are related to the new process, and I wonder if the same will happen to translations after the next release. And it feels wrong that translations are available for those on 2026.1 but those using latest no longer have them.  
These are the translations for Horizon on 2026.1

> <https://github.com/discourse/discourse/blob/release/2026.1/themes/horizon/locales/de.yml>

And this is available on latest

> <https://github.com/discourse/discourse/blob/latest/themes/horizon/locales/de.yml>

---

<div class="post-metadata">

### Author: ![Moin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/moin/32/554653_2.png) [@Moin](https://meta.discourse.org/u/Moin)
#### Post date: [February 10, 2026, 7:33pm UTC](https://meta.discourse.org/t/translation-restructuring-on-crowdin-for-new-versioning-strategy/394453/9 "2026-02-10T19:33:19Z")

</div>

> [@Moin](#):
>
> I also don’t see any visual indicator

Update: I found the indicator

 ![image](https://global.discourse-cdn.com/meta/original/4X/7/2/5/7254145cdadc5c40fafb97e23bd0a3af99a06525.png)

I was correct that there is no visible indicator; it’s the lack of “Master” at the top right that hints at the fact that this text is not used by the latest release.

 ![Screenshot_20260210_200917_Chrome](https://global.discourse-cdn.com/meta/original/4X/c/4/1/c416eb413d33bf24140bda987ba4a40fc7e0cd71.jpeg)

So, once I notice there is no “Master” in the top right, I know that the text from the release folder is no longer used in the latest release and can skip it to focus on texts used by all releases first.

---

<div class="post-metadata">

### Author: ![gerhard](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gerhard/32/119479_2.png) [@gerhard](https://meta.discourse.org/u/gerhard)
#### Post date: [February 10, 2026, 8:38pm UTC](https://meta.discourse.org/t/translation-restructuring-on-crowdin-for-new-versioning-strategy/394453/10 "2026-02-10T20:38:38Z")

</div>

Ah, yeah, that should work. It would be nice to have a filter option for that in the Crowdin editor, but I doubt that’s possible right now. I’ve posted a feature request in Crowdin’s community.

> **[Feature Request: Filter strings by branch membership / cross-branch presence](https://community.crowdin.com/t/feature-request-filter-strings-by-branch-membership-cross-branch-presence/16329)**
>
> Problem When working with multiple branches (e.g. “release” / master and “latest”), there’s no way to filter strings based on which branches they belong to. This makes it difficult to identify strings that exist in only one branch versus strings...
