Difference between revisions of "Localisation modding"

From Stellaris Wiki
Jump to navigation Jump to search
(Overriding Vanilla Text)
(£ Custom Icons: Updated to include name prefix requirements.)
Line 268: Line 268:
 
spriteTypes = {
 
spriteTypes = {
 
spriteType = {
 
spriteType = {
         name = "custom_worker_produces_mult"
+
         name = "GFX_text_worker_produces_mult"
 
         texturefile = "gfx/interface/icons/text_icons/mod_planet_jobs_worker_produces_mult.dds"
 
         texturefile = "gfx/interface/icons/text_icons/mod_planet_jobs_worker_produces_mult.dds"
 
     }</nowiki>
 
     }</nowiki>
 
You can link multiple icons by making separate <code>spriteType =</code> blocks. All of these should be within one larger <code>spriteTypes =</code> (with an s) block.
 
You can link multiple icons by making separate <code>spriteType =</code> blocks. All of these should be within one larger <code>spriteTypes =</code> (with an s) block.
  
Now, to reference this custom icon in localisation, use £custom_worker_produces_mult£ and it will appear in game
+
The name must be prefixed <code>GFX_text_</code>. However, to reference this custom icon in localisation, use £worker_produces_mult£ (without the prefix) and it will appear alongside in game text.
  
 
== Slash-Based Codes ==
 
== Slash-Based Codes ==

Revision as of 15:55, 1 April 2020

Version

Outliner top.png
Please help with verifying or updating older sections of this article. At least some were last verified for version 2.6.

This article is for the PC version of Stellaris only.

Localisation refers to the actual text presented to the player in events, menus, weaponry, stories, and any other string of text in any window in the game. Localisation files are saved as .yml in the localisation/ folder and should be encoded with UTF-8 with BOM. The naming convention for .yml files is <file>_l_<language>.yml where <file> is the name given for this group of localisations, and <language> is the language the localisation is for. Supported languages currently include Portugeuse (braz_por) English (english), French (french), German (german), Polish (polish), Russian (russian), Spanish (spanish), and simplified Chinese (simp_chinese).


Creating Localisation Files

  • In the root mod folder (not in common), create a folder named "localisation" spelled with an s. Note, some other paradox titles may use the Americanized "localization" with a z.
  • Optionally, create language subfolders within the "localisation" folder. This is organizationally helpful but not required.
  • Stellaris's localisation files are encoded as UTF-8-BOM. They must be encoded in UTF-8-BOM, as even UTF-8 will fail to be parsed by Stellaris, and will not work.
  • The easiest way to get the correct encoding is to copy an existing Stellaris .yml file and modify it.
  • Alternatively, simply create a standard text file and save it as .yml with UTF-8 with BOM encoding. Various text editors, such as Notepad++ and Visual Studio Code, will allow you to manually save with encoding UTF-8 with BOM
  • The file name must end in "_l_<language>", otherwise it will not be read.
  • The first line of any localisation file must be l_<language>:, otherwise it will not be read.
  • Example file name: mod_buildings_l_english.yml

Naming a YML file the same as a vanilla YML file will overwrite vanilla. Doing this is not recommended, unless you are trying to change (almost) all of the entries in the file. Localisation entries can be overwritten individually, by saving them in the "Replace" folder. See override section.

File Encoding

  • Open the YML file using a text editor. Editors such as Notepad++ and Visual Studio Code are recommended, however, if those aren't available, even standard Notepad will work.
  • Convert the file to UTF-8 with BOM
  • If using Notepad++, go to menu bar, open the Encoding menu.
  • If using VSC, go to the bottom right corner and click on the encoding (UTF-8 by default), then click Save with Encoding. Alternatively, it is possible to modify the settings so YML files created using VSC have UTF-8 with BOM encoding by default.
  • If using Notepad, go to Save As..., then change the encoding and save the file.
    • If the options listed are UTF-8 and UTF-8 with BOM (or similar), use UTF-8 with BOM.
    • If the options listed are UTF-8 without BOM and UTF-8 (or similar), use UTF-8.

Localisation Keys

l_<language>:
 localisation_key_1: "Text String 1"
 localisation_key_2: "Text String 2"

Individual localisation entries are called keys and are placed before the colon. Keys are the actual code that points to the localised text. The text itself itself is called a string. The key is to the left of the colon. The string of text that will display in game is to the right of the colon, listed within two quotation marks (" "). The colon is the separator.

  • The number seen in vanilla files right after the colon can be omitted, as it is only useful for Paradox's internal translation tracking.[1]
  • The file must contain l_english: (or equivalent for other languages) before any localiaztion keys.
  • Every entry after l_english: (or equivalent) must begin with whitespace (a space or a tab works).
  • Each string to be displayed in game is encased in quotation marks. To display quotation marks in game, input a backslash before each quotation mark (for example: text \"name\")
  • Note that the following unicode characters are invalid inside the localisation file and will generate a "?" instead: „ “ ‚ ‘ – ” ’ … —

Overriding Vanilla Text

To overwrite vanilla localisation keys (or keys from other mods), create a folder named "replace" inside your "localisation" folder. Localisation files in this folder will load after all other localisation files, and overwrite any duplicate keys. In this way it is not necessary to overwrite entire localisation files, as individual key entries will be overwritten by the last loaded file, LIOS (Last in, only served). It is possible to overwrite localisation without a "replace" folder, however this is not a reliable method.

Bracket Commands

Bracket commands are enclosed in square brackets ([ ]), start with a primary scope, end with a text retrieval, and can have one or more secondary scopes in between. The fields are separated by periods (.). Text retrievals can be predefined (as per examples below), can mention Variables defined in the scope, or can be a scripted_loc (see common/scripted_loc/ files for for examples). When writing "scripted_loc" entries, it's important to note that these entries cannot themselves use bracket commands (i.e., a scripted_loc that includes "[Root.GetName]" will literally print "[Root.GetName]").

Primary Scope

Command Example usage Comments
Actor [Actor.GetAllianceName] Used in diplomatic response messages. The faction initiating an action
Recipient [Recipient.GetName] Used in diplomatic response messages. The faction targeted by the action
Third_party [Third_party.GetName] Used in diplomatic response messages. A third party involved in the action
Root [Root.GetName] The event's ROOT scope
This [This.GetName] The current scope
From [From.From.GetName] The calling event's ROOT scope. For events further back in the call stack, From can also be used as a secondary scope
Prev [Prev.From.GetName] The previous scope. It is not obvious to me what Prev.From points to, but some project descriptions use it
<event target tag> [mytarget.GetName] Event target tags are used without preceding them with event_target: in localisation

Secondary Scopes

Command Example usage Comments
Capital [Root.Capital.GetName] The capital of the current scope
Leader [Root.Leader.GetName] The leader of the current scope (e.g. admiral of fleet, ruler of country)
MainAttacker [This.MainAttacker.GetAllianceName] The main attacker of the current scope (must be used in a war scope), used in war name formats
Owner [Root.Owner.GetName] The current scope's owner
Planet [Root.Planet.GetName] The planet where the current scope is located
Solar_System [Root.Solar_System.GetName] The system where the primary scope is located

Text Retrieval

Command Example usage Comments
GetAdj [Root.GetAdj] The adjective associated with the current scope
GetAdjective [Root.GetAdjective ] The adjective associated with the current scope
GetAllianceName [This.MainAttacker.GetAllianceName] The name of the alliance the current scope belongs to
GetControllerName [Root.GetControllerName] Name of the current controller (known to work on planets)
GetClassName [Root.GetClassName ] Name of the current planet class
GetFleetName [Root.GetFleetName] The name of the fleet associated with the current scope
GetHeirName [Root.GetHeirName ] The name of the current heir
GetHeirTitle [Root.GetHeirTitle] The title of the current heir
GetHomeWorldName [Root.GetHomeWorldName] The name of the home world of the current scope
GetLeaderName [Root.GetLeaderName] The name of the leader associated with the current scope
GetName [Root.GetName] The name associated with the current scope
GetFirstName [Root.GetFirstName] The name first associated with the current scoped leader
GetSecondName [Root.GetSecondName] The second name associated with the current scoped leader
GetAge [Root.GetAge] The age of the scoped leader
GetNamePlural [Root.GetNamePlural] The plural name associated with the current scope (must be a species)
GetNebula [Root.GetNebula] (unknown)
GetOwnerName [Root.GetOwnerName ] Name of the current owner
GetPersonalityName [Root.GetPersonalityName] Get the name of the current AI personality
GetPlanetMoon [Root.GetPlanetMoon] "planet" or "moon" depending on whether the current scope is a planet or moon
GetPlanetMoonCap [Root.GetPlanetMoonCap ] "Planet" or "Moon" depending on whether the current scope is a planet or moon
GetPopFactionName [Root.GetPopFactionName] The name of the currently scoped pop's faction
GetRandomSpeciesSound [Root.GetRandomSpeciesSound] A sound chosen randomly from a list of sounds associated with current scope's species
GetRegnalName [Root.GetRegnalName] The regnal name of the current scope
GetRulerName [Root.GetRulerName] The name of the ruler associated with the current scope
GetRulerTitle [Root.GetRulerTitle] The title of the ruler associated with the current scope
GetSpeciesAdj [Root.GetSpeciesAdj] The adjective for the species of the current scope
GetSpeciesClass [Root.GetSpeciesClass] The class to which the species of the current scope belongs
GetSpeciesClassPlural [Root.GetSpeciesClassPlural] The plural of the current scope's species' clas
GetSpeciesMouthName [Root.GetSpeciesMouthName] The word for the current scope's species' mouth
GetSpeciesName [Root.GetSpeciesName The name of the current scope's species
GetSpeciesNameCompliment [From.GetSpeciesNameCompliment] A compliment using the current scope's species
GetSpeciesNameInsult [From.From.GetSpeciesNameInsult] An insult using the current scope's species
GetSpeciesNamePlural [This.GetSpeciesNamePlural] The plural of current scope's species' name
GetSpeciesNamePluralCompliment [Root.SpeciesNamePluralCompliment] A compliment using the plural of the current scope's species' name
GetSpeciesNamePluralInsult [From.SpeciesNamePluralInsult] An insult using the plural of the current scope's species' name
GetSpeciesHandName [From.GetSpeciesHandName] The word for the current scope's species' hand
GetSpeciesMouthName [From.GetSpeciesMouthName] The word for the current scope's species' mouth
GetSpeciesOrganName [From.GetSpeciesOrganName] The word for the current scope's species' internal organ
GetSpeciesSpawnName [Root.GetSpeciesSpawnName The word for the children of the current scope's species
GetSpeciesSpawnNamePlural [Root.GetSpeciesSpawnNamePlural The plural word for the children of the current scope's species
GetStarName [Root.Capital.GetStarName] The name of the star where the current scope is located
GetHerHim [admiral.GetHerHim] Prints 'her' or 'him' based on the character's gender.
GetSheHe [abducted_leader.GetSheHe] Prints 'she' or 'he' based on the character's gender.
GetSheHeCap [abducted_leader.GetSheHeCap] Prints 'She' or 'He' based on the character's gender.
GetHomeWorldName [Root.GetHomeWorldName ] The home world name of the selected country
GetHerHis [admiral.GetHerHis] Prints 'her' or 'his' based on the character's gender.
GetHerHisCap [admiral.GetHerHisCap] Prints 'Her' or 'His' based on the character's gender.
LastKilledCountryName [LastKilledCountryName] Prints the name of the last killed country.

Color Codes

Color codes start with §, which is followed by a single character specifying the color to be used until another color code is detected, or the end of the string. There may be other supported color codes, these are the ones found in a brief perusal of localisation files. Within a $ command, the color for the displayed command may also be specified by preceding the closing $ with | and the color code character: $AGE|Y$

Code Color
B Blue
E Teal
G Green
H Orange
L Brown
M Purple
P Light red
R Red
S Dark orange
T Light grey
W White
Y Yellow
! Default

For an example of these color codes in-game, refer to this image.

$ Codes

$ is used to delimit strings defined elsewhere to be expanded in the current string, or system statistics in GUI elements.

£ Codes

£ codes are used for the names of various system stats, including energy, minerals, influence, and the three research categories (engineering, physics and society.) More exist than those listed here, such as £ship_stats_hitpoints\armor\shield£, £fleet_template_size£, and £trigger_yes\no£ among others. Search the '£' character using something like Notepad++'s Find in Files feature to find something specific. Remember that £ codes must surround the tag you're inserting, ie. £energy£.

Code Picture
£energy£ Energy Credits.png
£minerals£ Minerals.png
£food£ Food.png
£influence£ Influence.png
£unity£ Unity.png
£physics£ Physics Research.png
£society£ Society Research.png
£engineering£ Engineering Research.png
£pops£ Pop.png
£happiness£ Happiness.png
£opinion£ Opinion.png
£military_ship£ Military Ship (icon).png
£military_power£
£blocker£ Tile Blocker.png
£time£ Time.png

£ Custom Icons

You can create custom text icons to appear in game exactly like those above, by saving an icon in <root>/gfx/interface/icons/text_icons. Standard text icons are 16x16 pixel .dds files. In order to reference your icon in text, you will need to define it in the same way you define event pictures. Save a text file as .gfx in <root>/interface/ Define any custom modifiers as shown below:

spriteTypes = {	
	spriteType = {
        name = "GFX_text_worker_produces_mult"
        texturefile = "gfx/interface/icons/text_icons/mod_planet_jobs_worker_produces_mult.dds"
    }

You can link multiple icons by making separate spriteType = blocks. All of these should be within one larger spriteTypes = (with an s) block.

The name must be prefixed GFX_text_. However, to reference this custom icon in localisation, use £worker_produces_mult£ (without the prefix) and it will appear alongside in game text.

Slash-Based Codes

The sole slash-based code is \n, which is the equivalent of pressing the Enter key and starting a new line, unless it is inside one of the above codes. Backslashes can also be used to treat special characters as text characters, for example \" will make the string contain a quotation mark, instead of closing it off.

References

Empire EmpireEthicsGovernments • Civics • OriginsMandatesAgendasTraditions • Ascension PerksEdictsPoliciesRelicsTechnologiesCustom Empires
Pops JobsFactions
Leaders LeadersLeader Traits
Species SpeciesSpecies Traits
Planets PlanetsPlanetary Feature • Orbital DepositBuildings • DistrictsPlanetary Decisions
Systems SystemsStarbasesMegastructuresBypassesMap
Fleets FleetsShips • Components
Land Warfare ArmiesBombardment Stance
Diplomacy Diplomacy • Federations • Galactic CommunityOpinion ModifiersCasus Belli • War Goals
Events EventsAnomaliesSpecial projectsArchaeological Sites
Gameplay GameplayDefinesResources • Economy
Dynamic modding Dynamic moddingEffectsConditionsScopesModifiersVariablesAI
Media/localisation Maya exporterGraphicsPortraitsFlagsEvent picturesInterfaceIconsMusicLocalisation
Other Console commandsSave-game editingSteam Workshop