Translation keys are unique identifiers assigned to specific strings.
These keys act as placeholders for the actual content that needs to be translated.
Currently, "1:1" English strings are used as keys.
This is a really bad approach.
It's been almost half a year since we started, and we have already encountered numerous problems because of this:
  1. Keys are supposed to be static
    , but as the original string changes, keys often change too (accidentally), causing duplication of strings and creating a mess both in Crowdin and the community.
  2. These keys provide no context
    , and even if it's given, manually-assigned labels like "General", "Tooltip", and "Main Menu" don't provide many clues. I propose using generalized, structured, and unified keys, exactly like in Minecraft. They use keys like
    category.subcategory.whatever.entry
    for every string in the game.
This approach is better because:
  1. It's stable and future-proof
    . Developers can change the original English text however they want, and it will not cause a mess on Crowdin. No strange symbols or placeholder leak into keys. Simple static key.
  2. It always provides context
    (both grammatical and semiotic)
    and the location where the string is used
    . For example, we see the string "Custom", but we look at the key
    item.minecraft.firework_star.custom_color
    and know for sure that it's about a standard Minecraft-namespaced firework item which has a custom color. As we know it's about color and fireworks, we can translate it with grammatically correct gender, case, and number - "Пользовательский". Or we see "Hidden" with the key
    gui.socialInteractions.status_hidden
    and now know it's about status and should be "Скрытый", not "Скрытое" or "Скрытая". And so on.
  3. Strings will be automatically split for contexts
    . If we only had (for example)
    gui.mainmenu.group.membership_visibility.hidden
    and
    gui.nameplate.visibility.hidden
    , or
    instance_type.friends
    and
    gui.world_list.access.friends
    , half of the posts on this Canny might not have even happened.
  4. It also
    solves problems of searching
    as it also
    provides grouping and categorization
    . In the example of Minecraft, we can always search for
    gui.socialInteractions
    to see all the keys related to the "social interactions" context and translate it consistently.
The same approach can be useful in VRChat. I hope for understanding, this system will make things easier for everyone: Devs, Managers, Proofreaders and Translators.
Gonna drop some examples below.