diff --git a/datafiles/lang/en.json b/datafiles/lang/en.json index 38fe5d754d..eb29d61b3b 100644 --- a/datafiles/lang/en.json +++ b/datafiles/lang/en.json @@ -1,19 +1,501 @@ { - "Settings": "Settings", - "Menu": "Menu", - "Language": "Language", - "Master Volume": "Master Volume", - "Effects Volume": "Effects Volume", - "Music Volume": "Music Volume", - "Full Screen?:": "Full Screen?:", - "Enable Autosaves?:": "Enable Autosaves?:", - "Build: {0}": "Build: {0}", - "Version: {0}": "Version: {0}", - "Update: {0}\nClick to open download page": "Update: {0}\nClick to open download page", - "Save": "Save", - "Load": "Load", - "Options": "Options", - "Exit": "Exit", - "Return": "Return", - "Back": "Back" -} \ No newline at end of file + "Back": "Back", + "Build: {0}": "Build: {0}", + "Effects Volume": "Effects Volume", + "Enable Autosaves?:": "Enable Autosaves?:", + "Exit": "Exit", + "Full Screen?:": "Full Screen?:", + "Language": "Language", + "Load": "Load", + "Master Volume": "Master Volume", + "Menu": "Menu", + "Music Volume": "Music Volume", + "Options": "Options", + "Return": "Return", + "Save": "Save", + "Settings": "Settings", + "Update: {0}\nClick to open download page": "Update: {0}\nClick to open download page", + "Version: {0}": "Version: {0}" + +, + "(Hold Ctrl to decrease by 10)": "(Hold Ctrl to decrease by 10)", + "(Hold Ctrl to increase by 10)": "(Hold Ctrl to increase by 10)", + "A special challenge is needed for Aspirants to be judged worthy of becoming Astartes. After completing the Trial they then become a Neophyte, beginning implantation and training. (This can be changed once in game, but the chosen trial here will affect the spawn characteristics of your starting Space Marines).": "A special challenge is needed for Aspirants to be judged worthy of becoming Astartes. After completing the Trial they then become a Neophyte, beginning implantation and training. (This can be changed once in game, but the chosen trial here will affect the spawn characteristics of your starting Space Marines).", + "Abnormal": "Abnormal", + "Above Average": "Above Average", + "Advantages cost points, and improve the performance of your Chapter in a specific domain. You can only have one trait of the same category, shown in brackets.": "Advantages cost points, and improve the performance of your Chapter in a specific domain. You can only have one trait of the same category, shown in brackets.", + "Antagonistic": "Antagonistic", + "Aspirant Trial": "Aspirant Trial", + "Average": "Average", + "Bad": "Bad", + "Cancel": "Cancel", + "Chapter Advantages": "Chapter Advantages", + "Chapter Disadvantages": "Chapter Disadvantages", + "Chapter Stats": "Chapter Stats", + "Chapter Type": "Chapter Type", + "Considerable": "Considerable", + "Cooperation": "Cooperation", + "Cooperation: {0} ({1})": "Cooperation: {0} ({1})", + "Create your own customized Chapter, deciding the origins, strength, and weaknesses. Custom Chapters are weaker than Founding Chapters.": "Create your own customized Chapter, deciding the origins, strength, and weaknesses. Custom Chapters are weaker than Founding Chapters.", + "Custom": "Custom", + "Custom Chapters": "Custom Chapters", + "Decimated": "Decimated", + "Decrease": "Decrease", + "Disadvantages grant additional points, and penalize the performance of your Chapter. You can only have one trait of the same category, shown in brackets.": "Disadvantages grant additional points, and penalize the performance of your Chapter. You can only have one trait of the same category, shown in brackets.", + "Exemplary": "Exemplary", + "Existing Chapters": "Existing Chapters", + "Fleet Based": "Fleet Based", + "Fleet Based\nRather than a homeworld, your Chapter begins near their recruiting world. The fleet includes a Battle Barge, which serves as a mobile base, and powerful ship.": "Fleet Based\nRather than a homeworld, your Chapter begins near their recruiting world. The fleet includes a Battle Barge, which serves as a mobile base, and powerful ship.", + "Founding Chapters": "Founding Chapters", + "Gene-Seed Purity": "Gene-Seed Purity", + "Gene-Seed Purity: {0} ({1})": "Gene-Seed Purity: {0} ({1})", + "Gene-Seed Stability": "Gene-Seed Stability", + "Gene-Seed Stability: ({0}%)": "Gene-Seed Stability: ({0}%)", + "Good": "Good", + "Homeworld": "Homeworld", + "Homeworld\nYour Chapter has a homeworld that they base on. Contained upon it is a massive Fortress Monastery, which provides high levels of defense and automated weapons.": "Homeworld\nYour Chapter has a homeworld that they base on. Contained upon it is a massive Fortress Monastery, which provides high levels of defense and automated weapons.", + "Horrible": "Horrible", + "How diplomatic your Chapter is. \nA low score will lower starting dispositions of Imperial factions and make disposition increases less likely to occur.": "How diplomatic your Chapter is. \nA low score will lower starting dispositions of Imperial factions and make disposition increases less likely to occur.", + "How easily new mutations and corruption can occur with your Chapter's gene-seed. \nAffects the amount of random mutations your existing Space Marines have, and the amount new Aspirants get after the implantation is finished.": "How easily new mutations and corruption can occur with your Chapter's gene-seed. \nAffects the amount of random mutations your existing Space Marines have, and the amount new Aspirants get after the implantation is finished.", + "How many inherent mutations your gene-seed has. \nEach score below ten requires one mutation to be chosen.": "How many inherent mutations your gene-seed has. \nEach score below ten requires one mutation to be chosen.", + "How many Space Marines your Chapter has. \nFor every score below five a company will be removed; conversely, each score higher grants 50 additional Astartes.": "How many Space Marines your Chapter has. \nFor every score below five a company will be removed; conversely, each score higher grants 50 additional Astartes.", + "Increase": "Increase", + "Mediocre": "Mediocre", + "Neutral": "Neutral", + "Other": "Other", + "Overwhelming": "Overwhelming", + "Penitent": "Penitent", + "Penitent\nAs with Fleet Based, but you must crusade and fight until your penitence meter runs out. Note that recruiting is disabled until then.": "Penitent\nAs with Fleet Based, but you must crusade and fight until your penitence meter runs out. Note that recruiting is disabled until then.", + "Perfect": "Perfect", + "Points: {0}/{1}": "Points: {0}/{1}", + "Progenitor: {0}": "Progenitor: {0}", + "Randomize": "Randomize", + "Randomly generate a Chapter to play. The origins, strength, and weaknesses are all random. Random Chapters are normally weaker than Founding Chapters. ": "Randomly generate a Chapter to play. The origins, strength, and weaknesses are all random. Random Chapters are normally weaker than Founding Chapters. ", + "Reduced": "Reduced", + "Select an Icon": "Select an Icon", + "Select Chapter": "Select Chapter", + "Strength": "Strength", + "Strength: {0} ({1})": "Strength: {0} ({1})", + "Trusted": "Trusted", + "Uncooperative": "Uncooperative" + +, + "Adeptus Astartes ({0})": "Adeptus Astartes ({0})", + "Adeptus Mechanicus ({0})": "Adeptus Mechanicus ({0})", + "After every battle the Astartes have a chance to feast upon their fallen enemies, or seldom, their allies.": "After every battle the Astartes have a chance to feast upon their fallen enemies, or seldom, their allies.", + "Anemic Preomnor": "Anemic Preomnor", + "Born Leader": "Born Leader", + "Chapter Icon": "Chapter Icon", + "Chapter Master Name: ": "Chapter Master Name: ", + "Chapter Saved!": "Chapter Saved!", + "Click to save your Chapter.": "Click to save your Chapter.", + "Disturbing Voice": "Disturbing Voice", + "Do you want to save your Chapter?": "Do you want to save your Chapter?", + "Doomed": "Doomed", + "Ecclesiarchy ({0})": "Ecclesiarchy ({0})", + "Either by secretions or radiation, your Astartes have an unusual or strange skin color. Decreases Imperium disposition.": "Either by secretions or radiation, your Astartes have an unusual or strange skin color. Decreases Imperium disposition.", + "Even before your rise to Chapter Master you were a renowned warrior, nearly without compare. Increases Chapter Master Experience and all stats.": "Even before your rise to Chapter Master you were a renowned warrior, nearly without compare. Increases Chapter Master Experience and all stats.", + "Faulty Lyman's Ear": "Faulty Lyman's Ear", + "Founding Chapter": "Founding Chapter", + "Gene-Seed Mutations": "Gene-Seed Mutations", + "Hyperactive Ossmodula": "Hyperactive Ossmodula", + "Hyper-Stimulated Omophagea": "Hyper-Stimulated Omophagea", + "Imperium ({0})": "Imperium ({0})", + "Inactive Sus-an Membrane": "Inactive Sus-an Membrane", + "Inquisition ({0})": "Inquisition ({0})", + "Instead of wound tissue bone is generated; Apothecaries must spend twice the normal time healing your Astartes.": "Instead of wound tissue bone is generated; Apothecaries must spend twice the normal time healing your Astartes.", + "Lacking a working Lyman's ear, all deep-striked Astartes receive moderate penalties to both attack and defense.": "Lacking a working Lyman's ear, all deep-striked Astartes receive moderate penalties to both attack and defense.", + "Lost Zygote": "Lost Zygote", + "Melee": "Melee", + "Missing Betchers Gland": "Missing Betchers Gland", + "Mutated Catalepsean Node": "Mutated Catalepsean Node", + "One of the Zygotes is faulty or missing. Your Astartes only have one each, generating half the normal gene-seed. Counts as two mutations.": "One of the Zygotes is faulty or missing. Your Astartes only have one each, generating half the normal gene-seed. Counts as two mutations.", + "Oolitic Secretions": "Oolitic Secretions", + "Oversensitive Occulobe": "Oversensitive Occulobe", + "Paragon": "Paragon", + "Points Too High!!": "Points Too High!!", + "Progenitor ({0})": "Progenitor ({0})", + "Psyker": "Psyker", + "Rampant Mucranoid": "Rampant Mucranoid", + "Ranged": "Ranged", + "Save Chapter": "Save Chapter", + "Select {0} more, according to your purity score": "Select {0} more, according to your purity score", + "Select Two Weapons": "Select Two Weapons", + "Starting Disposition": "Starting Disposition", + "Successor Chapters: {0}": "Successor Chapters: {0}", + "The gene-seed is mutated enough": "The gene-seed is mutated enough", + "The gene-seed is perfectly pure": "The gene-seed is perfectly pure", + "The impossible is nothing to you; despite being a Psyker you have slowly risen to lead a Chapter. Chapter Master gains every Power within the chosen Discipline.": "The impossible is nothing to you; despite being a Psyker you have slowly risen to lead a Chapter. Chapter Master gains every Power within the chosen Discipline.", + "The parent Chapter whose gene-seed your own originates from.": "The parent Chapter whose gene-seed your own originates from.", + "You always know the right words to inspire your men or strike doubt in the hearts of the enemy. Increases Disposition and Grants a +10% Requisition Income Bonus.": "You always know the right words to inspire your men or strike doubt in the hearts of the enemy. Increases Disposition and Grants a +10% Requisition Income Bonus.", + "Your Astartes are no longer immune to stun grenades or bright lights, and have a massive penalty during morning battles.": "Your Astartes are no longer immune to stun grenades or bright lights, and have a massive penalty during morning battles.", + "Your Astartes cannot spit acid, and as a result, have slightly less attack in melee combat.": "Your Astartes cannot spit acid, and as a result, have slightly less attack in melee combat.", + "Your Astartes do not have a Sus-an Membrane; they cannot enter suspended animation and receive more casualties.": "Your Astartes do not have a Sus-an Membrane; they cannot enter suspended animation and receive more casualties.", + "Your Astartes have a voice like a creaking door or a rumble. Decreases Imperium disposition.": "Your Astartes have a voice like a creaking door or a rumble. Decreases Imperium disposition.", + "Your Astartes have reduced awareness when tired. Slightly less attack in ranged and melee combat.": "Your Astartes have reduced awareness when tired. Slightly less attack in ranged and melee combat.", + "Your Astartes lack the detoxifying gland called the Preomnor. They are more susceptible to poisons and toxins.": "Your Astartes lack the detoxifying gland called the Preomnor. They are more susceptible to poisons and toxins.", + "Your Astartes' Mucranoid cannot be turned off; the slime lowers most dispositions and occasionally damages their armour.": "Your Astartes' Mucranoid cannot be turned off; the slime lowers most dispositions and occasionally damages their armour.", + "Your Chapter": "Your Chapter", + "Your Chapter cannot make more Astartes until enough research is generated. Counts as four mutations and decreases Imperium disposition while increasing that of other Astartes.": "Your Chapter cannot make more Astartes until enough research is generated. Counts as four mutations and decreases Imperium disposition while increasing that of other Astartes.", + "Your Chapter's icon. Click to edit.": "Your Chapter's icon. Click to edit." + +, + " Disposition Gains : {0}\n": " Disposition Gains : {0}\n", + " Disposition Multiplyers x{0}\n": " Disposition Multiplyers x{0}\n", + " Disposition Start {0}\n": " Disposition Start {0}\n", + "[-] {0}": "[-] {0}", + "{0} ({1})": "{0} ({1})", + "{0} \nCategories: {1}\n\nEffects:\n{2}": "{0} \nCategories: {1}\n\nEffects:\n{2}", + "Add disadvantages or decrease Chapter Stats": "Add disadvantages or decrease Chapter Stats", + "Advantages": "Advantages", + "Chapter {0}": "Chapter {0}", + "Decrease Character trait spawns : {0}\n": "Decrease Character trait spawns : {0}\n", + "Disadvantage": "Disadvantage", + "Disadvantages": "Disadvantages", + "Faction {0}:\n{1}\n": "Faction {0}:\n{1}\n", + "Increases Character trait spawns : {0}\n": "Increases Character trait spawns : {0}\n", + "Insufficient Points": "Insufficient Points", + "None": "None", + "Select a {0}": "Select a {0}", + "Suspicion: {0}\n": "Suspicion: {0}\n" + +, + "A recent siege in aid of the Imperium has reduced the number of your Marines greatly. You retain a normal amount of equipment, but some is damaged.": "A recent siege in aid of the Imperium has reduced the number of your Marines greatly. You retain a normal amount of equipment, but some is damaged.", + "A recent string of unfortunate events has left your Chapter decimated. You have very little left, will your story continue?": "A recent string of unfortunate events has left your Chapter decimated. You have very little left, will your story continue?", + "Ambushers": "Ambushers", + "Ancient Armoury": "Ancient Armoury", + "Assault Doctrine": "Assault Doctrine", + "Barren Librarius": "Barren Librarius", + "Black Rage": "Black Rage", + "Blood Debt": "Blood Debt", + "Boarders": "Boarders", + "Boarding other ships is the specialty of your Chapter. Your Chapter is more lethal when boarding ships, have dedicated boarding squads, and two extra strike cruisers.": "Boarding other ships is the specialty of your Chapter. Your Chapter is more lethal when boarding ships, have dedicated boarding squads, and two extra strike cruisers.", + "Bolter Drilling": "Bolter Drilling", + "Bolter drills are sacred to your Chapter; all Space Marines have increased attack with Bolter weaponry.": "Bolter drills are sacred to your Chapter; all Space Marines have increased attack with Bolter weaponry.", + "Chaos Marines are particularly hated by your Chapter. When fighting the traitors damage is increased.": "Chaos Marines are particularly hated by your Chapter. When fighting the traitors damage is increased.", + "Crafters": "Crafters", + "Depleted Gene-seed Stocks": "Depleted Gene-seed Stocks", + "Devastator Doctrine": "Devastator Doctrine", + "Due to being newly created your Chapter has little special wargear or psykers.": "Due to being newly created your Chapter has little special wargear or psykers.", + "Eldar are particularly hated by your Chapter. When fighting Eldar damage is increased.": "Eldar are particularly hated by your Chapter. When fighting Eldar damage is increased.", + "Elite Guard": "Elite Guard", + "Enduring Angels": "Enduring Angels", + "Enemy: Eldar": "Enemy: Eldar", + "Enemy: Fallen": "Enemy: Fallen", + "Enemy: Necrons": "Enemy: Necrons", + "Enemy: Orks": "Enemy: Orks", + "Enemy: Tau": "Enemy: Tau", + "Enemy: Tyranids": "Enemy: Tyranids", + "Even in death they still serve. Your Chapter places a staunch reverence for its forebears and has a number of additional Venerable Dreadnoughts in service.": "Even in death they still serve. Your Chapter places a staunch reverence for its forebears and has a number of additional Venerable Dreadnoughts in service.", + "Favoured By The Warp": "Favoured By The Warp", + "Fresh Blood": "Fresh Blood", + "Great Luck": "Great Luck", + "In the past, traitors broke off from your Chapter. They harbor incriminating secrets or heretical beliefs, and thus, must be hunted down whenever possible.": "In the past, traitors broke off from your Chapter. They harbor incriminating secrets or heretical beliefs, and thus, must be hunted down whenever possible.", + "Inquisitorial Mandate": "Inquisitorial Mandate", + "Kings of Space": "Kings of Space", + "Lightning Warriors": "Lightning Warriors", + "Many Marines in your Chapter are favoured by the powers of the Warp, making perils of the Warp happen less frequently for them.": "Many Marines in your Chapter are favoured by the powers of the Warp, making perils of the Warp happen less frequently for them.", + "Many of your Chapter's Apothecaries have fallen in recent battles, whether due to their incompetence or deliberate targeting.": "Many of your Chapter's Apothecaries have fallen in recent battles, whether due to their incompetence or deliberate targeting.", + "Medicae Primacy": "Medicae Primacy", + "Necrons are particularly hated by your Chapter. When fighting Necrons damage is increased.": "Necrons are particularly hated by your Chapter. When fighting Necrons damage is increased.", + "Never Forgive": "Never Forgive", + "Obliterated": "Obliterated", + "Orks are particularly hated by your Chapter. When fighting Orks damage is increased.": "Orks are particularly hated by your Chapter. When fighting Orks damage is increased.", + "Poor Equipment": "Poor Equipment", + "Prevents your Chapter from recruiting new Astartes until enough of your Space Marines, or enemies, have been killed. Incompatible with Penitent Chapter types.": "Prevents your Chapter from recruiting new Astartes until enough of your Space Marines, or enemies, have been killed. Incompatible with Penitent Chapter types.", + "Psychic mutations run rampant in your Chapter. You have more Marines with high psychic rating and Aspirants are also more likely to be capable of harnessing powers of the Warp.": "Psychic mutations run rampant in your Chapter. You have more Marines with high psychic rating and Aspirants are also more likely to be capable of harnessing powers of the Warp.", + "Psyker Intolerant": "Psyker Intolerant", + "Retinue of Renown": "Retinue of Renown", + "Reverent Guardians": "Reverent Guardians", + "Ryzan Patronage": "Ryzan Patronage", + "Serpents Delight": "Serpents Delight", + "Shitty Luck": "Shitty Luck", + "Siege Masters": "Siege Masters", + "Sieged": "Sieged", + "Sleeper cells infiltrated your Chapter. When they rose up for the decapitation strike, they slew your five most experienced Companies and many of your HQ staff before being defeated.": "Sleeper cells infiltrated your Chapter. When they rose up for the decapitation strike, they slew your five most experienced Companies and many of your HQ staff before being defeated.", + "Small Reclusiam": "Small Reclusiam", + "Some of your Chapter's past actions or current practices make the Inquisition suspicious. Their disposition is lowered.": "Some of your Chapter's past actions or current practices make the Inquisition suspicious. Their disposition is lowered.", + "Splintered": "Splintered", + "Suspicious": "Suspicious", + "Tau are particularly hated by your Chapter. When fighting Tau damage is increased.": "Tau are particularly hated by your Chapter. When fighting Tau damage is increased.", + "Tech-Heresy": "Tech-Heresy", + "Tech-Scavengers": "Tech-Scavengers", + "The Chapter's journey thus far has been arduous & unforgiving, leaving them severely under strength yet not out of the fight quite yet. You begin with five fewer Companies.": "The Chapter's journey thus far has been arduous & unforgiving, leaving them severely under strength yet not out of the fight quite yet. You begin with five fewer Companies.", + "The steady advance of overwhelming firepower is your Chapter's combat doctrine. Each company has an additional Devastator squad, all infantry have boosted defence, and heavy weapons have increased attack.": "The steady advance of overwhelming firepower is your Chapter's combat doctrine. Each company has an additional Devastator squad, all infantry have boosted defence, and heavy weapons have increased attack.", + "This is actually really bad for your Chapter. Trust me.": "This is actually really bad for your Chapter. Trust me.", + "This is actually really helpful and beneficial for your Chapter. Trust me.": "This is actually really helpful and beneficial for your Chapter. Trust me.", + "Tolerant": "Tolerant", + "Tyranids are particularly hated by your Chapter, owing to experience in the Tyrannic Wars or specialized training. When fighting Tyranids damage is increased.": "Tyranids are particularly hated by your Chapter, owing to experience in the Tyrannic Wars or specialized training. When fighting Tyranids damage is increased.", + "Venerable Ancients": "Venerable Ancients", + "Veterans of naval combat, your Chapter fleet has bonuses to offence, defence, an additional battle barge, and may always be controlled regardless of whether or not the Chapter Master is present.": "Veterans of naval combat, your Chapter fleet has bonuses to offence, defence, an additional battle barge, and may always be controlled regardless of whether or not the Chapter Master is present.", + "Warp Tainted": "Warp Tainted", + "Warp Touched": "Warp Touched", + "Weakened Apothecarion": "Weakened Apothecarion", + "Whether due to being cut off from Forge Worlds or bad luck, your Chapter no longer has enough high quality gear to go around. Your elite troops will have to make do with standard armour.": "Whether due to being cut off from Forge Worlds or bad luck, your Chapter no longer has enough high quality gear to go around. Your elite troops will have to make do with standard armour.", + "Witches are hated by your Chapter, pleasing the Inquisition and Ecclesiarchy. You cannot create Librarians, but gain a small amount of bonus attack against psykers.": "Witches are hated by your Chapter, pleasing the Inquisition and Ecclesiarchy. You cannot create Librarians, but gain a small amount of bonus attack against psykers.", + "Your Astartes have a knack for finding what has been lost. Items and wargear are periodically found and added to the Armamentarium.": "Your Astartes have a knack for finding what has been lost. Items and wargear are periodically found and added to the Armamentarium.", + "Your Chapter cares little for its Reclusiam compared to other Chapters. Fewer Marines have shown the desire to be Chaplains.": "Your Chapter cares little for its Reclusiam compared to other Chapters. Fewer Marines have shown the desire to be Chaplains.", + "Your Chapter does things that make the Mechanicus upset. Mechanicus disposition is lowered and you have less Tech Marines. You start as a tech heretic tolerant Chapter": "Your Chapter does things that make the Mechanicus upset. Mechanicus disposition is lowered and you have less Tech Marines. You start as a tech heretic tolerant Chapter", + "Your Chapter has a smaller Librarius compared to other Chapters due to having fewer potent psykers.": "Your Chapter has a smaller Librarius compared to other Chapters due to having fewer potent psykers.", + "Your Chapter has better ties to the Adeptus Mechanicus; you have more Techmarines and higher Mechanicus disposition.": "Your Chapter has better ties to the Adeptus Mechanicus; you have more Techmarines and higher Mechanicus disposition.", + "Your Chapter has lost its gene-seed stocks in recent engagement. You start with no gene-seed.": "Your Chapter has lost its gene-seed stocks in recent engagement. You start with no gene-seed.", + "Your Chapter has strong ties to the Forgeworld of Ryza. Your Techmarines are privy to the secrets of their Techpriests, granting your Chapter enhanced Plasma and Las weaponry.": "Your Chapter has strong ties to the Forgeworld of Ryza. Your Techmarines are privy to the secrets of their Techpriests, granting your Chapter enhanced Plasma and Las weaponry.", + "Your Chapter is an elite fighting force comprised almost exclusively of Veterans. All Tactical Marines are replaced by Veterans.": "Your Chapter is an elite fighting force comprised almost exclusively of Veterans. All Tactical Marines are replaced by Veterans.", + "Your Chapter is dedicated to preserving ancient wargear and as such have substantially higher amounts of rare Heresy-era armour and weapons than normal.": "Your Chapter is dedicated to preserving ancient wargear and as such have substantially higher amounts of rare Heresy-era armour and weapons than normal.", + "Your Chapter is especially trained with ambushing foes; they have a bonus to attack during the start of a battle.": "Your Chapter is especially trained with ambushing foes; they have a bonus to attack during the start of a battle.", + "Your Chapter is familiar with the ins-and-outs of fortresses. They are better at defending and attacking fortifications, and better at garrisoning": "Your Chapter is familiar with the ins-and-outs of fortresses. They are better at defending and attacking fortifications, and better at garrisoning", + "Your Chapter is more lenient with xenos. All xeno disposition is slightly increased and all Imperial disposition is lowered.": "Your Chapter is more lenient with xenos. All xeno disposition is slightly increased and all Imperial disposition is lowered.", + "Your Chapter is tainted by the Warp. Many of your Marines are afflicted with it, getting caught in perils of the Warp less often but to far more devastating effect. Also greatly reduces Disposition of many Imperial factions.": "Your Chapter is tainted by the Warp. Many of your Marines are afflicted with it, getting caught in perils of the Warp less often but to far more devastating effect. Also greatly reduces Disposition of many Imperial factions.", + "Your Chapter Master is guarded by renowned heroes of the Chapter. You start with a larger well-equipped Honour Guard.": "Your Chapter Master is guarded by renowned heroes of the Chapter. You start with a larger well-equipped Honour Guard.", + "Your Chapter performs some service to the Inquisition that is of some specific value or mandate of the Inquisition": "Your Chapter performs some service to the Inquisition that is of some specific value or mandate of the Inquisition", + "Your Chapter places great faith in the Imperial Cult; you start with more Chaplains and any Ecclesiarchy disposition increases are enhanced.": "Your Chapter places great faith in the Imperial Cult; you start with more Chaplains and any Ecclesiarchy disposition increases are enhanced.", + "Your Chapter prefers quick close-quarter assaults on the enemy. Each Company has an additional Assault Squad, and your Marines are more skilled in melee.": "Your Chapter prefers quick close-quarter assaults on the enemy. Each Company has an additional Assault Squad, and your Marines are more skilled in melee.", + "Your Chapter reveres the Apothecary above all of its specialists. You start with more Apothecaries, and each Company contains an additional Apothecary.": "Your Chapter reveres the Apothecary above all of its specialists. You start with more Apothecaries, and each Company contains an additional Apothecary.", + "Your Chapter views artifacts as sacred; you start with better gear and maintain all equipment with more ease.": "Your Chapter views artifacts as sacred; you start with better gear and maintain all equipment with more ease.", + "Your Chapter's style of warfare is built around the speedy execution of battle. Infantry have boosted attack at the cost of defence as well as two additional Land speeders and Biker squads.": "Your Chapter's style of warfare is built around the speedy execution of battle. Infantry have boosted attack at the cost of defence as well as two additional Land speeders and Biker squads.", + "Your Marines are susceptible to the Black Rage, having a chance each battle to become Death Company. These units are locked as Assault Marines and are fairly suicidal.": "Your Marines are susceptible to the Black Rage, having a chance each battle to become Death Company. These units are locked as Assault Marines and are fairly suicidal.", + "Your Marines are unorganized and splintered. Your forces are initially spread out across the sector and will take time to regroup.": "Your Marines are unorganized and splintered. Your forces are initially spread out across the sector and will take time to regroup." + +, + "Advanced": "Advanced", + "Advanced options for colouring": "Advanced options for colouring", + "Breastplate": "Breastplate", + "Bulk": "Bulk", + "bulk colouring for ease and speed": "bulk colouring for ease and speed", + "Captain": "Captain", + "Captain Markers": "Captain Markers", + "Company": "Company", + "company specific livery that will overide role livery": "company specific livery that will overide role livery", + "Default": "Default", + "First Pauldron": "First Pauldron", + "Helm Lens Colour\nHelm lens colour of {0}": "Helm Lens Colour\nHelm lens colour of {0}", + "Helm Primary : {0}": "Helm Primary : {0}", + "Helm Secondary : {0}": "Helm Secondary : {0}", + "Lens": "Lens", + "Lens : {0}": "Lens : {0}", + "Lens: {0}": "Lens: {0}", + "Muzzle": "Muzzle", + "Pattern": "Pattern", + "Pauldron 1: {0}": "Pauldron 1: {0}", + "Pauldron 2: {0}": "Pauldron 2: {0}", + "Primary": "Primary", + "Primary : {0}": "Primary : {0}", + "Primary Helm Colour\nPrimary helm colour of {0}": "Primary Helm Colour\nPrimary helm colour of {0}", + "Quadrant": "Quadrant", + "Role": "Role", + "Role Settings": "Role Settings", + "Role specific livery that will overide default livery": "Role specific livery that will overide default livery", + "Second Pauldron": "Second Pauldron", + "Secondary": "Secondary", + "Secondary Helm Colour\nSecondary helm colour of {0}": "Secondary Helm Colour\nSecondary helm colour of {0}", + "Secondary: {0}": "Secondary: {0}", + "Sergeant": "Sergeant", + "Sergeant Markers": "Sergeant Markers", + "Single Colour": "Single Colour", + "Standard": "Standard", + "standard options to colour marine": "standard options to colour marine", + "Stripe": "Stripe", + "The color of your Astartes' left Pauldron. Normally this Pauldron displays their rank and designation.": "The color of your Astartes' left Pauldron. Normally this Pauldron displays their rank and designation.", + "The color of your Astartes' lenses. Most of the time this will be the visor color.": "The color of your Astartes' lenses. Most of the time this will be the visor color.", + "The color of your Astartes' right Pauldron. Normally this Pauldron contains the Chapter Insignia.": "The color of your Astartes' right Pauldron. Normally this Pauldron contains the Chapter Insignia.", + "The default livery all marines will be coloured in": "The default livery all marines will be coloured in", + "The main color of your Astartes and their vehicles. And the colour of your chapters Ships": "The main color of your Astartes and their vehicles. And the colour of your chapters Ships", + "The primary color of your Astartes' weapons.": "The primary color of your Astartes' weapons.", + "The secondary color of your Astartes and their vehicles.": "The secondary color of your Astartes and their vehicles.", + "The trim color that appears on the Pauldrons, armour plating, and any decorations.": "The trim color that appears on the Pauldrons, armour plating, and any decorations.", + "Trim": "Trim", + "Trim: {0}": "Trim: {0}", + "Vertical": "Vertical", + "Veteran": "Veteran", + "Veteran Markers": "Veteran Markers", + "Veteran Sergeant": "Veteran Sergeant", + "Veteran Sergeant Markers": "Veteran Sergeant Markers", + "Weapon": "Weapon", + "Weapon: {0}": "Weapon: {0}" + +, + "Battle Barge": "Battle Barge", + "Flagship": "Flagship", + "Homeworld Rule": "Homeworld Rule", + "Instead of a Planetary Governer the planet is broken up into many countries or clans. The people are less united but happier, and see your illusive Astartes as semi-divine beings.": "Instead of a Planetary Governer the planet is broken up into many countries or clans. The people are less united but happier, and see your illusive Astartes as semi-divine beings.", + "Passive Supervision": "Passive Supervision", + "Personal Rule": "Personal Rule", + "Planetary Governer": "Planetary Governer", + "Recruiting World": "Recruiting World", + "The name of your Flagship Battle Barge.": "The name of your Flagship Battle Barge.", + "The world that your Chapter selects recruits from. More harsh worlds provide recruits with more grit and warrior mentality. If you are a homeworld-based Chapter, you may uncheck 'Recruiting World' to recruit from your homeworld instead.": "The world that your Chapter selects recruits from. More harsh worlds provide recruits with more grit and warrior mentality. If you are a homeworld-based Chapter, you may uncheck 'Recruiting World' to recruit from your homeworld instead.", + "The world that your Chapter's Fortress Monastery is located upon. More civilized worlds are more easily defensible but the citizens may pose a risk or be a nuisance.": "The world that your Chapter's Fortress Monastery is located upon. More civilized worlds are more easily defensible but the citizens may pose a risk or be a nuisance.", + "You personally take the rule of the Planetary Governer, ruling over your homeworld with an iron fist. Your every word and directive, be they good or bad, are absolute law.": "You personally take the rule of the Planetary Governer, ruling over your homeworld with an iron fist. Your every word and directive, be they good or bad, are absolute law.", + "Your Chapter's homeworld is ruled by a single Planetary Governer, who does with the planet mostly as they see fit. While heavily influenced by your Astartes the planet is sovereign.": "Your Chapter's homeworld is ruled by a single Planetary Governer, who does with the planet mostly as they see fit. While heavily influenced by your Astartes the planet is sovereign." + +, + "Advisor Names": "Advisor Names", + "Chief Apothecary: ": "Chief Apothecary: ", + "Chief Librarian: ": "Chief Librarian: ", + "Distribute Scouts": "Distribute Scouts", + "Distribute Scouts\nCheck to have your Scouts split across ships in the fleet.": "Distribute Scouts\nCheck to have your Scouts split across ships in the fleet.", + "Distribute Veterans": "Distribute Veterans", + "Distribute Veterans\nCheck to have your Veterans split across the fleet.": "Distribute Veterans\nCheck to have your Veterans split across the fleet.", + "Equal Scout Distribution": "Equal Scout Distribution", + "Equal Specialist Distribution": "Equal Specialist Distribution", + "Forge Master: ": "Forge Master: ", + "High Chaplain: ": "High Chaplain: ", + "Load (Sans Escorts)": "Load (Sans Escorts)", + "Load (Sans Escorts)\nCheck to have your Astartes automatically loaded into ships, except for Escorts, when the game starts.": "Load (Sans Escorts)\nCheck to have your Astartes automatically loaded into ships, except for Escorts, when the game starts.", + "Load to Ships": "Load to Ships", + "Load to Ships\nCheck to have your Astartes automatically loaded into ships when the game starts.": "Load to Ships\nCheck to have your Astartes automatically loaded into ships when the game starts.", + "Master of Recruits: ": "Master of Recruits: ", + "Master of the Fleet: ": "Master of the Fleet: ", + "On Planet": "On Planet", + "On Planet\nCheck to have your Astartes Start on your home planet.": "On Planet\nCheck to have your Astartes Start on your home planet.", + "Roles": "Roles", + "Scout Distribution\nCheck if you wish for Scouts to be distributed equally across your Battle Companies rather than concentrated in the 10th.": "Scout Distribution\nCheck if you wish for Scouts to be distributed equally across your Battle Companies rather than concentrated in the 10th.", + "Specialist Distribution\nCheck if you wish for your Companies to be uniform and each contain {0}s and {1}s.": "Specialist Distribution\nCheck if you wish for your Companies to be uniform and each contain {0}s and {1}s.", + "The names of your main Advisors. They provide useful information and reports on the divisions of your Chapter.": "The names of your main Advisors. They provide useful information and reports on the divisions of your Chapter." + +, + "Ancient": "Ancient", + "Apothecary": "Apothecary", + "Assault": "Assault", + "Champion": "Champion", + "Chaplain": "Chaplain", + "Chapter Master": "Chapter Master", + "Chief Apothecary": "Chief Apothecary", + "Chief Librarian": "Chief Librarian", + "Devastator": "Devastator", + "Dreadnought": "Dreadnought", + "Forge Master": "Forge Master", + "High Chaplain": "High Chaplain", + "Honour Guard": "Honour Guard", + "Librarian": "Librarian", + "Master of Recruits": "Master of Recruits", + "Master of Sanctity": "Master of Sanctity", + "Master of the Apothecarion": "Master of the Apothecarion", + "Master of the Fleet": "Master of the Fleet", + "Scout": "Scout", + "Tactical": "Tactical", + "Techmarine": "Techmarine", + "Terminator": "Terminator" + +, + "{0} is selected as the new {1} {2}.": "{0} is selected as the new {1} {2}.", + "A few have raised questions over his experience.": "A few have raised questions over his experience.", + "Do Nothing": "Do Nothing", + "Experience Pick": "Experience Pick", + "He is disliked by many.": "He is disliked by many.", + "He is generally well liked": "He is generally well liked", + "He is like by all of his tech brothers": "He is like by all of his tech brothers", + "He is not generally well liked": "He is not generally well liked", + "He is not unanimously liked.": "He is not unanimously liked.", + "He mostly disliked": "He mostly disliked", + "Many Question his Technical Talents.": "Many Question his Technical Talents.", + "Most are unhappy with the decision but your word is final": "Most are unhappy with the decision but your word is final", + "New Forge Master": "New Forge Master", + "Popular Pick": "Popular Pick", + "Support the Cult mechanicus faithfuls": "Support the Cult mechanicus faithfuls", + "Support the heretics": "Support the heretics", + "Talent Pick": "Talent Pick", + "Technical Differences!": "Technical Differences!", + "The Demise of Forge Master {0} means a replacement must be chosen. Several Options have already been put forward to you but it is ultimatly your decision.": "The Demise of Forge Master {0} means a replacement must be chosen. Several Options have already been put forward to you but it is ultimatly your decision.", + "The extremists and heretics that have been allowed to grow like a cancer in the Armentarium are rooted out and disposed of.": "The extremists and heretics that have been allowed to grow like a cancer in the Armentarium are rooted out and disposed of.", + "There are some questions about his ability.": "There are some questions about his ability.", + "There have been Many concerns over his experience.": "There have been Many concerns over his experience.", + "While a few may have preferred another there are no serious concerns": "While a few may have preferred another there are no serious concerns", + "With neither faction receiving your favor it is not long until the BloodLetting begins. Within a month a brutal civil war engulfs the Tech ranks with losses suffered on both sides": "With neither faction receiving your favor it is not long until the BloodLetting begins. Within a month a brutal civil war engulfs the Tech ranks with losses suffered on both sides", + "With your full support the so called 'heretics' who have seen through the lies of the bureaucracy of Mars eliminate those who will not be swayed to see the truth.": "With your full support the so called 'heretics' who have seen through the lies of the bureaucracy of Mars eliminate those who will not be swayed to see the truth.", + "You Recive an Urgent Transmision A serious breakdown in culture has coccured causing believers in tech heresy to demand that they are given preseidence and assurance to continue their practises": "You Recive an Urgent Transmision A serious breakdown in culture has coccured causing believers in tech heresy to demand that they are given preseidence and assurance to continue their practises", + "Your choice Is almost unanimously respected": "Your choice Is almost unanimously respected", + "Your supporters are more than our detractors but many are unhappy": "Your supporters are more than our detractors but many are unhappy" + +, + "Adeptus Mechanicus": "Adeptus Mechanicus", + "Chaos": "Chaos", + "Ecclesiarchy": "Ecclesiarchy", + "Eldar": "Eldar", + "Genestealer Cults": "Genestealer Cults", + "Heretics": "Heretics", + "Imperium of Man": "Imperium of Man", + "Inquisition": "Inquisition", + "Necron Dynasties": "Necron Dynasties", + "Orks": "Orks", + "Tau Empire": "Tau Empire", + "Tech-Brothers": "Tech-Brothers", + "Tyranid Hive": "Tyranid Hive" + +, + "Agri": "Agri", + "Dead": "Dead", + "Death": "Death", + "Desert": "Desert", + "Feudal": "Feudal", + "Forge": "Forge", + "Hive": "Hive", + "Ice": "Ice", + "Lava": "Lava", + "Shrine": "Shrine", + "Temperate": "Temperate" + +, + "Boltstorm Gauntlet": "Boltstorm Gauntlet", + "Eviscerator": "Eviscerator", + "Force Staff": "Force Staff", + "Infernus Pistol": "Infernus Pistol", + "Master Crafted Heavy Bolter": "Master Crafted Heavy Bolter", + "Master Crafted Meltagun": "Master Crafted Meltagun", + "Plasma Gun": "Plasma Gun", + "Plasma Pistol": "Plasma Pistol", + "Power Axe": "Power Axe", + "Power Sword": "Power Sword", + "Relic Blade": "Relic Blade", + "Storm Shield": "Storm Shield", + "Thunder Hammer": "Thunder Hammer", + "Twin Lightning Claws": "Twin Lightning Claws", + "Twin Power Fists": "Twin Power Fists" + +, + "Black": "Black", + "Blue": "Blue", + "Bone": "Bone", + "Brown": "Brown", + "Caliban Green": "Caliban Green", + "Codex Grey": "Codex Grey", + "Copper": "Copper", + "Cyan": "Cyan", + "Dark Gold": "Dark Gold", + "Dark Green": "Dark Green", + "Dark Grey": "Dark Grey", + "Dark Metal": "Dark Metal", + "Dark Red": "Dark Red", + "Dark Ultramarine": "Dark Ultramarine", + "Deathwing": "Deathwing", + "Enchanted Blue": "Enchanted Blue", + "Fenrisian Grey": "Fenrisian Grey", + "Firedrake Green": "Firedrake Green", + "Gold": "Gold", + "Green": "Green", + "Grey": "Grey", + "Imperial Fists": "Imperial Fists", + "Light Blue": "Light Blue", + "Light Brown": "Light Brown", + "Light Caliban Green": "Light Caliban Green", + "Lighter Black": "Lighter Black", + "Lightest Brown": "Lightest Brown", + "Lime": "Lime", + "Orange": "Orange", + "Pink": "Pink", + "Purple": "Purple", + "Raptors Green": "Raptors Green", + "Red": "Red", + "Sanguine Red": "Sanguine Red", + "Screamer Pink": "Screamer Pink", + "Silver": "Silver", + "Turqoise": "Turqoise", + "Ultramarine": "Ultramarine", + "White": "White", + "Yellow": "Yellow" + +, + "Error Loading Chapter": "Error Loading Chapter", + "No json file exists for chapter id {0} and name {1}": "No json file exists for chapter id {0} and name {1}" + +} diff --git a/datafiles/lang/zh.json b/datafiles/lang/zh.json index c703a4898c..b755b97252 100644 --- a/datafiles/lang/zh.json +++ b/datafiles/lang/zh.json @@ -1,19 +1,472 @@ { - "Settings": "设置", - "Menu": "菜单", - "Language": "语言", - "Master Volume": "主音量", - "Effects Volume": "特效音量", - "Music Volume": "音乐音量", - "Full Screen?:": "全屏?", - "Enable Autosaves?:": "开启自动保存?", - "Build: {0}": "构建版本:{0}", - "Version: {0}": "游戏版本:{0}", - "Update: {0}\nClick to open download page": "有更新:{0}\n点击打开下载页面", - "Save": "保存", - "Load": "读取", - "Options": "选项", - "Exit": "退出", - "Return": "返回", - "Back": "返回" -} \ No newline at end of file + "Back": "返回", + "Build: {0}": "构建版本:{0}", + "Effects Volume": "特效音量", + "Enable Autosaves?:": "开启自动保存?", + "Exit": "退出", + "Full Screen?:": "全屏?", + "Language": "语言", + "Load": "读取", + "Master Volume": "主音量", + "Menu": "菜单", + "Music Volume": "音乐音量", + "Options": "选项", + "Return": "返回", + "Save": "保存", + "Settings": "设置", + "Update: {0}\nClick to open download page": "有更新:{0}\n点击打开下载页面", + "Version: {0}": "游戏版本:{0}", + "(Hold Ctrl to decrease by 10)": "(按住 Ctrl 以每次减少 10)", + "(Hold Ctrl to increase by 10)": "(按住 Ctrl 以每次增加 10)", + "A special challenge is needed for Aspirants to be judged worthy of becoming Astartes. After completing the Trial they then become a Neophyte, beginning implantation and training. (This can be changed once in game, but the chosen trial here will affect the spawn characteristics of your starting Space Marines).": "试炼者需要经受特殊考验,才能被认定有资格成为阿斯塔特。完成试炼后他们将晋升为新兵(Neophyte),开始植入与训练。(此项可以在游戏中更改,但此处选择的试炼将影响你初始星际战士的生成特性。)", + "Abnormal": "异常", + "Above Average": "中上", + "Advantages cost points, and improve the performance of your Chapter in a specific domain. You can only have one trait of the same category, shown in brackets.": "优势消耗点数,并在特定领域提升战团的表现。每类(括号中所示)只能选择一项特性。", + "Antagonistic": "敌对", + "Aspirant Trial": "试炼仪式", + "Average": "中等", + "Bad": "低劣", + "Cancel": "取消", + "Chapter Advantages": "战团优势", + "Chapter Disadvantages": "战团劣势", + "Chapter Stats": "战团属性", + "Chapter Type": "战团类型", + "Considerable": "可观", + "Cooperation": "协同", + "Cooperation: {0} ({1})": "协同:{0}({1})", + "Create your own customized Chapter, deciding the origins, strength, and weaknesses. Custom Chapters are weaker than Founding Chapters.": "创建你自己的定制战团,决定其起源、长处与弱点。自定义战团弱于初创战团。", + "Custom": "自定义", + "Custom Chapters": "自定义战团", + "Decimated": "严重削弱", + "Decrease": "降低", + "Disadvantages grant additional points, and penalize the performance of your Chapter. You can only have one trait of the same category, shown in brackets.": "劣势提供额外点数,并使战团的表现受损。每类(括号中所示)只能选择一项特性。", + "Exemplary": "典范", + "Existing Chapters": "现有战团", + "Fleet Based": "舰基型", + "Fleet Based\nRather than a homeworld, your Chapter begins near their recruiting world. The fleet includes a Battle Barge, which serves as a mobile base, and powerful ship.": "舰队型\n你的战团没有母星,而是在招募世界附近起家。舰队包括一艘荣光女王级战列舰(Battle Barge),它充当移动基地,也是强大的作战舰船。", + "Founding Chapters": "初创战团", + "Gene-Seed Purity": "基因种子纯净度", + "Gene-Seed Purity: {0} ({1})": "基因种子纯净度:{0}({1})", + "Gene-Seed Stability": "基因种子稳定性", + "Gene-Seed Stability: ({0}%)": "基因种子稳定性:({0}%)", + "Good": "良好", + "Homeworld": "陆基型", + "Homeworld\nYour Chapter has a homeworld that they base on. Contained upon it is a massive Fortress Monastery, which provides high levels of defense and automated weapons.": "母星\n你的战团拥有一座作为根据地的母星。其上建有宏伟的修道院堡垒,提供高水平的防御和自动化武器。", + "Horrible": "极差", + "How diplomatic your Chapter is. \nA low score will lower starting dispositions of Imperial factions and make disposition increases less likely to occur.": "你的战团的外交手腕。\n低分值会降低帝国内各势力的初始好感度,并使好感度更难提升。", + "How easily new mutations and corruption can occur with your Chapter's gene-seed. \nAffects the amount of random mutations your existing Space Marines have, and the amount new Aspirants get after the implantation is finished.": "你的战团基因种子发生新突变与腐化的容易程度。\n影响现有星际战士的随机突变数量,以及新试炼者在完成植入后获得的突变数量。", + "How many inherent mutations your gene-seed has. \nEach score below ten requires one mutation to be chosen.": "你的基因种子自带多少突变。\n每低于十分一点的属性都要求选择一项突变。", + "How many Space Marines your Chapter has. \nFor every score below five a company will be removed; conversely, each score higher grants 50 additional Astartes.": "你的战团拥有多少星际战士。\n每低于五分一点即减少一个连队;反之,每超过一分即额外获得 50 名阿斯塔特。", + "Increase": "提升", + "Mediocre": "平庸", + "Neutral": "中立", + "Other": "其他", + "Overwhelming": "压倒性", + "Penitent": "赎罪远征", + "Penitent\nAs with Fleet Based, but you must crusade and fight until your penitence meter runs out. Note that recruiting is disabled until then.": "赎罪远征\n与舰队型相同,但你必须持续远征作战,直到悔过值耗尽。注意:在此之前无法招募新兵。", + "Perfect": "完美", + "Points: {0}/{1}": "点数:{0}/{1}", + "Progenitor: {0}": "母团:{0}", + "Randomize": "随机生成", + "Randomly generate a Chapter to play. The origins, strength, and weaknesses are all random. Random Chapters are normally weaker than Founding Chapters. ": "随机生成一个可游玩的战团。起源、长处与弱点均为随机。随机战团通常弱于初创战团。", + "Reduced": "削弱", + "Select an Icon": "选择图标", + "Select Chapter": "选择战团", + "Strength": "战力", + "Strength: {0} ({1})": "战力:{0}({1})", + "Trusted": "信赖", + "Uncooperative": "不合作", + "Adeptus Astartes ({0})": "阿斯塔特修会({0})", + "Adeptus Mechanicus ({0})": "机械神教({0})", + "After every battle the Astartes have a chance to feast upon their fallen enemies, or seldom, their allies.": "每场战斗后,阿斯塔特都有机会吞噬倒下的敌人,偶尔也会吞噬盟友。", + "Anemic Preomnor": "虚弱的预置胃", + "Born Leader": "天生领袖", + "Chapter Icon": "战团徽记", + "Chapter Master Name: ": "战团长姓名:", + "Chapter Saved!": "战团已保存!", + "Click to save your Chapter.": "点击保存你的战团。", + "Disturbing Voice": "扰人声线", + "Do you want to save your Chapter?": "是否要保存你的战团?", + "Doomed": "末日将至", + "Ecclesiarchy ({0})": "国教({0})", + "Either by secretions or radiation, your Astartes have an unusual or strange skin color. Decreases Imperium disposition.": "由于分泌物或辐射,你的阿斯塔特拥有不寻常或怪异的肤色。降低帝国的好感度。", + "Even before your rise to Chapter Master you were a renowned warrior, nearly without compare. Increases Chapter Master Experience and all stats.": "早在成为战团长之前,你就是一位几乎无人能及的著名战士。提升战团长经验与所有属性。", + "Faulty Lyman's Ear": "有缺陷的莱曼之耳", + "Founding Chapter": "母团", + "Gene-Seed Mutations": "基因种子突变", + "Hyperactive Ossmodula": "过度活跃的骨骼强化", + "Hyper-Stimulated Omophagea": "超常激发的基因侦测神经", + "Imperium ({0})": "帝国({0})", + "Inactive Sus-an Membrane": "失效的假死脑膜", + "Inquisition ({0})": "审判庭({0})", + "Instead of wound tissue bone is generated; Apothecaries must spend twice the normal time healing your Astartes.": "伤口上长出骨骼而非正常的疤痕组织;药剂师必须耗费两倍于常的时间为你的阿斯塔特治疗。", + "Lacking a working Lyman's ear, all deep-striked Astartes receive moderate penalties to both attack and defense.": "由于莱曼之耳的缺陷,所有深入打击的阿斯塔特在攻防两方面都受到中等程度的惩罚。", + "Lost Zygote": "缺失的基因存收腺", + "Melee": "近战", + "Missing Betchers Gland": "缺失的贝切尔腺", + "Mutated Catalepsean Node": "突变的小脑僵缩节", + "One of the Zygotes is faulty or missing. Your Astartes only have one each, generating half the normal gene-seed. Counts as two mutations.": "其中一个基因存收腺在生理上缺失或异常。你的阿斯塔特只能生成一个基因种子。计为两项突变。", + "Oolitic Secretions": "卵石分泌异常", + "Oversensitive Occulobe": "超敏视觉控制器官", + "Paragon": "楷模", + "Points Too High!!": "点数过高!!", + "Progenitor ({0})": "母团({0})", + "Psyker": "灵能者", + "Rampant Mucranoid": "失控的汗腺改进器官", + "Ranged": "远程", + "Save Chapter": "保存战团", + "Select {0} more, according to your purity score": "根据你的纯净度分数,再选择 {0} 项", + "Select Two Weapons": "选择两个武器", + "Starting Disposition": "初始好感度", + "Successor Chapters: {0}": "后续战团:{0}", + "The gene-seed is mutated enough": "基因种子已有足够多突变", + "The gene-seed is perfectly pure": "基因种子完美纯净", + "The impossible is nothing to you; despite being a Psyker you have slowly risen to lead a Chapter. Chapter Master gains every Power within the chosen Discipline.": "对你而言没有不可能之事;即使身为灵能者你仍一步步升任领导一个战团。战团长获得所选学派中的全部灵能。", + "The parent Chapter whose gene-seed your own originates from.": "你的基因种子所源自的母战团。", + "You always know the right words to inspire your men or strike doubt in the hearts of the enemy. Increases Disposition and Grants a +10% Requisition Income Bonus.": "你总知道该说些什么来激励部下,或在敌人心中播种疑虑。提升好感度,并获得 +10% 征用点收入加成。", + "Your Astartes are no longer immune to stun grenades or bright lights, and have a massive penalty during morning battles.": "你的阿斯塔特不再对眩晕手雷或强光免疫,且在晨间战斗中受到大幅惩罚。", + "Your Astartes cannot spit acid, and as a result, have slightly less attack in melee combat.": "你的阿斯塔特无法吐出酸液,因此近战攻击力略有下降。", + "Your Astartes do not have a Sus-an Membrane; they cannot enter suspended animation and receive more casualties.": "你的阿斯塔特没有假死脑膜;他们无法进入假死状态,因此会承受更多伤亡。", + "Your Astartes have a voice like a creaking door or a rumble. Decreases Imperium disposition.": "你的阿斯塔特嗓音如吱呀作响的门或隆隆的雷声。降低帝国的好感度。", + "Your Astartes have reduced awareness when tired. Slightly less attack in ranged and melee combat.": "你的阿斯塔特疲惫时警觉性下降。远程与近战攻击均略有降低。", + "Your Astartes lack the detoxifying gland called the Preomnor. They are more susceptible to poisons and toxins.": "你的阿斯塔特缺少预置胃的解毒腺体。他们更容易受到毒药与毒素的影响。", + "Your Astartes' Mucranoid cannot be turned off; the slime lowers most dispositions and occasionally damages their armour.": "你的阿斯塔特的汗腺改进器官无法关闭;持续分泌的黏液会降低大多数好感度,并偶尔损坏其盔甲。", + "Your Chapter": "你的战团", + "Your Chapter cannot make more Astartes until enough research is generated. Counts as four mutations and decreases Imperium disposition while increasing that of other Astartes.": "在积累足够的研究之前,你的战团无法制造更多阿斯塔特。计为四项突变,降低帝国的好感度,同时提升其他阿斯塔特的好感度。", + "Your Chapter's icon. Click to edit.": "你的战团徽记。点击进行编辑。", + " Disposition Gains : {0}\n": "好感度增长:{0}\n", + " Disposition Multiplyers x{0}\n": "好感度倍数 x{0}\n", + " Disposition Start {0}\n": "初始好感度 {0}\n", + "[-] {0}": "[-] {0}", + "{0} ({1})": "{0}({1})", + "{0} \nCategories: {1}\n\nEffects:\n{2}": "{0}\n类别:{1}\n\n效果:\n{2}", + "Add disadvantages or decrease Chapter Stats": "添加劣势或降低战团属性", + "Advantages": "优势", + "Chapter {0}": "战团{0}", + "Decrease Character trait spawns : {0}\n": "减少角色特性生成:{0}\n", + "Disadvantage": "劣势", + "Disadvantages": "劣势", + "Faction {0}:\n{1}\n": "势力 {0}:\n{1}\n", + "Increases Character trait spawns : {0}\n": "增加角色特性生成:{0}\n", + "Insufficient Points": "点数不足", + "None": "无", + "Select a {0}": "选择一项{0}", + "Suspicion: {0}\n": "怀疑度:{0}\n", + "A recent siege in aid of the Imperium has reduced the number of your Marines greatly. You retain a normal amount of equipment, but some is damaged.": "一场援助帝国的近期围城战使你的战士数量锐减。你保留了正常的装备数量,但其中一部分已受损。", + "A recent string of unfortunate events has left your Chapter decimated. You have very little left, will your story continue?": "一长串最近的不幸事件让你的战团损失惨重。你的战团几乎灭绝,你的故事还能继续吗?", + "Ambushers": "伏击者", + "Ancient Armoury": "远古军械", + "Assault Doctrine": "突击条令", + "Barren Librarius": "贫瘠智库", + "Black Rage": "黑色狂怒", + "Blood Debt": "血债", + "Boarders": "跳帮专家", + "Boarding other ships is the specialty of your Chapter. Your Chapter is more lethal when boarding ships, have dedicated boarding squads, and two extra strike cruisers.": "跳帮作战是你战团的专长。你的战团在跳帮时更加致命,拥有专门的跳帮小队和两艘额外的打击巡洋舰。", + "Bolter Drilling": "爆弹枪训练", + "Bolter drills are sacred to your Chapter; all Space Marines have increased attack with Bolter weaponry.": "爆弹枪训练对你的战团堪称神圣;所有星际战士在使用爆弹武器时攻击力提升。", + "Chaos Marines are particularly hated by your Chapter. When fighting the traitors damage is increased.": "你的战团尤其痛恨混沌战士。与叛乱者作战时伤害提升。", + "Crafters": "大师工匠", + "Depleted Gene-seed Stocks": "枯竭的基因种子库存", + "Devastator Doctrine": "毁灭条令", + "Due to being newly created your Chapter has little special wargear or psykers.": "由于才刚刚创立,你的战团几乎没有特殊装备或灵能者。", + "Eldar are particularly hated by your Chapter. When fighting Eldar damage is increased.": "你的战团尤其痛恨艾达灵族。与灵族作战时伤害提升。", + "Elite Guard": "精英卫队", + "Enduring Angels": "坚韧天使", + "Enemy: Eldar": "宿敌:艾达灵族", + "Enemy: Fallen": "宿敌:堕落者", + "Enemy: Necrons": "宿敌:太空死灵", + "Enemy: Orks": "宿敌:兽人", + "Enemy: Tau": "宿敌:钛帝国", + "Enemy: Tyranids": "宿敌:泰伦虫族", + "Even in death they still serve. Your Chapter places a staunch reverence for its forebears and has a number of additional Venerable Dreadnoughts in service.": "虽死犹忠。你的战团对先辈怀有坚定的敬意,因此有额外的若干神圣无畏在役。", + "Favoured By The Warp": "亚空间之眷", + "Fresh Blood": "新血", + "Great Luck": "大吉大运", + "In the past, traitors broke off from your Chapter. They harbor incriminating secrets or heretical beliefs, and thus, must be hunted down whenever possible.": "过去曾有叛徒脱离你的战团。他们掌握着足以定罪之秘或信奉异端邪说,因此任何时候都必须全力追捕。", + "Inquisitorial Mandate": "审判庭授权", + "Kings of Space": "太空之主", + "Lightning Warriors": "闪电战士", + "Many Marines in your Chapter are favoured by the powers of the Warp, making perils of the Warp happen less frequently for them.": "你战团中的许多战士受到亚空间力量的青睐,使他们在亚空间危害中幸存的几率更高。", + "Many of your Chapter's Apothecaries have fallen in recent battles, whether due to their incompetence or deliberate targeting.": "你的战团有许多药剂师在近期战斗中阵亡,无论是出于无能还是有人蓄意针对。", + "Medicae Primacy": "医疗至上", + "Necrons are particularly hated by your Chapter. When fighting Necrons damage is increased.": "你的战团尤其痛恨太空死灵。与太空死灵作战时伤害提升。", + "Never Forgive": "永不宽恕", + "Obliterated": "几近覆灭", + "Orks are particularly hated by your Chapter. When fighting Orks damage is increased.": "你的战团尤其痛恨兽人。与兽人作战时伤害提升。", + "Poor Equipment": "劣质装备", + "Prevents your Chapter from recruiting new Astartes until enough of your Space Marines, or enemies, have been killed. Incompatible with Penitent Chapter types.": "在杀死足够多的敌人,或者损失足够多的星际战士之前,你的战团无法招募新兵。与赎罪远征类型战团不兼容。", + "Psychic mutations run rampant in your Chapter. You have more Marines with high psychic rating and Aspirants are also more likely to be capable of harnessing powers of the Warp.": "灵能突变在你的战团中横行。你拥有更多高灵能等级的战士,受选者也更有可能掌握驾驭亚空间力量的能力。", + "Psyker Intolerant": "排斥灵能者", + "Retinue of Renown": "威名亲卫", + "Reverent Guardians": "虔诚护卫", + "Ryzan Patronage": "瑞扎赞助", + "Serpents Delight": "九头蛇之悦", + "Shitty Luck": "霉运连连", + "Siege Masters": "攻城大师", + "Sieged": "围城浩劫", + "Sleeper cells infiltrated your Chapter. When they rose up for the decapitation strike, they slew your five most experienced Companies and many of your HQ staff before being defeated.": "潜伏小组渗透了你的战团并发动了一次斩首打击,在被击败前歼灭了战团经验最丰富的五个连队和许多指挥部人员。", + "Small Reclusiam": "圣所凋敝", + "Some of your Chapter's past actions or current practices make the Inquisition suspicious. Their disposition is lowered.": "你的战团过去的某些行为或现存的做法让审判庭起了疑心。审判庭的好感度下降。", + "Splintered": "各自为战", + "Suspicious": "疑云笼罩", + "Tau are particularly hated by your Chapter. When fighting Tau damage is increased.": "你的战团尤其痛恨钛族。与钛族作战时伤害提升。", + "Tech-Heresy": "科技异端", + "Tech-Scavengers": "科技拾荒者", + "The Chapter's journey thus far has been arduous & unforgiving, leaving them severely under strength yet not out of the fight quite yet. You begin with five fewer Companies.": "战团迄今的征程艰辛而严酷,虽尚未丧失战斗力,却已严重缺编。你的战团缺少五个连队。", + "The steady advance of overwhelming firepower is your Chapter's combat doctrine. Each company has an additional Devastator squad, all infantry have boosted defence, and heavy weapons have increased attack.": "以压倒性火力稳步推进是你战团的作战教义。每个连队额外拥有一支歼灭者小队,所有步兵防御提升,重武器攻击力提升。", + "This is actually really bad for your Chapter. Trust me.": "这对你的战团其实真的非常不利。信我。", + "This is actually really helpful and beneficial for your Chapter. Trust me.": "这对你的战团其实真的非常有益。信我。", + "Tolerant": "纵容异形", + "Tyranids are particularly hated by your Chapter, owing to experience in the Tyrannic Wars or specialized training. When fighting Tyranids damage is increased.": "由于泰伦战争中的经历或专门训练,你的战团尤其痛恨泰伦虫族。与虫族作战时伤害提升。", + "Venerable Ancients": "远古圣贤", + "Veterans of naval combat, your Chapter fleet has bonuses to offence, defence, an additional battle barge, and may always be controlled regardless of whether or not the Chapter Master is present.": "作为海战老兵,你的战团舰队在攻防上获得加成,并额外拥有一艘战斗驳船,并且无论战团长是否在场都始终可由你指挥。", + "Warp Tainted": "亚空间污染", + "Warp Touched": "亚空间之触", + "Weakened Apothecarion": "医所衰微", + "Whether due to being cut off from Forge Worlds or bad luck, your Chapter no longer has enough high quality gear to go around. Your elite troops will have to make do with standard armour.": "无论是因与铸造世界中断联系还是霉运,你的战团已没有足够的高品质装备可分配。你的精锐部队将不得不以标准盔甲将就。", + "Witches are hated by your Chapter, pleasing the Inquisition and Ecclesiarchy. You cannot create Librarians, but gain a small amount of bonus attack against psykers.": "你的战团憎恶巫师,这让审判庭和国教感到满意。你无法创建智库,但对灵能者获得少量攻击加成。", + "Your Astartes have a knack for finding what has been lost. Items and wargear are periodically found and added to the Armamentarium.": "你的阿斯塔特天生擅长寻找失落之物。物品与战争装备会被定期寻回并加入兵械库。", + "Your Chapter cares little for its Reclusiam compared to other Chapters. Fewer Marines have shown the desire to be Chaplains.": "你的战团远不如其他战团那般重视圣所。有志担任牧师的战士屈指可数。", + "Your Chapter does things that make the Mechanicus upset. Mechanicus disposition is lowered and you have less Tech Marines. You start as a tech heretic tolerant Chapter": "你的战团做了些让机械教不满的事。机械教好感度下降,你拥有的技术军士也更少。你以宽容科技异端的战团开局。", + "Your Chapter has a smaller Librarius compared to other Chapters due to having fewer potent psykers.": "与其它战团相比,你的战团拥有较小的智库,因为强大的灵能者较少。", + "Your Chapter has better ties to the Adeptus Mechanicus; you have more Techmarines and higher Mechanicus disposition.": "你的战团与机械神教关系更好;你拥有更多技术军士,机械教好感度也更高。", + "Your Chapter has lost its gene-seed stocks in recent engagement. You start with no gene-seed.": "你的战团在最近的交战中失去了基因种子库存。你一开始没有任何基因种子。", + "Your Chapter has strong ties to the Forgeworld of Ryza. Your Techmarines are privy to the secrets of their Techpriests, granting your Chapter enhanced Plasma and Las weaponry.": "你的战团与铸造世界瑞扎关系牢固。你的技术军士深谙其机械神甫的秘密,让你的战团获得强化的等离武器与激光武器。", + "Your Chapter is an elite fighting force comprised almost exclusively of Veterans. All Tactical Marines are replaced by Veterans.": "你的战团是一支几乎全由老兵组成的精英战斗力量。所有战术小队的战士都被老兵取代。", + "Your Chapter is dedicated to preserving ancient wargear and as such have substantially higher amounts of rare Heresy-era armour and weapons than normal.": "你的战团致力于保存古代战争装备,因此拥有比寻常战团多得多的稀有异端时代盔甲与武器。", + "Your Chapter is especially trained with ambushing foes; they have a bonus to attack during the start of a battle.": "你的战团尤其擅长伏击敌人;他们在战斗开始时获得攻击加成。", + "Your Chapter is familiar with the ins-and-outs of fortresses. They are better at defending and attacking fortifications, and better at garrisoning": "你的战团精通要塞攻防。他们更擅长攻击与防守防御工事,驻守星球的效率更高。", + "Your Chapter is more lenient with xenos. All xeno disposition is slightly increased and all Imperial disposition is lowered.": "你的战团对异形更为宽容。所有异形的好感度略升,所有帝国的好感度下降。", + "Your Chapter is tainted by the Warp. Many of your Marines are afflicted with it, getting caught in perils of the Warp less often but to far more devastating effect. Also greatly reduces Disposition of many Imperial factions.": "你的战团受亚空间污染。你许多战士都深受其苦,你更难触发亚空间的威胁,但一旦遭难后果则严重得多。同时大幅降低许多帝国势力的好感度。", + "Your Chapter Master is guarded by renowned heroes of the Chapter. You start with a larger well-equipped Honour Guard.": "你的战团长由战团中著名的英雄护卫。你一开始就拥有规模更大、装备精良的荣誉卫队。", + "Your Chapter performs some service to the Inquisition that is of some specific value or mandate of the Inquisition": "你的战团为审判庭履行某种具有特定价值或受其委任的职务。", + "Your Chapter places great faith in the Imperial Cult; you start with more Chaplains and any Ecclesiarchy disposition increases are enhanced.": "你的战团对帝国国教抱有极大的信仰;你一开始就有更多牧师,任何国教好感度的提升都会得到增强。", + "Your Chapter prefers quick close-quarter assaults on the enemy. Each Company has an additional Assault Squad, and your Marines are more skilled in melee.": "你的战团偏爱对敌人发动快速的近身突击。每个连队额外拥有一支突击小队,你的战士也更擅长近战。", + "Your Chapter reveres the Apothecary above all of its specialists. You start with more Apothecaries, and each Company contains an additional Apothecary.": "你的战团对其所有专家中最推崇药剂师。你一开始就拥有更多药剂师,且每个连队都额外编有一名药剂师。", + "Your Chapter views artifacts as sacred; you start with better gear and maintain all equipment with more ease.": "你的战团将远古造物奉为圣物;你们以更好的装备开局,保养装备也更得心应手。", + "Your Chapter's style of warfare is built around the speedy execution of battle. Infantry have boosted attack at the cost of defence as well as two additional Land speeders and Biker squads.": "你的战团以快速打击为主要作战风格。步兵以防御为代价获得攻击提升,每个连队都额外拥有两台兰德速攻艇和两个摩托小队。", + "Your Marines are susceptible to the Black Rage, having a chance each battle to become Death Company. These units are locked as Assault Marines and are fairly suicidal.": "你的战士易受黑色狂怒影响,每场战斗都可能成为死亡连队。这些单位会被锁定为突击战士,且极易伤亡。", + "Your Marines are unorganized and splintered. Your forces are initially spread out across the sector and will take time to regroup.": "你的星际战士组织涣散、四分五裂。部队最初分散在整个星区,需要时间才能重新集结。", + "Advanced": "高级", + "Advanced options for colouring": "高级涂装选项", + "Breastplate": "胸甲", + "Bulk": "批量", + "bulk colouring for ease and speed": "为便捷与快速而设的批量涂装", + "Captain": "连长", + "Captain Markers": "连长标记", + "Company": "连队", + "company specific livery that will overide role livery": "将覆盖角色涂装的连队专属涂装", + "Default": "默认", + "First Pauldron": "左侧肩甲", + "Helm Lens Colour\nHelm lens colour of {0}": "头盔目镜颜色\n{0} 的头盔目镜颜色", + "Helm Primary : {0}": "头盔主色 :{0}", + "Helm Secondary : {0}": "头盔辅色 :{0}", + "Lens": "目镜", + "Lens : {0}": "目镜 :{0}", + "Lens: {0}": "目镜:{0}", + "Muzzle": "面甲", + "Pattern": "图案", + "Pauldron 1: {0}": "肩甲 1:{0}", + "Pauldron 2: {0}": "肩甲 2:{0}", + "Primary": "主色", + "Primary : {0}": "主色 :{0}", + "Primary Helm Colour\nPrimary helm colour of {0}": "头盔主色\n{0} 的头盔主色", + "Quadrant": "四分", + "Role": "角色", + "Role Settings": "角色设置", + "Role specific livery that will overide default livery": "将覆盖默认涂装的角色专属涂装", + "Second Pauldron": "右侧肩甲", + "Secondary": "辅色", + "Secondary Helm Colour\nSecondary helm colour of {0}": "头盔辅色\n{0} 的头盔辅色", + "Secondary: {0}": "辅色:{0}", + "Sergeant": "士官", + "Sergeant Markers": "士官标记", + "Single Colour": "纯色", + "Standard": "标准", + "standard options to colour marine": "标准战士涂装选项", + "Stripe": "条纹", + "The color of your Astartes' left Pauldron. Normally this Pauldron displays their rank and designation.": "你阿斯塔特左侧肩甲的颜色。通常这侧肩甲显示其军衔与职务。", + "The color of your Astartes' lenses. Most of the time this will be the visor color.": "你阿斯塔特目镜的颜色。", + "The color of your Astartes' right Pauldron. Normally this Pauldron contains the Chapter Insignia.": "你阿斯塔特右侧肩甲的颜色。通常这侧肩甲绘有战团徽记。", + "The default livery all marines will be coloured in": "所有战士应用的默认涂装", + "The main color of your Astartes and their vehicles. And the colour of your chapters Ships": "你阿斯塔特及其载具的主色,也是你战团舰船的颜色。", + "The primary color of your Astartes' weapons.": "你阿斯塔特武器的主色。", + "The secondary color of your Astartes and their vehicles.": "你阿斯塔特及其载具的辅色。", + "The trim color that appears on the Pauldrons, armour plating, and any decorations.": "出现在肩甲、装甲板及任何装饰物上的滚边颜色。", + "Trim": "滚边", + "Trim: {0}": "滚边:{0}", + "Vertical": "竖向", + "Veteran": "老兵", + "Veteran Markers": "老兵标记", + "Veteran Sergeant": "老兵士官", + "Veteran Sergeant Markers": "老兵士官标记", + "Weapon": "武器", + "Weapon: {0}": "武器:{0}", + "Battle Barge": "战列舰", + "Flagship": "旗舰", + "Homeworld Rule": "母星统治方式", + "Instead of a Planetary Governer the planet is broken up into many countries or clans. The people are less united but happier, and see your illusive Astartes as semi-divine beings.": "这颗星球并非由行星总督统治,而是分裂为众多国家或部族。民众虽不那么团结,却更为快乐,并将神出鬼没的阿斯塔特们视为半神。", + "Passive Supervision": "被动监管", + "Personal Rule": "个人统治", + "Planetary Governer": "行星总督", + "Recruiting World": "招募世界", + "The name of your Flagship Battle Barge.": "你的旗舰战斗驳船的名称。", + "The world that your Chapter selects recruits from. More harsh worlds provide recruits with more grit and warrior mentality. If you are a homeworld-based Chapter, you may uncheck 'Recruiting World' to recruit from your homeworld instead.": "你的战团选择招募新兵的世界。更严酷的世界会为招募者提供更多坚韧与战士心性。如果你是母星型战团,可以取消勾选“招募世界”改为从母星招募。", + "The world that your Chapter's Fortress Monastery is located upon. More civilized worlds are more easily defensible but the citizens may pose a risk or be a nuisance.": "你的战团修道院堡垒所在的世界。越文明的世界越易于防御,但公民可能构成威胁或带来麻烦。", + "You personally take the rule of the Planetary Governer, ruling over your homeworld with an iron fist. Your every word and directive, be they good or bad, are absolute law.": "你亲自接管行星总督的权柄,以铁腕统治你的母星。你说的每一句话、下达的每一条指示,无论好坏,都是绝对的法律。", + "Your Chapter's homeworld is ruled by a single Planetary Governer, who does with the planet mostly as they see fit. While heavily influenced by your Astartes the planet is sovereign.": "你的战团母星由一位行星总督统治,他基本按自己的意愿行事。虽然深受你的阿斯塔特影响,但该行星是独立的。", + "Advisor Names": "顾问姓名", + "Chief Apothecary: ": "首席药剂师:", + "Chief Librarian: ": "首席智库馆长:", + "Distribute Scouts": "分散侦察兵", + "Distribute Scouts\nCheck to have your Scouts split across ships in the fleet.": "分散侦察兵\n勾选后,你的侦察兵将被分散到舰队各舰船中。", + "Distribute Veterans": "分散老兵", + "Distribute Veterans\nCheck to have your Veterans split across the fleet.": "分散老兵\n勾选后,你的老兵将被分散到舰队各舰船中。", + "Equal Scout Distribution": "侦察兵均分", + "Equal Specialist Distribution": "专家均分", + "Forge Master: ": "铸造大师:", + "High Chaplain: ": "高阶牧师:", + "Load (Sans Escorts)": "装载(不含护卫舰)", + "Load (Sans Escorts)\nCheck to have your Astartes automatically loaded into ships, except for Escorts, when the game starts.": "装载(不含护卫舰)\n勾选后,游戏开始时你的阿斯塔特将自动装载到舰船中,护卫舰除外。", + "Load to Ships": "装载到舰船", + "Load to Ships\nCheck to have your Astartes automatically loaded into ships when the game starts.": "装载到舰船\n勾选后,游戏开始时你的阿斯塔特将自动装载到舰船中。", + "Master of Recruits: ": "新兵统领:", + "Master of the Fleet: ": "舰队统领:", + "On Planet": "在行星上", + "On Planet\nCheck to have your Astartes Start on your home planet.": "在行星上\n勾选后,你的阿斯塔特将在我方母星上开局。", + "Roles": "角色", + "Scout Distribution\nCheck if you wish for Scouts to be distributed equally across your Battle Companies rather than concentrated in the 10th.": "侦察兵分布\n如果你希望侦察兵在你的战斗连队中平均分布,而不是集中于第十连,请勾选。", + "Specialist Distribution\nCheck if you wish for your Companies to be uniform and each contain {0}s and {1}s.": "专家分布\n如果你希望你的连队整齐划一且每个连队都包含 {0} 和 {1},请勾选。", + "The names of your main Advisors. They provide useful information and reports on the divisions of your Chapter.": "你的主要顾问的姓名。他们就你战团各部门的情况提供有用的情报与报告。", + "Ancient": "旗手", + "Apothecary": "药剂师", + "Assault": "突击战士", + "Champion": "冠军", + "Chaplain": "牧师", + "Chapter Master": "战团长", + "Chief Apothecary": "首席药剂师", + "Chief Librarian": "首席智库馆长", + "Devastator": "毁灭者", + "Dreadnought": "无畏机甲", + "Forge Master": "铸造大师", + "High Chaplain": "高阶牧师", + "Honour Guard": "荣誉卫队", + "Librarian": "智库馆长", + "Master of Recruits": "新兵统领", + "Master of Sanctity": "圣所统领", + "Master of the Apothecarion": "药剂师统领", + "Master of the Fleet": "舰队统领", + "Scout": "侦察兵", + "Tactical": "战术战士", + "Techmarine": "技术军士", + "Terminator": "终结者", + "{0} is selected as the new {1} {2}.": "{0} 被选为新任{1} {2}。", + "A few have raised questions over his experience.": "有少数人对他的经验提出了质疑。", + "Do Nothing": "按兵不动", + "Experience Pick": "经验之选", + "He is disliked by many.": "他遭人厌恶。", + "He is generally well liked": "他普遍受到爱戴", + "He is like by all of his tech brothers": "他的所有技术兄弟都喜欢他", + "He is not generally well liked": "他并不普遍受欢迎", + "He is not unanimously liked.": "他并未获得一致拥戴。", + "He mostly disliked": "他大多不受欢迎", + "Many Question his Technical Talents.": "许多人质疑他的技术才能。", + "Most are unhappy with the decision but your word is final": "大多数人对这一决定不满,但你的话就是最终定论", + "New Forge Master": "新任铸造大师", + "Popular Pick": "众望所归", + "Support the Cult mechanicus faithfuls": "支持机械教信徒", + "Support the heretics": "支持异端", + "Talent Pick": "才能之选", + "Technical Differences!": "技术分歧!", + "The Demise of Forge Master {0} means a replacement must be chosen. Several Options have already been put forward to you but it is ultimatly your decision.": "铸造大师 {0} 的离世意味着必须选出一位接替者。已有人向你提交了若干人选,但最终决定权在你。", + "The extremists and heretics that have been allowed to grow like a cancer in the Armentarium are rooted out and disposed of.": "那些被允许像毒瘤一般滋生于武库中的极端分子与异端已被连根拔除并处理掉。", + "There are some questions about his ability.": "有人对他的能力存疑。", + "There have been Many concerns over his experience.": "人们对他的经验有许多担忧。", + "While a few may have preferred another there are no serious concerns": "虽然少数人可能更偏爱另一个人选,但并无严重的顾虑", + "With neither faction receiving your favor it is not long until the BloodLetting begins. Within a month a brutal civil war engulfs the Tech ranks with losses suffered on both sides": "由于两派都未得到你的垂青,流血冲突不久便拉开帷幕。不出一个月,一场残酷的内战便席卷了技术阶层,双方都损失惨重", + "With your full support the so called 'heretics' who have seen through the lies of the bureaucracy of Mars eliminate those who will not be swayed to see the truth.": "在你的全力支持下,那些看透了火星官僚谎言、所谓的“异端”清除了不愿被说服正视真相之人。", + "You Recive an Urgent Transmision A serious breakdown in culture has coccured causing believers in tech heresy to demand that they are given preseidence and assurance to continue their practises": "你收到一封紧急通讯:文化领域发生了严重裂变,导致技术异端的信奉者要求获得优先地位并保证能够继续他们的实践。", + "Your choice Is almost unanimously respected": "你的选择几乎获得一致尊重", + "Your supporters are more than our detractors but many are unhappy": "支持你的人多于反对者,但仍有许多人不高兴", + "Adeptus Mechanicus": "机械神教", + "Chaos": "混沌", + "Ecclesiarchy": "国教", + "Eldar": "艾达灵族", + "Genestealer Cults": "基因窃取者教团", + "Heretics": "异端", + "Imperium of Man": "人类帝国", + "Inquisition": "审判庭", + "Necron Dynasties": "死灵王朝", + "Orks": "兽人", + "Tau Empire": "钛帝国", + "Tech-Brothers": "技术兄弟", + "Tyranid Hive": "泰伦虫巢", + "Agri": "农业世界", + "Dead": "死寂世界", + "Death": "死亡世界", + "Desert": "沙漠世界", + "Feudal": "封建世界", + "Forge": "铸造世界", + "Hive": "巢都世界", + "Ice": "冰封世界", + "Lava": "熔岩世界", + "Shrine": "圣殿世界", + "Temperate": "温带世界", + "Boltstorm Gauntlet": "爆矢风暴拳套", + "Eviscerator": "裂人锯", + "Force Staff": "力场杖", + "Infernus Pistol": "炼狱手枪", + "Master Crafted Heavy Bolter": "精工重型爆弹枪", + "Master Crafted Meltagun": "精工热熔枪", + "Plasma Gun": "等离枪", + "Plasma Pistol": "等离子手枪", + "Power Axe": "动力斧", + "Power Sword": "动力剑", + "Relic Blade": "圣物之刃", + "Storm Shield": "风暴盾", + "Thunder Hammer": "雷霆锤", + "Twin Lightning Claws": "双联闪电爪", + "Twin Power Fists": "双联动力拳", + "Black": "黑色", + "Blue": "蓝色", + "Bone": "骨白", + "Brown": "棕色", + "Caliban Green": "卡利班绿", + "Codex Grey": "圣典灰", + "Copper": "铜色", + "Cyan": "青色", + "Dark Gold": "暗金", + "Dark Green": "深绿", + "Dark Grey": "深灰", + "Dark Metal": "暗金属", + "Dark Red": "暗红", + "Dark Ultramarine": "暗群青", + "Deathwing": "死亡之翼", + "Enchanted Blue": "魔幻蓝", + "Fenrisian Grey": "芬里斯灰", + "Firedrake Green": "火龙绿", + "Gold": "金色", + "Green": "绿色", + "Grey": "灰色", + "Imperial Fists": "帝国之拳", + "Light Blue": "浅蓝", + "Light Brown": "浅棕", + "Light Caliban Green": "浅卡利班绿", + "Lighter Black": "较浅黑", + "Lightest Brown": "最浅棕", + "Lime": "青柠绿", + "Orange": "橙色", + "Pink": "粉色", + "Purple": "紫色", + "Raptors Green": "猛禽绿", + "Red": "红色", + "Sanguine Red": "血红", + "Screamer Pink": "尖叫粉", + "Silver": "银色", + "Turqoise": "蓝绿色", + "Ultramarine": "群青", + "White": "白色", + "Yellow": "黄色", + "Error Loading Chapter": "战团加载错误", + "No json file exists for chapter id {0} and name {1}": "不存在战团 id 为 {0}、名称为 {1} 的 JSON 文件" +} diff --git a/objects/obj_creation/Draw_0.gml b/objects/obj_creation/Draw_0.gml index 550d23a07d..7b91c4a77c 100644 --- a/objects/obj_creation/Draw_0.gml +++ b/objects/obj_creation/Draw_0.gml @@ -70,8 +70,8 @@ try { obj_cursor.image_index = 0; if (scr_hit(436, 74, 436 + 128, 74 + 128) && (popup == "")) { obj_cursor.image_index = 1; - tooltip = "Chapter Icon"; - tooltip2 = "Your Chapter's icon. Click to edit."; + tooltip = localize("Chapter Icon"); + tooltip2 = localize("Your Chapter's icon. Click to edit."); } if (slide == eCREATION_SLIDES.CHAPTERTRAITS) { @@ -88,10 +88,10 @@ try { draw_sprite_stretched(_chapter_icon, 0, 1164 - 128, 74, 128, 128); draw_set_alpha(1); - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); if (scr_hit(1164 - 128, 74, 1164, 74 + 128)) { - tooltip = "Founding Chapter"; - tooltip2 = "The parent Chapter whose gene-seed your own originates from."; + tooltip = localize("Founding Chapter"); + tooltip2 = localize("The parent Chapter whose gene-seed your own originates from."); } if (custom == eCHAPTER_TYPE.CUSTOM) { @@ -134,7 +134,7 @@ try { } else if (slide == eCREATION_SLIDES.CHAPTERGENE) { /* Gene Seed Mutations, Disposition */ draw_set_color(CM_GREEN_COLOR); - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); draw_set_halign(fa_center); draw_set_alpha(1); @@ -146,21 +146,21 @@ try { draw_set_color(CM_GREEN_COLOR); draw_set_halign(fa_left); - draw_text_transformed(580, 118, string_hash_to_newline("Successor Chapters: " + string(successors)), 0.6, 0.6, 0); - draw_set_font(fnt_40k_14b); + draw_text_transformed(580, 118, string_hash_to_newline(localize("Successor Chapters: {0}", [string(successors)])), 0.6, 0.6, 0); + draw_set_font(cjk_font(fnt_40k_14b)); draw_rectangle(445, 200, 1125, 202, true); draw_set_halign(fa_center); - draw_set_font(fnt_40k_30b); - draw_text_transformed(800, 210, string_hash_to_newline("Gene-Seed Mutations"), 0.6, 0.6, 0); + draw_set_font(cjk_font(fnt_40k_30b)); + draw_text_transformed(800, 210, string_hash_to_newline(localize("Gene-Seed Mutations")), 0.6, 0.6, 0); if (purity == 10) { - draw_text_transformed(800, 230, $"The gene-seed is perfectly pure", 0.5, 0.5, 0); + draw_text_transformed(800, 230, localize("The gene-seed is perfectly pure"), 0.5, 0.5, 0); } else { if (mutations > mutations_selected) { - draw_text_transformed(800, 230, $"Select {mutations - mutations_selected} more, according to your purity score", 0.5, 0.5, 0); + draw_text_transformed(800, 230, localize("Select {0} more, according to your purity score", [string(mutations - mutations_selected)]), 0.5, 0.5, 0); } else { - draw_text_transformed(800, 230, $"The gene-seed is mutated enough", 0.5, 0.5, 0); + draw_text_transformed(800, 230, localize("The gene-seed is mutated enough"), 0.5, 0.5, 0); draw_set_alpha(0.5); } } @@ -173,15 +173,15 @@ try { } var mutations_defects = [ { - t_tip: "Anemic Preomnor", - t_tip2: "Your Astartes lack the detoxifying gland called the Preomnor. They are more susceptible to poisons and toxins.", + t_tip: localize("Anemic Preomnor"), + t_tip2: localize("Your Astartes lack the detoxifying gland called the Preomnor. They are more susceptible to poisons and toxins."), data: preomnor, mutation_points: 1, disposition: [], }, { - t_tip: "Disturbing Voice", - t_tip2: "Your Astartes have a voice like a creaking door or a rumble. Decreases Imperium disposition.", + t_tip: localize("Disturbing Voice"), + t_tip2: localize("Your Astartes have a voice like a creaking door or a rumble. Decreases Imperium disposition."), data: voice, mutation_points: 1, disposition: [ @@ -192,8 +192,8 @@ try { ], }, { - t_tip: "Doomed", - t_tip2: "Your Chapter cannot make more Astartes until enough research is generated. Counts as four mutations and decreases Imperium disposition while increasing that of other Astartes.", + t_tip: localize("Doomed"), + t_tip2: localize("Your Chapter cannot make more Astartes until enough research is generated. Counts as four mutations and decreases Imperium disposition while increasing that of other Astartes."), data: doomed, mutation_points: 4, disposition: [ @@ -208,57 +208,57 @@ try { ], }, { - t_tip: "Faulty Lyman's Ear", - t_tip2: "Lacking a working Lyman's ear, all deep-striked Astartes receive moderate penalties to both attack and defense.", + t_tip: localize("Faulty Lyman's Ear"), + t_tip2: localize("Lacking a working Lyman's ear, all deep-striked Astartes receive moderate penalties to both attack and defense."), data: lyman, mutation_points: 1, disposition: [], }, { - t_tip: "Hyper-Stimulated Omophagea", - t_tip2: "After every battle the Astartes have a chance to feast upon their fallen enemies, or seldom, their allies.", + t_tip: localize("Hyper-Stimulated Omophagea"), + t_tip2: localize("After every battle the Astartes have a chance to feast upon their fallen enemies, or seldom, their allies."), data: omophagea, mutation_points: 1, disposition: [], }, { - t_tip: "Hyperactive Ossmodula", - t_tip2: "Instead of wound tissue bone is generated; Apothecaries must spend twice the normal time healing your Astartes.", + t_tip: localize("Hyperactive Ossmodula"), + t_tip2: localize("Instead of wound tissue bone is generated; Apothecaries must spend twice the normal time healing your Astartes."), data: ossmodula, mutation_points: 1, disposition: [], }, { - t_tip: "Lost Zygote", - t_tip2: "One of the Zygotes is faulty or missing. Your Astartes only have one each, generating half the normal gene-seed. Counts as two mutations.", + t_tip: localize("Lost Zygote"), + t_tip2: localize("One of the Zygotes is faulty or missing. Your Astartes only have one each, generating half the normal gene-seed. Counts as two mutations."), data: zygote, mutation_points: 2, disposition: [], }, { - t_tip: "Inactive Sus-an Membrane", - t_tip2: "Your Astartes do not have a Sus-an Membrane; they cannot enter suspended animation and receive more casualties.", + t_tip: localize("Inactive Sus-an Membrane"), + t_tip2: localize("Your Astartes do not have a Sus-an Membrane; they cannot enter suspended animation and receive more casualties."), data: membrane, mutation_points: 1, disposition: [], }, { - t_tip: "Missing Betchers Gland", - t_tip2: "Your Astartes cannot spit acid, and as a result, have slightly less attack in melee combat.", + t_tip: localize("Missing Betchers Gland"), + t_tip2: localize("Your Astartes cannot spit acid, and as a result, have slightly less attack in melee combat."), data: betchers, mutation_points: 1, disposition: [], }, { - t_tip: "Mutated Catalepsean Node", - t_tip2: "Your Astartes have reduced awareness when tired. Slightly less attack in ranged and melee combat.", + t_tip: localize("Mutated Catalepsean Node"), + t_tip2: localize("Your Astartes have reduced awareness when tired. Slightly less attack in ranged and melee combat."), data: catalepsean, mutation_points: 1, disposition: [], }, { - t_tip: "Oolitic Secretions", - t_tip2: "Either by secretions or radiation, your Astartes have an unusual or strange skin color. Decreases Imperium disposition.", + t_tip: localize("Oolitic Secretions"), + t_tip2: localize("Either by secretions or radiation, your Astartes have an unusual or strange skin color. Decreases Imperium disposition."), data: secretions, mutation_points: 1, disposition: [ @@ -269,8 +269,8 @@ try { ], }, { - t_tip: "Oversensitive Occulobe", - t_tip2: "Your Astartes are no longer immune to stun grenades or bright lights, and have a massive penalty during morning battles.", + t_tip: localize("Oversensitive Occulobe"), + t_tip2: localize("Your Astartes are no longer immune to stun grenades or bright lights, and have a massive penalty during morning battles."), data: occulobe, mutation_points: 1, disposition: [ @@ -281,8 +281,8 @@ try { ], }, { - t_tip: "Rampant Mucranoid", - t_tip2: "Your Astartes' Mucranoid cannot be turned off; the slime lowers most dispositions and occasionally damages their armour.", + t_tip: localize("Rampant Mucranoid"), + t_tip2: localize("Your Astartes' Mucranoid cannot be turned off; the slime lowers most dispositions and occasionally damages their armour."), data: mucranoid, mutation_points: 1, disposition: [ @@ -369,21 +369,21 @@ try { draw_line(445, 506, 1125, 505); draw_line(445, 507, 1125, 507); - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); draw_set_halign(fa_center); - draw_text_transformed(800, 515, string_hash_to_newline("Starting Disposition"), 0.6, 0.6, 0); + draw_text_transformed(800, 515, string_hash_to_newline(localize("Starting Disposition")), 0.6, 0.6, 0); - draw_set_font(fnt_40k_14b); + draw_set_font(cjk_font(fnt_40k_14b)); draw_set_halign(fa_right); - draw_text(650, 550, string_hash_to_newline("Imperium (" + string(disposition[2]) + ")")); - draw_text(650, 575, string_hash_to_newline("Adeptus Mechanicus (" + string(disposition[3]) + ")")); - draw_text(650, 600, string_hash_to_newline("Ecclesiarchy (" + string(disposition[5]) + ")")); - draw_text(650, 625, string_hash_to_newline("Inquisition (" + string(disposition[4]) + ")")); + draw_text(650, 550, string_hash_to_newline(global.faction_names[eFACTION.IMPERIUM] + " (" + string(disposition[eFACTION.IMPERIUM]) + ")")); + draw_text(650, 575, string_hash_to_newline(global.faction_names[eFACTION.MECHANICUS] + " (" + string(disposition[eFACTION.MECHANICUS]) + ")")); + draw_text(650, 600, string_hash_to_newline(global.faction_names[eFACTION.ECCLESIARCHY] + " (" + string(disposition[eFACTION.ECCLESIARCHY]) + ")")); + draw_text(650, 625, string_hash_to_newline(global.faction_names[eFACTION.INQUISITION] + " (" + string(disposition[eFACTION.INQUISITION]) + ")")); if (founding != ePROGENITOR.NONE) { - draw_text(650, 650, string_hash_to_newline("Progenitor (" + string(disposition[1]) + ")")); + draw_text(650, 650, string_hash_to_newline(localize("Progenitor ({0})", [string(disposition[1])]))); } - draw_text(650, 675, "Adeptus Astartes (" + string(disposition[6]) + ")"); + draw_text(650, 675, localize("Adeptus Astartes ({0})", [string(disposition[6])])); draw_rectangle(655, 552, 1150, 567, 1); draw_rectangle(655, 552 + 25, 1150, 567 + 25, 1); @@ -416,7 +416,7 @@ try { /* Chapter Master */ if (slide == eCREATION_SLIDES.CHAPTERMASTER) { draw_set_color(CM_GREEN_COLOR); - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); draw_set_halign(fa_center); draw_set_alpha(1); @@ -426,8 +426,8 @@ try { draw_set_color(CM_GREEN_COLOR); draw_set_halign(fa_left); - draw_text_transformed(580, 100, string_hash_to_newline("Chapter Master Name: "), 0.9, 0.9, 0); - draw_set_font(fnt_40k_14b); + draw_text_transformed(580, 100, string_hash_to_newline(localize("Chapter Master Name: ")), 0.9, 0.9, 0); + draw_set_font(cjk_font(fnt_40k_14b)); if ((text_selected != "cm") || (custom == eCHAPTER_TYPE.PREMADE)) { draw_text_ext(580, 144, string_hash_to_newline(string(chapter_master_name)), -1, 580); @@ -472,10 +472,10 @@ try { draw_line(445, 201, 1125, 201); draw_line(445, 202, 1125, 202); - draw_set_font(fnt_40k_30b); - draw_text_transformed(444, 215, string_hash_to_newline("Select Two Weapons"), 0.6, 0.6, 0); - draw_text_transformed(444, 240, string_hash_to_newline("Melee"), 0.6, 0.6, 0); - draw_text_transformed(800, 240, string_hash_to_newline("Ranged"), 0.6, 0.6, 0); + draw_set_font(cjk_font(fnt_40k_30b)); + draw_text_transformed(444, 215, string_hash_to_newline(localize("Select Two Weapons")), 0.6, 0.6, 0); + draw_text_transformed(444, 240, string_hash_to_newline(localize("Melee")), 0.6, 0.6, 0); + draw_text_transformed(800, 240, string_hash_to_newline(localize("Ranged")), 0.6, 0.6, 0); var x6, y6, spac; var melee_choice_order = 0; @@ -526,7 +526,7 @@ try { onceh = 1; } } - draw_text_transformed(x6 + 30, y6 + 4, string_hash_to_newline(melee_choice_weapon), 0.4, 0.4, 0); + draw_text_transformed(x6 + 30, y6 + 4, string_hash_to_newline(localize(melee_choice_weapon)), 0.4, 0.4, 0); y6 += spac; } @@ -560,7 +560,7 @@ try { chapter_master_ranged = ranged_choice_order; } } - draw_text_transformed(x6 + 30, y6 + 4, ranged_options[ranged_choice_order], 0.4, 0.4, 0); + draw_text_transformed(x6 + 30, y6 + 4, localize(ranged_options[ranged_choice_order]), 0.4, 0.4, 0); y6 += spac; } @@ -570,7 +570,7 @@ try { draw_line(445, 491, 1125, 491); draw_line(445, 492, 1125, 492); - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); // draw_text_transformed(444,505,"Select Speciality",0.6,0.6,0); draw_set_halign(fa_center); @@ -591,16 +591,16 @@ try { "", ], [ - "Born Leader", - "You always know the right words to inspire your men or strike doubt in the hearts of the enemy. Increases Disposition and Grants a +10% Requisition Income Bonus.", + localize("Born Leader"), + localize("You always know the right words to inspire your men or strike doubt in the hearts of the enemy. Increases Disposition and Grants a +10% Requisition Income Bonus."), ], [ - "Paragon", - "Even before your rise to Chapter Master you were a renowned warrior, nearly without compare. Increases Chapter Master Experience and all stats.", + localize("Paragon"), + localize("Even before your rise to Chapter Master you were a renowned warrior, nearly without compare. Increases Chapter Master Experience and all stats."), ], [ - "Psyker", - "The impossible is nothing to you; despite being a Psyker you have slowly risen to lead a Chapter. Chapter Master gains every Power within the chosen Discipline.", + localize("Psyker"), + localize("The impossible is nothing to you; despite being a Psyker you have slowly risen to lead a Chapter. Chapter Master gains every Power within the chosen Discipline."), ], ]; for (var h = 1; h <= 3; h++) { @@ -650,18 +650,18 @@ try { _sc_box.y2 = _sc_box.y1 + _sc_box.h; _sc_box.x2 = _sc_box.x1 + _sc_box.w; - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); draw_rectangle(_sc_box.x1, _sc_box.y1, _sc_box.x2, _sc_box.y2, true); - draw_text_transformed(_sc_box.x1 + 90, _sc_box.y1 + 5, string("Save Chapter"), 0.6, 0.6, 0); - draw_set_font(fnt_40k_14b); + draw_text_transformed(_sc_box.x1 + 90, _sc_box.y1 + 5, string(localize("Save Chapter")), 0.6, 0.6, 0); + draw_set_font(cjk_font(fnt_40k_14b)); if (scr_hit(_sc_box.x1, _sc_box.y1, _sc_box.x2, _sc_box.y2)) { - tooltip = "Do you want to save your Chapter?"; - tooltip2 = "Click to save your Chapter."; + tooltip = localize("Do you want to save your Chapter?"); + tooltip2 = localize("Click to save your Chapter."); if (mouse_button_clicked()) { scr_save_chapter(global.chapter_id); - tooltip = "Do you want to save your Chapter?"; - tooltip2 = "Chapter Saved!"; + tooltip = localize("Do you want to save your Chapter?"); + tooltip2 = localize("Chapter Saved!"); } } } @@ -803,7 +803,7 @@ try { var _lock = false; if (scr_hit([925, 756, 997, 824])) { if (slide == eCREATION_SLIDES.CHAPTERTRAITS && points > maxpoints) { - tooltip_draw("Points Too High!!"); + tooltip_draw(localize("Points Too High!!")); _lock = true; } } @@ -832,18 +832,18 @@ try { draw_set_alpha(1); draw_set_color(c_black); draw_set_halign(fa_left); - draw_set_font(fnt_40k_14b); + draw_set_font(cjk_font(fnt_40k_14b)); var _width1 = string_width_ext(string_hash_to_newline(tooltip), -1, 500); - draw_set_font(fnt_40k_14); + draw_set_font(cjk_font(fnt_40k_14)); var _width2 = string_width_ext(string_hash_to_newline(tooltip2), -1, 500); var _height = string_height_ext(string_hash_to_newline(tooltip2), -1, 500); draw_rectangle(mouse_x + 18, mouse_y + 20, mouse_x + max(_width1, _width2) + 24, mouse_y + 44 + _height, 0); draw_set_color(CM_GREEN_COLOR); draw_rectangle(mouse_x + 18, mouse_y + 20, mouse_x + max(_width1, _width2) + 24, mouse_y + 44 + _height, 1); - draw_set_font(fnt_40k_14b); + draw_set_font(cjk_font(fnt_40k_14b)); draw_text(mouse_x + 22, mouse_y + 22, string_hash_to_newline(string(tooltip))); - draw_set_font(fnt_40k_14); + draw_set_font(cjk_font(fnt_40k_14)); draw_text_ext(mouse_x + 22, mouse_y + 42, string_hash_to_newline(string(tooltip2)), -1, 500); } } catch (_exception) { diff --git a/objects/obj_creation_popup/Draw_0.gml b/objects/obj_creation_popup/Draw_0.gml index e75ddaad70..455ec19761 100644 --- a/objects/obj_creation_popup/Draw_0.gml +++ b/objects/obj_creation_popup/Draw_0.gml @@ -7,12 +7,12 @@ try { } else if (type == ePOPUP_TYPE.EQUIP) { draw_popup_equip(before_after_styling); - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); var _role_data = obj_creation.player_role_data[target_role]; var _role_name = _role_data.role; - role_name_input.tooltip = $"Astartes Role Name/nThe name of this Astartes Role. The plural form will be ''{_role_name}s''."; + role_name_input.tooltip = $"Astartes Role Name\nThe name of this Astartes Role. The plural form will be ''{_role_name}s''."; role_name_input.draw(_role_name); if (role_name_input.value_allowed){ _role_data.role = role_name_input.draw(_role_name); @@ -21,15 +21,15 @@ try { if ((tooltip != "") && (obj_creation.change_slide <= 0)) { draw_set_alpha(1); - draw_set_font(fnt_40k_14); + draw_set_font(cjk_font(fnt_40k_14)); draw_set_halign(fa_left); draw_set_color(0); draw_rectangle(mouse_x + 18, mouse_y + 20, mouse_x + string_width_ext(string_hash_to_newline(tooltip2), -1, 500) + 24, mouse_y + 44 + string_height_ext(string_hash_to_newline(tooltip2), -1, 500), 0); draw_set_color(CM_GREEN_COLOR); draw_rectangle(mouse_x + 18, mouse_y + 20, mouse_x + string_width_ext(string_hash_to_newline(tooltip2), -1, 500) + 24, mouse_y + 44 + string_height_ext(string_hash_to_newline(tooltip2), -1, 500), 1); - draw_set_font(fnt_40k_14b); + draw_set_font(cjk_font(fnt_40k_14b)); draw_text(mouse_x + 22, mouse_y + 22, string_hash_to_newline(string(tooltip))); - draw_set_font(fnt_40k_14); + draw_set_font(cjk_font(fnt_40k_14)); draw_text_ext(mouse_x + 22, mouse_y + 42, string_hash_to_newline(string(tooltip2)), -1, 500); } } catch (ex) { diff --git a/objects/obj_star_select/Create_0.gml b/objects/obj_star_select/Create_0.gml index bf5ef07984..4308626a24 100644 --- a/objects/obj_star_select/Create_0.gml +++ b/objects/obj_star_select/Create_0.gml @@ -67,7 +67,7 @@ main_data_slate = new DataSlate(); potential_donors = []; colonist_button = new PurchaseButton(1000); -colonist_button.update({tooltip: "Planets with higher populations can provide more recruits both for your chapter and to keep a planets PDF bolstered, however colonists from other planets bring with them their home planets influences and evils /n REQ : 1000", label: "Request Colonists", target: target}); +colonist_button.update({tooltip: "Planets with higher populations can provide more recruits both for your chapter and to keep a planets PDF bolstered, however colonists from other planets bring with them their home planets influences and evils \nREQ : 1000", label: "Request Colonists", target: target}); colonist_button.bind_method = function() { var doner = array_random_element(obj_star_select.potential_donors); new_colony_fleet(doner[0], doner[1], target.id, obj_controller.selecting_planet, "bolster_population"); diff --git a/objects/obj_tooltip/Draw_75.gml b/objects/obj_tooltip/Draw_75.gml index 75516c553f..ebfc728cff 100644 --- a/objects/obj_tooltip/Draw_75.gml +++ b/objects/obj_tooltip/Draw_75.gml @@ -14,6 +14,10 @@ for (var i = 0; i < array_length(tooltip_data); i++) { var _force_width = tooltip_data[i].force_width; var _cost = tooltip_data[i].cost; + var _draw_font = cjk_font(_font); + var _draw_header_font = cjk_font(_header_font); + var _draw_footer_font = cjk_font(_footer_font); + var _screen_vpadding = 30; var _screen_hpadding = 60; var _header_h = 0; @@ -33,18 +37,18 @@ for (var i = 0; i < array_length(tooltip_data); i++) { var _rect_h = 0; // Measurements - draw_set_font(_font); + draw_set_font(_draw_font); var _text_w = _force_width ? _width : min(string_width(_tooltip), _width); var _text_h = string_height_ext(_tooltip, DEFAULT_LINE_GAP, _text_w); if (_header != "") { - draw_set_font(_header_font); + draw_set_font(_draw_header_font); _header_w = _force_width ? _width : max(string_width(_header), _width); _header_h = string_height_ext(_header, DEFAULT_LINE_GAP, _header_w); } if (_footer != "") { - draw_set_font(_footer_font); + draw_set_font(_draw_footer_font); _footer_w = _force_width ? _width : max(string_width(_footer), _width); _footer_h = string_height_ext(_footer, DEFAULT_LINE_GAP, _footer_w); } @@ -99,15 +103,15 @@ for (var i = 0; i < array_length(tooltip_data); i++) { draw_rectangle_color_simple(_rect_x + 2, _rect_y + 2, _rect_w + _rect_x - 2, _rect_h + _rect_y - 2, 1, c_gray); if (_header != "") { - draw_set_font(_header_font); + draw_set_font(_draw_header_font); draw_text_ext_transformed_colour(_content_x, _header_y, _header, DEFAULT_LINE_GAP, _header_w, 1, 1, 0, _text_color, _text_color, _text_color, _text_color, 1); } - draw_set_font(_font); + draw_set_font(_draw_font); draw_text_ext_transformed_colour(_content_x, _text_y, _tooltip, DEFAULT_LINE_GAP, _text_w, 1, 1, 0, _text_color, _text_color, _text_color, _text_color, 1); if (_footer != "") { - draw_set_font(_footer_font); + draw_set_font(_draw_footer_font); draw_text_ext_transformed_colour(_content_x, _footer_y, _footer, DEFAULT_LINE_GAP, _footer_w, 1, 1, 0, _text_color, _text_color, _text_color, _text_color, 1); if (_cost != 0) { var _cost_color = (obj_controller.requisition < _cost) ? c_red : COL_REQUISITION; diff --git a/scripts/LocalizationManager/LocalizationManager.gml b/scripts/LocalizationManager/LocalizationManager.gml index 118517b07f..8fed19aea2 100644 --- a/scripts/LocalizationManager/LocalizationManager.gml +++ b/scripts/LocalizationManager/LocalizationManager.gml @@ -5,12 +5,17 @@ function LocalizationManager() constructor { needs_cjk = false; translations = {}; cjk_fonts = {}; + font_styles = {}; + // Keys already warned about as missing this language load, so draw-time arrays do not + // flood LOGGER.error every frame for the same gap. Reset on each language load. + reported_missing = {}; /// @param {string} _language Language code: LANG_EN, LANG_ZH, etc. static load_language = function(_language) { self.language = _language; self.needs_cjk = _language != LANG_EN && string_count(LANG_ZH, _language) > 0; self.translations = self._load_lang_file(_language); + self.reported_missing = {}; self._warn_missing_translations(); }; @@ -77,14 +82,99 @@ function LocalizationManager() constructor { } if (_args != undefined) { - for (var i = 0; i < array_length(_args); i++) { - _value = string_replace_all(_value, "{" + string(i) + "}", string(_args[i])); + var _count = array_length(_args); + var _tokens = []; + for (var i = 0; i < _count; i++) { + var _token = chr(2) + "LOC_ARG_" + string(i) + chr(2); + array_push(_tokens, _token); + _value = string_replace_all(_value, "{" + string(i) + "}", _token); + } + for (var i = 0; i < _count; i++) { + _value = string_replace_all(_value, _tokens[i], string(_args[i])); } } return _value; }; + /// @desc Localizes every entry of an array in one call, returning a new array. Each element + /// is treated as an English translation key (or a { text, variables } struct for + /// keys with {0}, {1} placeholders). Missing keys fall back to the English value and + /// are reported with LOGGER.error so translation gaps surface loudly instead of + /// silently showing the wrong language. + /// @param {Array} _keys Array of English keys and/or { text, variables } structs. + /// @returns {Array} + static localize_array = function(_keys) { + var _result = array_create(array_length(_keys), ""); + for (var i = 0; i < array_length(_keys); i++) { + var _item = _keys[i]; + _result[i] = self._localize_item(_item); + } + return _result; + }; + + /// @desc Reports a missing translation key once per language load. Calling this from + /// _localize_item (which may run every draw frame for draw-time arrays) with an + /// un-deduplicated LOGGER.error would flood the log, so each key fires at most once + /// until the next load_language resets reported_missing. + /// @param {string} _key The untranslated English key. + static _report_missing = function(_key) { + if (struct_exists(self.reported_missing, _key)) { + return; + } + self.reported_missing[$ _key] = true; + LOGGER.error($"No translation for '{_key}' in language '{self.language}'."); + }; + + /// @desc Localizes a single array entry: an English key, or a { text, variables } struct. + /// Empty values pass through untouched; missing keys fall back to English with a + /// once-per-language-load LOGGER.error warning. + /// @param {string|Struct} _item English translation key or struct with placeholder data. + /// @returns {string} + static _localize_item = function(_item) { + if (is_struct(_item)) { + var _text = _item[$ LANG_ENTRY_TEXT]; + var _variables = struct_exists(_item, LANG_ENTRY_VARIABLES) ? _item[$ LANG_ENTRY_VARIABLES] : undefined; + if (_text != "" && !struct_exists(self.translations, _text)) { + self._report_missing(_text); + } + return self.translate(_text, _variables); + } + if (!is_string(_item) || _item == "") { + return _item; + } + if (!struct_exists(self.translations, _item)) { + self._report_missing(_item); + } + return self.translate(_item); + }; + + /// @desc Rebuilds the localized global faction_names display array from the pristine English + /// source (global.faction_names_en), translating once per language change instead of on + /// every draw frame. Translating from the constant English source each time makes the + /// call fully idempotent and round-trip safe: switching to another language and back to + /// English always restores the original English names. Call from + /// SettingsManager.apply_language(). + static refresh_locale_globals = function() { + for (var i = 0; i < array_length(global.faction_names_en); i++) { + global.faction_names[i] = self.translate(global.faction_names_en[i]); + } + + // Rebuild each live rating array from its pristine English source, exactly like + // faction_names above. Writes go directly through each global accessor so the live + // array CoW-copies away from the shared _en source; translating from English each time + // keeps the call idempotent and round-trip safe. + for (var i = 0; i < array_length(global.chapter_strength_ratings_en); i++) { + global.chapter_strength_ratings[i] = self.translate(global.chapter_strength_ratings_en[i]); + } + for (var i = 0; i < array_length(global.chapter_cooperation_ratings_en); i++) { + global.chapter_cooperation_ratings[i] = self.translate(global.chapter_cooperation_ratings_en[i]); + } + for (var i = 0; i < array_length(global.chapter_geneseed_ratings_en); i++) { + global.chapter_geneseed_ratings[i] = self.translate(global.chapter_geneseed_ratings_en[i]); + } + }; + /// @param {real} _size Point size used for the runtime fallback font. /// @param {real} _base_font The font asset intended for this text. /// @returns {real} @@ -93,12 +183,13 @@ function LocalizationManager() constructor { return _base_font; } - var _key = string(_size); + var _style = self._get_font_style(_base_font); + var _key = string(_size) + ":" + string(_style.bold) + ":" + string(_style.italic); if (struct_exists(self.cjk_fonts, _key)) { return self.cjk_fonts[$ _key]; } - var _fallback_font = font_add(STR_CJK_FALLBACK_FONT, _size, false, false, 32, 65535); + var _fallback_font = font_add(STR_CJK_FALLBACK_FONT, _size, _style.bold, _style.italic, 32, 65535); if (!font_exists(_fallback_font)) { LOGGER.error($"Failed to load CJK fallback font '{STR_CJK_FALLBACK_FONT}' at size {_size}. Chinese glyphs may render as blank boxes."); self.cjk_fonts[$ _key] = _base_font; @@ -108,6 +199,71 @@ function LocalizationManager() constructor { self.cjk_fonts[$ _key] = _fallback_font; return _fallback_font; }; + + /// @desc Returns a font's bold/italic style, cached per font asset so detection (and any + /// warnings) run once per session rather than on every draw call. + /// @param {real} _base_font The font asset intended for this text. + /// @returns {Struct} + static _get_font_style = function(_base_font) { + var _font_id = string(_base_font); + if (struct_exists(self.font_styles, _font_id)) { + return self.font_styles[$ _font_id]; + } + + var _style = self._font_style(_base_font); + self.font_styles[$ _font_id] = _style; + return _style; + }; + + /// @desc Resolves a font's bold/italic style. Styled fonts are declared explicitly in + /// font_style_overrides(); the name-suffix heuristic below is only a safety net and logs + /// a warning when it detects a styled font that is not declared, so adding or renaming a + /// font surfaces loudly instead of silently losing or gaining weight. + /// @param {real} _base_font The font asset intended for this text. + /// @returns {Struct} + static _font_style = function(_base_font) { + var _name = font_get_name(_base_font); + var _overrides = font_style_overrides(); + if (struct_exists(_overrides, _name)) { + return _overrides[$ _name]; + } + + var _style = { bold: false, italic: false }; + var _len = string_length(_name); + if (_len == 0) { + return _style; + } + + var _is_digit = function(_char) { + return string_digits(_char) == _char; + }; + + var _last = string_char_at(_name, _len); + if (_is_digit(_last)) { + return _style; + } + if (_last != "b" && _last != "i") { + return _style; + } + + LOGGER.warning($"Font '{_name}' suggests bold/italic via its name suffix but is not declared in font_style_overrides(); add it there so the CJK fallback weight is explicit."); + + _style.bold = _last == "b"; + _style.italic = _last == "i"; + + if (_len > 1) { + var _prev = string_char_at(_name, _len - 1); + if (_is_digit(_prev)) { + return _style; + } + if (_last == "i" && _prev == "b") { + _style.bold = true; + } else if (_last == "b" && _prev == "i") { + _style.italic = true; + } + } + return _style; + }; } /// @desc Global shorthand for speaking localized text. Falls back to the raw English key. @@ -121,6 +277,18 @@ function localize(_key, _args = undefined) { return _key; } +/// @desc Global shorthand for localizing every entry of an array in one call, mapping each +/// English element to the current language. Missing keys fall back to English and are +/// flagged with LOGGER.error. +/// @param {Array} _keys Array of English keys and/or { text, variables } structs. +/// @returns {Array} +function localize_array(_keys) { + if (variable_global_exists("localization_manager")) { + return global.localization_manager.localize_array(_keys); + } + return _keys; +} + /// @desc Global shorthand for a font suitable for the current language, deriving /// the point size from the base font asset so callers never hardcode sizes. /// @param {real} _base_font The font asset intended for this text. @@ -132,3 +300,18 @@ function cjk_font(_base_font) { } return _base_font; } + +/// @desc Explicit registry of styled font assets used by the CJK fallback. The CJK runtime font +/// cannot preserve bold/italic, so styled fonts must be declared here; the name-suffix +/// heuristic in LocalizationManager._font_style() is only a safety net and warns loudly if a +/// styled-looking font is missing from this list. Add any future styled font here. +/// @returns {Struct} +function font_style_overrides() { + static _overrides = { + fnt_40k_14b: { bold: true, italic: false }, + fnt_40k_30b: { bold: true, italic: false }, + fnt_40k_12i: { bold: false, italic: true }, + fnt_40k_14i: { bold: false, italic: true }, + }; + return _overrides; +} diff --git a/scripts/SettingsManager/SettingsManager.gml b/scripts/SettingsManager/SettingsManager.gml index 82067d867f..4204b41aa8 100644 --- a/scripts/SettingsManager/SettingsManager.gml +++ b/scripts/SettingsManager/SettingsManager.gml @@ -75,6 +75,7 @@ function SettingsManager() constructor { static apply_language = function() { global.language = language; global.localization_manager.load_language(language); + global.localization_manager.refresh_locale_globals(); }; static sync_ui = function() { diff --git a/scripts/UIRenderComponents/UIRenderComponents.gml b/scripts/UIRenderComponents/UIRenderComponents.gml index efb9984b8e..066168ff43 100644 --- a/scripts/UIRenderComponents/UIRenderComponents.gml +++ b/scripts/UIRenderComponents/UIRenderComponents.gml @@ -79,8 +79,9 @@ function UITextRendererComponent(owner, name) : UIRenderComponent(owner, name) c return; } callback(self); - if (draw_get_font() != font) { - draw_set_font(font); + var _effective_font = cjk_font(font); + if (draw_get_font() != _effective_font) { + draw_set_font(_effective_font); } var orig_valign = draw_get_valign(); var orig_halign = draw_get_halign(); diff --git a/scripts/globals/globals.gml b/scripts/globals/globals.gml index d2f1737ce0..eab8dce8e2 100644 --- a/scripts/globals/globals.gml +++ b/scripts/globals/globals.gml @@ -14,7 +14,13 @@ global.list_terminator_armour = [ "Cataphractii", ]; -global.faction_names = [ +// Faction display names, indexed by eFACTION. The English values double as the localization +// keys. faction_names_en is the pristine English source and is NEVER mutated; faction_names is +// the live display array rebuilt from it on each language change, so switching back to English +// restores the original English names (an in-place mutation would lose them). Reads like +// global.faction_names[eFACTION.X] pick up the current language without a localize() call +// during draw. +global.faction_names_en = [ "", "Your Chapter", "Imperium of Man", @@ -31,6 +37,55 @@ global.faction_names = [ "Necron Dynasties", ]; +global.faction_names = global.faction_names_en; + +// Chapter-stat rating labels shown on the creation screen, indexed 0..10 by stat value. +// Same pristine-English-source / live-localized-array pattern as faction_names so the draw +// path never allocates or translates per frame; refresh via LocalizationManager.refresh_locale_globals(). +global.chapter_strength_ratings_en = [ + "", + "Decimated", + "Reduced", + "Reduced", + "Reduced", + "Average", + "Above Average", + "Above Average", + "Considerable", + "Considerable", + "Overwhelming", +]; +global.chapter_cooperation_ratings_en = [ + "", + "Antagonistic", + "Uncooperative", + "Uncooperative", + "Uncooperative", + "Neutral", + "Trusted", + "Trusted", + "Trusted", + "Trusted", + "Exemplary", +]; +global.chapter_geneseed_ratings_en = [ + "", + "Abnormal", + "Horrible", + "Horrible", + "Bad", + "Bad", + "Mediocre", + "Mediocre", + "Good", + "Good", + "Perfect", +]; + +global.chapter_strength_ratings = global.chapter_strength_ratings_en; +global.chapter_cooperation_ratings = global.chapter_cooperation_ratings_en; +global.chapter_geneseed_ratings = global.chapter_geneseed_ratings_en; + global.xenos_factions = [ eFACTION.ELDAR, eFACTION.ORK, diff --git a/scripts/macros/macros.gml b/scripts/macros/macros.gml index 3c58f11563..2bcf6cef9c 100644 --- a/scripts/macros/macros.gml +++ b/scripts/macros/macros.gml @@ -22,6 +22,12 @@ #macro LANG_FILE_DIR "/lang/" #macro LANG_FILE_EXT ".json" +// Field keys of the { text, variables } struct used for keys with {0}, {1} placeholders in +// localize_array()/localize_button_text()/power flavour text. Centralized so the array-entry +// contract stays explicit across LocalizationManager, scr_buttons and scr_powers. +#macro LANG_ENTRY_TEXT "text" +#macro LANG_ENTRY_VARIABLES "variables" + #macro MANAGE_MAN_SEE 34 #macro MANAGE_MAN_MAX array_length(obj_controller.display_unit) + 7 #macro LARGE_PLANET_MOD 1000000000 // Population threshold for large planet classification diff --git a/scripts/scr_ChapterTraits/scr_ChapterTraits.gml b/scripts/scr_ChapterTraits/scr_ChapterTraits.gml index b9e5f37513..dbd0d435fb 100644 --- a/scripts/scr_ChapterTraits/scr_ChapterTraits.gml +++ b/scripts/scr_ChapterTraits/scr_ChapterTraits.gml @@ -138,25 +138,27 @@ function ChapterTrait(trait) constructor { var _line = ""; if (struct_exists(_mod, "int_mod") && _mod.int_mod != 0) { - _line += $" Disposition Gains : {string_plus_minus(_mod.int_mod)}{_mod.int_mod}\n"; + var _int_mod_str = $"{string_plus_minus(_mod.int_mod)}{_mod.int_mod}"; + _line += localize(" Disposition Gains : {0}\n", [_int_mod_str]); } if (struct_exists(_mod, "mult") && _mod.mult != 1) { if (_line != "") { _line += " "; } - _line += $" Disposition Multiplyers x{_mod.mult}\n"; + _line += localize(" Disposition Multiplyers x{0}\n", [_mod.mult]); } if (struct_exists(_mod, "start_disp") && _mod.start_disp != 0) { if (_line != "") { _line += " "; } - _line += $" Disposition Start {string_plus_minus(_mod.start_disp)}{_mod.start_disp}\n"; + var _start_disp_str = $"{string_plus_minus(_mod.start_disp)}{_mod.start_disp}"; + _line += localize(" Disposition Start {0}\n", [_start_disp_str]); } if (_line != "") { - _str += $"Faction {_fac_names[_mod.faction]}:\n{_line}\n"; + _str += localize("Faction {0}:\n{1}\n", [localize(_fac_names[_mod.faction]), _line]); } } } @@ -200,25 +202,25 @@ function ChapterTrait(trait) constructor { } if (suspicion != 0) { - _str += $"Suspicion: {string_plus_minus(suspicion)}{suspicion}\n"; + _str += localize("Suspicion: {0}\n", [string_plus_minus(suspicion) + string(suspicion)]); } if (array_length(character_spawn_increase)) { - _str += $"Increases Character trait spawns : {character_spawn_increase}\n"; + _str += localize("Increases Character trait spawns : {0}\n", [character_spawn_increase]); } if (array_length(character_spawn_decrease)) { - _str += $"Decrease Character trait spawns : {character_spawn_decrease}\n"; + _str += localize("Decrease Character trait spawns : {0}\n", [character_spawn_decrease]); } return _str; }; static main_tool_tip = function() { - return $"{name} ({points})"; + return localize("{0} ({1})", [localize(name), string(points)]); }; static data_tool_tip = function() { - return $"{description} \nCategories: {print_meta()}\n\nEffects:\n{effects_string()}"; + return localize("{0} \nCategories: {1}\n\nEffects:\n{2}", [localize(description), print_meta(), effects_string()]); }; static alter_starting_dispositions = function() { @@ -251,9 +253,13 @@ function ChapterTrait(trait) constructor { static print_meta = function() { if (array_length(meta) == 0) { - return "None"; + return localize("None"); } else { - return string_join_ext(", ", meta); + var _localized = []; + for (var i = 0; i < array_length(meta); i++) { + array_push(_localized, localize(string(meta[i]))); + } + return string_join_ext(", ", _localized); } }; } @@ -517,12 +523,12 @@ function draw_chapter_trait_list(type) { _list = obj_creation.all_disadvantages; } - var _title = type ? "Advantages" : "Disadvantage"; + var _title = type ? localize("Advantages") : localize("Disadvantage"); - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); draw_set_halign(fa_center); - draw_text_transformed(800, 211, $"Select a {_title}", 0.6, 0.6, 0); - draw_set_font(fnt_40k_14b); + draw_text_transformed(800, 211, localize("Select a {0}", [_title]), 0.6, 0.6, 0); + draw_set_font(cjk_font(fnt_40k_14b)); draw_set_halign(fa_left); for (var slot = 0; slot < array_length(_list); slot++) { var _trait = _list[slot]; @@ -539,6 +545,7 @@ function draw_chapter_trait_list(type) { continue; } var _trait_name = _trait.name; + var _trait_display_name = localize(_trait_name); //columns of 14, shift the left boarder across and leave a gap at the top on cols 2 & 3 if (slot >= 15 && slot < 29) { column.x1 = 670; @@ -560,9 +567,9 @@ function draw_chapter_trait_list(type) { var gap = ((slot - 1) % 14) * column.h; - draw_text(column.x1, column.y1 + gap, _trait_name); + draw_text(column.x1, column.y1 + gap, _trait_display_name); - var dis_width = string_width(_trait_name); + var dis_width = string_width(_trait_display_name); var coords = [ column.x1, @@ -577,7 +584,7 @@ function draw_chapter_trait_list(type) { tooltip2 = _trait.data_tool_tip(); draw_set_color(c_white); draw_set_alpha(0.2); - draw_text(column.x1, column.y1 + gap, _trait_name); + draw_text(column.x1, column.y1 + gap, _trait_display_name); //Click on disadvantage if (!disable && mouse_button_clicked()) { @@ -591,7 +598,7 @@ function draw_chapter_trait_list(type) { function draw_selected_chapter_traits(type) { //advatages positive disssadvatages negative type - var _title = type ? "Advantages" : "Disadvantages"; + var _title = type ? localize("Advantages") : localize("Disadvantages"); add_draw_return_values(); @@ -614,9 +621,9 @@ function draw_selected_chapter_traits(type) { var _advantage_click_allow = custom == eCHAPTER_TYPE.CUSTOM; draw_set_halign(fa_left); - draw_set_font(fnt_40k_30b); - draw_text_transformed(_title_x, 564, $"Chapter {_title}", 0.5, 0.5, 0); - draw_set_font(fnt_40k_14); + draw_set_font(cjk_font(fnt_40k_30b)); + draw_text_transformed(_title_x, 564, localize("Chapter {0}", [_title]), 0.5, 0.5, 0); + draw_set_font(cjk_font(fnt_40k_14)); _adv_txt.x2 = _adv_txt.x1 + _adv_txt.w; _adv_txt.y2 = _adv_txt.y1 + _adv_txt.h; @@ -627,7 +634,7 @@ function draw_selected_chapter_traits(type) { var _array = []; if (_adv.activated) { if (_advantages < _max_advantage_count) { - _array = draw_unit_buttons([_adv_txt.x1, _adv_txt.y1 + (_advantages * _adv_txt.h)], $"[-] {_adv.name}", [0.75, 0.75], CM_GREEN_COLOR); + _array = draw_unit_buttons([_adv_txt.x1, _adv_txt.y1 + (_advantages * _adv_txt.h)], localize("[-] {0}", [localize(_adv.name)]), [0.75, 0.75], CM_GREEN_COLOR); _advantages++; } else { _adv.remove(); @@ -640,8 +647,8 @@ function draw_selected_chapter_traits(type) { continue; } - tooltip = $"{_adv.name} ({_adv.points} Points)"; - tooltip2 = _adv.description; + tooltip = _adv.main_tool_tip(); + tooltip2 = localize(_adv.description); if (!_advantage_click_allow || popup != "") { continue; @@ -659,8 +666,8 @@ function draw_selected_chapter_traits(type) { } if (scr_hit(_array)) { if (bool(type) && points >= maxpoints) { - tooltip = "Insufficient Points"; - tooltip2 = "Add disadvantages or decrease Chapter Stats"; + tooltip = localize("Insufficient Points"); + tooltip2 = localize("Add disadvantages or decrease Chapter Stats"); } } else { continue; diff --git a/scripts/scr_DataSlate/scr_DataSlate.gml b/scripts/scr_DataSlate/scr_DataSlate.gml index 4aa7ff7fb4..4f832ff321 100644 --- a/scripts/scr_DataSlate/scr_DataSlate.gml +++ b/scripts/scr_DataSlate/scr_DataSlate.gml @@ -458,7 +458,7 @@ function ShutterButton() constructor { draw_set_alpha(1); scale = _scale; text = _text; - draw_set_font(fnt_40k_12); + draw_set_font(cjk_font(fnt_40k_12)); draw_set_halign(fa_left); draw_set_color(c_gray); width = Width * scale; @@ -498,7 +498,7 @@ function ShutterButton() constructor { draw_sprite_ext(spr_shutter_button, main_sprite, xx, yy, scale, scale, 0, c_white, 1); if (cover_text != "") { draw_set_valign(fa_top); - draw_set_font(fnt_Embossed_metal); + draw_set_font(cjk_font(fnt_Embossed_metal)); var _cover_scale = 3 * scale; while (string_width(cover_text) * _cover_scale > width - (5 * scale)) { _cover_scale -= 0.1; diff --git a/scripts/scr_buttons/scr_buttons.gml b/scripts/scr_buttons/scr_buttons.gml index 8d26f08039..7d0b660e00 100644 --- a/scripts/scr_buttons/scr_buttons.gml +++ b/scripts/scr_buttons/scr_buttons.gml @@ -49,6 +49,38 @@ function standard_loc_data() { self.h = 0; } +/// @function measure_with_font(_font, _measure_func) +/// @category Draw Helpers +/// @description Runs _measure_func() while _font is the active draw font, then restores the +/// previously active font. Centralises the save/set/measure/restore boilerplate shared by +/// UI constructors that measure text dimensions under a font-swap. +/// @param {real} _font The font to measure under. +/// @param {Function} _measure_func The measurement logic to run while _font is active. +/// @returns {undefined} +function measure_with_font(_font, _measure_func) { + var _prev_font = draw_get_font(); + draw_set_font(_font); + _measure_func(); + draw_set_font(_prev_font); +} + +/// @function localize_button_text(_value) +/// @category Localization +/// @description Shared localization helper for button display text. Accepts either a plain +/// English key or a { text, variables } struct for placeholder-bearing strings. Call it +/// from every button constructor's update() so direct str1/label assignments and future +/// button types cannot silently skip translation. Idempotent: already-localized values +/// (and non-keys) pass through unchanged because translate() falls back to its input. +/// @param {string|Struct} _value Either "English text" or { text: "...", variables: [...] }. +/// @returns {string} +function localize_button_text(_value) { + if (is_struct(_value)) { + var _variables = struct_exists(_value, LANG_ENTRY_VARIABLES) ? _value[$ LANG_ENTRY_VARIABLES] : undefined; + return localize(_value[$ LANG_ENTRY_TEXT], _variables); + } + return localize(_value); +} + /// @function draw_unit_buttons(position, text, size_mod, colour, halign, font, alpha_mult, bg, bg_color) /// @category Draw Helpers /// @description Draws a styled button with text, optional background and hover effects. @@ -66,7 +98,7 @@ function draw_unit_buttons(position, text, size_mod = [1.5, 1.5], colour = c_gra // TODO: fix halign usage add_draw_return_values(); - draw_set_font(font); + draw_set_font(cjk_font(font)); draw_set_halign(_halign); draw_set_valign(fa_middle); @@ -201,8 +233,9 @@ function ReactiveString(text_param, x1_param = 0, y1_param = 0, data = {}) const y1 = y1_param; text = text_param; font = fnt_40k_14; + font_cjk = cjk_font(font); add_draw_return_values(); - draw_set_font(font); + draw_set_font(font_cjk); w = string_width(text); h = string_height(text); pop_draw_return_values(); @@ -220,30 +253,30 @@ function ReactiveString(text_param, x1_param = 0, y1_param = 0, data = {}) const static update = function(data = {}) { move_data_to_current_scope(data); - var temp_font = draw_get_font(); - draw_set_font(font); - if (max_width > -1) { - if (!scale_text) { - w = string_width_ext(text, -1, max_width); - h = string_height_ext(text, -1, max_width); - x2 = x1 + w; - y2 = y1 + h; + font_cjk = cjk_font(font); + measure_with_font(font_cjk, function() { + if (max_width > -1) { + if (!scale_text) { + w = string_width_ext(text, -1, max_width); + h = string_height_ext(text, -1, max_width); + x2 = x1 + w; + y2 = y1 + h; + } else { + w = max_width; + var _scale_edits = calc_text_scale_confines(text, max_width, 0, allow_line_breaks); + scale = _scale_edits.scale; + text = _scale_edits.text; + h = string_height(text) * scale; + x2 = x1 + w; + y2 = y1 + h; + } } else { - w = max_width; - var _scale_edits = calc_text_scale_confines(text, max_width, 0, allow_line_breaks); - scale = _scale_edits.scale; - text = _scale_edits.text; - h = string_height(text) * scale; + w = string_width(text); + h = string_height(text); x2 = x1 + w; y2 = y1 + h; } - } else { - w = string_width(text); - h = string_height(text); - x2 = x1 + w; - y2 = y1 + h; - } - draw_set_font(temp_font); + }); }; update(data); @@ -254,7 +287,7 @@ function ReactiveString(text_param, x1_param = 0, y1_param = 0, data = {}) const static draw = function() { add_draw_return_values(); - draw_set_font(font); + draw_set_font(font_cjk); draw_set_halign(halign); draw_set_valign(valign); draw_set_color(colour); @@ -291,7 +324,7 @@ function ValueShifter(value_text, data = {}) constructor { current_value = 0; shift_value = 1; - draw_set_font(fnt_40k_14b); + draw_set_font(cjk_font(fnt_40k_14b)); var _but_width = string_height("-") + 8; decrease_button = new UnitButtonObject({ @@ -358,18 +391,22 @@ function LabeledIcon(icon_param, text_param, x1_param = 0, y1_param = 0, data = icon = sprite_exists(icon_param) ? icon_param : spr_none; icon_width = sprite_get_width(icon); icon_height = sprite_get_height(icon); + font_cjk = cjk_font(font); + text_width = 0; w = icon_width; h = icon_height; x2 = x1 + w; y2 = y1 + icon_height; - temp_font = draw_get_font(); - draw_set_font(font); - text_width = string_width(text) + 2; - draw_set_font(temp_font); static update = function(data = {}) { move_data_to_current_scope(data); + text = localize_button_text(text); + tooltip = localize_button_text(tooltip); + font_cjk = cjk_font(font); if (text_position == "right") { + measure_with_font(font_cjk, function() { + text_width = string_width(text) + 2; + }); w = icon_width + text_width; h = icon_height; x2 = x1 + w; @@ -390,7 +427,7 @@ function LabeledIcon(icon_param, text_param, x1_param = 0, y1_param = 0, data = static draw = function() { add_draw_return_values(); - draw_set_font(font); + draw_set_font(font_cjk); draw_set_halign(fa_left); draw_set_valign(fa_top); draw_set_color(colour); @@ -500,23 +537,24 @@ function UnitButtonObject(data = {}) constructor { style = "standard"; font = fnt_40k_14b; set_height_width = false; + font_cjk = cjk_font(font); static update_loc = function() { if (label != "") { - var temp_font = draw_get_font(); - draw_set_font(font); - if (!set_width) { - w = string_width(label) + 10; - h = string_height(label) + 4; - } else { - var _text_scale = calc_text_scale_confines(label, w, 10); + font_cjk = cjk_font(font); + measure_with_font(font_cjk, function() { + if (!set_width) { + w = string_width(label) + 10; + h = string_height(label) + 4; + } else { + var _text_scale = calc_text_scale_confines(label, w, 10); - text_scale = _text_scale.scale; + text_scale = _text_scale.scale; - label = _text_scale.text; - } - h = string_height(label) + 4; - draw_set_font(temp_font); + label = _text_scale.text; + } + h = string_height(label) + 4; + }); } x2 = x1 + w; y2 = y1 + h; @@ -526,6 +564,8 @@ function UnitButtonObject(data = {}) constructor { static update = function(data = {}) { move_data_to_current_scope(data); + label = localize_button_text(label); + tooltip = localize_button_text(tooltip); if (struct_exists(data, "label") && !struct_exists(data, "set_width")) { set_width = false; w = 0; @@ -588,7 +628,7 @@ function UnitButtonObject(data = {}) constructor { draw_sprite_ext(spr_pixel_button_right, allow_click, x1 + _widths[0] + _widths[1], y1, height_scale, height_scale, 0, c_white, 1); var _text_position_x = x1 + _widths[0] + 2; _text_position_x += _widths[1] / 2; - draw_set_font(font); + draw_set_font(font_cjk); draw_set_halign(fa_center); draw_set_valign(fa_middle); draw_set_color(color); @@ -768,7 +808,7 @@ function TextBarArea(_x, _y, _max_width = 400, _requires_input = false, data = { draw_set_valign(fa_middle); draw_set_halign(fa_center); draw_set_alpha(1); - draw_set_font(fnt_fancy); + draw_set_font(cjk_font(fnt_fancy)); var _display_string = $"{current_text}"; var _text_w = string_width(_display_string); @@ -799,7 +839,7 @@ function TextBarArea(_x, _y, _max_width = 400, _requires_input = false, data = { } value_allowed = true; - draw_set_font(fnt_fancy); + draw_set_font(cjk_font(fnt_fancy)); if (cooloff > 0) { cooloff--; @@ -934,7 +974,7 @@ function UIDropdown(_options, _width = 180, _on_change = undefined) constructor draw_rectangle_array(_main_rect, true); // Draw Current Selection - draw_set_font(fnt_40k_14b); + draw_set_font(cjk_font(fnt_40k_14b)); draw_set_halign(fa_left); draw_text(_x + 8, _y + 6, options[selected_index].label); @@ -1009,7 +1049,7 @@ function UIDropdown(_options, _width = 180, _on_change = undefined) constructor } draw_set_color(_is_hovering ? c_white : c_gray); - draw_set_font(fnt_40k_12); + draw_set_font(cjk_font(fnt_40k_12)); draw_text(_x + 10, _oy + 4, options[i].label); } @@ -1384,6 +1424,7 @@ function ToggleButton(data = {}) constructor { text_color = c_gray; button_color = c_gray; font = fnt_40k_12; + font_cjk = cjk_font(font); style = "default"; hover_func = undefined; @@ -1392,25 +1433,27 @@ function ToggleButton(data = {}) constructor { static update = function(data = {}) { move_data_to_current_scope(data); - var temp_font = draw_get_font(); - draw_set_font(font); - if (style == "default") { - if (w == 0) { - w = string_width(str1); - w *= 1 + (text_padding * 2); - } - if (h == 0) { - h = string_height(str1); - h *= 1 + (text_padding * 2); + str1 = localize_button_text(str1); + tooltip = localize_button_text(tooltip); + font_cjk = cjk_font(font); + measure_with_font(font_cjk, function() { + if (style == "default") { + if (w == 0) { + w = string_width(str1); + w *= 1 + (text_padding * 2); + } + if (h == 0) { + h = string_height(str1); + h *= 1 + (text_padding * 2); + } + } else if (style == "box") { + var _text_w = string_width(str1) * (1 + (text_padding * 2)); + w = max(32, _text_w) + 12; + h = 32 + 4 + (string_height(str1) * (1 + (text_padding * 2))); } - } else if (style == "box") { - var _text_w = string_width(str1) * (1 + (text_padding * 2)); - w = max(32, _text_w) + 12; - h = 32 + 4 + (string_height(str1) * (1 + (text_padding * 2))); - } + }); x2 = x1 + w; y2 = y1 + h; - draw_set_font(temp_font); }; update(data); @@ -1434,7 +1477,7 @@ function ToggleButton(data = {}) constructor { self.active = is_active; } add_draw_return_values(); - draw_set_font(font); + draw_set_font(font_cjk); var str1_h = string_height(str1); var _text_padding = w * 0.03; var text_x = x1 + _text_padding; @@ -1530,6 +1573,9 @@ function InteractiveButton(data = {}) constructor { static update = function(data = {}) { move_data_to_current_scope(data); + str1 = localize_button_text(str1); + tooltip = localize_button_text(tooltip); + inactive_tooltip = localize_button_text(inactive_tooltip); if (struct_exists(data, "str1") && !struct_exists(data, "width")) { width = 0; } @@ -1688,7 +1734,7 @@ function MainMenuButton(_sprite = spr_ui_but_1, _sprite_hover = spr_ui_hov_1, _x draw_set_color(c_white); draw_set_halign(fa_center); draw_set_valign(fa_top); - draw_set_font(fnt_cul_14); + draw_set_font(cjk_font(fnt_cul_14)); var _text_x = _x + (_final_w / 2); var _text_y = _y + (4 * _y_scale); diff --git a/scripts/scr_chapter_managent_events/scr_chapter_managent_events.gml b/scripts/scr_chapter_managent_events/scr_chapter_managent_events.gml index ae84f28819..d4d686600e 100644 --- a/scripts/scr_chapter_managent_events/scr_chapter_managent_events.gml +++ b/scripts/scr_chapter_managent_events/scr_chapter_managent_events.gml @@ -86,12 +86,12 @@ function tech_uprising_event_aftermath() { } } if (press == 0) { - text = "With neither faction receiving your favor it is not long until the BloodLetting begins. Within a month a brutal civil war engulfs the Tech ranks with losses suffered on both sides"; + text = localize("With neither faction receiving your favor it is not long until the BloodLetting begins. Within a month a brutal civil war engulfs the Tech ranks with losses suffered on both sides"); } else if (press == 1) { - text = "With your full support the so called 'heretics' who have seen through the lies of the bureaucracy of Mars eliminate those who will not be swayed to see the truth."; + text = localize("With your full support the so called 'heretics' who have seen through the lies of the bureaucracy of Mars eliminate those who will not be swayed to see the truth."); obj_controller.tech_status = "heretics"; } else if (press == 2) { - text = "The extremists and heretics that have been allowed to grow like a cancer in the Armentarium are rooted out and disposed of."; + text = localize("The extremists and heretics that have been allowed to grow like a cancer in the Armentarium are rooted out and disposed of."); } reset_popup_options(); press = 0; @@ -102,21 +102,21 @@ function tech_uprising_event() { var _pop_data = {}; var _options = [ { - str1: "Do Nothing", + str1: localize("Do Nothing"), choice_func: tech_uprising_event_aftermath, }, { - str1: "Support the heretics", + str1: localize("Support the heretics"), choice_func: tech_uprising_event_aftermath, }, { - str1: "Support the Cult mechanicus faithfuls", + str1: localize("Support the Cult mechanicus faithfuls"), choice_func: tech_uprising_event_aftermath, }, ]; _pop_data.options = _options; - scr_popup("Technical Differences!", "You Recive an Urgent Transmision A serious breakdown in culture has coccured causing believers in tech heresy to demand that they are given preseidence and assurance to continue their practises", "tech_uprising", _pop_data); + scr_popup(localize("Technical Differences!"), localize("You Recive an Urgent Transmision A serious breakdown in culture has coccured causing believers in tech heresy to demand that they are given preseidence and assurance to continue their practises"), "tech_uprising", _pop_data); } function setup_new_forge_master_popup(techs) { @@ -151,7 +151,7 @@ function setup_new_forge_master_popup(techs) { } var _options = [ { - str1: "Popular Pick", + str1: localize("Popular Pick"), choice_func: function() { new_forge_master_chosen(pop_data.charisma_pick); }, @@ -160,7 +160,7 @@ function setup_new_forge_master_popup(techs) { }, }, { - str1: "Experience Pick", + str1: localize("Experience Pick"), choice_func: function() { new_forge_master_chosen(pop_data.experience_pick); }, @@ -169,7 +169,7 @@ function setup_new_forge_master_popup(techs) { }, }, { - str1: "Talent Pick", + str1: localize("Talent Pick"), choice_func: function() { new_forge_master_chosen(pop_data.talent_pick); }, @@ -179,7 +179,7 @@ function setup_new_forge_master_popup(techs) { }, ]; _pop_data.options = _options; - scr_popup("New Forge Master", $"The Demise of Forge Master {last_master} means a replacement must be chosen. Several Options have already been put forward to you but it is ultimatly your decision.", "new_forge_master", _pop_data); + scr_popup(localize("New Forge Master"), localize("The Demise of Forge Master {0} means a replacement must be chosen. Several Options have already been put forward to you but it is ultimatly your decision.", [localize(last_master)]), "new_forge_master", _pop_data); } /// @self Asset.GMObject.obj_popup @@ -233,42 +233,42 @@ function new_forge_master_chosen(pick) { var likability = ""; if (dislike <= 5) { - likability = "He is generally well liked"; + likability = localize("He is generally well liked"); } if (dislike > 5) { - likability = "He is not generally well liked"; + likability = localize("He is not generally well liked"); } if (dislike > 10) { - likability = "He mostly disliked"; + likability = localize("He mostly disliked"); } if (dislike == 0) { - likability = "He is like by all of his tech brothers"; + likability = localize("He is like by all of his tech brothers"); } - text = $"{pick.name()} is selected as the new {pick.role()} {likability}."; + text = localize("{0} is selected as the new {1} {2}.", [localize(pick.name()), localize(pick.role()), likability]); if (skill_lack > 0 && skill_lack < 6) { - text += "There are some questions about his ability."; + text += localize("There are some questions about his ability."); } else if (skill_lack > 6) { - text += "Many Question his Technical Talents."; + text += localize("Many Question his Technical Talents."); } if (exp_lack > 0 && exp_lack < 6) { - text += "A few have raised questions over his experience."; + text += localize("A few have raised questions over his experience."); } else if (exp_lack >= 6) { - text += "There have been Many concerns over his experience."; + text += localize("There have been Many concerns over his experience."); } if (popularity_lack > 1 && popularity_lack < 6) { - text += "He is not unanimously liked."; + text += localize("He is not unanimously liked."); } else if (popularity_lack >= 6) { - text += "He is disliked by many."; + text += localize("He is disliked by many."); } var lacks = skill_lack + exp_lack + popularity_lack; if (lacks < ((array_length(techs) - 1) / 10)) { - text += "Your choice Is almost unanimously respected"; + text += localize("Your choice Is almost unanimously respected"); } else if (lacks < ((array_length(techs) - 1) / 4)) { - text += "While a few may have preferred another there are no serious concerns"; + text += localize("While a few may have preferred another there are no serious concerns"); } else if (lacks < ((array_length(techs) - 1) / 2)) { - text += "Your supporters are more than our detractors but many are unhappy"; + text += localize("Your supporters are more than our detractors but many are unhappy"); } else if (lacks < ((array_length(techs) - 1) * 0.65)) { - text += "Most are unhappy with the decision but your word is final"; + text += localize("Most are unhappy with the decision but your word is final"); } reset_popup_options(); if (pick.company > 0) { diff --git a/scripts/scr_chapter_new/scr_chapter_new.gml b/scripts/scr_chapter_new/scr_chapter_new.gml index 54ea349d1e..5be8998a12 100644 --- a/scripts/scr_chapter_new/scr_chapter_new.gml +++ b/scripts/scr_chapter_new/scr_chapter_new.gml @@ -224,9 +224,9 @@ function scr_chapter_new(chapter_identifier) { var chapter_obj = new ChapterData(); var successfully_loaded = chapter_obj.load_from_json(chapter_id); if (!successfully_loaded) { - var issue = $"No json file exists for chapter id {chapter_id} and name {chapter_identifier}"; + var issue = localize("No json file exists for chapter id {0} and name {1}", [string(chapter_id), chapter_identifier]); // LOGGER.error(issue); - scr_popup("Error Loading Chapter", issue, "debug"); + scr_popup(localize("Error Loading Chapter"), issue, "debug"); return false; } @@ -241,9 +241,9 @@ function scr_chapter_new(chapter_identifier) { var chapter_obj = new ChapterData(); var successfully_loaded = chapter_obj.load_from_json(chapter_identifier, true); if (!successfully_loaded) { - var issue = $"No json file exists for chapter id {chapter_identifier} and name {chapter_identifier}"; + var issue = localize("No json file exists for chapter id {0} and name {1}", [string(chapter_identifier), chapter_identifier]); LOGGER.error(issue); - scr_popup("Error Loading Chapter", issue, "debug"); + scr_popup(localize("Error Loading Chapter"), issue, "debug"); return false; } global.chapter_creation_object = chapter_obj; diff --git a/scripts/scr_company_struct/scr_company_struct.gml b/scripts/scr_company_struct/scr_company_struct.gml index 5ce7b9ddd0..a2b3b899c3 100644 --- a/scripts/scr_company_struct/scr_company_struct.gml +++ b/scripts/scr_company_struct/scr_company_struct.gml @@ -459,7 +459,7 @@ function CompanyStruct(comp) constructor { static default_member = function() { var _member = company_squads[0].fetch_member(0); if (is_struct(_member)) { - obj_controller.unit_focus = _fetched; + obj_controller.unit_focus = _member; } selected_unit = obj_controller.unit_focus; }; diff --git a/scripts/scr_creation/scr_creation.gml b/scripts/scr_creation/scr_creation.gml index a717bc17bb..ccd6f65be9 100644 --- a/scripts/scr_creation/scr_creation.gml +++ b/scripts/scr_creation/scr_creation.gml @@ -27,8 +27,8 @@ function set_complex_livery_buttons() { x1: 500, y1: 252, style: "pixel", - tooltip: $"Primary Helm Colour\nPrimary helm colour of {_name}", - label: $"Helm Primary : {get_colour_name(_data.helm_primary)}", + tooltip: localize("Primary Helm Colour\nPrimary helm colour of {0}", [localize(_name)]), + label: localize("Helm Primary : {0}", [localize(get_colour_name(_data.helm_primary))]), area: "helm_primary", role_id: _type, alpha: _alpha, @@ -37,8 +37,8 @@ function set_complex_livery_buttons() { x1: 500, y1: 287, style: "pixel", - tooltip: $"Secondary Helm Colour\nSecondary helm colour of {_name}", - label: $"Helm Secondary : {get_colour_name(_data.helm_secondary)}", + tooltip: localize("Secondary Helm Colour\nSecondary helm colour of {0}", [localize(_name)]), + label: localize("Helm Secondary : {0}", [localize(get_colour_name(_data.helm_secondary))]), area: "helm_secondary", role_id: _type, alpha: _alpha, @@ -47,8 +47,8 @@ function set_complex_livery_buttons() { x1: 500, y1: 322, style: "pixel", - tooltip: $"Helm Lens Colour\nHelm lens colour of {_name}", - label: $"Lens : {get_colour_name(_data.helm_lens)}", + tooltip: localize("Helm Lens Colour\nHelm lens colour of {0}", [localize(_name)]), + label: localize("Lens : {0}", [localize(get_colour_name(_data.helm_lens))]), area: "helm_lens", role_id: _type, alpha: _alpha, @@ -69,7 +69,7 @@ function update_creation_roles_radio(start_role = 1) { for (var i = start_role; i < array_length(player_role_data); i++) { var _role_data = player_role_data[i]; if (_role_data.available_to_player && _role_data.role != "") { - array_push(_role_choice_array, {str1: _role_data.role, font: fnt_40k_14b, role_id: i}); + array_push(_role_choice_array, {str1: localize(_role_data.role), font: fnt_40k_14b, role_id: i}); } } @@ -79,7 +79,7 @@ function update_creation_roles_radio(start_role = 1) { y1: 220, y_gap: 1, }; - roles_radio = new RadioSet(_role_choice_array, "Role Settings", _radio_data); + roles_radio = new RadioSet(_role_choice_array, localize("Role Settings"), _radio_data); roles_radio.current_selection = -1; } @@ -87,63 +87,63 @@ function update_creation_roles_radio(start_role = 1) { function bulk_selection_buttons_setup() { var _button_data = [ { - text: $"Primary : {col[main_color]}", - tooltip: "Primary", - tooltip2: "The main color of your Astartes and their vehicles. And the colour of your chapters Ships", + text: localize("Primary : {0}", [localize(col[main_color])]), + tooltip: localize("Primary"), + tooltip2: localize("The main color of your Astartes and their vehicles. And the colour of your chapters Ships"), cords: [ 500, 287, ], }, { - text: $"Secondary: {col[secondary_color]}", - tooltip: "Secondary", - tooltip2: "The secondary color of your Astartes and their vehicles.", + text: localize("Secondary: {0}", [localize(col[secondary_color])]), + tooltip: localize("Secondary"), + tooltip2: localize("The secondary color of your Astartes and their vehicles."), cords: [ 500, 322, ], }, { - text: $"Pauldron 1: {col[left_pauldron]}", - tooltip: "First Pauldron", - tooltip2: "The color of your Astartes' left Pauldron. Normally this Pauldron displays their rank and designation.", + text: localize("Pauldron 1: {0}", [localize(col[left_pauldron])]), + tooltip: localize("First Pauldron"), + tooltip2: localize("The color of your Astartes' left Pauldron. Normally this Pauldron displays their rank and designation."), cords: [ 500, 357, ], }, { - text: $"Pauldron 2: {col[right_pauldron]}", - tooltip: "Second Pauldron", - tooltip2: "The color of your Astartes' right Pauldron. Normally this Pauldron contains the Chapter Insignia.", + text: localize("Pauldron 2: {0}", [localize(col[right_pauldron])]), + tooltip: localize("Second Pauldron"), + tooltip2: localize("The color of your Astartes' right Pauldron. Normally this Pauldron contains the Chapter Insignia."), cords: [ 500, 392, ], }, { - text: $"Trim: {col[main_trim]}", - tooltip: "Trim", - tooltip2: "The trim color that appears on the Pauldrons, armour plating, and any decorations.", + text: localize("Trim: {0}", [localize(col[main_trim])]), + tooltip: localize("Trim"), + tooltip2: localize("The trim color that appears on the Pauldrons, armour plating, and any decorations."), cords: [ 500, 427, ], }, { - text: $"Lens: {col[lens_color]}", - tooltip: "Lens", - tooltip2: "The color of your Astartes' lenses. Most of the time this will be the visor color.", + text: localize("Lens: {0}", [localize(col[lens_color])]), + tooltip: localize("Lens"), + tooltip2: localize("The color of your Astartes' lenses. Most of the time this will be the visor color."), cords: [ 500, 462, ], }, { - text: $"Weapon: {col[weapon_color]}", - tooltip: "Weapon", - tooltip2: "The primary color of your Astartes' weapons.", + text: localize("Weapon: {0}", [localize(col[weapon_color])]), + tooltip: localize("Weapon"), + tooltip2: localize("The primary color of your Astartes' weapons."), cords: [ 500, 497, @@ -151,7 +151,7 @@ function bulk_selection_buttons_setup() { }, ]; bulk_buttons = []; - draw_set_font(fnt_40k_14b); + draw_set_font(cjk_font(fnt_40k_14b)); for (var i = 0; i < array_length(_button_data); i++) { var _but = _button_data[i]; array_push(bulk_buttons, new UnitButtonObject({ @@ -203,31 +203,31 @@ function scr_creation(slide_num) { update_creation_roles_radio(); if (slide_num == eCREATION_SLIDES.CHAPTERHOME) { - draw_set_font(fnt_40k_12); + draw_set_font(cjk_font(fnt_40k_12)); complex_livery_radio = new RadioSet([ { - str1: "Sergeant Markers", + str1: localize("Sergeant Markers"), font: fnt_40k_12, value: "sgt", - display_name: "Sergeant", + display_name: localize("Sergeant"), }, { - str1: "Veteran Sergeant Markers", + str1: localize("Veteran Sergeant Markers"), font: fnt_40k_12, value: "vet_sgt", - display_name: "Veteran Sergeant", + display_name: localize("Veteran Sergeant"), }, { - str1: "Captain Markers", + str1: localize("Captain Markers"), font: fnt_40k_12, value: "captain", - display_name: "Captain", + display_name: localize("Captain"), }, { - str1: "Veteran Markers", + str1: localize("Veteran Markers"), font: fnt_40k_12, value: "veteran", - display_name: "Veteran", + display_name: localize("Veteran"), }, ], "", { max_width: 50, @@ -237,22 +237,22 @@ function scr_creation(slide_num) { bulk_armour_pattern = new RadioSet([ { - str1: "Single Colour", + str1: localize("Single Colour"), font: fnt_40k_12, style: "box", }, { - str1: "Breastplate", + str1: localize("Breastplate"), font: fnt_40k_12, style: "box", }, { - str1: "Vertical", + str1: localize("Vertical"), font: fnt_40k_12, style: "box", }, { - str1: "Quadrant", + str1: localize("Quadrant"), font: fnt_40k_12, style: "box", }, @@ -264,22 +264,22 @@ function scr_creation(slide_num) { advanced_helmet_livery = new RadioSet([ { - str1: "Single Colour", + str1: localize("Single Colour"), font: fnt_40k_12, style: "box", }, { - str1: "Stripe", + str1: localize("Stripe"), font: fnt_40k_12, style: "box", }, { - str1: "Muzzle", + str1: localize("Muzzle"), font: fnt_40k_12, style: "box", }, { - str1: "Pattern", + str1: localize("Pattern"), font: fnt_40k_12, style: "box", }, @@ -291,23 +291,23 @@ function scr_creation(slide_num) { set_complex_livery_buttons(); - draw_set_font(fnt_40k_14b); + draw_set_font(cjk_font(fnt_40k_14b)); bulk_selection_buttons_setup(); livery_selection_options = new RadioSet( [ { - str1: "Default", - tooltip: "The default livery all marines will be coloured in", + str1: localize("Default"), + tooltip: localize("The default livery all marines will be coloured in"), font: fnt_menu, }, { - str1: "Role", - tooltip: "Role specific livery that will overide default livery", + str1: localize("Role"), + tooltip: localize("Role specific livery that will overide default livery"), font: fnt_menu, }, { - str1: "Company", - tooltip: "company specific livery that will overide role livery", + str1: localize("Company"), + tooltip: localize("company specific livery that will overide role livery"), font: fnt_menu, }, ], @@ -315,18 +315,18 @@ function scr_creation(slide_num) { colour_selection_options = new RadioSet( [ { - str1: "Standard", - tooltip: "standard options to colour marine", + str1: localize("Standard"), + tooltip: localize("standard options to colour marine"), font: fnt_menu, }, { - str1: "Bulk", - tooltip: "bulk colouring for ease and speed", + str1: localize("Bulk"), + tooltip: localize("bulk colouring for ease and speed"), font: fnt_menu, }, { - str1: "Advanced", - tooltip: "Advanced options for colouring", + str1: localize("Advanced"), + tooltip: localize("Advanced options for colouring"), font: fnt_menu, }, ], diff --git a/scripts/scr_creation_draw_slides/scr_creation_draw_slides.gml b/scripts/scr_creation_draw_slides/scr_creation_draw_slides.gml index ce82dac38e..88ced79482 100644 --- a/scripts/scr_creation_draw_slides/scr_creation_draw_slides.gml +++ b/scripts/scr_creation_draw_slides/scr_creation_draw_slides.gml @@ -11,17 +11,17 @@ enum eCREATION_SLIDES { /// @self Asset.GMObject.obj_creation function draw_chapter_select() { draw_set_color(CM_GREEN_COLOR); - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); draw_set_halign(fa_center); - draw_text(800, 80, "Select Chapter"); + draw_text(800, 80, localize("Select Chapter")); - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); draw_set_halign(fa_left); - draw_text_transformed(440, founding_y, "Founding Chapters", 0.75, 0.75, 0); - draw_text_transformed(440, successor_y, "Existing Chapters", 0.75, 0.75, 0); - draw_text_transformed(440, custom_y, "Custom Chapters", 0.75, 0.75, 0); - draw_text_transformed(440, other_y, "Other", 0.75, 0.75, 0); + draw_text_transformed(440, founding_y, localize("Founding Chapters"), 0.75, 0.75, 0); + draw_text_transformed(440, successor_y, localize("Existing Chapters"), 0.75, 0.75, 0); + draw_text_transformed(440, custom_y, localize("Custom Chapters"), 0.75, 0.75, 0); + draw_text_transformed(440, other_y, localize("Other"), 0.75, 0.75, 0); /// @localvar grid object to keep track of where to draw icon boxes var grid = { @@ -352,23 +352,23 @@ function draw_chapter_select() { if (highlight <= array_length(all_chapters)) { var chap = all_chapters[highlight]; - tooltip = chap.name; + tooltip = localize(chap.name); if (chap.progenitor != 0 && chap.progenitor < 10) { - tooltip += " - Progenitor: " + all_chapters[chap.progenitor].name; + tooltip += " - " + localize("Progenitor: {0}", [localize(all_chapters[chap.progenitor].name)]); } - tooltip2 = chap.tooltip; + tooltip2 = localize(chap.tooltip); } if (highlight == 1001) { - tooltip = "Custom"; + tooltip = localize("Custom"); } if (highlight == 1002) { - tooltip = "Randomize"; + tooltip = localize("Randomize"); } if (highlight == 1001) { - tooltip2 = "Create your own customized Chapter, deciding the origins, strength, and weaknesses. Custom Chapters are weaker than Founding Chapters."; + tooltip2 = localize("Create your own customized Chapter, deciding the origins, strength, and weaknesses. Custom Chapters are weaker than Founding Chapters."); } if (highlight == 1002) { - tooltip2 = "Randomly generate a Chapter to play. The origins, strength, and weaknesses are all random. Random Chapters are normally weaker than Founding Chapters. "; + tooltip2 = localize("Randomly generate a Chapter to play. The origins, strength, and weaknesses are all random. Random Chapters are normally weaker than Founding Chapters. "); } } } @@ -377,21 +377,21 @@ function draw_chapter_select() { function setup_chapter_trait_select() { chapter_type_radio = new RadioSet([ { - str1: "Homeworld", + str1: localize("Homeworld"), font: fnt_40k_14b, - tooltip: "Homeworld\nYour Chapter has a homeworld that they base on. Contained upon it is a massive Fortress Monastery, which provides high levels of defense and automated weapons.", + tooltip: localize("Homeworld\nYour Chapter has a homeworld that they base on. Contained upon it is a massive Fortress Monastery, which provides high levels of defense and automated weapons."), }, { - str1: "Fleet Based", + str1: localize("Fleet Based"), font: fnt_40k_14b, - tooltip: "Fleet Based\nRather than a homeworld, your Chapter begins near their recruiting world. The fleet includes a Battle Barge, which serves as a mobile base, and powerful ship.", + tooltip: localize("Fleet Based\nRather than a homeworld, your Chapter begins near their recruiting world. The fleet includes a Battle Barge, which serves as a mobile base, and powerful ship."), }, { - str1: "Penitent", + str1: localize("Penitent"), font: fnt_40k_14b, - tooltip: "Penitent\nAs with Fleet Based, but you must crusade and fight until your penitence meter runs out. Note that recruiting is disabled until then.", + tooltip: localize("Penitent\nAs with Fleet Based, but you must crusade and fight until your penitence meter runs out. Note that recruiting is disabled until then."), }, - ], "Chapter Type", { + ], localize("Chapter Type"), { x1: 445, y1: 211, max_width: 1125 - 445, @@ -403,7 +403,7 @@ function setup_chapter_trait_select() { /// @self Asset.GMObject.obj_creation function draw_chapter_trait_select() { draw_set_color(CM_GREEN_COLOR); - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); draw_set_halign(fa_center); obj_cursor.image_index = 0; @@ -437,7 +437,7 @@ function draw_chapter_trait_select() { } draw_set_color(CM_GREEN_COLOR); - draw_text_transformed(800, 120, string_hash_to_newline("Points: " + string(points) + "/" + string(maxpoints)), 0.6, 0.6, 0); + draw_text_transformed(800, 120, string_hash_to_newline(localize("Points: {0}/{1}", [points, maxpoints])), 0.6, 0.6, 0); obj_cursor.image_index = 0; if ((custom != eCHAPTER_TYPE.PREMADE) && (restarted == 0)) { @@ -467,52 +467,13 @@ function draw_chapter_trait_select() { draw_line(445, 291, 1125, 291); draw_set_halign(fa_center); - draw_text_transformed(800, 301, "Chapter Stats", 0.6, 0.6, 0); + draw_text_transformed(800, 301, localize("Chapter Stats"), 0.6, 0.6, 0); draw_set_halign(fa_left); - var _strength_ratings = [ - "", - "Decimated", - "Reduced", - "Reduced", - "Reduced", - "Average", - "Above Average", - "Above Average", - "Considerable", - "Considerable", - "Overwhelming", - ]; - var _cooperation_ratings = [ - "", - "Antagonistic", - "Uncooperative", - "Uncooperative", - "Uncooperative", - "Neutral", - "Trusted", - "Trusted", - "Trusted", - "Trusted", - "Exemplary", - ]; - var _geneseed_ratings = [ - "", - "Abnormal", - "Horrible", - "Horrible", - "Bad", - "Bad", - "Mediocre", - "Mediocre", - "Good", - "Good", - "Perfect", - ]; - draw_text_transformed(505, 332, $"Strength: {_strength_ratings[strength]} ({strength})", 0.5, 0.5, 0); - draw_text_transformed(505, 387, $"Cooperation: {_cooperation_ratings[cooperation]} ({cooperation})", 0.5, 0.5, 0); - draw_text_transformed(505, 442, $"Gene-Seed Purity: {_geneseed_ratings[purity]} ({purity})", 0.5, 0.5, 0); - draw_text_transformed(505, 497, $"Gene-Seed Stability: ({stability}%)", 0.5, 0.5, 0); + draw_text_transformed(505, 332, localize("Strength: {0} ({1})", [global.chapter_strength_ratings[strength], string(strength)]), 0.5, 0.5, 0); + draw_text_transformed(505, 387, localize("Cooperation: {0} ({1})", [global.chapter_cooperation_ratings[cooperation], string(cooperation)]), 0.5, 0.5, 0); + draw_text_transformed(505, 442, localize("Gene-Seed Purity: {0} ({1})", [global.chapter_geneseed_ratings[purity], string(purity)]), 0.5, 0.5, 0); + draw_text_transformed(505, 497, localize("Gene-Seed Stability: ({0}%)", [string(stability)]), 0.5, 0.5, 0); var arrow_buttons_controls = [ strength, @@ -544,8 +505,8 @@ function draw_chapter_trait_select() { draw_sprite_stretched(spr_arrow, 0, 436, 325 + (i * 55), 32, 32); if (scr_hit(436, 325 + (i * 55), 436 + sprite_get_width(spr_arrow), 357 + (i * 55))) { obj_cursor.image_index = 1; - tooltip = "Decrease"; - tooltip2 = "(Hold Ctrl to decrease by 10)"; + tooltip = localize("Decrease"); + tooltip2 = localize("(Hold Ctrl to decrease by 10)"); if (mouse_button_clicked() && (arrow_buttons_controls[i] - click_change) >= scores_min[i]) { arrow_buttons_controls[i] -= click_change; points -= score_costs[i] * click_change; @@ -554,8 +515,8 @@ function draw_chapter_trait_select() { draw_sprite_stretched(spr_arrow, 1, 470, 325 + (i * 55), 32, 32); if (scr_hit(470, 325 + (i * 55), 470 + sprite_get_width(spr_arrow), 357 + (i * 55))) { obj_cursor.image_index = 1; - tooltip = "Increase"; - tooltip2 = "(Hold Ctrl to increase by 10)"; + tooltip = localize("Increase"); + tooltip2 = localize("(Hold Ctrl to increase by 10)"); if (mouse_button_clicked() && (arrow_buttons_controls[i] + click_change) <= scores_max[i] && (points + (score_costs[i] * click_change) <= maxpoints)) { arrow_buttons_controls[i] += click_change; points += score_costs[i] * click_change; @@ -570,20 +531,20 @@ function draw_chapter_trait_select() { stability = arrow_buttons_controls[3]; if (scr_hit(505, 325, 800, 357)) { - tooltip = "Strength"; - tooltip2 = "How many Space Marines your Chapter has. \nFor every score below five a company will be removed; conversely, each score higher grants 50 additional Astartes."; + tooltip = localize("Strength"); + tooltip2 = localize("How many Space Marines your Chapter has. \nFor every score below five a company will be removed; conversely, each score higher grants 50 additional Astartes."); } if (scr_hit(505, 380, 800, 412)) { - tooltip = "Cooperation"; - tooltip2 = "How diplomatic your Chapter is. \nA low score will lower starting dispositions of Imperial factions and make disposition increases less likely to occur."; + tooltip = localize("Cooperation"); + tooltip2 = localize("How diplomatic your Chapter is. \nA low score will lower starting dispositions of Imperial factions and make disposition increases less likely to occur."); } if (scr_hit(505, 435, 800, 467)) { - tooltip = "Gene-Seed Purity"; - tooltip2 = "How many inherent mutations your gene-seed has. \nEach score below ten requires one mutation to be chosen."; + tooltip = localize("Gene-Seed Purity"); + tooltip2 = localize("How many inherent mutations your gene-seed has. \nEach score below ten requires one mutation to be chosen."); } if (scr_hit(505, 490, 800, 522)) { - tooltip = "Gene-Seed Stability"; - tooltip2 = "How easily new mutations and corruption can occur with your Chapter's gene-seed. \nAffects the amount of random mutations your existing Space Marines have, and the amount new Aspirants get after the implantation is finished."; + tooltip = localize("Gene-Seed Stability"); + tooltip2 = localize("How easily new mutations and corruption can occur with your Chapter's gene-seed. \nAffects the amount of random mutations your existing Space Marines have, and the amount new Aspirants get after the implantation is finished."); } } @@ -601,12 +562,12 @@ function draw_chapter_trait_select() { draw_set_alpha(1); if (scr_hit(436, 564, 631, 583)) { - tooltip = "Chapter Advantages"; - tooltip2 = "Advantages cost points, and improve the performance of your Chapter in a specific domain. You can only have one trait of the same category, shown in brackets."; + tooltip = localize("Chapter Advantages"); + tooltip2 = localize("Advantages cost points, and improve the performance of your Chapter in a specific domain. You can only have one trait of the same category, shown in brackets."); } if (scr_hit(810, 564, 1030, 583)) { - tooltip = "Chapter Disadvantages"; - tooltip2 = "Disadvantages grant additional points, and penalize the performance of your Chapter. You can only have one trait of the same category, shown in brackets."; + tooltip = localize("Chapter Disadvantages"); + tooltip2 = localize("Disadvantages grant additional points, and penalize the performance of your Chapter. You can only have one trait of the same category, shown in brackets."); } } else if (popup == "icons") { draw_set_alpha(1); @@ -618,18 +579,18 @@ function draw_chapter_trait_select() { draw_line(445, 728, 1125, 728); draw_line(445, 729, 1125, 729); - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); draw_set_halign(fa_center); - draw_text_transformed(800, 211, "Select an Icon", 0.6, 0.6, 0); - draw_text_transformed(800, 687, "Cancel", 0.6, 0.6, 0); + draw_text_transformed(800, 211, localize("Select an Icon"), 0.6, 0.6, 0); + draw_text_transformed(800, 687, localize("Cancel"), 0.6, 0.6, 0); - var cw = string_width("Cancel") * 0.6; - var ch = string_height("Cancel") * 0.6; + var cw = string_width(localize("Cancel")) * 0.6; + var ch = string_height(localize("Cancel")) * 0.6; if (scr_hit(800, 687, 800 + cw, 687 + ch)) { draw_set_color(c_white); draw_set_alpha(0.25); - draw_text_transformed(800, 687, "Cancel", 0.6, 0.6, 0); + draw_text_transformed(800, 687, localize("Cancel"), 0.6, 0.6, 0); draw_set_color(CM_GREEN_COLOR); draw_set_alpha(1); @@ -638,7 +599,7 @@ function draw_chapter_trait_select() { } } - draw_set_font(fnt_40k_14b); + draw_set_font(cjk_font(fnt_40k_14b)); draw_set_halign(fa_left); var icons_per_row = 6; // how many icons per row @@ -704,7 +665,7 @@ function draw_chapter_trait_select() { /// @self Asset.GMObject.obj_creation function draw_chapter_homeworld_select() { draw_set_color(CM_GREEN_COLOR); - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); draw_set_halign(fa_center); tooltip = ""; @@ -720,19 +681,24 @@ function draw_chapter_homeworld_select() { left_data_slate.inside_method = function() { if (!buttons.complex_homeworld.active) { var trial_data = scr_trial_data(); - draw_text_transformed(160, 90, "Aspirant Trial", 0.6, 0.6, 0); + var _trial_label = localize("Aspirant Trial"); + draw_text_transformed(160, 90, _trial_label, 0.6, 0.6, 0); if (custom == eCHAPTER_TYPE.CUSTOM) { - draw_sprite_stretched(spr_creation_arrow, 0, 40, 90, 32, 32); - if (point_and_click([40, 90, 40 + 32, 90 + 32])) { + var _trial_label_w = string_width(_trial_label) * 0.6; + var _arrow_size = 32; + var _side_gap = 10; + var _left_x = 160 - (_trial_label_w / 2) - _side_gap - _arrow_size; + var _right_x = 160 + (_trial_label_w / 2) + _side_gap; + draw_sprite_stretched(spr_creation_arrow, 0, _left_x, 90, _arrow_size, _arrow_size); + if (point_and_click([_left_x, 90, _left_x + _arrow_size, 90 + _arrow_size])) { aspirant_trial++; if (aspirant_trial >= array_length(trial_data)) { aspirant_trial = 0; } } - var _right_x = 72 + string_length("Aspirant Trial") + 10; - draw_sprite_stretched(spr_creation_arrow, 1, _right_x, 90, 32, 32); - if (point_and_click([_right_x, 90, _right_x + 32, 90 + 32])) { + draw_sprite_stretched(spr_creation_arrow, 1, _right_x, 90, _arrow_size, _arrow_size); + if (point_and_click([_right_x, 90, _right_x + _arrow_size, 90 + _arrow_size])) { aspirant_trial--; if (aspirant_trial < 0) { aspirant_trial = array_length(trial_data) - 1; @@ -751,11 +717,11 @@ function draw_chapter_homeworld_select() { draw_text_ext_transformed(160, 150, asp_info, -1, left_data_slate.width - 20, 0.4, 0.4, 0); if (scr_hit(50, 480, 950, 510)) { - tooltip = "Aspirant Trial"; - tooltip2 = "A special challenge is needed for Aspirants to be judged worthy of becoming Astartes. After completing the Trial they then become a Neophyte, beginning implantation and training. (This can be changed once in game, but the chosen trial here will affect the spawn characteristics of your starting Space Marines)."; + tooltip = localize("Aspirant Trial"); + tooltip2 = localize("A special challenge is needed for Aspirants to be judged worthy of becoming Astartes. After completing the Trial they then become a Neophyte, beginning implantation and training. (This can be changed once in game, but the chosen trial here will affect the spawn characteristics of your starting Space Marines)."); } } else { - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); var _spawn_radio = buttons.home_spawn_loc_options; var _max_width = left_data_slate.width - 100; _spawn_radio.update({x1: 70, y1: 60, max_width: _max_width, allow_changes: custom}); diff --git a/scripts/scr_creation_home_planet_create/scr_creation_home_planet_create.gml b/scripts/scr_creation_home_planet_create/scr_creation_home_planet_create.gml index f013d9e1ab..05d86042c7 100644 --- a/scripts/scr_creation_home_planet_create/scr_creation_home_planet_create.gml +++ b/scripts/scr_creation_home_planet_create/scr_creation_home_planet_create.gml @@ -3,7 +3,7 @@ function player_recruit_planet_selection() { add_draw_return_values(); with (obj_creation) { draw_set_color(CM_GREEN_COLOR); - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); draw_set_halign(fa_center); if ((fleet_type != 1) || (custom != eCHAPTER_TYPE.CUSTOM)) { draw_set_alpha(0.5); @@ -29,7 +29,7 @@ function player_recruit_planet_selection() { scr_image("ui/planet", _cur_planet_index2, 1313, 244, 128, 128); - draw_text_transformed(1377, 378, recruiting, 0.5, 0.5, 0); + draw_text_transformed(1377, 378, localize(recruiting), 0.5, 0.5, 0); if (_recruit_world_type < 2) { recruiting_name = homeworld_name; @@ -104,7 +104,7 @@ function scr_creation_game_play_date() { function scr_creation_home_planet_create() { add_draw_return_values(); - var fleet_type_text = fleet_type == ePLAYER_BASE.HOME_WORLD ? "Homeworld" : "Flagship"; + var fleet_type_text = fleet_type == ePLAYER_BASE.HOME_WORLD ? localize("Homeworld") : localize("Flagship"); draw_text_transformed(644, 218, fleet_type_text, 0.6, 0.6, 0); var _cur_planet_index = scr_planet_image_numbers(homeworld); @@ -115,7 +115,7 @@ function scr_creation_home_planet_create() { if (fleet_type == ePLAYER_BASE.HOME_WORLD) { scr_image("ui/planet", _cur_planet_index, 580, 244, 128, 128); - draw_text_transformed(644, 378, homeworld, 0.5, 0.5, 0); + draw_text_transformed(644, 378, localize(homeworld), 0.5, 0.5, 0); if ((text_selected != "home_name") || (custom != eCHAPTER_TYPE.CUSTOM)) { draw_text_transformed(644, 398, homeworld_name, 0.5, 0.5, 0); } @@ -160,12 +160,12 @@ function scr_creation_home_planet_create() { _system_complex.update(); _system_complex.draw(); _system_complex.clicked(); - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); } if (fleet_type != ePLAYER_BASE.HOME_WORLD) { scr_image("ui/planet", _cur_planet_index, 580, 244, 128, 128); - draw_text_transformed(644, 378, "Battle Barge", 0.5, 0.5, 0); + draw_text_transformed(644, 378, localize("Battle Barge"), 0.5, 0.5, 0); if ((text_selected != "flagship_name") || (custom == eCHAPTER_TYPE.PREMADE)) { draw_text_transformed(644, 398, flagship_name, 0.5, 0.5, 0); } @@ -218,23 +218,23 @@ function scr_creation_home_planet_create() { scr_image("ui/planet", _cur_planet_index, 913, 244, 128, 128); draw_set_alpha(0.5); - draw_text_transformed(977, 378, homeworld, 0.5, 0.5, 0); + draw_text_transformed(977, 378, localize(homeworld), 0.5, 0.5, 0); draw_text_transformed(977, 398, homeworld_name, 0.5, 0.5, 0); draw_set_alpha(1); } if (scr_hit(575, 216, 710, 242)) { if (fleet_type != ePLAYER_BASE.HOME_WORLD) { - tooltip = "Battle Barge"; - tooltip2 = "The name of your Flagship Battle Barge."; + tooltip = localize("Battle Barge"); + tooltip2 = localize("The name of your Flagship Battle Barge."); } else if (fleet_type == ePLAYER_BASE.HOME_WORLD) { - tooltip = "Homeworld"; - tooltip2 = "The world that your Chapter's Fortress Monastery is located upon. More civilized worlds are more easily defensible but the citizens may pose a risk or be a nuisance."; + tooltip = localize("Homeworld"); + tooltip2 = localize("The world that your Chapter's Fortress Monastery is located upon. More civilized worlds are more easily defensible but the citizens may pose a risk or be a nuisance."); } } if (scr_hit(895, 216, 1075, 242)) { - tooltip = "Recruiting World"; - tooltip2 = "The world that your Chapter selects recruits from. More harsh worlds provide recruits with more grit and warrior mentality. If you are a homeworld-based Chapter, you may uncheck 'Recruiting World' to recruit from your homeworld instead."; + tooltip = localize("Recruiting World"); + tooltip2 = localize("The world that your Chapter selects recruits from. More harsh worlds provide recruits with more grit and warrior mentality. If you are a homeworld-based Chapter, you may uncheck 'Recruiting World' to recruit from your homeworld instead."); } draw_line(445, 455, 1125, 455); @@ -250,22 +250,22 @@ function scr_creation_home_planet_create() { } var _homeworld_types = [ { - name: "Planetary Governer", - tooltip: "Planetary Governer", - tooltip2: "Your Chapter's homeworld is ruled by a single Planetary Governer, who does with the planet mostly as they see fit. While heavily influenced by your Astartes the planet is sovereign.", + name: localize("Planetary Governer"), + tooltip: localize("Planetary Governer"), + tooltip2: localize("Your Chapter's homeworld is ruled by a single Planetary Governer, who does with the planet mostly as they see fit. While heavily influenced by your Astartes the planet is sovereign."), }, { - name: "Passive Supervision", - tooltip: "Passive Supervision", - tooltip2: "Instead of a Planetary Governer the planet is broken up into many countries or clans. The people are less united but happier, and see your illusive Astartes as semi-divine beings.", + name: localize("Passive Supervision"), + tooltip: localize("Passive Supervision"), + tooltip2: localize("Instead of a Planetary Governer the planet is broken up into many countries or clans. The people are less united but happier, and see your illusive Astartes as semi-divine beings."), }, { - name: "Personal Rule", - tooltip: "Personal Rule", - tooltip2: "You personally take the rule of the Planetary Governer, ruling over your homeworld with an iron fist. Your every word and directive, be they good or bad, are absolute law.", + name: localize("Personal Rule"), + tooltip: localize("Personal Rule"), + tooltip2: localize("You personally take the rule of the Planetary Governer, ruling over your homeworld with an iron fist. Your every word and directive, be they good or bad, are absolute law."), }, ]; - draw_text_transformed(445, 480, "Homeworld Rule", 0.6, 0.6, 0); + draw_text_transformed(445, 480, localize("Homeworld Rule"), 0.6, 0.6, 0); var _coords = [ 445, diff --git a/scripts/scr_livery_setup/scr_livery_setup.gml b/scripts/scr_livery_setup/scr_livery_setup.gml index 27c07da081..856b563e46 100644 --- a/scripts/scr_livery_setup/scr_livery_setup.gml +++ b/scripts/scr_livery_setup/scr_livery_setup.gml @@ -1,7 +1,7 @@ /// @self Asset.GMObject.obj_creation function scr_livery_setup() { add_draw_return_values(); - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); draw_set_halign(fa_center); draw_set_alpha(1); draw_set_color(CM_GREEN_COLOR); @@ -28,12 +28,12 @@ function scr_livery_setup() { draw_set_halign(fa_left); draw_text_transformed(580, 118, "Battle Cry:", 0.6, 0.6, 0); - draw_set_font(fnt_40k_14b); + draw_set_font(cjk_font(fnt_40k_14b)); battle_cry = text_bars.battle_cry.draw(battle_cry); draw_rectangle(445, 200, 1125, 202, 0); - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); if (colour_selection_options.current_selection == 0) { var _col_areas = livery_picker.colours_radio; @@ -96,7 +96,7 @@ function scr_livery_setup() { } draw_rectangle(844, 204, 846, 740, 0); - draw_set_font(fnt_40k_14b); + draw_set_font(cjk_font(fnt_40k_14b)); draw_set_halign(fa_left); var spacing = 30; var xxx = 862; @@ -140,7 +140,7 @@ function scr_livery_setup() { } } - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); draw_set_halign(fa_center); if (_livery_type != 2) { var liv_string = $"Full Livery \n{livery_picker.role_set == 0 ? "default" : player_role_data[livery_picker.role_set].role}"; @@ -149,7 +149,7 @@ function scr_livery_setup() { draw_text(160, 100, "Company Livery"); } - draw_set_font(fnt_40k_14b); + draw_set_font(cjk_font(fnt_40k_14b)); draw_set_halign(fa_left); right_data_slate.inside_method = function() { var _cultures = buttons.culture_styles; diff --git a/scripts/scr_powers/scr_powers.gml b/scripts/scr_powers/scr_powers.gml index 9b873feadd..0d6fb4e5f9 100644 --- a/scripts/scr_powers/scr_powers.gml +++ b/scripts/scr_powers/scr_powers.gml @@ -441,10 +441,10 @@ function get_flavour_text(_flavour_text_data) { var _conditions_satisfied = power_conditions_check(_text_option[$ "conditions"]); if (_conditions_satisfied) { - _flavour_text = array_concat(_flavour_text, _text_option[$ "text"]); + _flavour_text = array_concat(_flavour_text, _text_option[$ LANG_ENTRY_TEXT]); } } else { - _flavour_text = array_concat(_flavour_text, _text_option[$ "text"]); + _flavour_text = array_concat(_flavour_text, _text_option[$ LANG_ENTRY_TEXT]); } } diff --git a/scripts/scr_role_setup/scr_role_setup.gml b/scripts/scr_role_setup/scr_role_setup.gml index 3b8fc766ae..895310b6df 100644 --- a/scripts/scr_role_setup/scr_role_setup.gml +++ b/scripts/scr_role_setup/scr_role_setup.gml @@ -83,7 +83,10 @@ function role_setup_objects() { style: "box", x1: 500, y1: 250, - tooltip: $"Specialist Distribution\nCheck if you wish for your Companies to be uniform and each contain {player_role_data[eROLE.ASSAULT].role}s and {player_role_data[eROLE.DEVASTATOR].role}s.", + tooltip: { + text: "Specialist Distribution\nCheck if you wish for your Companies to be uniform and each contain {0}s and {1}s.", + variables: [localize(player_role_data[eROLE.ASSAULT].role), localize(player_role_data[eROLE.DEVASTATOR].role)], + }, active: (squad_distribution == 1 || squad_distribution == 3), clicked_check_default: true, }); @@ -93,7 +96,7 @@ function role_setup_objects() { style: "box", x1: 710, y1: 250, - tooltip: $"Scout Distribution\nCheck if you wish for Scouts to be distributed equally across your Battle Companies rather than concentrated in the 10th.", + tooltip: "Scout Distribution\nCheck if you wish for Scouts to be distributed equally across your Battle Companies rather than concentrated in the 10th.", active: (squad_distribution == 2 || squad_distribution == 3), clicked_check_default: true, }); @@ -103,19 +106,19 @@ function role_setup_objects() { str1: "On Planet", font: fnt_40k_12, style: "box", - tooltip: $"On Planet/nCheck to have your Astartes Start on your home planet.", + tooltip: "On Planet\nCheck to have your Astartes Start on your home planet.", }, { str1: "Load to Ships", font: fnt_40k_12, style: "box", - tooltip: $"Load to Ships\nCheck to have your Astartes automatically loaded into ships when the game starts.", + tooltip: "Load to Ships\nCheck to have your Astartes automatically loaded into ships when the game starts.", }, { str1: "Load (Sans Escorts)", font: fnt_40k_12, style: "box", - tooltip: $"Load (Sans Escorts)\nCheck to have your Astartes automatically loaded into ships, except for Escorts, when the game starts.", + tooltip: "Load (Sans Escorts)\nCheck to have your Astartes automatically loaded into ships, except for Escorts, when the game starts.", }, ], "", { x1: 445, @@ -131,7 +134,7 @@ function role_setup_objects() { style: "box", x1: 540, y1: 370, - tooltip: $"Distribute Scouts\nCheck to have your Scouts split across ships in the fleet.", + tooltip: "Distribute Scouts\nCheck to have your Scouts split across ships in the fleet.", active: load_to_ships[1], clicked_check_default: true, }); @@ -141,7 +144,7 @@ function role_setup_objects() { style: "box", x1: 690, y1: 370, - tooltip: $"Distribute Veterans\nCheck to have your Veterans split across the fleet.", + tooltip: "Distribute Veterans\nCheck to have your Veterans split across the fleet.", active: load_to_ships[2], clicked_check_default: true, }); @@ -173,12 +176,12 @@ function scr_distribution_and_advisor_setup() { } draw_set_halign(fa_left); if (scr_hit(540, 547, 800, 725)) { - tooltip = "Advisor Names"; - tooltip2 = "The names of your main Advisors. They provide useful information and reports on the divisions of your Chapter."; + tooltip = localize("Advisor Names"); + tooltip2 = localize("The names of your main Advisors. They provide useful information and reports on the divisions of your Chapter."); } - draw_text_transformed(444, 550, "Advisor Names", 0.6, 0.6, 0); - draw_set_font(fnt_40k_14b); + draw_text_transformed(444, 550, string_hash_to_newline(localize("Advisor Names")), 0.6, 0.6, 0); + draw_set_font(cjk_font(fnt_40k_14b)); draw_set_halign(fa_right); var _apoths_allowed = player_role_data[eROLE.APOTHECARY].available_to_player; var _chaps_allowed = player_role_data[eROLE.CHAPLAIN].available_to_player; @@ -186,19 +189,19 @@ function scr_distribution_and_advisor_setup() { var _techs_allowed = player_role_data[eROLE.TECHMARINE].available_to_player; if (_apoths_allowed) { - draw_text(594, 575, "Chief Apothecary: "); + draw_text(594, 575, localize("Chief Apothecary: ")); } if (player_role_data[eROLE.CHAPLAIN].available_to_player) { - draw_text(594, 597, "High Chaplain: "); + draw_text(594, 597, localize("High Chaplain: ")); } if (player_role_data[eROLE.LIBRARIAN].available_to_player) { - draw_text(594, 619, "Chief Librarian: "); + draw_text(594, 619, localize("Chief Librarian: ")); } if (player_role_data[eROLE.TECHMARINE].available_to_player) { - draw_text(594, 641, "Forge Master: "); + draw_text(594, 641, localize("Forge Master: ")); } - draw_text(594, 663, "Master of Recruits: "); - draw_text(594, 685, "Master of the Fleet: "); + draw_text(594, 663, localize("Master of Recruits: ")); + draw_text(594, 685, localize("Master of the Fleet: ")); draw_set_halign(fa_left); if (_apoths_allowed) { @@ -473,13 +476,13 @@ function scr_distribution_and_advisor_setup() { function scr_role_setup() { add_draw_return_values(); - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); draw_set_halign(fa_center); draw_set_alpha(1); draw_set_color(CM_GREEN_COLOR); roles_radio.current_selection = -1; - draw_text_color_simple(800, 80, "Roles", CM_GREEN_COLOR); + draw_text_color_simple(800, 80, localize("Roles"), CM_GREEN_COLOR); if (!instance_exists(obj_creation_popup)) { roles_radio.update({y1: 150}); roles_radio.draw(); @@ -495,7 +498,7 @@ function scr_role_setup() { } draw_set_color(CM_GREEN_COLOR); draw_set_alpha(1); - draw_set_font(fnt_40k_30b); + draw_set_font(cjk_font(fnt_40k_30b)); if (custom != eCHAPTER_TYPE.CUSTOM) { draw_set_alpha(0.5);