Thank you for your interest in translating Survive the Wild into another language! When you do this, the things you do for me and the game are by extension huge, so seriously thank you so much for your interest in undertaking this massive project!
The translation engine in the game is entirely serverside and dynamic. You can translate strings with dynamic content in them, you can rerun bits of dynamic content through the translator, and the best part is that you can update your translation data instantly for all players using your translation and all they have to do to update their translation is... absolutely NOTHING! Players don't even need to do so much as log out of the game, translation strings will be pushed to new players the second you want them to be! If you are a team, you can even add editors to your language giving them permissions to modify the language data, and you can all seemlessly work together!
I have tried to make the translation engine as easy to use as possible, and the nature of new game components makes it easy for us to update the system at any time if needed. In this document, we'll first talk about the language user interface, and following that, a reference to the translation sintax.
Pretty much everything having to do with language translations is, as you may imagine, under the language submenu in the game options list accessed with alt+o or tab from the game keyboard area. If you are at the top level of the menu, Language will be the first option you see there.
Upon clicking this option, by default you will see something pretty self explanitory. Simply clicking on any language in the resulting menu will instantly switch you over to that language. There are only 2 options here that are not languages. Those are the options to create a new language translation or to view unofficial translations.
This is how you create a new translation. To avoid spam, each account (NOT CHARACTER BUT ACCOUNT!) can only create one language translation. If you speak more than 2 languages, or wish for another translation for another reason, such as being able to have your own shortcut dictionary and language translation, please contact an administrator. In almost all cases though, 1 translation is plenty for most people.
When you click on this option, a quick dialog will appear. First, fill in a language ID. Think ISO language codes, EN, ES, RU, DE, stuff like that. If it's some sort of low verbosity translation, you could use ENS (english shortened), for example. Hint, language ID's can actually be up to 16 characters, however please keep them as short as possible as they are used for data lookups. Once you come up with an ID, just enter a friendly name for your language (English, Spanish, Russian), and certify your acceptance of terms before clicking the Create Language Translation button.
It is not possible to create a translation and have it instantly appear in the list of public languages that represent the game. For that, you need to contact an administrator. When you create a translation, by default it is in the unofficial state. When you click view unofficial translations, you actually stay in the same menu, but the list of languages changes to show the unofficial ones, and the View unofficial translation option renames itself to View official translations, allowing you to switch back to those conveniently. Keep in mind that anybody can create an unofficial translation, so this list could be rather cluttered and could contain any amount of poorly moderated content! As such, please be wise when selecting random unofficial translations when you don't know their purpose.
If you have created a translation before though, or have been invited to work on others, a new option will appear in this menu at the top.
This option appears as Edit followed by a language's summary, for example Edit English (default) by SamTupy and 0 other contributers. You will have as many Edit options in the menu as you have languages with edit rights, and the menu resulting from clicking one of these Edit options is, predictibly, how you modify your language translation once it has been created. This menu has the following options:
This option will place the current private language data on your clipboard. Some single translation authors will rather constantly work from a local file, but when you have editors, it's good to fetch the latest language data and paste it into a notepad document or a local file before starting a translation work session, this way you make sure you have the latest data that another editor may have submitted.
When you click this, a dialog with a multiline text field will appear. Here, you should paste your entire translation data and simply click the designated button to submit that private data.
Note that to help avoid pasting invalid data, the very first line in your file must be a string with your language's exact friendly name as it's source. For example, if I want to submit new english data, my file must start with (excluding quotes) "English (default) [=] ". Also note that this option only submits private data, meaning that only other editors will see it.
This option allows you to set a bit of editional information that appends itself to each language menu option. If this is some sort of low verbosity translation, this could make that more clear. It can almost work as a sort of message of the day for your translation in a fassion. You could mention any notes of serious importants that users of your translation should know, and/or it could contain editional contact information for people to report broken strings to. With in reason and responsibility feel free to put any bit of short info you want here, of course any sort of clear rule/system abuse not withstanding!
When you click it, a very simple dialog will appear with an edit box to type your info, a submit button, and a cancel button. The text field will already be populated with the current language info when you click this option.
This option publishes your translation's latest private data. Upon clicking this option, every single player using your language translation will begin automatically using the latest available translation data, and a copy of the private data, in it's current form, will be copied and made public for all new players who switch to your language.
To be clear: Private data is what all editors and the creator of a translation automatically use. It is downloaded upon login and whenever a language editor posts new data with the Set language data option. Again though, only editors get this data, and this allows work to be tested before it is pushed to the public. Public data, on the other hand, is updated far less frequently in most cases by this option. This is a copy of your translation, in a stable state, that all non-editors who use your language will download automatically whenever it is updated. Translation editors or creators will never download this data, as the private data will always be more up to date with the latest test strings from editors. If you need to test the public version of your language, feel free to use a character that is not an editor of the translation.
This is how you can allow other players to edit your language. At some point in the future, a rank of testers may be added which can test the latest private data without the permission to modify it. For now though, click this option and select from an online player in the resulting list to add them as an editor. Remember that any editor can play with your language data, so make sure you trust them!
This is how you remove language editors. Simply click on the option and select from the resulting list of editors to remove them. Warning, you won't be able to re-add an editor you remove with this option until that player is online again!
Assuming that this translation is unofficial, you will have the option to delete it. Keep in mind that this will not force other editors or even the deleter off of the translation's last data when it was deleted, everyone must select another language manually. Other than that, deleting a translation does exactly what it sounds like.
If a language is unofficial and/or private and you are an editor, this is how you switch to it seeing as how it will not show up in the public translation lists in the interface.
The only other noteworthy thing about the user interface is that when the game is first launched for a new player, a menu will appear with all official languages so that they can instantly begin playing even from the main menu with the correct language!
This is a reference to the sintax that must be followed to denote strings in translation data. If you are having trouble getting a string to translate properly, make sure you reread this section thoroughly, and if the system just doesn't seem to support your sanario yet, please feel free to contact an administrator for asistance, or alternatively submit a detailed suggestion from the support and contact menu with information about how the system is currently lacking. Feedback is very welcome, knowing one only language I as the developer can't translate anything, so it's very possible that I'm not imagining vital possibilities yet!
The most common type of string found in translation data is also the quickest to deal with while running the game and is the easiest to understand. We call it a static string because it simply mapps some text to a replacement for that text with no editional features. There for, it is a simple dictionary lookup to translate these strings and thus they should be used whenever possible.
To define a static string, on an empty line of your translation data, simply type:
original text [=] destination_text
Where original text is the string the game was originally going to send to the screen reader, and destination text is of course the text that the original string should be replaced with.
Hello [=] Hola water [=] agua exit the game [=] salir del juego
In all cases, be the string type static or something else, you always deliminate the original and destination strings with " [=] " This includes the 2 spaces touching the brackets.
Here, things get pretty complicated pretty quickly. They also get much more slow. These are strings where the original content is not 100 percent known. For example, in the string 486 thirst, the number which of course is not static text makes it impossible for this to be a static string. This is because the number could be anything, and the translation is actually the word thirst. The translation engine allows you to denote up to 9 bits of dynamic content per string. This is done by using the % character in your original string. For example,
%1 thirst would be a valid original string that would match anything before a space and the word thirst. The 1 indicates the index of the dynamic content. For example, a more complicated string.
You are %1 percent dirty, and %2 percent wet has 2 bits of dynamic content, and so we use %1 to indicate that the text between "are " and " percent dirty" should be stored in the variable %1, and that the text between "and " and " percent wet" should be stored in the variable %2.
In the destination portion of the string (after the delimiter), you can then use %1 through %9 to indicate that the designated variable's contents should be placed at this position in the text. For example,
%1 health [=] %1 hp or
%1 health [=] health: %1 are all valid examples of this.
It is worth noting for clarity that you can use any variables in the destination string in any order, or even not at all. Though this is not recommended and should only be done in personal translations for reasons I can't entirely comprehend,
%1 health [=] hidden health! is actually a valid string. Or,
%1 health [=] %1 health. Did you hear me? %1 health. I said %1 health! is another example of a valid though probably useless string. Variables do not need to be placed in the same order as defined in the original string, you can do whatever makes sense for your translation.
out of character, %1 says %2 [=] %1 (ooc): %2 You can accept %1 quests, and you have %2 left still to unlock. Press enter on any of these quests to accept one [=] %1 quests available, %2 quests locked %1 (Group Chat) [=] %1
One extremely common case during translation work is when you need to rerun bits of dynamic content through the translation engine again before replacing the variable in a dynamic string. A perfect example:
current location: island mainland
Generally, as I said, it is best to have as many static strings as possible. This means that the string "island mainland" would be translated into it's own string, and then any dynamic original string would be able to use that one zone translation at any point where it is referenced. The way this is done is with the %t identifier. The exact same as dynamic strings, but in this case when defining your original string, you use %t1 through %t9 to denote that the dynamic content in that variable should be translated before replacement. In this case, the valid string for the b key is:
current location: %t1 [=] ubicación actual: %1
It is perfectly valid to mix subtranslated variables with regular dynamic ones, basically just use %t in the original string denotation when you wish to subtranslate the dynamic content placed in that variable, or just % otherwise.
To avoid infinent loops or stack overflows, you can only subtranslate up to 5 levels of strings. Consider the following string:
out of character, %1 says %t2 [=] ooc %1: %2 In the above string, the mistake is being made to subtranslate the contents of a person's out of character messages. We can consider that people like to copypaste other people's messages on that chat resulting in weird strings like out of character, player1 says out of character, player2 says out of character, player1 says out of character, player2 says out of character, player1 says out of character, player2 says see what I mean? In this case, the source string would keep being run through the translator over and over again, which could be slow in the best case. To protect against this, you can only nest up to 5 levels of %t translations.
Remember, the %t notation is only used in the original string denotation, not the replacement text. Continue to use regular variable replacement (%1 through %9) in the replacement strings.
%t1 for %2 stw_points: %t3 [=] quest: %1, price: %2, description: %3 %t1 button [=] button %1 %t1. you have %2 [=] %2 %1
To help format your translations, it is possible to include comments in your translation data. Just put a semicolon (;) at the beginning of any line, and that line will be ignored by the engine.
;This is a comment!
Try not to use too many of them, because at the time of writing, entire language translation files are transmitted to users, so this means comments are included. Keep them short sweet and sparse!
By creating or editing a language translation, you automatically agree to the following:
Those of you trying to break the system, you know who you are. Unlike normal rules where breaking them only effects other players a little, this translation engine enables entire communities to access the game. Abuse of the translation system will not be delt with lightly! If I'm being brootally honest here, a good translation will draw more players to the game than we will lose to people breaking the system, and people who would deliberatly damage the work of honest players or even raise a community's hopes of playing while having the full intent to create a broken translation all aglone are not people that any good and honest player wants on the game anyway. If you intentionally abuse the translation system, we'll probably just ban you permanently and not look back. To be clear, this is aimed at those who would aim to intentionally use the translation system to harm the experience of other players or the game's livelyhood by misrepresenting it's text. This doesn't aim to scare off honest would be translators, if you don't intend any harm, there's almost certainly no way to break these rules to a large degree on accident beyond perhaps a simple warning letting you know that a string is missing needed information or something simple like that. I think we can all agree that these rules are very standard and common sense. Lets all be nice and reasonable, and no one will have anything to worry about.
This section will be much more complete once more becomes available. Here, any resources that may help translators work will be available for download or use. We will try to list strings, tutorials, templates and other useful odds and ends here.
This zip file contains strings for item names and descriptions, as well as map zones and travelpoint texts, and also some older but possibly still useful documentation in a txt file. This is the file that was originally sent to interested translators when this system was just a concept, and perhaps may contain something useful.
Thank you again for your interest in translating. I can't express how much a good and complete translation does for me personally as the developer and for the game itself. You help enable everything from me being able to live independantly to the game getting better sound effects and staying online to helping me get good equipment to continue coding the game and more, of course because of the most basic and important help of allowing more people to access and play the game! Really, thank you!