Translation update: more things are translated, more are translatable, translation function moved

This commit is contained in:
Yair Morgenstern 2018-12-07 11:24:55 +02:00
parent e53929a3db
commit 0a5ba19c6d
47 changed files with 535 additions and 451 deletions

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

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

View File

@ -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

View File

@ -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":{

View File

@ -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.*

View File

@ -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

View File

@ -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,

View File

@ -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.*

View File

@ -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 {

View File

@ -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

View File

@ -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

View File

@ -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
}

View File

@ -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 {

View File

@ -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()

View File

@ -1,6 +1,6 @@
package com.unciv.models.stats
import com.unciv.ui.utils.tr
import com.unciv.models.gamebasics.tr
open class Stats() {

View File

@ -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())

View File

@ -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){

View File

@ -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+=""
}

View File

@ -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() {

View File

@ -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.*

View File

@ -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.*

View File

@ -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.*

View File

@ -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

View File

@ -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

View File

@ -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() {

View File

@ -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.*

View File

@ -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.*

View File

@ -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

View File

@ -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() {

View File

@ -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(){

View File

@ -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) {

View File

@ -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,

View File

@ -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)

View File

@ -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>()

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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.*

View File

@ -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

View File

@ -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 {

View File

@ -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() {

View File

@ -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.*

View File

@ -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

View File

@ -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