mirror of
https://github.com/yairm210/Unciv.git
synced 2025-02-11 03:18:18 +07:00
Translation update: more things are translated, more are translatable, translation function moved
This commit is contained in:
parent
e53929a3db
commit
0a5ba19c6d
@ -123,6 +123,7 @@ All the following are from [the Noun Project](https://thenounproject.com) licenc
|
||||
* [korean palace](https://thenounproject.com/term/korean-palace/1797542/) By 1516 for Palace
|
||||
* [Obelisk](https://thenounproject.com/term/obelisk/749104/) By Eliricon for Monument
|
||||
* [Cross swords](https://thenounproject.com/term/cross-swords/965398/) By Creaticca Creative Agency for Barracks
|
||||
* [Fortress](https://thenounproject.com/search/?q=fortress&i=146989) By Creative Stall for Krepost
|
||||
* [Paper](https://thenounproject.com/term/paper/1443472/) By anam
|
||||
* [Circus](https://thenounproject.com/term/circus/743734/) By Ralph Schmitzer
|
||||
* [Stonehenge](https://thenounproject.com/term/stonehenge/543289/) By icon 54
|
||||
|
BIN
android/Images/BuildingIcons/Krepost.png
Normal file
BIN
android/Images/BuildingIcons/Krepost.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
BIN
android/Images/FlagIcons/Portuguese.png
Normal file
BIN
android/Images/FlagIcons/Portuguese.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.3 KiB |
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Before Width: | Height: | Size: 802 KiB After Width: | Height: | Size: 808 KiB |
@ -97,6 +97,16 @@
|
||||
maintenance:1,
|
||||
requiredTech:"Bronze Working"
|
||||
},
|
||||
{
|
||||
name:"Krepost",
|
||||
replaces:"Barracks",
|
||||
uniqueTo:"Russia"
|
||||
xpForNewUnits:15,
|
||||
hurryCostModifier:25,
|
||||
maintenance:1,
|
||||
uniques:["Culture and Gold costs of acquiring new tiles reduced by 25% in this city"] // todo implement
|
||||
requiredTech:"Bronze Working"
|
||||
},
|
||||
|
||||
// Classical Era
|
||||
|
||||
|
@ -2583,36 +2583,6 @@
|
||||
|
||||
// Building unique abilities
|
||||
|
||||
"+1 Science Per 2 Population":{
|
||||
Italian:"+1 Scienza ogni 2 abitanti"
|
||||
Russian:"+1 Наука за 2 населения"
|
||||
French:"+1 Science par 2 Population"
|
||||
Romanian:"+1 știință pe 2 persoane"
|
||||
German:"+1 Erforschung pro 2 Bewohner"
|
||||
Dutch:"+1 Wetenschap per 2 Populatie"
|
||||
Spanish:"+1 Ciencia cada 2 habitantes"
|
||||
Portuguese:"+1 Ciência a cada 2 habitantes"
|
||||
}
|
||||
"Worker construction increased 25%":{
|
||||
Italian:"+25% velocità costruzione lavoratori"
|
||||
Russian:"Увеличивает на 25% скорость создания улучшений на клетках"
|
||||
French:"La construction des travailleurs a augmenté de 25%"
|
||||
Romanian:"Lucrările de construcție a crescut cu 25%"
|
||||
German:"Arbeiterproduktion um 25% erhöht"
|
||||
Dutch:"Werkerproducktie met 25% vehoogt"
|
||||
Spanish:"+25% velocidad de construcción trabajador"
|
||||
Portuguese:"Velocidade de construção dos trabalhadores aumentada em +25%"
|
||||
}
|
||||
"Provides 2 free workers":{
|
||||
Italian:"Offre 2 Lavoratori liberi"
|
||||
Russian:"предоставляет 2 бесплатных рабочих"
|
||||
French:"Fournit 2 travailleurs gratuits"
|
||||
Romanian:"Oferă 2 lucrători liberi"
|
||||
German:"Gibt 2 freie Arbeiter"
|
||||
Dutch:"Geeft 2 gratis werkers"
|
||||
Spanish:"Proporciona 2 trabajadores gratis"
|
||||
Portuguese:"Proporciona 2 trabalhadores gratis"
|
||||
}
|
||||
"Free Social Policy":{
|
||||
Italian:"Politica sociale gratuita"
|
||||
Russian:"Бесплатный общественный институт"
|
||||
@ -3262,7 +3232,10 @@
|
||||
}
|
||||
|
||||
|
||||
//civilisations
|
||||
// Civilisations and uniques
|
||||
"replaces":{// As in "Camel Archer replaces Knight", "Krepost replaces Barracks"
|
||||
}
|
||||
|
||||
"Babylon":{
|
||||
Italian:"Babilonia"
|
||||
Russian:"Вавилон"
|
||||
@ -3303,6 +3276,8 @@
|
||||
Spanish:"Inglaterra"
|
||||
Portuguese:"Inglaterra"
|
||||
}
|
||||
"+2 movement for all naval units":{}
|
||||
|
||||
"France":{
|
||||
Italian:"Francia"
|
||||
Russian:"Франция"
|
||||
@ -3311,6 +3286,14 @@
|
||||
Spanish:"Francia"
|
||||
Portuguese:"França"
|
||||
}
|
||||
"Russia":{}
|
||||
"Strategic Resources provide +1 Production, and Horses, Iron and Uranium Resources provide double quantity":{}
|
||||
"Rome":{}
|
||||
"Arabia":{}
|
||||
"America":{}
|
||||
"All land military units have +1 sight, 50% discount when purchasing tiles":{}
|
||||
"Barbarians":{}
|
||||
|
||||
|
||||
//Difficulty
|
||||
"Settler":{
|
||||
@ -3669,6 +3652,7 @@
|
||||
Spanish:"Stonehenge"
|
||||
Portuguese:"Stonehenge"
|
||||
}
|
||||
|
||||
"Library":{
|
||||
Italian:"Biblioteca"
|
||||
Russian:"Библиотека"
|
||||
@ -3677,6 +3661,18 @@
|
||||
Spanish:"Biblioteca"
|
||||
Portuguese:"Livraria"
|
||||
}
|
||||
"+1 Science Per 2 Population":{
|
||||
Italian:"+1 Scienza ogni 2 abitanti"
|
||||
Russian:"+1 Наука за 2 населения"
|
||||
French:"+1 Science par 2 Population"
|
||||
Romanian:"+1 știință pe 2 persoane"
|
||||
German:"+1 Erforschung pro 2 Bewohner"
|
||||
Dutch:"+1 Wetenschap per 2 Populatie"
|
||||
Spanish:"+1 Ciencia cada 2 habitantes"
|
||||
Portuguese:"+1 Ciência a cada 2 habitantes"
|
||||
}
|
||||
"Paper Maker":{}
|
||||
|
||||
"The Great Library":{
|
||||
Italian:"Grande Biblioteca"
|
||||
Russian:"Великая Библиотека"
|
||||
@ -3701,6 +3697,7 @@
|
||||
Spanish:"Muros"
|
||||
Portuguese:"Muralhas"
|
||||
}
|
||||
|
||||
"The Pyramids":{
|
||||
Italian:"Grandi Piramidi"
|
||||
Russian:"Пирамиды"
|
||||
@ -3709,6 +3706,27 @@
|
||||
Spanish:"Las Pirámides"
|
||||
Portuguese:"Pirâmides"
|
||||
}
|
||||
"Worker construction increased 25%":{
|
||||
Italian:"+25% velocità costruzione lavoratori"
|
||||
Russian:"Увеличивает на 25% скорость создания улучшений на клетках"
|
||||
French:"La construction des travailleurs a augmenté de 25%"
|
||||
Romanian:"Lucrările de construcție a crescut cu 25%"
|
||||
German:"Arbeiterproduktion um 25% erhöht"
|
||||
Dutch:"Werkerproducktie met 25% vehoogt"
|
||||
Spanish:"+25% velocidad de construcción trabajador"
|
||||
Portuguese:"Velocidade de construção dos trabalhadores aumentada em +25%"
|
||||
}
|
||||
"Provides 2 free workers":{
|
||||
Italian:"Offre 2 Lavoratori liberi"
|
||||
Russian:"предоставляет 2 бесплатных рабочих"
|
||||
French:"Fournit 2 travailleurs gratuits"
|
||||
Romanian:"Oferă 2 lucrători liberi"
|
||||
German:"Gibt 2 freie Arbeiter"
|
||||
Dutch:"Geeft 2 gratis werkers"
|
||||
Spanish:"Proporciona 2 trabajadores gratis"
|
||||
Portuguese:"Proporciona 2 trabalhadores gratis"
|
||||
}
|
||||
|
||||
"Barracks":{
|
||||
Italian:"Caserma"
|
||||
Russian:"Казармы"
|
||||
@ -3717,6 +3735,7 @@
|
||||
Spanish:"Barracones"
|
||||
Portuguese:"Quartéis"
|
||||
}
|
||||
"Krepost":{} // russian uique, transliterate this probably, this is a russian word
|
||||
"Temple":{
|
||||
Italian:"Tempio"
|
||||
Russian:"Храм"
|
||||
@ -3725,6 +3744,7 @@
|
||||
Spanish:"Templo"
|
||||
Portuguese:"Templo"
|
||||
}
|
||||
"Burial Tomb":{}
|
||||
"The Oracle":{
|
||||
Italian:"Ooracolo"
|
||||
Russian:"Оракул"
|
||||
@ -3799,6 +3819,7 @@
|
||||
Spanish:"Mercado"
|
||||
Portuguese:"Mercado"
|
||||
}
|
||||
"Bazaar":{}// Arabian unique - transliterate?
|
||||
"Monastery":{
|
||||
Italian:"Monastero"
|
||||
Russian:"Монастырь"
|
||||
@ -4337,6 +4358,7 @@
|
||||
Spanish:"Caballero"
|
||||
Portuguese:"Cavaleiro"
|
||||
}
|
||||
"Camel Archer":{}
|
||||
|
||||
// Renaissance units
|
||||
"Caravel":{
|
||||
@ -4363,6 +4385,7 @@
|
||||
French:"Mousquetaire"
|
||||
Portuguese:"Mosqueteiro"
|
||||
}
|
||||
"Minuteman":{}
|
||||
"Frigate":{
|
||||
Italian:"Fregata"
|
||||
French:"Frégate"
|
||||
@ -4408,10 +4431,10 @@
|
||||
// iron clad has 3 different tranlations to portuguese but i am not sure wich one to use
|
||||
}
|
||||
|
||||
// Modern units
|
||||
// Are we suppossed to do these?
|
||||
// Modern units (do these, yes)
|
||||
"Landship":{}
|
||||
"Great War Infantry":{}
|
||||
"Destroyer":{}
|
||||
|
||||
// Great units
|
||||
"Great Artist":{
|
||||
|
@ -4,8 +4,8 @@ import com.badlogic.gdx.graphics.Color
|
||||
import com.unciv.logic.automation.Automation
|
||||
import com.unciv.models.gamebasics.Building
|
||||
import com.unciv.models.gamebasics.GameBasics
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.models.stats.Stats
|
||||
import com.unciv.ui.utils.tr
|
||||
import com.unciv.ui.utils.withItem
|
||||
import com.unciv.ui.utils.withoutItem
|
||||
import java.util.*
|
||||
|
@ -13,9 +13,9 @@ import com.unciv.models.gamebasics.GameBasics
|
||||
import com.unciv.models.gamebasics.tech.TechEra
|
||||
import com.unciv.models.gamebasics.tile.ResourceType
|
||||
import com.unciv.models.gamebasics.tile.TileResource
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.models.stats.Stats
|
||||
import com.unciv.ui.utils.getRandom
|
||||
import com.unciv.ui.utils.tr
|
||||
import java.util.*
|
||||
import kotlin.collections.ArrayList
|
||||
import kotlin.collections.HashMap
|
||||
|
@ -6,7 +6,7 @@ import com.unciv.logic.trade.TradeType
|
||||
import com.unciv.models.Counter
|
||||
import com.unciv.models.gamebasics.GameBasics
|
||||
import com.unciv.models.gamebasics.tile.TileResource
|
||||
import com.unciv.ui.utils.tr
|
||||
import com.unciv.models.gamebasics.tr
|
||||
|
||||
enum class DiplomaticStatus{
|
||||
Peace,
|
||||
|
@ -4,8 +4,8 @@ package com.unciv.logic.civilization
|
||||
import com.badlogic.gdx.graphics.Color
|
||||
import com.unciv.models.gamebasics.GameBasics
|
||||
import com.unciv.models.gamebasics.tech.Technology
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.models.gamebasics.unit.BaseUnit
|
||||
import com.unciv.ui.utils.tr
|
||||
import com.unciv.ui.utils.withItem
|
||||
import java.util.*
|
||||
|
||||
|
@ -6,8 +6,8 @@ import com.unciv.logic.city.CityInfo
|
||||
import com.unciv.logic.civilization.CivilizationInfo
|
||||
import com.unciv.models.gamebasics.GameBasics
|
||||
import com.unciv.models.gamebasics.tile.*
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.models.stats.Stats
|
||||
import com.unciv.ui.utils.tr
|
||||
import kotlin.math.abs
|
||||
|
||||
open class TileInfo {
|
||||
|
@ -6,7 +6,7 @@ import com.unciv.logic.civilization.CivilizationInfo
|
||||
import com.unciv.logic.civilization.DiplomaticStatus
|
||||
import com.unciv.models.gamebasics.GameBasics
|
||||
import com.unciv.models.gamebasics.tile.ResourceType
|
||||
import com.unciv.ui.utils.tr
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import kotlin.math.min
|
||||
import kotlin.math.sqrt
|
||||
|
||||
|
@ -5,7 +5,6 @@ import com.unciv.logic.city.IConstruction
|
||||
import com.unciv.models.gamebasics.tech.Technology
|
||||
import com.unciv.models.stats.NamedStats
|
||||
import com.unciv.models.stats.Stats
|
||||
import com.unciv.ui.utils.tr
|
||||
|
||||
class Building : NamedStats(), IConstruction{
|
||||
override val description: String
|
||||
|
@ -1,6 +1,7 @@
|
||||
package com.unciv.models.gamebasics
|
||||
|
||||
import com.badlogic.gdx.utils.JsonReader
|
||||
import com.unciv.UnCivGame
|
||||
import java.util.*
|
||||
|
||||
class Translations() : HashMap<String, HashMap<String, String>>(){
|
||||
@ -47,4 +48,59 @@ class Translations() : HashMap<String, HashMap<String, String>>(){
|
||||
fun getLanguages(): List<String> {
|
||||
return mutableListOf("English").apply { addAll(values.flatMap { it.keys }.distinct()) }
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun translateBonusOrPenalty(unique:String): String {
|
||||
val regexResult = Regex("""(Bonus|Penalty) vs (.*) (\d*)%""").matchEntire(unique)
|
||||
if(regexResult==null) return unique.tr()
|
||||
else{
|
||||
val start = regexResult.groups[1]!!.value+" vs ["+regexResult.groups[2]!!.value+"]"
|
||||
val translatedUnique = start.tr() + " "+ regexResult.groups[3]!!.value+"%"
|
||||
return translatedUnique
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fun String.tr(): String {
|
||||
if(contains("[")){ // Placeholders!
|
||||
/**
|
||||
* I'm SURE there's an easier way to do this but I can't think of it =\
|
||||
* So what's all this then?
|
||||
* Well, not all languages are like English. So say I want to say "work on Library has completed in Akkad",
|
||||
* but in a completely different language like Japanese or German,
|
||||
* It could come out "Akkad hast die worken onner Library gerfinishen" or whatever,
|
||||
* basically, the order of the words in the sentance is not guaranteed.
|
||||
* So to translate this, I give a sentence like "work on [building] has completed in [city]"
|
||||
* and the german can put those placeholders where he wants, so "[city] hast die worken onner [building] gerfinishen"
|
||||
* The string on which we call tr() will look like "work on [library] has completed in [Akkad]"
|
||||
* We will find the german placeholder text, and replace the placeholders with what was filled in the text we got!
|
||||
*/
|
||||
|
||||
val squareBraceRegex = Regex("\\[(.*?)\\]")
|
||||
val englishTranslationPlaceholder = GameBasics.Translations.keys
|
||||
.firstOrNull { it.replace(squareBraceRegex,"[]") == replace(squareBraceRegex,"[]") }
|
||||
if(englishTranslationPlaceholder==null ||
|
||||
!GameBasics.Translations[englishTranslationPlaceholder]!!.containsKey(UnCivGame.Current.settings.language)){
|
||||
// Translation placeholder doesn't exist for this language
|
||||
return this.replace("[","").replace("]","")
|
||||
}
|
||||
|
||||
val termsInMessage = squareBraceRegex.findAll(this).map { it.groups[1]!!.value }.toMutableList()
|
||||
val termsInTranslationPlaceholder = squareBraceRegex.findAll(englishTranslationPlaceholder).map { it.value }.toMutableList()
|
||||
if(termsInMessage.size!=termsInTranslationPlaceholder.size)
|
||||
throw Exception("Message $this has a different number of terms than the placeholder $englishTranslationPlaceholder!")
|
||||
|
||||
var languageSpecificPlaceholder = GameBasics.Translations[englishTranslationPlaceholder]!![UnCivGame.Current.settings.language]!!
|
||||
for(i in 0 until termsInMessage.size){
|
||||
languageSpecificPlaceholder = languageSpecificPlaceholder.replace(termsInTranslationPlaceholder[i], termsInMessage[i].tr())
|
||||
}
|
||||
return languageSpecificPlaceholder.tr()
|
||||
}
|
||||
if(contains("{")){ // sentence
|
||||
return Regex("\\{(.*?)\\}").replace(this) { it.groups[1]!!.value.tr() }
|
||||
}
|
||||
val translation = GameBasics.Translations.get(this, UnCivGame.Current.settings.language) // single word
|
||||
return translation
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ package com.unciv.models.gamebasics.tech
|
||||
import com.unciv.UnCivGame
|
||||
import com.unciv.models.gamebasics.GameBasics
|
||||
import com.unciv.models.gamebasics.ICivilopedia
|
||||
import com.unciv.ui.utils.tr
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import java.util.*
|
||||
|
||||
class Technology : ICivilopedia {
|
||||
|
@ -6,8 +6,9 @@ import com.unciv.logic.civilization.CivilizationInfo
|
||||
import com.unciv.logic.map.MapUnit
|
||||
import com.unciv.models.gamebasics.GameBasics
|
||||
import com.unciv.models.gamebasics.ICivilopedia
|
||||
import com.unciv.models.gamebasics.Translations
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.models.stats.INamed
|
||||
import com.unciv.ui.utils.tr
|
||||
|
||||
// This is BaseUnit because Unit is already a base Kotlin class and to avoid mixing the two up
|
||||
class BaseUnit : INamed, IConstruction, ICivilopedia {
|
||||
@ -35,16 +36,12 @@ class BaseUnit : INamed, IConstruction, ICivilopedia {
|
||||
return getDescription(false)
|
||||
}
|
||||
|
||||
|
||||
|
||||
fun getShortDescription(): String {
|
||||
val infoList= mutableListOf<String>()
|
||||
for(unique in uniques){
|
||||
val regexResult = Regex("""(Bonus|Penalty) vs (.*) (\d*)%""").matchEntire(unique)
|
||||
if(regexResult==null) infoList += unique.tr()
|
||||
else{
|
||||
val start = regexResult.groups[1]!!.value+" vs ["+regexResult.groups[2]!!.value+"]"
|
||||
val translatedUnique = start.tr() + " "+ regexResult.groups[3]!!.value+"%"
|
||||
infoList+=translatedUnique
|
||||
}
|
||||
infoList+=Translations.translateBonusOrPenalty(unique)
|
||||
}
|
||||
if(strength!=0) infoList += "{Strength}: $strength".tr()
|
||||
if(rangedStrength!=0) infoList += "{Ranged strength}: $rangedStrength".tr()
|
||||
|
@ -1,6 +1,6 @@
|
||||
package com.unciv.models.stats
|
||||
|
||||
import com.unciv.ui.utils.tr
|
||||
import com.unciv.models.gamebasics.tr
|
||||
|
||||
|
||||
open class Stats() {
|
||||
|
@ -14,6 +14,7 @@ import com.unciv.logic.civilization.CivilizationInfo
|
||||
import com.unciv.logic.civilization.DiplomaticStatus
|
||||
import com.unciv.logic.trade.Trade
|
||||
import com.unciv.logic.trade.TradeOffersList
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.utils.*
|
||||
import java.text.DecimalFormat
|
||||
import kotlin.math.roundToInt
|
||||
@ -291,7 +292,7 @@ class EmpireOverviewScreen : CameraStageBaseScreen(){
|
||||
val civGroup = Table()
|
||||
val civGroupBackground = ImageGetter.getDrawable("OtherIcons/civTableBackground.png")
|
||||
|
||||
val label = Label(civ.civName, CameraStageBaseScreen.skin)
|
||||
val label = Label(civ.civName.tr(), CameraStageBaseScreen.skin)
|
||||
|
||||
if(playerKnows(civ)) {
|
||||
civGroup.background = civGroupBackground.tint(civ.getNation().getColor())
|
||||
|
@ -7,11 +7,11 @@ import com.badlogic.gdx.scenes.scene2d.ui.Skin
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Table
|
||||
import com.unciv.UnCivGame
|
||||
import com.unciv.models.gamebasics.GameBasics
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.pickerscreens.PickerScreen
|
||||
import com.unciv.ui.utils.ImageGetter
|
||||
import com.unciv.ui.utils.enable
|
||||
import com.unciv.ui.utils.onClick
|
||||
import com.unciv.ui.utils.tr
|
||||
|
||||
|
||||
class LanguageTable(val language:String,skin: Skin):Table(skin){
|
||||
|
@ -10,6 +10,8 @@ import com.unciv.GameStarter
|
||||
import com.unciv.logic.GameInfo
|
||||
import com.unciv.models.gamebasics.GameBasics
|
||||
import com.unciv.models.gamebasics.Nation
|
||||
import com.unciv.models.gamebasics.Translations
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.pickerscreens.PickerScreen
|
||||
import com.unciv.ui.utils.*
|
||||
import com.unciv.ui.worldscreen.WorldScreen
|
||||
@ -35,7 +37,7 @@ class NewGameScreen: PickerScreen(){
|
||||
init {
|
||||
pad(10f)
|
||||
background=ImageGetter.getBackground(nation.getColor().apply { a=0.5f })
|
||||
add(Label(nation.name, skin).apply { setFontColor(nation.getSecondaryColor())}).row()
|
||||
add(Label(nation.name.tr(), skin).apply { setFontColor(nation.getSecondaryColor())}).row()
|
||||
add(Label(getUniqueLabel(nation), skin).apply { setWrap(true);setFontColor(nation.getSecondaryColor())}).width(width)
|
||||
onClick { newGameParameters.nation=nation.name; onClick() }
|
||||
touchable=Touchable.enabled
|
||||
@ -46,7 +48,7 @@ class NewGameScreen: PickerScreen(){
|
||||
val textList = ArrayList<String>()
|
||||
|
||||
if(nation.unique!=null) {
|
||||
textList += nation.unique!!
|
||||
textList += nation.unique!!.tr()
|
||||
textList += ""
|
||||
}
|
||||
|
||||
@ -58,7 +60,7 @@ class NewGameScreen: PickerScreen(){
|
||||
val originalBuildingStatMap = originalBuilding.toHashMap()
|
||||
for (stat in building.toHashMap())
|
||||
if (stat.value != originalBuildingStatMap[stat.key])
|
||||
textList += " "+stat.value.toInt() + " " + stat.key + " vs " + originalBuildingStatMap[stat.key]!!.toInt()
|
||||
textList += " "+stat.key.toString().tr() +" "+stat.value.toInt() + " vs " + originalBuildingStatMap[stat.key]!!.toInt()
|
||||
for(unique in building.uniques.filter { it !in originalBuilding.uniques })
|
||||
textList += " "+unique.tr()
|
||||
if (building.maintenance != originalBuilding.maintenance)
|
||||
@ -72,7 +74,7 @@ class NewGameScreen: PickerScreen(){
|
||||
|
||||
textList += unit.name.tr() + " - {replaces} " + originalUnit.name.tr()
|
||||
if (unit.strength != originalUnit.strength)
|
||||
textList += " {Combat strength} " + unit.strength + " vs " + originalUnit.strength
|
||||
textList += " {Strength} " + unit.strength + " vs " + originalUnit.strength
|
||||
if (unit.rangedStrength!= originalUnit.rangedStrength)
|
||||
textList+= " {Ranged strength} " + unit.rangedStrength+ " vs " + originalUnit.rangedStrength
|
||||
if (unit.range!= originalUnit.range)
|
||||
@ -81,7 +83,7 @@ class NewGameScreen: PickerScreen(){
|
||||
textList+= " {Movement} " + unit.movement+ " vs " + originalUnit.movement
|
||||
val newUniques = unit.uniques.filterNot { it in originalUnit.uniques }
|
||||
if(newUniques.isNotEmpty())
|
||||
textList+=" {Uniques}: "+newUniques.joinToString()
|
||||
textList+=" {Uniques}: "+newUniques.joinToString{ Translations.translateBonusOrPenalty(it)}
|
||||
textList+=""
|
||||
}
|
||||
|
||||
|
@ -5,10 +5,10 @@ import com.badlogic.gdx.scenes.scene2d.ui.Table
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.TextButton
|
||||
import com.unciv.UnCivGame
|
||||
import com.unciv.models.gamebasics.GameBasics
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.pickerscreens.PickerScreen
|
||||
import com.unciv.ui.utils.enable
|
||||
import com.unciv.ui.utils.onClick
|
||||
import com.unciv.ui.utils.tr
|
||||
|
||||
class VictoryScreen : PickerScreen() {
|
||||
|
||||
|
@ -5,6 +5,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.*
|
||||
import com.badlogic.gdx.utils.Align
|
||||
import com.unciv.logic.city.CityInfo
|
||||
import com.unciv.models.gamebasics.Building
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.models.stats.Stat
|
||||
import com.unciv.models.stats.Stats
|
||||
import com.unciv.ui.utils.*
|
||||
|
@ -9,6 +9,7 @@ import com.unciv.UnCivGame
|
||||
import com.unciv.logic.HexMath
|
||||
import com.unciv.logic.city.CityInfo
|
||||
import com.unciv.logic.map.TileInfo
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.utils.*
|
||||
import java.util.*
|
||||
|
||||
|
@ -9,6 +9,7 @@ import com.badlogic.gdx.utils.Align
|
||||
import com.unciv.UnCivGame
|
||||
import com.unciv.logic.city.SpecialConstruction
|
||||
import com.unciv.models.gamebasics.Building
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.pickerscreens.ConstructionPickerScreen
|
||||
import com.unciv.ui.utils.*
|
||||
import java.util.*
|
||||
|
@ -7,11 +7,11 @@ import com.badlogic.gdx.scenes.scene2d.ui.VerticalGroup
|
||||
import com.unciv.logic.city.CityInfo
|
||||
import com.unciv.logic.city.SpecialConstruction
|
||||
import com.unciv.models.gamebasics.GameBasics
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.cityscreen.CityScreen
|
||||
import com.unciv.ui.utils.ImageGetter
|
||||
import com.unciv.ui.utils.onClick
|
||||
import com.unciv.ui.utils.setFontColor
|
||||
import com.unciv.ui.utils.tr
|
||||
|
||||
class ConstructionPickerScreen(val city: CityInfo) : PickerScreen() {
|
||||
private var selectedProduction: String? = null
|
||||
|
@ -7,10 +7,10 @@ import com.badlogic.gdx.scenes.scene2d.ui.VerticalGroup
|
||||
import com.unciv.logic.map.TileInfo
|
||||
import com.unciv.models.gamebasics.GameBasics
|
||||
import com.unciv.models.gamebasics.tile.TileImprovement
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.utils.ImageGetter
|
||||
import com.unciv.ui.utils.onClick
|
||||
import com.unciv.ui.utils.setFontColor
|
||||
import com.unciv.ui.utils.tr
|
||||
|
||||
class ImprovementPickerScreen(tileInfo: TileInfo) : PickerScreen() {
|
||||
private var selectedImprovement: TileImprovement? = null
|
||||
|
@ -2,7 +2,11 @@ package com.unciv.ui.pickerscreens
|
||||
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.*
|
||||
import com.badlogic.gdx.utils.Align
|
||||
import com.unciv.ui.utils.*
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.utils.CameraStageBaseScreen
|
||||
import com.unciv.ui.utils.disable
|
||||
import com.unciv.ui.utils.enable
|
||||
import com.unciv.ui.utils.onClick
|
||||
|
||||
open class PickerScreen : CameraStageBaseScreen() {
|
||||
|
||||
|
@ -8,6 +8,7 @@ import com.unciv.UnCivGame
|
||||
import com.unciv.logic.civilization.CivilizationInfo
|
||||
import com.unciv.models.gamebasics.GameBasics
|
||||
import com.unciv.models.gamebasics.Policy
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.utils.*
|
||||
|
||||
|
||||
|
@ -7,6 +7,7 @@ import com.unciv.logic.civilization.CivilizationInfo
|
||||
import com.unciv.logic.civilization.TechManager
|
||||
import com.unciv.models.gamebasics.GameBasics
|
||||
import com.unciv.models.gamebasics.tech.Technology
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.utils.*
|
||||
import java.util.*
|
||||
|
||||
|
@ -9,6 +9,7 @@ import com.badlogic.gdx.utils.Json
|
||||
import com.unciv.UnCivGame
|
||||
import com.unciv.logic.GameInfo
|
||||
import com.unciv.logic.GameSaver
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.pickerscreens.PickerScreen
|
||||
import com.unciv.ui.utils.*
|
||||
import java.text.SimpleDateFormat
|
||||
|
@ -8,11 +8,11 @@ import com.badlogic.gdx.scenes.scene2d.ui.TextField
|
||||
import com.badlogic.gdx.utils.Json
|
||||
import com.unciv.UnCivGame
|
||||
import com.unciv.logic.GameSaver
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.pickerscreens.PickerScreen
|
||||
import com.unciv.ui.utils.enable
|
||||
import com.unciv.ui.utils.getRandom
|
||||
import com.unciv.ui.utils.onClick
|
||||
import com.unciv.ui.utils.tr
|
||||
|
||||
|
||||
class SaveScreen : PickerScreen() {
|
||||
|
@ -3,6 +3,7 @@ package com.unciv.ui.trade
|
||||
import com.badlogic.gdx.graphics.Color
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.*
|
||||
import com.unciv.UnCivGame
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.utils.*
|
||||
|
||||
class DiplomacyScreen:CameraStageBaseScreen(){
|
||||
|
@ -3,9 +3,9 @@ package com.unciv.ui.trade
|
||||
import com.badlogic.gdx.scenes.scene2d.Stage
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Table
|
||||
import com.unciv.logic.trade.TradeLogic
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.utils.CameraStageBaseScreen
|
||||
import com.unciv.ui.utils.addSeparator
|
||||
import com.unciv.ui.utils.tr
|
||||
|
||||
class OfferColumnsTable(tradeLogic: TradeLogic, stage: Stage, onChange: ()->Unit): Table(CameraStageBaseScreen.skin) {
|
||||
|
||||
|
@ -6,11 +6,11 @@ import com.badlogic.gdx.scenes.scene2d.ui.TextButton
|
||||
import com.unciv.logic.trade.TradeOffersList
|
||||
import com.unciv.logic.trade.TradeType
|
||||
import com.unciv.logic.trade.TradeType.*
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.cityscreen.ExpanderTab
|
||||
import com.unciv.ui.utils.CameraStageBaseScreen
|
||||
import com.unciv.ui.utils.disable
|
||||
import com.unciv.ui.utils.onClick
|
||||
import com.unciv.ui.utils.tr
|
||||
import kotlin.math.min
|
||||
|
||||
class OffersList(val offers: TradeOffersList, val correspondingOffers: TradeOffersList,
|
||||
|
@ -7,9 +7,9 @@ import com.badlogic.gdx.scenes.scene2d.ui.TextButton
|
||||
import com.unciv.UnCivGame
|
||||
import com.unciv.logic.civilization.CivilizationInfo
|
||||
import com.unciv.logic.trade.TradeLogic
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.utils.CameraStageBaseScreen
|
||||
import com.unciv.ui.utils.onClick
|
||||
import com.unciv.ui.utils.tr
|
||||
|
||||
class TradeTable(val otherCivilization: CivilizationInfo, stage: Stage, onTradeComplete: () -> Unit): Table(CameraStageBaseScreen.skin){
|
||||
var tradeLogic = TradeLogic(UnCivGame.Current.gameInfo.getPlayerCivilization(),otherCivilization)
|
||||
|
@ -15,7 +15,6 @@ import com.badlogic.gdx.scenes.scene2d.ui.*
|
||||
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener
|
||||
import com.badlogic.gdx.utils.viewport.ExtendViewport
|
||||
import com.unciv.UnCivGame
|
||||
import com.unciv.models.gamebasics.GameBasics
|
||||
|
||||
open class CameraStageBaseScreen : Screen {
|
||||
|
||||
@ -113,48 +112,6 @@ fun Actor.centerY(parent:Stage){ y = parent.height/2- height/2}
|
||||
fun Actor.center(parent:Stage){ centerX(parent); centerY(parent)}
|
||||
|
||||
fun Label.setFontColor(color:Color): Label {style=Label.LabelStyle(style).apply { fontColor=color }; return this}
|
||||
fun String.tr(): String {
|
||||
if(contains("[")){ // Placeholders!
|
||||
/**
|
||||
* I'm SURE there's an easier way to do this but I can't think of it =\
|
||||
* So what's all this then?
|
||||
* Well, not all languages are like English. So say I want to say "work on Library has completed in Akkad",
|
||||
* but in a completely different language like Japanese or German,
|
||||
* It could come out "Akkad hast die worken onner Library gerfinishen" or whatever,
|
||||
* basically, the order of the words in the sentance is not guaranteed.
|
||||
* So to translate this, I give a sentence like "work on [building] has completed in [city]"
|
||||
* and the german can put those placeholders where he wants, so "[city] hast die worken onner [building] gerfinishen"
|
||||
* The string on which we call tr() will look like "work on [library] has completed in [Akkad]"
|
||||
* We will find the german placeholder text, and replace the placeholders with what was filled in the text we got!
|
||||
*/
|
||||
|
||||
val squareBraceRegex = Regex("\\[(.*?)\\]")
|
||||
val englishTranslationPlaceholder = GameBasics.Translations.keys
|
||||
.firstOrNull { it.replace(squareBraceRegex,"[]") == replace(squareBraceRegex,"[]") }
|
||||
if(englishTranslationPlaceholder==null ||
|
||||
!GameBasics.Translations[englishTranslationPlaceholder]!!.containsKey(UnCivGame.Current.settings.language)){
|
||||
// Translation placeholder doesn't exist for this language
|
||||
return this.replace("[","").replace("]","")
|
||||
}
|
||||
|
||||
val termsInMessage = squareBraceRegex.findAll(this).map { it.groups[1]!!.value }.toMutableList()
|
||||
val termsInTranslationPlaceholder = squareBraceRegex.findAll(englishTranslationPlaceholder).map { it.value }.toMutableList()
|
||||
if(termsInMessage.size!=termsInTranslationPlaceholder.size)
|
||||
throw Exception("Message $this has a different number of terms than the placeholder $englishTranslationPlaceholder!")
|
||||
|
||||
var languageSpecificPlaceholder = GameBasics.Translations[englishTranslationPlaceholder]!![UnCivGame.Current.settings.language]!!
|
||||
for(i in 0 until termsInMessage.size){
|
||||
languageSpecificPlaceholder = languageSpecificPlaceholder.replace(termsInTranslationPlaceholder[i], termsInMessage[i].tr())
|
||||
}
|
||||
return languageSpecificPlaceholder.tr()
|
||||
}
|
||||
if(contains("{")){ // sentence
|
||||
return Regex("\\{(.*?)\\}").replace(this) { it.groups[1]!!.value.tr() }
|
||||
}
|
||||
val translation = GameBasics.Translations.get(this,UnCivGame.Current.settings.language) // single word
|
||||
return translation
|
||||
}
|
||||
|
||||
|
||||
|
||||
val fontCache = HashMap<Int,BitmapFont>()
|
||||
|
@ -10,6 +10,7 @@ import com.badlogic.gdx.utils.Align
|
||||
import com.badlogic.gdx.utils.Array
|
||||
import com.unciv.UnCivGame
|
||||
import com.unciv.models.gamebasics.GameBasics
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import java.util.LinkedHashMap
|
||||
import kotlin.collections.ArrayList
|
||||
import kotlin.collections.HashMap
|
||||
|
@ -5,6 +5,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.Label
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Table
|
||||
import com.unciv.logic.civilization.Notification
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.utils.*
|
||||
import kotlin.math.min
|
||||
|
||||
|
@ -12,6 +12,7 @@ import com.unciv.logic.GameSaver
|
||||
import com.unciv.logic.civilization.CivilizationInfo
|
||||
import com.unciv.logic.civilization.DiplomaticStatus
|
||||
import com.unciv.models.gamebasics.tile.ResourceType
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.models.gamebasics.unit.UnitType
|
||||
import com.unciv.ui.pickerscreens.GreatPersonPickerScreen
|
||||
import com.unciv.ui.pickerscreens.PolicyPickerScreen
|
||||
|
@ -11,6 +11,7 @@ import com.unciv.UnCivGame
|
||||
import com.unciv.logic.civilization.CivilizationInfo
|
||||
import com.unciv.models.gamebasics.GameBasics
|
||||
import com.unciv.models.gamebasics.tile.ResourceType
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.models.stats.Stats
|
||||
import com.unciv.ui.EmpireOverviewScreen
|
||||
import com.unciv.ui.utils.*
|
||||
|
@ -10,6 +10,7 @@ import com.unciv.logic.battle.Battle
|
||||
import com.unciv.logic.battle.BattleDamage
|
||||
import com.unciv.logic.battle.ICombatant
|
||||
import com.unciv.logic.battle.MapUnitCombatant
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.models.gamebasics.unit.UnitType
|
||||
import com.unciv.ui.utils.*
|
||||
import com.unciv.ui.worldscreen.WorldScreen
|
||||
|
@ -5,7 +5,11 @@ import com.badlogic.gdx.scenes.scene2d.ui.Label
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Table
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.TextButton
|
||||
import com.unciv.UnCivGame
|
||||
import com.unciv.ui.utils.*
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.utils.CameraStageBaseScreen
|
||||
import com.unciv.ui.utils.ImageGetter
|
||||
import com.unciv.ui.utils.center
|
||||
import com.unciv.ui.utils.onClick
|
||||
|
||||
open class PopupTable: Table(){
|
||||
init {
|
||||
|
@ -1,12 +1,14 @@
|
||||
package com.unciv.ui.worldscreen.optionstable
|
||||
|
||||
import com.unciv.UnCivGame
|
||||
import com.unciv.ui.*
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.CivilopediaScreen
|
||||
import com.unciv.ui.NewGameScreen
|
||||
import com.unciv.ui.VictoryScreen
|
||||
import com.unciv.ui.pickerscreens.PolicyPickerScreen
|
||||
import com.unciv.ui.saves.LoadScreen
|
||||
import com.unciv.ui.saves.SaveScreen
|
||||
import com.unciv.ui.utils.center
|
||||
import com.unciv.ui.utils.tr
|
||||
|
||||
class WorldScreenOptionsTable internal constructor() : PopupTable() {
|
||||
|
||||
|
@ -7,11 +7,11 @@ import com.unciv.logic.automation.WorkerAutomation
|
||||
import com.unciv.logic.map.MapUnit
|
||||
import com.unciv.models.gamebasics.Building
|
||||
import com.unciv.models.gamebasics.GameBasics
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.models.gamebasics.unit.UnitType
|
||||
import com.unciv.ui.pickerscreens.ImprovementPickerScreen
|
||||
import com.unciv.ui.pickerscreens.PromotionPickerScreen
|
||||
import com.unciv.ui.pickerscreens.TechPickerScreen
|
||||
import com.unciv.ui.utils.tr
|
||||
import com.unciv.ui.worldscreen.WorldScreen
|
||||
import com.unciv.ui.worldscreen.optionstable.YesNoPopupTable
|
||||
import java.util.*
|
||||
|
@ -7,6 +7,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.Label
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Table
|
||||
import com.unciv.UnCivGame
|
||||
import com.unciv.logic.map.MapUnit
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.utils.*
|
||||
import com.unciv.ui.worldscreen.WorldScreen
|
||||
|
||||
|
@ -5,6 +5,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.Label
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Table
|
||||
import com.unciv.logic.map.MapUnit
|
||||
import com.unciv.logic.map.TileInfo
|
||||
import com.unciv.models.gamebasics.tr
|
||||
import com.unciv.ui.utils.*
|
||||
import com.unciv.ui.worldscreen.WorldScreen
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user