diff --git a/bin/release.sh b/bin/release.sh index fb601f736..41943845b 100755 --- a/bin/release.sh +++ b/bin/release.sh @@ -27,12 +27,14 @@ exit EOF cd .. -if ant manual javadoc ; then +if ant manual devmanual javadoc ; then cd doc { echo "cd /home/project-web/freecol/htdocs" echo "put FreeCol.pdf docs/" echo "put FreeCol.html docs/" + echo "put developer.pdf docs/" + echo "put developer.html docs/" echo "put images/* docs/images" find javadoc/ -printf "put %p %p\n" } | sftp $USERNAME,freecol@web.sf.net diff --git a/build.xml b/build.xml index 2c06c9979..f39b0d1a7 100644 --- a/build.xml +++ b/build.xml @@ -9,7 +9,7 @@ the metaserver, distribution packages, running tests and creating documentation. - + @@ -43,8 +43,8 @@ - - + + @@ -182,7 +182,7 @@ @@ -251,10 +251,11 @@ addproperty="freecol.version" defaultvalue="git-${DSTAMP}" /> - + + @@ -337,7 +338,7 @@ - 1.7 + 1.8 @@ -475,7 +476,7 @@ mainclass="net.sf.freecol.FreeCol" version="${freecol.version}" vmoptions="-Xmx256M -Dapple.awt.fakefullscreen=true" - jvmversion="1.7+" + jvmversion="1.8+" arguments="--windowed --freecol-data FreeCol.app/Contents/Resources/" stubfile="${freecol.build.dir}/skeletons/FreeCol" icon="${freecol.packaging.dir}/icons/FreeCol.icns"> @@ -632,7 +633,7 @@ export CLASSPATH=${CLASSPATH}:test/lib/junit.jar; ant testall --> + failureProperty="error.junit" fork="yes" maxmemory="96M"> @@ -706,6 +707,25 @@ + + + + + + + + + + + + + + + + + @@ -724,10 +744,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/installer.jsmooth b/build/installer.jsmooth index 1f1e4b57e..48c4e8e4e 100644 --- a/build/installer.jsmooth +++ b/build/installer.jsmooth @@ -19,7 +19,7 @@ com.izforge.izpack.installer.Installer 268435456 - 1.7 + 1.8 Windowed Wrapper Message diff --git a/splash.jpg b/build/splash.jpg similarity index 100% rename from splash.jpg rename to build/splash.jpg diff --git a/build/startup.jsmooth b/build/startup.jsmooth index 042092a88..2abfeb8c3 100644 --- a/build/startup.jsmooth +++ b/build/startup.jsmooth @@ -23,7 +23,7 @@ net.sf.freecol.FreeCol 536870912 - 1.7 + 1.8 Windowed Wrapper Message diff --git a/build/uninstaller.jsmooth b/build/uninstaller.jsmooth index 838b559d5..e9bef7f74 100644 --- a/build/uninstaller.jsmooth +++ b/build/uninstaller.jsmooth @@ -19,7 +19,7 @@ com.izforge.izpack.uninstaller.Uninstaller -1 - 1.7 + 1.8 Windowed Wrapper Message diff --git a/config/nbproject/project.xml b/config/nbproject/project.xml index 40ca97582..1dcd50be9 100644 --- a/config/nbproject/project.xml +++ b/config/nbproject/project.xml @@ -97,7 +97,7 @@ src - jars/commons-cli-1.1.jar;jars/cortado-0.6.0.jar;jars/jogg-0.0.7.jar;jars/jorbis-0.0.15.jar;jars/miglayout-core-4.2.jar;jars/miglayout-swing-4.2.jar + jars/commons-cli-1.1.jar;jars/cortado-0.6.0.jar;jars/jogg-0.0.17.jar;jars/jorbis-0.0.17.jar;jars/miglayout-core-4.2.jar;jars/miglayout-swing-4.2.jar build . doc diff --git a/data/mods/example/FreeColMessages.properties b/data/mods/example/FreeColMessages.properties index 2c4fdae25..2deea49e1 100644 --- a/data/mods/example/FreeColMessages.properties +++ b/data/mods/example/FreeColMessages.properties @@ -1,2 +1,2 @@ mod.example.name=Example Mod -mod.example.shortDescription=This mod changes the picture of the Expert Farmer into a Milkmaid. +mod.example.shortDescription=This mod adds an alternate version of the Expert Farmer. diff --git a/data/mods/example/resources.properties b/data/mods/example/resources.properties index 0887756e5..79f16bac9 100644 --- a/data/mods/example/resources.properties +++ b/data/mods/example/resources.properties @@ -1,6 +1,6 @@ -image.unit.model.unit.expertFarmer=milkmaid.png +#image.unit.model.unit.expertFarmer=milkmaid.png -#image.unit.model.unit.milkmaid=resources/images/units/milkmaid.png +image.unit.model.unit.milkmaid=milkmaid.png #image.unit.model.unit.milkmaid.scout=resources/images/units/scout/scout.png #image.unit.model.unit.milkmaid.pioneer=resources/images/units/pioneer/pioneer.png #image.unit.model.unit.milkmaid.soldier=resources/images/units/soldier/soldier.png diff --git a/data/mods/plantForest/ModMessages.properties b/data/mods/plantForest/ModMessages.properties index 4c6e34a94..656832aa5 100644 --- a/data/mods/plantForest/ModMessages.properties +++ b/data/mods/plantForest/ModMessages.properties @@ -3,3 +3,9 @@ model.improvement.plantForest.action=Plant forest model.improvement.plantForest.occupationString=f plantForestAction.name=Plant forest plantForestAction.accelerator= +report.requirements.tile.plantForest=%type% to the %direction% of %colony% would benefit from planting a new forest. +report.requirements.tile.plantForest.center=%colony% would benefit from plant a forest on its tile. +report.colony.tile.plantForest.description=%colony% would benefit from reforesting {{plural:%amount%|one=one tile|other=%amount% tiles}} +report.colony.tile.plantForest.specific.description=%colony% would benefit from reforesting %location% +report.colony.tile.plantForest.header=f +report.colony.tile.plantForest.header.description=Number of colony tiles that would benefit from reforestation. diff --git a/data/rules/classic/resources.properties b/data/rules/classic/resources.properties index ec06cc53d..b205ba68a 100644 --- a/data/rules/classic/resources.properties +++ b/data/rules/classic/resources.properties @@ -14,22 +14,23 @@ sound.attack.artillery=resources/sound/attack/artillery.ogg sound.attack.mounted=resources/sound/attack/dragoon.ogg sound.attack.naval=resources/sound/attack/naval.ogg # TODO: sound.attack.bombard +sound.attack.bombard=resources/sound/attack/artillery.ogg # TODO: sound.attack.foot sound.event.meet.model.nation.aztec=resources/sound/meet/aztec.ogg # TODO: sound.event.meet. -sound.event.buildingComplete=resources/sound/building.ogg -sound.event.captureColony=resources/sound/colony.ogg -sound.event.illegalMove=resources/sound/illegal.ogg -sound.event.alertSound=resources/sound/alert.ogg +sound.event.buildingComplete=resources/sound/event/building.ogg +sound.event.illegalMove=resources/sound/event/illegal.ogg +sound.event.alertSound=resources/sound/event/alert.ogg +sound.event.fountainOfYouth=resources/sound/event/fountain.ogg +sound.event.missionEstablished=resources/sound/event/mission.ogg +sound.event.loadCargo=resources/sound/event/load.ogg +sound.event.sellCargo=resources/sound/event/sell.ogg # TODO: specific sound for cashInTreasureTrain -sound.event.cashInTreasureTrain=resources/sound/sell.ogg +sound.event.cashInTreasureTrain=resources/sound/event/sell.ogg +sound.event.captureColony=resources/sound/event/colony.ogg # TODO: sound.event.destroySettlement -sound.event.destroySettlement=resources/sound/colony.ogg -sound.event.fountainOfYouth=resources/sound/fountain.ogg -sound.event.loadCargo=resources/sound/load.ogg -sound.event.missionEstablished=resources/sound/mission.ogg -sound.event.sellCargo=resources/sound/sell.ogg -sound.event.shipSunk=resources/sound/sunk.ogg +sound.event.destroySettlement=resources/sound/event/colony.ogg +sound.event.shipSunk=resources/sound/event/sunk.ogg # Order buttons image.miscicon.button.normal.wait=resources/images/ui/order-buttons/normal/wait.png diff --git a/data/rules/classic/resources/sound/README b/data/rules/classic/resources/sound/event/README similarity index 100% rename from data/rules/classic/resources/sound/README rename to data/rules/classic/resources/sound/event/README diff --git a/data/rules/classic/resources/sound/alert.ogg b/data/rules/classic/resources/sound/event/alert.ogg similarity index 100% rename from data/rules/classic/resources/sound/alert.ogg rename to data/rules/classic/resources/sound/event/alert.ogg diff --git a/data/rules/classic/resources/sound/building.ogg b/data/rules/classic/resources/sound/event/building.ogg similarity index 100% rename from data/rules/classic/resources/sound/building.ogg rename to data/rules/classic/resources/sound/event/building.ogg diff --git a/data/rules/classic/resources/sound/colony.ogg b/data/rules/classic/resources/sound/event/colony.ogg similarity index 100% rename from data/rules/classic/resources/sound/colony.ogg rename to data/rules/classic/resources/sound/event/colony.ogg diff --git a/data/rules/classic/resources/sound/fountain.ogg b/data/rules/classic/resources/sound/event/fountain.ogg similarity index 100% rename from data/rules/classic/resources/sound/fountain.ogg rename to data/rules/classic/resources/sound/event/fountain.ogg diff --git a/data/rules/classic/resources/sound/illegal.ogg b/data/rules/classic/resources/sound/event/illegal.ogg similarity index 100% rename from data/rules/classic/resources/sound/illegal.ogg rename to data/rules/classic/resources/sound/event/illegal.ogg diff --git a/data/rules/classic/resources/sound/load.ogg b/data/rules/classic/resources/sound/event/load.ogg similarity index 100% rename from data/rules/classic/resources/sound/load.ogg rename to data/rules/classic/resources/sound/event/load.ogg diff --git a/data/rules/classic/resources/sound/mission.ogg b/data/rules/classic/resources/sound/event/mission.ogg similarity index 100% rename from data/rules/classic/resources/sound/mission.ogg rename to data/rules/classic/resources/sound/event/mission.ogg diff --git a/data/rules/classic/resources/sound/sell.ogg b/data/rules/classic/resources/sound/event/sell.ogg similarity index 100% rename from data/rules/classic/resources/sound/sell.ogg rename to data/rules/classic/resources/sound/event/sell.ogg diff --git a/data/rules/classic/resources/sound/sunk.ogg b/data/rules/classic/resources/sound/event/sunk.ogg similarity index 100% rename from data/rules/classic/resources/sound/sunk.ogg rename to data/rules/classic/resources/sound/event/sunk.ogg diff --git a/data/rules/classic/specification.xml b/data/rules/classic/specification.xml index b9665d350..6062ef8c2 100644 --- a/data/rules/classic/specification.xml +++ b/data/rules/classic/specification.xml @@ -1594,6 +1594,10 @@ recruit-probability="1" score-value="4"> + + + + type="multiplicative" value="3"> @@ -2512,9 +2516,9 @@ - + + + + + + -client.choicePlayer=Please choose a player: +client.choicePlayer=Please choose a nation: client.classic=Failed to load resource mapping from rule set `classic'. client.debugConnect=You can not connect to an existing game in debug mode. client.ending=The game is ending. @@ -2674,9 +2687,9 @@ metaServer.communicationError=There was an error while communicating with the me # Lots of messages here, prefix more specific to the actual use abandonEducation.action.studying=studying abandonEducation.action.teaching=teaching -abandonEducation.no=No, continue the education +abandonEducation.no=Continue education abandonEducation.text=If your %unit% leaves %colony% it will abandon %action% in the %building%, are you sure it should leave? -abandonEducation.yes=Yes, leave the colony +abandonEducation.yes=Abandon education abandonTeaching.text=If your %unit% leaves the %building% it will stop teaching, are you sure it should leave? armedUnitSettlement.attack=Attack armedUnitSettlement.tribute=Demand tribute @@ -2687,11 +2700,11 @@ buy.takeOffer=Accept the offer buy.text=The %nation% would like to sell their %goods% for %gold%: clearTradeRoute.text=Your %unit% is assigned to trade route %route%. Setting its destination will drop it from the trade route. Are you sure you want to do this? client.fullScreen=Full screen mode is not supported for this GraphicsDevice.\nFalling back to windowed mode. -confirmHostile.alliance=You can not attack an allied nation! Do you really wish to break your alliance with the %nation% and declare war? -confirmHostile.ceaseFire=You have signed a cease fire with the %nation%. Do you really wish to attack? -confirmHostile.peace=You are at peace with the %nation%. Do you really wish to declare war? +confirmHostile.alliance=You can not attack an allied nation! Do you really wish to break your alliance with {{tag:country|%nation%}} and declare war? +confirmHostile.ceaseFire=You have signed a cease fire with {{tag:country|%nation%}}. Do you really wish to attack? +confirmHostile.peace=You are at peace with {{tag:country|%nation%}}. Do you really wish to declare war? confirmHostile.yes=Yes, let slip the dogs of war! -confirmTribute.broke=Our spies report that the %nation% are utterly broke. Let us not waste our time with tribute demands. +confirmTribute.broke=Our spies report that {{tag:country|%nation%}} is utterly broke. Let us not waste our time with tribute demands. confirmTribute.european=The %nation% %danger%, and %finance%. How much tribute should we demand of them? confirmTribute.happy=The %nation% at %settlement% are good friends to us, it is a pity to damage our comradeship. confirmTribute.no=Perhaps we had better not @@ -2710,7 +2723,7 @@ indianLand.cancel=Leave the land indianLand.pay=Offer %amount% gold for the land indianLand.take=Take what is rightfully ours indianLand.text=This land is owned by the %player%. Would you like to: -indianLand.unknown=Some unknown people live in these lands. Would you like to: +indianLand.unknown=Some uncontacted people live in these lands. Would you like to: info.autodetectLanguageSelected=You have now chosen to autodetect the language. This will be done the next time you restart the game. info.enterSomeText=Please enter some text. info.newLanguageSelected=Setting the language to %language%. You will need to restart the game for the changes to fully take effect. @@ -2758,8 +2771,8 @@ defeated.text=You have been defeated! Would you like to: defeated.yes=Stay and Watch defeatedSinglePlayer.text=You have been defeated!\n\nTis now the very witching time of night, When churchyards yawn and hell itself breathes out contagion to this world, now could I drink hot blood! and do such bitter business, as the day would quake to look on. defeatedSinglePlayer.yes=Enter Revenge Mode -diplomacy.offerAccepted=The %nation% have accepted your generous offer. -diplomacy.offerRejected=The %nation% have rejected your generous offer. +diplomacy.offerAccepted={{tag:country|%nation%}} has accepted your generous offer. +diplomacy.offerRejected={{tag:country|%nation%}} has rejected your generous offer. disbandUnit.text=Are you sure you want to disband this unit? disbandUnit.yes=Disband disembark.text=Greetings sailor, do you wish to disembark? @@ -2804,8 +2817,8 @@ move.noAccessGoods=The %nation% will not trade with an empty %unit%. move.noAccessMissionBan=The %nation% refuse all contact with your missionaries. move.noAccessSettlement=The %nation% do not allow our %unit% to enter their settlement. move.noAccessSkill=Our %unit% can not learn from the natives. -move.noAccessTrade=We do not have authority to trade with other European nations such as the %nation%. -move.noAccessWar=We can not trade with the %nation% while at war. +move.noAccessTrade=We do not have authority to trade with other European nations such as {{tag:country|%nation%}}. +move.noAccessWar=We can not trade with the %nation% nation while at war. move.noAccessWater=Our %unit% must land before entering the settlement. move.noAttackWater=Our %unit% must land before attacking. move.noTile=Our %unit% is not on the map! @@ -2867,7 +2880,7 @@ server.invalidPlayerNations=All players need to pick a unique nation before the server.maximumPlayers=Sorry, the maximum number of players has been reached. server.missingUserName=The user name is missing from the login request. server.missingVersion=The FreeCol version is missing from the login request. -server.noRouteToServer=The server cannot be made public. You should modify your firewall settings to allow connections on the port you specified. +server.noRouteToServer=The server cannot be made public as it could not connect to the metaserver. server.noSuchPlayer=The game does not contain a player called: %player% server.notAllReady=Not all players are ready to begin the game! server.onlyAdminCanLaunch=Sorry, only the server admin can launch the game. @@ -2879,7 +2892,7 @@ server.wrongFreeColVersion=The client and server FreeCol versions do not match. # server.control.InGameController # And again, lots of messages with prefix chosen from use -buildColony.others=The %nation% have founded the new colony of %colony% in %region%. +buildColony.others={{tag:country|%nation%}} has founded the new colony of %colony% in %region%. cashInTreasureTrain.colonial=A treasure with %amount% gold has been landed in Europe. %cashInAmount% gold has been cashed in. cashInTreasureTrain.independent=A treasure of %amount% has been added to the national treasury. cashInTreasureTrain.otherColonial=A treasure of %amount% has been landed in Europe. The %nation% monarch is apparently pleased. @@ -2888,7 +2901,7 @@ declareIndependence.announce=The %oldNation% colonies have declared independence declareIndependence.continentalArmyMuster=In support of your declaration of independence, %number% {{plural:%number%|%oldUnit%}} in %colony% {{plural:%number%|one=has|other=have}} been promoted to {{plural:%number%|%unit%}}! declareIndependence.interventionForce={{tag:country|%nation%}} solemnly pledges to dispatch an Intervention Force to support your legitimate struggle for independence, provided you generate %number% Freedom {{plural:%number%|one=Bell|other=Bells}} in order to prove your determination. declareIndependence.nativeSupport=The %nation% declare their contempt for %ruler% and the Royal Expeditionary Force, and promise to attack them at any opportunity. -declareIndependence.nativeHostile=Our spies report that the Royal Expeditionary Force have established friendly relations with the %nation%. Beware that they may be planning to attack! +declareIndependence.nativeHostile=Our spies report that the Royal Expeditionary Force have established friendly relations with the %nation% nation. Beware that they may be planning to attack! declareIndependence.resolution=This Day the Congress has passed the most important Resolution, that ever was taken in America.\n\nI am well aware of the Toil and Blood and Treasure, that it will cost Us to maintain this Declaration, and support and defend these States. Yet through all the Gloom I can see the Rays of ravishing Light and Glory. I can see that the End is more than worth all the Means. And that Posterity will triumph in that Days Transaction, even although We should rue it, which I trust in God We shall not.\n\nThe Royal Expeditionary Force will soon be upon us. Prepare our defences carefully while we raise voluntaires for a new Continental Army. declareIndependence.unitsSeized=In reaction to your declaration of independence, the Crown has seized the following units in Europe and at sea: %units% deliverGift.goods=The %player% deliver a gift of %amount% %type% to %settlement%. @@ -2998,7 +3011,7 @@ colopedia.unit.offensivePower=Offensive Power: colopedia.unit.price=Price in Europe: colopedia.unit.productionBonus=Production {{plural:%number%|one=modifier|other=modifiers}}: colopedia.unit.requirements=Requirements: -colopedia.unit.school=School required to train: +colopedia.unit.school=May teach in: colopedia.unit.skill=Skill Level: @@ -3033,40 +3046,60 @@ report.labour.workingAsOther=other # ReportColonyPanel # reuses colonyPanel.currentlyBuilding report.colony.arriving.description=%colony%: new %unit% {{plural:%turns%|one=next turn|other=in %turns% turns}} +report.colony.arriving.summary.description=The average number of turns before a new colonist arrives in the colonies of this continent report.colony.birth.description=Number of turns until a new colonist arrives or starves report.colony.explore.description=Number of tiles to Explore adjacent to this colony report.colony.explore.header=E report.colony.exploring.description=%colony% would benefit from exploring {{plural:%amount%|one=one tile|other=%amount% tiles}} +report.colony.exploring.summary.description=Total number of colony tiles that would benefit from exploring for this continent. report.colony.grow.description=Number of units the colony can grow by without harming production report.colony.grow.header=+ report.colony.growing.description=%colony% can grow by {{plural:%amount%|one=one unit|other=%amount% units}} without harming production +report.colony.growing.summary.description=The total number of colonists that can join colonies of this continent without harming production report.colony.improve.description=Units that could improve production. report.colony.improve.header=Improve -report.colony.improving.description=%colony%: To make %amount% more %goods%, replace %oldUnit% with %unit% -report.colony.wanting.description=%colony%: To make %amount% more %goods%, add %unit% +report.colony.improving.description=%colony% %location%: To make %amount% more %goods%, replace %oldUnit% with %unit% +report.colony.improving.summary.description=Units (type and count) that would benefit colonies of this continent report.colony.making.blocking.description=%colony%: %amount% %goods% needed for %buildable% {{plural:%turns%|one=next turn|other=in %turns% turns}} report.colony.making.constructing.description=%colony%: %buildable% completes {{plural:%turns%|one=next turn|other=in %turns% turns}} report.colony.making.description=What this colony is making report.colony.making.educating.description=%colony%: %teacher% graduates {{plural:%turns%|one=next turn|other=in %turns% turns}} +report.colony.making.educationVacancy.description=%colony%: {{plural:%number%|one=one student place is|other=%number% student places are}} vacant +report.colony.making.educating.summary.description=Units (type and count) expected to graduate from schools of this continent report.colony.making.header=Making report.colony.making.noconstruction.description=%colony%: No construction occurring report.colony.making.noteach.description=%colony%: %teacher% lacks a student +report.colony.making.summary.description=The per turn %goods% deficit due to the unsatisfied building requirements of this continent report.colony.name.description=The list of colonies report.colony.name.header=Colony -report.colony.plow.description=Number of colony tiles that would benefit from Plowing -report.colony.plow.header=P -report.colony.plowing.description=%colony% would benefit from plowing {{plural:%amount%|one=one tile|other=%amount% tiles}} -report.colony.production.description=%colony%: net %goods% production = %amount% -report.colony.production.export.description=%colony%: net %goods% production is %amount% (exporting above %export%) +report.colony.name.summary.description=The region containing more of the above colonies of this continent +report.colony.production.description=%colony%: %amount% %goods% are being produced +report.colony.production.export.description=%colony%: %amount% %goods% are being produced (exporting above %export%) report.colony.production.header=Net %goods% production -report.colony.production.high.description=%colony%: net %goods% production = %amount%, full {{plural:%turns%|one=next turn|other=in %turns% turns}} -report.colony.production.low.description=%colony%: net %goods% production = %amount%, gone {{plural:%turns%|one=next turn|other=in %turns% turns}} -report.colony.production.waste.description=%colony%: net %goods% production = %amount%, warehouse will overflow, %waste% will be wasted -report.colony.road.description=Number of colony tiles that would benefit from Road building -report.colony.road.header=R -report.colony.roadBuilding.description=%colony% would benefit from building {{plural:%amount%|one=a road|other=%amount% roads}} +report.colony.production.high.description=%colony%: %amount% %goods% are being produced, full {{plural:%turns%|one=next turn|other=in %turns% turns}} +report.colony.production.low.description=%colony%: %amount% %goods% are being consumed, gone {{plural:%turns%|one=next turn|other=in %turns% turns}} +report.colony.production.maxConsumption.description=%colony%: %amount% %goods% are being consumed (could consume %more% more) +report.colony.production.maxProduction.description=%colony%: %amount% %goods% are being produced (could produce %more% more) +report.colony.production.summary.description=The amount of goods being produced or consumed +report.colony.production.waste.description=%colony%: %amount% %goods% are being produced, warehouse will overflow, %waste% will be wasted +report.colony.tile.clearForest.description=%colony% would benefit from clearing {{plural:%amount%|one=one tile|other=%amount% tiles}} +report.colony.tile.clearForest.specific.description=%colony% would benefit from clearing %location% +report.colony.tile.clearForest.header=C +report.colony.tile.clearForest.header.description=Number of colony tiles that would benefit from clearing. +report.colony.tile.clearForest.summary.description=Total number of colony tiles that would benefit from clearing for this continent. +report.colony.tile.plow.description=%colony% would benefit from plowing {{plural:%amount%|one=one tile|other=%amount% tiles}} +report.colony.tile.plow.specific.description=%colony% would benefit from plowing %location% +report.colony.tile.plow.header=P +report.colony.tile.plow.header.description=Number of colony tiles that would benefit from plowing. +report.colony.tile.plow.summary.description=Total number of colony tiles that would benefit from plowing for this continent. +report.colony.tile.road.description=%colony% would benefit from building {{plural:%amount%|one=a road|other=%amount% roads}} +report.colony.tile.road.specific.description=%colony% would benefit from building a road at %location% +report.colony.tile.road.header=R +report.colony.tile.road.header.description=Number of colony tiles that would benefit from road building. +report.colony.tile.road.summary.description=Total number of colony tiles that would benefit from road building for this continent. report.colony.shrinking.description=%colony% must shrink by {{plural:%amount%|one=one unit|other=%amount% units}} to improve production report.colony.starving.description=%colony%: starvation {{plural:%turns%|one=next turn|other=in %turns% turns}} +report.colony.wanting.description=%colony% %location%: To make %amount% more %goods%, add %unit% # ReportContinentalCongressPanel report.continentalCongress.available=Available @@ -3139,15 +3172,15 @@ report.production.update=Update # ReportRequirementsPanel report.requirements.badAssignment=%colony% has a %expert% currently working as %expertWork%, while a %nonExpert% is working as %nonExpertWork%. Production would be greater if the colonists swapped jobs. report.requirements.canTrainExperts={{plural:2|%unit%}} can be trained at -report.requirements.clearTile=%type% to the %direction% of %colony% would benefit from clearing. -report.requirements.exploreTile=%type% to the %direction% of %colony% would benefit from exploration. +report.requirements.exploreTile=%location% would benefit from exploration. report.requirements.met=All requirements are met. report.requirements.missingGoods=%colony% is producing %goods%, but requires more %input%. report.requirements.misusedExperts=There are {{plural:2|%unit%}} not working as %work% present at report.requirements.noExpert=%colony% is producing %goods%, but has no %unit%. -report.requirements.plowCenter=%colony% would benefit from plowing its tile. -report.requirements.plowTile=%type% to the %direction% of %colony% would benefit from plowing. -report.requirements.roadTile=%type% to the %direction% of %colony% would benefit from road building. +report.requirements.tile.clearForest=%location% would benefit from clearing. +report.requirements.tile.plow=%location% would benefit from plowing. +report.requirements.tile.road=%location% would benefit from road building. +#report.requirements.tile.road.center can not happen report.requirements.severalExperts=Several {{plural:2|%unit%}} are present at report.requirements.surplus=A surplus of %goods% is being produced at @@ -3155,7 +3188,8 @@ report.requirements.surplus=A surplus of %goods% is being produced at report.trade.afterTaxes=Income after taxes report.trade.beforeTaxes=Income before taxes report.trade.cargoUnits=Units in Cargo -report.trade.hasCustomHouse=* This colony has a custom house; these goods are exported. +report.trade.export=Exporting %goods% above %amount% +report.trade.hasCustomHouse=* This colony has a custom house, and may export goods. report.trade.totalDelta=Total Production report.trade.totalUnits=Total Units report.trade.unitsSold=Units bought or sold @@ -3163,7 +3197,7 @@ report.trade.unitsSold=Units bought or sold # ReportTurnPanel report.turn.filter=Do not display this type of message (%type%) report.turn.ignore=Ignore this message (Colony: %colony%, Goods: %goods%) -report.turn.playerNation=%player%'s %nation% +report.turn.playerNation=%player%'s {{tag:country|%nation%}} # -14- Dialogs, Labels and Panels @@ -3171,6 +3205,7 @@ report.turn.playerNation=%player%'s %nation% # AboutPanel aboutPanel.copyright=Copyright © 2002-2015 The FreeCol Team aboutPanel.legalDisclaimer=FreeCol is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or any later version. +aboutPanel.manual=FreeCol Manual Download aboutPanel.officialSite=Official site: aboutPanel.sfProject=SourceForge project: aboutPanel.version=Version: @@ -3207,7 +3242,7 @@ colonyPanel.buildQueue=Build Queue colonyPanel.colonyUnits=Colony Units colonyPanel.inPort=In Port colonyPanel.outsideColony=Outside Colony -colonyPanel.producing=Producing: +colonyPanel.producing=producing: colonyPanel.reducePopulation=If you reduce the population below %number%, %colony% will no longer be able to build %buildable%. colonyPanel.setGoods=Set Goods colonyPanel.traceWork=Trace Work @@ -3228,8 +3263,8 @@ confirmDeclarationDialog.areYouSure.no=Maybe Later confirmDeclarationDialog.areYouSure.text=Let us renounce the unjust tyranny of %monarch% and declare the independence of our colonies from the crown! confirmDeclarationDialog.areYouSure.yes=Liberty or Death! confirmDeclarationDialog.createFlag=and our enemies shall tremble at the sight of our defiant banner. -confirmDeclarationDialog.defaultCountry=United States of %nation% -confirmDeclarationDialog.defaultNation=Free %nation% +confirmDeclarationDialog.defaultCountry=United States of {{tag:country|%nation%}} +confirmDeclarationDialog.defaultNation=Free {{tag:country|%nation%}} confirmDeclarationDialog.enterCountry=Henceforth, our country shall be known as confirmDeclarationDialog.enterNation=and every citizen of our glorious nation shall be proud to be known as flag.background.FESSES=Fesses @@ -3286,10 +3321,10 @@ negotiationDialog.add=Add negotiationDialog.cancel=Cancel negotiationDialog.clear=Clear negotiationDialog.contact.tutorial=You meet fellow Europeans. They will compete with you for land and riches, and may well wage war against you. But after Jan de Witt has joined the Continental Congress, you can trade with them. -negotiationDialog.demand=The %nation% require of the %otherNation% +negotiationDialog.demand={{tag:country|%nation%}} requires of {{tag:country|%otherNation%}} negotiationDialog.exchange=in return for negotiationDialog.goldAvailable=(%amount% gold available) -negotiationDialog.offer=The %nation% offer the %otherNation% +negotiationDialog.offer={{tag:country|%nation%}} offers {{tag:country|%otherNation%}} negotiationDialog.send=Send negotiationDialog.title.contact=Meeting Fellow Europeans negotiationDialog.title.diplomatic=Diplomatic Negotiation @@ -3330,10 +3365,10 @@ findSettlementPanel.name=Find Settlement findSettlementPanel.settlement=%name%%capital% (%nation%) # FirstContactDialog -firstContactDialog.meeting.natives=Meeting the natives... +firstContactDialog.meeting.natives=Meeting the natives firstContactDialog.meeting.natives.tutorial=You meet natives. Send your Scouts to their settlements in order to learn more about them, and your Indentured Servants and Free Colonists in order to learn from them. Send your ships and Wagon Trains to their settlements if you wish to trade with them. -firstContactDialog.meeting.AZTEC=The Aztec nation... -firstContactDialog.meeting.INCA=The Inca empire... +firstContactDialog.meeting.aztec=The Aztec nation +firstContactDialog.meeting.inca=The Inca empire firstContactDialog.welcomeOffer.text=The %nation% welcome you. We are a glorious nation of %camps% %settlementType%. To celebrate our friendship, we generously offer you the land you now occupy as a gift. Will you accept our treaty and lie with us in peace as brothers? firstContactDialog.welcomeSimple.text=The %nation% welcome you. We are a glorious nation of %camps% %settlementType%. Will you accept our treaty and lie with us in peace as brothers? @@ -3396,6 +3431,7 @@ mapSizeDialog.mapSize=Select map size # ModifierFormat modifierFormat.unknown=??? +modifierFormat.scopeMethod.isIndian.name=natives # MonarchDialog monarchDialog.default=A message from the Crown @@ -3709,7 +3745,7 @@ model.nation.dutch.ship.47=Koe model.nation.dutch.ship.48=Liefde model.nation.dutch.ship.49=Mackreel model.nation.dutch.ship.50=Maecht van Enckhuysen -model.nation.dutch.ship.51=Malckmeyt or Melckmeyt +model.nation.dutch.ship.51=Melckmeyt model.nation.dutch.ship.52=Margriet model.nation.dutch.ship.53=Meeuwken model.nation.dutch.ship.54=Merimin @@ -4164,7 +4200,7 @@ model.nation.french.settlementName.classic.63=Port Menier model.nation.french.settlementName.classic.64=Portage la Prairie model.nation.french.settlementName.classic.65=St. Boniface -model.nation.french.settlementName.freecol.0=Ville de Québec +model.nation.french.settlementName.freecol.0=Québec #1541 model.nation.french.settlementName.freecol.1=Charlesfort #1562 @@ -4795,16 +4831,16 @@ model.nation.portuguese.region.river.22=São Francisco model.nation.portuguese.region.river.23=Parnaíba model.nation.portuguese.region.river.24=Tietê -model.nation.portuguese.region.mountain.1=Serra da Estrela -model.nation.portuguese.region.mountain.2=Serra do Morião -model.nation.portuguese.region.mountain.3=Serra de Santa Bárbara -model.nation.portuguese.region.mountain.4=Serra da Ribeirinha -model.nation.portuguese.region.mountain.5=Serra da Boa Viagem -model.nation.portuguese.region.mountain.6=Serra da Marofa -model.nation.portuguese.region.mountain.7=Serra do Bussaco -model.nation.portuguese.region.mountain.8=Serra da Coroa -model.nation.portuguese.region.mountain.9=Serra de Sintra -model.nation.portuguese.region.mountain.10=Monte Pascoal +model.nation.portuguese.region.mountain.1=Monte Pascoal +model.nation.portuguese.region.mountain.2=Serra da Estrela +model.nation.portuguese.region.mountain.3=Serra do Morião +model.nation.portuguese.region.mountain.4=Serra de Santa Bárbara +model.nation.portuguese.region.mountain.5=Serra da Ribeirinha +model.nation.portuguese.region.mountain.6=Serra da Boa Viagem +model.nation.portuguese.region.mountain.7=Serra da Marofa +model.nation.portuguese.region.mountain.8=Serra do Bussaco +model.nation.portuguese.region.mountain.9=Serra da Coroa +model.nation.portuguese.region.mountain.10=Serra de Sintra model.nation.portuguese.region.mountain.11=Serra Geral model.nation.portuguese.region.mountain.12=Serra do Mar model.nation.portuguese.region.mountain.13=Serra Vermelha diff --git a/data/strings/FreeColMessages_af.properties b/data/strings/FreeColMessages_af.properties index 8c010b272..9c6f3cf29 100644 --- a/data/strings/FreeColMessages_af.properties +++ b/data/strings/FreeColMessages_af.properties @@ -135,8 +135,9 @@ cli.no-java-check=slaan die java weergawebeheer oor cli.no-memory-check=slaan die geheuebeheer oor cli.no-sound=begin FreeCol sonder klank cli.private=begin 'n privaat bediener (nie gepubliseer na die metabediener) -cli.server-name=gee 'n aangepaste NAAM aan die bediener +# Fuzzy cli.server=begin 'n aleenstaande bediener op die gespesifiseerde poort +cli.server-name=gee 'n aangepaste NAAM aan die bediener cli.splash=vertoon 'n flitsskermbeeld LêER solank die spel laai cli.tc=laai die totale omskakeling met die gegewe NAAM cli.version=vertoon die weergawe nommer en sluit af @@ -177,7 +178,6 @@ colopediaAction.goods.name=Goedere colopediaAction.nations.name=Nasies colopediaAction.nationTypes.name=Nasionale voordele colopediaAction.resources.name=Bonus grondstowwe -colopediaAction.skills.name=Bekwaamdhede colopediaAction.terrain.name=Terrein-tipes colopediaAction.units.name=Eenhede colopediaAction.name=%object% (Colopedia) @@ -1178,24 +1178,33 @@ model.building.locationLabel=In %location% model.colony.badGovernment=Regering effektiwiteit van %colony% is sleg. Produksie verhindering vind plaas. model.colony.governmentImproved1=Regering van %colony% het verbeter, maar is nog oneffektief. Produksie verhindering vind steeds plaas. model.colony.governmentImproved2=Regering van %colony% het verbeter. Produksie verhindering vind nie meer plaas nie. +# Fuzzy model.colony.insufficientProduction=In %colony% sou %outputAmount% meer %outputType% geproduseer kan word as daar %inputAmount% meer %inputType% beskikbaar was. model.colony.minimumColonySize=%object% verhoed dat bevolking verder kan verminder. model.colony.unbuildable=%colony% kan nie tans %object% bou nie. %object% is uit die boulys verwyder. model.colony.veryBadGovernment=Regering effektiwiteit van %colony% is baie sleg. Erge produksie verhindering vind plaas. model.historyEventType.abandonColony.description=U laat vaar die kolonie van %colony%. +# Fuzzy model.historyEventType.cityOfGold.description=Die %nation% ontdek %city%, een van die Sewe Stede van Goud, en 'n skat van %treasure% goud. +# Fuzzy model.historyEventType.colonyConquered.description=U kolonie %colony% is deur die %nation% verower. +# Fuzzy model.historyEventType.colonyDestroyed.description=U kolonie %colony% is deur die %nation% vernietig. # Fuzzy model.historyEventType.declareIndependence.description=U vernietig die nedersetting %settlement% van die %nation%. +# Fuzzy model.historyEventType.destroyNation.description=U maak die %nation% van kant. model.historyEventType.discoverNewWorld.description=U het die Nuwe Wêreld ontdek. +# Fuzzy model.historyEventType.discoverRegion.description=Die %nation% het die %region% ontdek. model.historyEventType.foundColony.description=U het die kolonie %colony% gevestig. model.historyEventType.foundingFather.description=%father% tree tot die Kontinentale Kongres toe model.historyEventType.independence.description=U bereik onafhanklikheid van die Kroon. +# Fuzzy model.historyEventType.meetNation.description=U ontmoet die %nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=Die %nation% is van kant gemaak. +# Fuzzy model.historyEventType.spanishSuccession.description=Die %loserNation% staan al hul kolonies in die Nuwe Wêreld af aan die %nation%. model.indianSettlement.mostHatedNone=Geen model.indianSettlement.nameUnknown=Onbekend @@ -1240,6 +1249,7 @@ model.nationState.notAvailable.name=nie beskikbaar nie model.player.forces=%nation% Magte model.player.independentMarket=Europa model.player.startGame=Na maande op see het u eindelik by die kus van 'n onbekende kontinent aangekom. Seil na die weste om die Nuwe Wêreld te ontdek en dit vir die kroon toe te eien. +# Fuzzy model.player.waitingFor=Wag vir: %nation% model.regionType.coast.name=Kus model.regionType.coast.unknown=Onbekende kusgebied @@ -1288,9 +1298,9 @@ model.unit.underRepair=Besig met herstelwerk (%turns% beurte oor) model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S +# Fuzzy model.unit.unitState.skipped=W model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G @@ -1315,23 +1325,29 @@ model.colony.warehouseOverfull=Die pakhuis in %colony% is vol met %goods%. model.colony.warehouseSoonFull=Die pakhuis in %colony% sal teen die volgende beurt vol %goods% wees. %amount% %goods% sal vermors word. model.colony.warehouseWaste=Die pakhuis in %colony% is oorvol met %goods%. %waste% eenhede is weggegooi. model.colonyTile.resourceExhausted=Die grondstof %resource% is op in %colony% +# Fuzzy model.game.spanishSuccession=U eksellensie, die Oorlog van Spaanse Opvolging het in Europa geëindig. Volgens die ooreenkoms van Utrecht, moes die %loserNation% alle kolonies in die Nuwe Wêreld oorgee aan die %nation%! model.indianSettlement.mission.denounced=Jou sendeling by %settlement% is aan die kaak gestel is tereggestel! model.player.colonyGoodsParty.harbour=U koloniste in %colony% het %amount% %goods% in die have gegooi in protes teen die oneerlike belasting van die koning! model.player.colonyGoodsParty.horses=U koloniste in %colony% het %amount% perde vrygelaat uit protes teen die onregverdige belasting deur die Kroon! model.player.colonyGoodsParty.landLocked=U koloniste in %colony% het %amount% eenhede %goods% verbrand op die markplein in protes teen die oneerlike belasting van die koning! +# Fuzzy model.player.dead.european=U eksellensie, die %nation% het verklaar 'n onvoorwaardelike ontrekking van die Nuwe Wêreld! model.player.dead.native=U eksellensie, die %nation% is vernietig. model.player.emigrate=In %europe% het %unit% besluit om te emigreer. model.player.foundingFatherJoinedCongress=%foundingFather% het by die kongres aangesluit!\n\n%description% model.player.soLDecrease=Rebelle in u kolonies het geval tot %newSoL% persent! model.player.soLIncrease=Rebelle in u kolonies het gestyg tot %newSoL% persent! +# Fuzzy model.player.stance.alliance.declared=U eksellensie, die %nation% is in alliansie met ons! model.player.stance.alliance.others=U eksellensie, die %attacker% is in alliansie met die %defender%. +# Fuzzy model.player.stance.ceaseFire.declared=U eksellensie, die %nation% het ooreengekom tot 'n skietstilstand met ons! model.player.stance.ceaseFire.others=U eksellensie, die %attacker% het ooreengekom tot 'n skietstilstand met die %defender%. +# Fuzzy model.player.stance.peace.declared=U eksellensie, die %nation% is in vredesooreenkoms met ons! model.player.stance.peace.others=U eksellensie, die %attacker% is in vredesooreenkoms met die %defender%. +# Fuzzy model.player.stance.war.declared=Slegte nuus, u eksellensie, die %nation% het oorlog verklaar op ons! model.player.stance.war.others=U eksellensie, die %attacker% het oorlog verklaar met die %defender%. combat.automaticDefence=U %unit% in %colony% het wapens opgeneem om die kolonie te verdedig! @@ -1346,6 +1362,7 @@ combat.enemyShipEvaded=%enemyNation% %enemyUnit% het die aanval deur %unit% ontw combat.enemyShipSunk=%unit% het %enemyNation% %enemyUnit% gesink! combat.equipmentCaptured=Pasop, die krygers van %nation% het %equipment% buitgemaak! combat.goodsStolen=%enemyNation% %enemyUnit% steel %amount% %goods% in %colony%! +# Fuzzy combat.indianPlunder=%enemyNation% %enemyUnit% plunder %amount% van %colony%. combat.indianTreasure=U plunder %amount% van %settlement%. combat.nativeCapitalBurned=U het %name% afgebrand, die hoofstad van %nation%. Die %nation% gee oor aan u mag! @@ -1393,6 +1410,7 @@ error.couldNotLoad='n Fout het voorgekom tydens spellaai! # Fuzzy error.couldNotSave='n Fout het voorgekom tydens spelstoor! main.defaultPlayerName=Speler Naam +# Fuzzy client.choicePlayer=Kies asseblief 'n speler: metaServer.couldNotConnect=Jammer, kon nie aan meta-bediener koppel. Probeer asseblief weer later. metaServer.communicationError=Daar was fout tydens die meta-bediener kommunikasie. Probeer asseblief weer later. @@ -1402,8 +1420,11 @@ buy.moreGold=Vra vir laer prys buy.takeOffer=Aanvaar die aanbod buy.text=Die %nation% wil graag hulle %goods% vir %gold% verkoop: clearTradeRoute.text=Jou %unit% is toegeken aan handelsroete roete %route%. Deur sy bestemming te stel, sal dit die handel roete laat vaar. Is jy seker jy wil dit doen? +# Fuzzy confirmHostile.alliance=U kan nie 'n bondgenoot aanval nie! Wil u regtig u alliansie met die %nation% verbreek en oorlog verklaar? +# Fuzzy confirmHostile.ceaseFire=We het 'n skietstaking onderteken met %nation%. Wil u steeds aanval? +# Fuzzy confirmHostile.peace=U is in vrede met die %nation%. Wil u regtig oorlog verklaar? error.noSuchFile=Die spesifieke lêer bestaan nie of is nie 'n gewone lêer nie. # Fuzzy @@ -1452,7 +1473,9 @@ clearSpeciality.areYouSure=Is u seker u wil 'n %oldUnit% demoveer na 'n %unit%? clearSpeciality.impossible=%unit% kan nie gedemoveer word nie! defeated.text=U is verslaan! Wil U graag: defeated.yes=Bly en kyk +# Fuzzy diplomacy.offerAccepted=U vrygewige aanbod is deur %nation% aanvaar. +# Fuzzy diplomacy.offerRejected=U vrygewige aanbod is deur %nation% verwerp. disbandUnit.text=Is U seker U wil hierdie eenheid ontbind? disbandUnit.yes=Agterlaat @@ -1492,7 +1515,9 @@ move.noAccessBeached='n Gestrande skip van die %nation% versper ons weg. move.noAccessContact=Ons moet eers oor land kontak maak met die %nation%, Eksellensie. move.noAccessSettlement=Die %nation% laat nie toe dat ons %unit% hul nedersetting betree nie. move.noAccessSkill=Ons %unit% kan nikts leer van die inheemse bevolking. +# Fuzzy move.noAccessTrade=Ons het geen volmag om handel te dryf met ander Europeërs soos die %nation% nie. +# Fuzzy move.noAccessWar=Ons kan geen handel dryf met die %nation% as ons in oorlog is nie. move.noAccessWater=Ons %unit% moet eers aan land kom voor dit die nedersetting kan betree. nameRegion.text=U het 'n %type% ontdek en eien dit toe aan die Kroon! Soos gebruiklik mag u dit 'n naam gee: @@ -1524,6 +1549,7 @@ server.fileNotFound=Kon nie die lêer met gegewe naam vind nie. server.incompatibleVersions=Die gestoorde spel wat u probeer laai is nie aanpasbaar met hierdie weergawe van FreeCol nie. server.invalidPlayerNations=Alle spelers moet 'n unieke nasie kies voor die spel kan begin. server.maximumPlayers=Jammer, die maksimum getal spelers is bereik. +# Fuzzy server.noRouteToServer=Die bediener kon nie publiek gemaak word nie. U moet u brandmuur opstelling verander om op die poort gespesifiseer te kan konnekteer. server.notAllReady=Nie al die spelers is gereed om die spel te begin nie! server.onlyAdminCanLaunch=Jammer, slegs die bediener admin kan die spel begin. @@ -1592,6 +1618,7 @@ colopedia.unit.price=Prys in Europa: # Fuzzy colopedia.unit.productionBonus=Produksiewysiger(s): colopedia.unit.requirements=Vereistes: +# Fuzzy colopedia.unit.school=Skool nodig vir opleiding: colopedia.unit.skill=Vaardigheid: report.labour.allColonists=Alle Koloniste @@ -1661,12 +1688,14 @@ report.requirements.surplus='n Oorskot van %goods% word geproduseer by report.trade.afterTaxes=Inkomste na belasting report.trade.beforeTaxes=Inkomste voor belasting report.trade.cargoUnits=Eenhede in vrag +# Fuzzy report.trade.hasCustomHouse=* Hierdie kolonie het 'n doannehuis; hierdie goedere word uitgevoer. report.trade.totalDelta=Totale produksie report.trade.totalUnits=Aantal eenhede report.trade.unitsSold=Eenhede gekoop of verkoop report.turn.filter=Moenie hierdie tipe boodskap vertoon nie (%type%) report.turn.ignore=Ignoreer die berig (Kolonie: %colony%, Goedere: %goods%) +# Fuzzy report.turn.playerNation=%player% se %nation% # Fuzzy aboutPanel.copyright=Kopiereg (C) 2002-2013 Die FreeCol-span @@ -1696,7 +1725,9 @@ colonyPanel.notBestTile=%unit% kan meer %goods% produseer op %tile%. confirmDeclarationDialog.areYouSure.no=Miskien later confirmDeclarationDialog.areYouSure.text=Laat ons die onregverdige tirannie van %monarch% verwerp en laat ons die onafhanklikheid van ons kolonies van die kroon verklaar! confirmDeclarationDialog.areYouSure.yes=Vryheid of die Dood! +# Fuzzy confirmDeclarationDialog.defaultCountry=Verenigde State van %nation% +# Fuzzy confirmDeclarationDialog.defaultNation=Vrye %nation% confirmDeclarationDialog.enterCountry=Voortaan staan ons land bekend as confirmDeclarationDialog.enterNation=elke burger van ons glorieryke land sal trots wees om bekend te staan as diff --git a/data/strings/FreeColMessages_ang.properties b/data/strings/FreeColMessages_ang.properties index eb00d488b..a52787fa8 100644 --- a/data/strings/FreeColMessages_ang.properties +++ b/data/strings/FreeColMessages_ang.properties @@ -165,8 +165,9 @@ cli.no-memory-check=oferhebbe þa gemyndes neosunge cli.no-sound=drif FreeCol leas sƿeges cli.private=beginne anlepigne þegntol (nis forþsend to þæm eallþegntole) cli.seed=gield SÆD to þæm leashlietlican rimforþberende -cli.server-name=ceose tpmearcodne NAMAN for þæm þegntole +# Fuzzy cli.server=beginne anstandendne þegntol on þære gecorenre dura +cli.server-name=ceose tpmearcodne NAMAN for þæm þegntole cli.splash=eoƿie inlædendes bredes bilides YMELAN þa hƿile þe þæt gamen si gehladen cli.tc=hlade þa fullan aƿendunge mid þissum NAMAN cli.timeout=rim eagbearhtma þa þe se þegntol abitt andsƿære sumre ascunge @@ -226,7 +227,6 @@ colopediaAction.goods.name=Cēapas colopediaAction.nations.name=Þēoda colopediaAction.nationTypes.name=Þēodlīca mihta colopediaAction.resources.name=Oferduȝuþlīce timberas -colopediaAction.skills.name=Cræftas colopediaAction.terrain.name=Landȝecynd colopediaAction.units.name=Ƿiht colopediaAction.name=%object% (Colopedia) @@ -1243,6 +1243,7 @@ model.building.locationLabel=On %location% model.colony.badGovernment=Se ƿealdscipe of %colony% ƿyrceþ earfoðe. Forþbǣro lyre ȝelimpþ. model.colony.governmentImproved1=Se ƿealdscipe of %colony% hafaþ bēted ȝeƿord, ac hit ȝīet ne ƿyrceþ ƿel. Forþbǣro lyre ȝīet ȝelimpþ. model.colony.governmentImproved2=Se ƿealdscipe of %colony% hafaþ bēted ȝeƿorden. Forþbǣro lyre ne ȝelimpþ ȝīet. +# Fuzzy model.colony.insufficientProduction=%outputAmount% mā %outputType% cūðe mann forþberan on %colony%, ȝif ƿē hæfden %inputAmount% mā þonne %inputType%fromfaru. model.colony.minimumColonySize=%object% ƿirneþ māran gelytlunge þære leodrædne. model.colony.unbuildable=%colony% ne cann timbrian %object% herrihte. %object% ƿæs anumen fram þære endebyrdnesse bolda to ƿesenne getimbrod. @@ -1256,21 +1257,29 @@ model.direction.SW.name=suþƿest model.direction.W.name=ƿest model.direction.NW.name=norþƿest model.historyEventType.abandonColony.description=Þū forlǣtst þā %colony%landbūnesse. +# Fuzzy model.historyEventType.cityOfGold.description=Sēo %nation%þēod fint þā %city%burȝe, ān þāra seofona ȝyldenena burȝa, and ēac hord %treasure% ȝoldes. +# Fuzzy model.historyEventType.colonyConquered.description=Þīn %colony%landbūness is oferƿunnen fram þǣre %nation%þēode. +# Fuzzy model.historyEventType.colonyDestroyed.description=Þīn %colony%landbūness is forloren fram þǣre %nation%þēode. # Fuzzy model.historyEventType.conquerColony.description=Þū ne dearst andfōn ūre holdan fōreƿearde and ȝīeþ æthlīepst lēane? Swilc tƿifealdness sceall ascian þā biteran lēane ūrre ƿrǣþþu. # Fuzzy model.historyEventType.declareIndependence.description=Þū forlure %settlement%setl %nation%þēode. +# Fuzzy model.historyEventType.destroyNation.description=Þā %nation% forluron þā %nativeNation%. model.historyEventType.discoverNewWorld.description=Þū hafast þā nīƿan land ȝefunden. +# Fuzzy model.historyEventType.discoverRegion.description=Sēo %nation%þēod fint %region%. model.historyEventType.foundColony.description=Þū staðolast þā landbūnesse þǣre %colony%landbūnesse. model.historyEventType.foundingFather.description=%father% formenȝeþ mid þǣm Ƿitenaȝemōte. model.historyEventType.independence.description=Þū efnest selfƿeald fram þǣm cynecynne. +# Fuzzy model.historyEventType.meetNation.description=Þū mētst þā %nation%þēode. +# Fuzzy model.historyEventType.nationDestroyed.description=%nation%þēod nis ȝīet andƿeard on þǣm nīƿum landum. +# Fuzzy model.historyEventType.spanishSuccession.description=Sēo %loserNation%þēod ȝieldeþ ealla heora landbūnessa on þǣm nīƿum landum tō þǣre %nation%þēode. model.indianSettlement.mostHatedNone=Nǣniȝ model.indianSettlement.nameUnknown=Uncūþ @@ -1315,6 +1324,7 @@ model.messageType.warning.name=Ƿærƿord model.monarch.action.addToRef.text=Se Cynescipe hafaþ geīht þone Cyneaspyriunghere mid %number% {{plural:%number%|%unit%}}. Landbūnesslādmenn gecȳðaþ ƿærlīcnesse. model.monarch.action.addToRef.no=Fulfremed model.monarch.action.declarePeace.no=Fulfyled lā +# Fuzzy model.monarch.action.declareWar.text=Sēo ƿlencu %nation%þēode fornȳdeþ ūs tō farenne on herȝoðe ƿiþ hīe! model.monarch.action.declareWar.no=Fulfremed # Fuzzy @@ -1350,6 +1360,7 @@ model.noClaimReason.worked.description=Ōðer setl ǣr brȳcþ þis land. model.player.forces=%nation%þēode full here model.player.independentMarket=Europe model.player.startGame=Æfter manigum monaðum on ðæm garsecge eart þu nu gecumen to þæm strande ungecuðes landes. Sægla {{tag:%direction%|west=ƿest|east=east|default=ƿiþ ƿind}} to findenne þa Niƿan Land and to manienne heora for þæm cynedome. +# Fuzzy model.player.waitingFor=Abidende: %nation% nu gaþ model.regionType.coast.name=Strand model.regionType.coast.unknown=Uncūþ stōƿ on þǣm strande @@ -1403,6 +1414,7 @@ model.unit.unitState.fortified=F model.unit.unitState.fortifying=F model.unit.unitState.inColony=B model.unit.unitState.sentry=S +# Fuzzy model.unit.unitState.skipped=W model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G @@ -1433,23 +1445,29 @@ model.colony.warehouseOverfull=Þīn hordærn on %colony%landbūnesse hafaþ ȝe model.colony.warehouseSoonFull=Þīn hordærn on þǣre %colony%landbūnesse sceall habban tō fela %goods%ƿara under þǣm nīehstan stæpe. %amount% %goods%ƿara sculon ƿesan forloren. model.colony.warehouseWaste=Þīn hordærn on þǣre %colony%landbūnesse hafaþ tō fela %goods%ƿara.%waste% ƿara ƿǣron forloren. model.colonyTile.resourceExhausted=Þæt %resource% andƿeorc is nū ascortod on þǣre %colony%landbūnesse +# Fuzzy model.game.spanishSuccession=Lēof, on Europe hafaþ þæt Ƿīȝ þǣre Spēoniscan Æfterȝenȝnesse ȝeendod. On þǣre Fōreƿearde Traiectum, sēo %loserNation%þēod ƿæs fornȳded tō ȝieldenne ealla landbūnessa on þǣm nīƿum landum tō þǣre %nation%þēode! model.indianSettlement.mission.denounced=Þīn boda be %settlement% hafaþ ȝeƿorden ȝeƿrēht and ofsloȝen! model.player.colonyGoodsParty.harbour=Þīne landbūendas on þǣre %colony%landbūnesse habbaþ āƿorpen %amount% %goods%ƿara in þā hȳðe tō ceorienne onȝēan þās unrihtan ȝafole ȝesettunȝe fram þǣm cynecynne! model.player.colonyGoodsParty.horses=Þīne landbūendas on þǣre %colony%landbūnesse habbaþ ȝelȳsed %amount% horsa tō onhebbenne þās unrihtan ȝafola fram þǣm cynecynne! model.player.colonyGoodsParty.landLocked=Þīne landbūendas on þǣre %colony%landbūnesse habbaþ forburnen %amount% %goods%ƿara in þǣre cēapstōƿe ceorienne onȝēan þās unrihtan ȝafole ȝesettunȝe fram þǣm cynecynne! +# Fuzzy model.player.dead.european=Lēof, sēo %nation%þēod hafaþ ȝehāten arēdnesslēase lēornesse fram nīƿra landa intinȝum! model.player.dead.native=Lēof, sēo %nation%þēod hafaþ ȝeƿorden forloren. model.player.emigrate=On %europe%, %unit%ƿiht hafaþ ȝecoren tō ȝeleorenne. model.player.foundingFatherJoinedCongress=%foundingFather% hafaþ ȝeþēoded hine selfne mid þǣm Ƿitenaȝemōte!\n\n%description% model.player.soLDecrease=Suna Frēodōmes ȝyldrǣden on þīnum landbūnessum hafaþ ȝeƿorden āƿend tō %newSoL% hundtēontiȝoðena dǣla! model.player.soLIncrease=Suna Frēodōmes ȝyldrǣden on þīnum landbūnesum hafaþ ȝeƿorden āƿend tō %newSoL% hundtēontiȝoðena dǣla! +# Fuzzy model.player.stance.alliance.declared=Lēof, sēo %nation%þēod is on ȝeþoftscipe mid ūs! model.player.stance.alliance.others=Lēof, sēo %attacker%þēod is on ȝeþoftscipe mid þǣre %defender%þēode. +# Fuzzy model.player.stance.ceaseFire.declared=Lēof, sēo %nation%þēod hafaþ ȝeþafad þæt ƿē ne feohten! model.player.stance.ceaseFire.others=Lēof, sēo %attacker%þēod hafaþ ȝeþafod þæt hēo ne feohte ƿiþ þā %defender%þēode. +# Fuzzy model.player.stance.peace.declared=Lēof, sēo %nation%þēod friðaþ ūsic! model.player.stance.peace.others=Lēof, sēo %attacker%þēod friðaþ þā %defender%þēode. +# Fuzzy model.player.stance.war.declared=Ƿā, lēof, sēo %nation%þēod hafaþ nū drēoȝaþ ȝeƿinn ƿit ūsic! model.player.stance.war.others=Lēof, sēo %attacker%þēod nū drīehþ ȝeƿinn ƿiþ þā %defender%þēode. combat.automaticDefence=Þīn %unit%ƿiht on þǣre %colony%landbūnesse hafaþ ȝeƿǣpned self tō beorȝenne þā landbūnesse! @@ -1465,6 +1483,7 @@ combat.enemyShipEvaded=Þǣre %enemyNation%þēode %enemyUnit%ƿiht hafaþ æthl combat.enemyShipSunk=%unit%ƿiht hafaþ ȝesenced þǣre %enemyNation%þēode %enemyUnit%ƿiht! combat.equipmentCaptured=Ƿara! Þā ƿīȝan þǣre %nation%þēode habbaþ ȝefanȝen %equipment%tōl! combat.goodsStolen=Þǣre %enemyNation%þēode %enemyUnit%ƿiht stīelþ %amount% %goods%ƿara be þǣre %colony%landbūnesse! +# Fuzzy combat.indianPlunder=Þǣre %enemyNation%þēode %enemyUnit%ƿiht ȝeherȝaþ %amount% ȝoldes fram þǣre %colony%landbūnesse. combat.indianRaid=Ūre scēaƿereas secȝaþ þe sēo %nation%þēod hafaþ ȝeherȝod þǣre %colonyNation%þēode þā %colony%landbūnesse. combat.indianSurprise=Sēo %nation%þēod macaþ undersmȳhþ %colony% landbūnesse, þe eȝsaþ ūre landbūendas. Þǣre %nation%þēode hēafodmann sæȝþ þætte hēo ne dyde hit. @@ -1518,6 +1537,7 @@ error.couldNotLoad=Ƿog gelamp þa hƿīle þe ic sohte þæt gamen hladan! error.couldNotSave=Ƿog gelamp þa hƿile þe ic sohte þæt gamen hordian! main.defaultPlayerName=Plegendes nama main.javaVersion=Java fadunge %minVersion% oþþe beteran fadunge ah man habban to plegenne FreeCol.\n(%version% is seo fadung þe ƿæs funden; bruc --no-java-check to bebugenne þas neosunge). +# Fuzzy client.choicePlayer=Ceos la plegend: metaServer.couldNotConnect=Ƿala, ne cuðe se spearctellend geþeodan selfne ƿiþ þone eallþegntol. Sec þu la eft siþþan. metaServer.communicationError=Þær ƿæs ƿog under þære hƿile þære gemansumunge mid þæm eallþegntole. Sec la eft siþþan. @@ -1527,8 +1547,11 @@ buy.moreGold=Ābidd læssan cēapȝyldes buy.takeOffer=Andfōh þā bēodunȝe buy.text=Sēo %nation%þēod wile cīepan heora %goods%ƿara ƿiþ %gold%: clearTradeRoute.text=Þīn %unit%ƿiht is ȝeseted tō cēapƿeȝe %route%. Ȝif þū sette his foreteohunȝe, þonne hit ne ȝā æfter þǣm cēapƿeȝe ȝīet. Ƿilt þū sōþlīce þis dōn? +# Fuzzy confirmHostile.alliance=Þū ne scealt afeohtan ȝesibbþēode! Ƿilt þū sōþlīce brecan þone ȝeþoftscipe þǣre %nation%þēode and drēoȝan ȝeƿinn? +# Fuzzy confirmHostile.ceaseFire=Þū hafast ȝesett griþ mid þǣre %nation%þēode. Ƿilt þū sōþlīce anƿinnan? +# Fuzzy confirmHostile.peace=Þū and sēo %nation%þēod habbaþ friþ. Ƿilt þū sōþlīce drēoȝan ȝeƿinn ƿiþ hīe? confirmTribute.unwise=Þa %nation% sindon strange and manige. Ƿitodlice ne si hit ƿis to abylgenne hie la? error.noSuchFile=Seo genamode ymele nis na, oþþe nis heo gewunelic ymele. @@ -1580,7 +1603,9 @@ clearSpeciality.areYouSure=Ƿilt þū sōþlīce fornȳdan %oldUnit% tō ƿeorð clearSpeciality.impossible=%unit% ne cann ƿeorðan læsse! defeated.text=Þū hafast ȝeƿorden oferdrifen! Ƿilt þū: defeated.yes=Abīdan and ƿæccan +# Fuzzy diplomacy.offerAccepted=Þa %nation% habbaþ andfangen þin cystige lac. +# Fuzzy diplomacy.offerRejected=Þa %nation% habbaþ aƿend þin cystige lac. disbandUnit.text=Ƿilt þū sōþlīce þis ƿiht tōhladan? disbandUnit.yes=Tōhlad @@ -1624,7 +1649,9 @@ move.noAccessContact=Ƿē sculon staðolian ǣrendsecȝunȝ mid þǣm %nation% move.noAccessGoods=Sēo %nation%þēod nile bycȝan of ǣmettiȝre %unit%ƿihte. move.noAccessSettlement=%nation%þēod ne alȳfþ ūrre %unit%ƿihte tō inȝanȝenne in heora setl. move.noAccessSkill=Ūre %unit% ne cann leornian þinȝ fram þǣm inlendiscum. +# Fuzzy move.noAccessTrade=Ƿē ne habbaþ þæt ȝeƿeald tō cīepenne ōðrum Europiscum þēodum sƿelce þā %nation%. +# Fuzzy move.noAccessWar=Ƿe ne cunnon cīepan þǣm %nation% þā hƿīle þe ƿē sind on ƿīȝe. move.noAccessWater=Ūru %unit%ƿiht sceal lendan ætfōran inȝanȝe in þæt setl. move.noAttackWater=Ūre %unit%ƿiht sceall lendan ǣr hēo onrǣse. @@ -1656,6 +1683,7 @@ server.fileNotFound=Ne cuðe findan þa ymelan þe hæfde þone gifenan naman. server.incompatibleVersions=Þæt hordode gamen þæt þe þu eart gesecende to hladenne nis genge on þisre fadunge FreeCol. server.invalidPlayerNations=Ealle pleȝendas þurfon cēosan ānlīce þēode fōre þæt ȝamen cann ƿesan underȝunnen. server.maximumPlayers=Ƿē sind sāriȝe, for þȳ þæt mǣste rīm pleȝenda hafaþ nū ǣr tōcumen. +# Fuzzy server.noRouteToServer=Se þeȝntōl ne cann ƿeorðan folclīc. Þū miht scoldest hƿeorfan þīnes fȳrbeorȝes ȝesetednessa tō ȝetīðienne þēodscipes on þisre dura þe þū cure. server.notAllReady=Nealle pleȝendas sind ȝearƿe tō beȝinnenne þæt ȝamen! server.onlyAdminCanLaunch=Ƿē sind sāriȝe, for synderlīce þæs þeȝntōles ȝerēfa cann beȝinnan þæt ȝamen. @@ -1733,6 +1761,7 @@ colopedia.unit.offensivePower=Ƿiðerrǣde miht: colopedia.unit.price=Cēapȝyld on Europe: colopedia.unit.productionBonus=Forþbǣro {{plural:%number%|one=modifier|other=modifiers}}: colopedia.unit.requirements=Nēada: +# Fuzzy colopedia.unit.school=Behēfu scolu tō lǣrenne: colopedia.unit.skill=Cræftiȝness: report.labour.allColonists=Ealle landbūendas @@ -1765,8 +1794,6 @@ report.colony.making.description=Þæt þēos landbūness ƿyrceþ report.colony.making.header=Ƿyrcende report.colony.name.description=Þæt ȝetæl landbūnessa report.colony.name.header=Landbūness -report.colony.plow.header=P -report.colony.road.header=R report.continentalCongress.none=(nǣniȝ) report.continentalCongress.recruiting=Inlǣdunȝ report.education.students=Ȝearu leornere @@ -1813,12 +1840,14 @@ report.requirements.surplus=Oferēaca %goods%ƿara is forþboren be report.trade.afterTaxes=Lēan æfter ȝeafolrǣdne report.trade.beforeTaxes=Lēanȝyld ǣr ȝeafolrǣdne report.trade.cargoUnits=Ƿihta on hlæste +# Fuzzy report.trade.hasCustomHouse=* Þēos landbūness nafaþ cēapsceamol; þās ƿara sind ūtsenda. report.trade.totalDelta=Eall forþbǣro report.trade.totalUnits=Ealla ƿihta report.trade.unitsSold=Ȝebohta oþþe ȝecīepda ƿihta report.turn.filter=Ēoƿa þis ȝecynd ǣrendȝeƿrita (%type%) report.turn.ignore=Lǣt þis ǣrendȝeƿrit (on þǣre %colony%landbūnesse; %goods%ƿaru) +# Fuzzy report.turn.playerNation=%nation% of %player% # Fuzzy aboutPanel.copyright=Cræftriht lōcaþ tō © 2002-2013 The FreeCol Team @@ -1843,6 +1872,7 @@ chooseFoundingFatherDialog.title=Namie staðoliend colonyPanel.colonyUnits=Landbunesse ƿihta colonyPanel.inPort=On porte colonyPanel.outsideColony=Butan landbunesse +# Fuzzy colonyPanel.producing=Ƿyrceþ: colonyPanel.reducePopulation=Gif þu gelytlie þa leodrædne sƿa þæt heo sie læsse þonne %number%, þonne ne cuðe %colony% %buildable% timbrian. colonyPanel.unitChange=Þǣr þū inēodest on þīn landbūnesse þīn %oldType% hafaþ ȝeƿorden %newType%. @@ -1854,7 +1884,9 @@ colonyPanel.notBestTile=%unit% cuðe ƿyrcan ma %goods% on %tile%. confirmDeclarationDialog.areYouSure.no=Meahtlīce hēræfter confirmDeclarationDialog.areYouSure.text=Ƿuton onsecȝan þæt unrihtƿīse nȳdȝeƿeald of %monarch% and bēodan þā ānstandendnesse ūrra landbūnessa fram þǣm cynecynne! confirmDeclarationDialog.areYouSure.yes=Frēodōm oþþe Dēaþ! +# Fuzzy confirmDeclarationDialog.defaultCountry=Ȝeāndu Rīce of %nation% +# Fuzzy confirmDeclarationDialog.defaultNation=Alȳs %nation% confirmDeclarationDialog.enterCountry=Hēræfter, ūre land biþ ȝecūþ sƿā confirmDeclarationDialog.enterNation=and ǣlc burȝmann on ūrum þrymfæstan lande biþ ƿlanc tō ƿesenne ȝecūþ sƿā @@ -1863,8 +1895,10 @@ constructionPanel.turnsToComplete=(Stapas oþ fulfylednesse: %number%) negotiationDialog.accept=Andfo negotiationDialog.add=Besette negotiationDialog.cancel=Onƿende +# Fuzzy negotiationDialog.demand=Þa %nation% asciaþ þa %otherNation% negotiationDialog.exchange=ƿiþ +# Fuzzy negotiationDialog.offer=Þa %nation% abeodaþ þæm %otherNation% negotiationDialog.send=Sende negotiationDialog.title.contact=Metung mid oðrum Europiscum @@ -1883,8 +1917,6 @@ findSettlementPanel.displayAll=Finde eall setlu findSettlementPanel.displayOnlyEuropean=Finde synderlice Europisc setlu findSettlementPanel.displayOnlyNatives=Finde synderlice inlendisc setlu findSettlementPanel.name=Finde setl -firstContactDialog.meeting.AZTEC=Seo Astecaþeod... -firstContactDialog.meeting.INCA=Þæt Incena rice... firstContactDialog.welcomeOffer.text=Þā %nation% ƿilcumiaþ ēoƿic. Ƿē sind þrymfæst þēod %camps% %settlementType%. Tō ȝebrēmenne ūrne frēondscipe, ƿē holde abēodaþ ēoƿ þæt lond þæt ȝē nū healdaþ, tō ȝiefe. Andfōþ ȝē ūre ȝriþ and ƿuniaþ mid ūs on friðe sƿā brōðru? firstContactDialog.welcomeSimple.text=Þā %nation% ƿilcumiaþ ēoƿ. Ƿe sind þrymfæst þēod %camps% %settlementType%. Andfōþ ȝē ūre ȝriþ and ƿuniaþ ȝē mid ūs on friðe sƿā brōðru? abandonColony.no=Onƿende diff --git a/data/strings/FreeColMessages_ar.properties b/data/strings/FreeColMessages_ar.properties index cfd152d53..5296a427d 100644 --- a/data/strings/FreeColMessages_ar.properties +++ b/data/strings/FreeColMessages_ar.properties @@ -4,6 +4,7 @@ # Author: Alnokta # Author: Claw eg # Author: DRIHEM +# Author: Haytham morsy # Author: Imksa # Author: Meno25 # Author: OsamaK @@ -35,11 +36,9 @@ cancel=إلغاء close=أغلق color=لون connect=توصيل -# Fuzzy current=حالي false=خطأ -# Fuzzy -fill=النتيجة النهائية +fill=شغل height=ارتفاع help=مساعدة host=مضيف @@ -48,7 +47,6 @@ load=تحميل many=العديد medium=متوسط more=المزيد... -# Fuzzy music=موسيقى name=الاسم no=لا @@ -66,10 +64,8 @@ rename=أعد التسمية reset=إعادة ضبط save=احفظ select=تحديد -# Fuzzy -server=اسم الخادم: +server=الخادم small=صغير -# Fuzzy test=اختبار true=صواب unload=ألغِ التحميل @@ -98,7 +94,6 @@ inPort=في المنفذ mission=مهمه modifiers=معدلات nation=أمة -# Fuzzy newWorld=عالم جديد notApplicable=غير مطبق payArrears=دفع الديون @@ -148,8 +143,7 @@ cli.debug-run=شغل N في وضع التصحيح، ثم أحفظ وسجل خر cli.debug=أصلح فري كول (%modes%) cli.default-locale=اضبط المحل الافتراضي (LANGUAGE[_COUNTRY[_VARIANT]]) cli.font=عين نوع الخط الافتراضي -# Fuzzy -cli.freecol-data=اضبط مجلد بيانات فري كول (به مجلد فرعي مسمى 'images') +cli.freecol-data=اضبط مجلد بيانات فري كول (به مجلد فرعي مسمى 'base') cli.help=اعرض شاشة المساعدة هذه cli.load-savegame=حمل اللعبة المحفوظة المعطاة FILE cli.log-console=سجل إلى الكونصول بالإضافة إلى الملف @@ -160,14 +154,14 @@ cli.no-java-check=تجاوز التحقق من نسخة الجافا cli.no-memory-check=تجاوز التحقق من الذاكرة cli.no-sound=شغل فري كول بدون صوت cli.private=ابدأ خادما سريا (غير منشور إلى الخادم العام) -cli.server-name=حدد NAME مخصصا للخادم +# Fuzzy cli.server=ابدأ خادما منفردا في المنفذ المحدد +cli.server-name=حدد NAME مخصصا للخادم cli.splash=اعرض شاشة صورة FILE أثناء تحميل اللعبة cli.tc=حمل التحويل الإجمالي بالاسم المعطى cli.timeout=عدد الثواني التي ينتظرها الخادم للإجابة على سؤال cli.version=اعرض رقم النسخة واخرج -# Fuzzy -cli.windowed=شغل فري كول في نمط النافذة بدلا من نمط الشاشة الكاملة +cli.windowed=شغل فري كول في نمط النافذة مع أبعاد اختيارية menuBar.colopedia=كولوبيديا menuBar.game=لعبة menuBar.orders=ترتيبات @@ -215,7 +209,6 @@ colopediaAction.goods.name=بضائع colopediaAction.nations.name=أمم colopediaAction.nationTypes.name=مميزات وطنية colopediaAction.resources.name=موارد الجائزة -colopediaAction.skills.name=مهارات colopediaAction.terrain.name=أنواع الأرض colopediaAction.units.name=وحدات declareIndependenceAction.name=أعلن الاستقلال @@ -327,8 +320,7 @@ model.option.startingYear.shortDescription=العام الذي تبدأ به ا model.option.seasonYear.name=موسم السنة model.option.mandatoryColonyYear.name=سنة مستعمرة إلزامية gameOptions.prices.name=خيارات الأسعار -# Fuzzy -gameOptions.prices.shortDescription=مدى الاسعار المبدئية لبضائع مختلفة. +gameOptions.prices.shortDescription=يحتوي على خيارات لعبة السيطرة علي الاسعار المبدئية . model.option.food.minimumPrice.name=الحد الأدنى للسعر المبدئي للطعام model.option.food.maximumPrice.name=الحد الأعلى للسعر المبدئي للطعام model.option.food.spread.name=فرق سعري شراء و بيع الطعام @@ -361,8 +353,7 @@ model.option.landMass.shortDescription=خيار لضبط كتلة الأرض ل model.option.landGeneratorType.name=نوع أرض كمي (EXPERIMENTAL!) model.option.landGeneratorType.shortDescription=خيار لضبط نوع مولد الأرض للاستخدام. mapGeneratorOptions.terrainGenerator.name=مولد الأرضية -# Fuzzy -mapGeneratorOptions.terrainGenerator.shortDescription=إعدادات لكمية الغابات، الجبال إلخ +mapGeneratorOptions.terrainGenerator.shortDescription=خيارات لمولد التضاريس model.option.riverNumber.name=عدد الأنهار model.option.riverNumber.shortDescription=خيار لتحديد عدد الأنهار في الخرائط المولدة. model.option.mountainNumber.name=عدد الجبال @@ -520,27 +511,19 @@ model.ability.carryUnits.shortDescription=هذه الوحدة لديها الق model.ability.electFoundingFather.name=انتخب الآباء المؤسسين model.ability.electFoundingFather.shortDescription=هذه الأمة لديها القدرة على انتخاب الآباء المؤسسين model.ability.foundColony.name=تأسيس مستعمرة -# Fuzzy model.ability.foundColony.shortDescription=هذه الوحدة لديها القدرة على تأسيس مستعمرة جديدة. -# Fuzzy model.ability.hasPort.name=وصول إلى البحر -# Fuzzy model.ability.hasPort.shortDescription=هذا الموقع لديه وصول مباشر أو غير مباشر للبحر model.ability.independenceDeclared.name=إعلان الاستقلال -# Fuzzy model.ability.independenceDeclared.shortDescription=هذا البلد أعلن استقلاله model.ability.moveToEurope.name=انتقل إلى أوروبا -# Fuzzy -model.ability.moveToEurope.shortDescription=هذا التل يسمح للوحدات بالانتقال إلى أوروبا. +model.ability.moveToEurope.shortDescription=هذا القرميدة تسمح للوحدات بالانتقال إلى أوروبا. model.ability.native.name=هندي model.ability.native.shortDescription=أمريكي أصلي model.ability.navalUnit.name=وحدة بحرية -# Fuzzy -model.ability.navalUnit.shortDescription=هذه الوحدة وحدة بحرية. -# Fuzzy -model.ability.plunderNatives.name=منحة كنز وطني +model.ability.navalUnit.shortDescription=هذه الوحدة هي وحدة بحرية. +model.ability.plunderNatives.name=أهالي النهب model.ability.royalExpeditionaryForce.name=القوة الاستكشافية الملكية -# Fuzzy model.ability.royalExpeditionaryForce.shortDescription=هذه الأمة هي قوة استكشافية ملكية model.ability.undead.name=غير ميت # Fuzzy @@ -1162,6 +1145,7 @@ model.building.locationLabel=في %location% model.colony.badGovernment=حكومة %colony% غير كفء. عقوبات إنتاج تطبق. model.colony.governmentImproved1=حكومة %colony% تحسنت، لكنها مازالت غير كفؤة. عقوبات الإنتاج مازالت سارية. model.colony.governmentImproved2=حكومة %colony% تحسنت. عقوبات الإنتاج لم تعد منطبقة. +# Fuzzy model.colony.insufficientProduction=%outputAmount% أكثر %outputType% يمكن إنتاجه في %colony%، فقط لو كنا نملك %inputAmount% أكثر %inputType% زائد. model.colony.minimumColonySize=%object% يمنع تخفيض السكان أكثر من هذا. model.colony.unbuildable=%colony%ويمكن بناء %object% في هذا الوقت. %object% تمت إزالة من قائمة انتظار الإنشاء. @@ -1175,18 +1159,25 @@ model.direction.SW.name=جنوب-غرب model.direction.W.name=غرب model.direction.NW.name=شمال-غرب model.historyEventType.abandonColony.description=أنت تهجر مستعمرة %colony%. +# Fuzzy model.historyEventType.cityOfGold.description=أنت تكتشف %city%, واحدة من مدن الذهب السبعة, وكنز من %treasure% ذهب. +# Fuzzy model.historyEventType.colonyConquered.description=مستعمرتك %colony% تم غزوها بواسطة %nation%. +# Fuzzy model.historyEventType.colonyDestroyed.description=مستعمرتك %colony% تم تدميرها بواسطة %nation%. # Fuzzy model.historyEventType.declareIndependence.description=أنت تدمر مستوطنة %settlement% %nation%الخاصة ب. +# Fuzzy model.historyEventType.destroyNation.description=أنت تدمر %nation%. model.historyEventType.discoverNewWorld.description=أنت تكتشف العالم الجديد. +# Fuzzy model.historyEventType.discoverRegion.description=أنت تكتشف %region%. model.historyEventType.foundColony.description=أنت تؤسس مستعمرة %colony%. model.historyEventType.foundingFather.description=%father% ينضم إلى الكونجرس القاري. model.historyEventType.independence.description=أنت تحقق الاستقلال عن التاج. +# Fuzzy model.historyEventType.meetNation.description=أنت تلتقي ب%nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=ال%nation% مدمّرة. model.indianSettlement.mostHatedNone=لا شيء model.indianSettlement.nameUnknown=غير معروف @@ -1224,13 +1215,12 @@ model.messageType.warning.name=تحذيرات model.monarch.action.displeasure.text=أنت تعلن الاستقلال عن التاج. model.nationState.aiOnly.name=AI فقط model.nationState.available.name=متوفر -# Fuzzy -model.nationState.available.shortDescription=أنت تقهر مستعمرة %nation% ل%colony%. +model.nationState.available.shortDescription=أنت تستطيع اللعب كهذة القبيلة model.nationState.notAvailable.name=غير متوفر model.player.forces=قوات %nation% model.player.independentMarket=أوروبا model.player.startGame=بعض قضاء أشهر عديدة في البحر، وصلت أخيرا إلى شاطئ مجهول. أبحر {{tag:%direction%|west=غربا|east=شرقا|default=في اتجاه الرياح}} من أجل أستكشاف العالم الجديد وانتهازه من أجل العرش. -model.player.waitingFor=بانتظار: %nation% +model.player.waitingFor=بانتظار : {{tag:country|%nation%}} model.regionType.coast.name=ساحل model.regionType.coast.unknown=منطقة ساحلية غير معروفة model.regionType.desert.name=صحراء @@ -1282,10 +1272,9 @@ model.unit.underRepair=إصلاح(%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S -model.unit.unitState.skipped=W +model.unit.unitState.skipped=س model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G model.building.noStudent=%teacher% في %colony% يحتاج طالبا. @@ -1308,7 +1297,7 @@ model.colony.warehouseOverfull=مستودعك في %colony% وصل إلى سعت model.colony.warehouseSoonFull=مستودعك في %colony% سيتجاوز سعته من %goods% خلال الدور التالي. %amount% وحدة من %goods% ستهدر. model.colony.warehouseWaste=مستودعك في %colony% تجاوز سعته ل %goods%. %waste% وحدة تم إهدارها. model.colonyTile.resourceExhausted=المورد %resource% تم إجهاده في %colony% -model.game.spanishSuccession=سعادتك، انتهت حرب الوراثة الإسبانية في أوروبا. وأجبرت %loserNation% على تسليم كل المستعمرات في العالم الجديد ل%nation% تحت معاهدة أوتريخت! +model.game.spanishSuccession=سعادتك، انتهت حرب الخلافة الإسبانية في أوروبا. في معاهدة أوتريخت {{tag:country|%loserNation%}} واضطر للتنازل عن كل المستعمرات في العالم الجديد إلي {{tag:country|%nation%}}! model.player.colonyGoodsParty.harbour=مستعمروك في %colony% ألقوا %amount% وحدة من %goods% إلى الميناء احتجاجا على هذه الضريبة غير العادلة بواسطة التاج! model.player.colonyGoodsParty.horses=مستعمروك في %colony% أطلقوا %amount% حصان احتجاج على ضرائبهم غير العادلة بواسطة التاج! model.player.colonyGoodsParty.landLocked=مستعمروك في %colony% أحرقوا %amount% وحدة من %goods% في السوق احتجاجا على هذه الضريبة غير العادلة بواسطة التاج! @@ -1316,12 +1305,16 @@ model.player.emigrate=في %europe%، %unit% قررت الهجرة. model.player.foundingFatherJoinedCongress=%foundingFather% انضم للكونجرس!\n\n%description% model.player.soLDecrease=عضوية أبناء الحرية في مستعمراتك انخفضت إلى %newSoL% في المائة! model.player.soLIncrease=عضوية أبناء الحرية في مستعمراتك ارتفعت إلى %newSoL% في المائة! +# Fuzzy model.player.stance.alliance.declared=جلالتك، %nation% في تحالف معنا! model.player.stance.alliance.others=جلالتك، %attacker% في تحالف مع %defender%. +# Fuzzy model.player.stance.ceaseFire.declared=جلالتك، %nation% وافقت على وقف إطلاق النار معنا! model.player.stance.ceaseFire.others=جلالتك، %attacker% وافقت على وقف إطلاق النار مع %defender%. +# Fuzzy model.player.stance.peace.declared=جلالتك، %nation% في سلام معنا! model.player.stance.peace.others=جلالتك، %attacker% في سلام مع %defender%. +# Fuzzy model.player.stance.war.declared=أخبار سيئة، فخامتك، %nation% أعلنوا الحرب علينا! model.player.stance.war.others=فخامتك، %attacker% أعلنت الحرب على %defender%. combat.automaticDefence=%unit% في %colony% أخذت أسلحة لتدافع عن المستعمرة! @@ -1336,6 +1329,7 @@ combat.enemyShipEvaded=%enemyNation% %enemyUnit% تفادت هجوما بواس combat.enemyShipSunk=%unit% أغرقت %enemyNation% %enemyUnit%! combat.equipmentCaptured=احترس، شجعان %nation% اكتسبوا %equipment%! combat.goodsStolen=%enemyNation% %enemyUnit% تسرق %amount% %goods% في %colony%! +# Fuzzy combat.indianPlunder=%enemyNation% %enemyUnit% بلندر %amount% من %colony%. combat.indianTreasure=أنت تأخذ %amount% من %settlement%. combat.nativeCapitalBurned=أنت أحرقت %name%، عاصمة %nation%. %nation% تستسلم لقوتك! @@ -1383,6 +1377,7 @@ error.couldNotLoad=حدث خطأ أثناء محاولة تحميل اللعبة # Fuzzy error.couldNotSave=حدث خطأ أثناء محاولة حفظ اللعبة! main.defaultPlayerName=اسم اللاعب +# Fuzzy client.choicePlayer=من فضلك اختر لاعبا: metaServer.couldNotConnect=عذرا، لم يمكن الاتصال بخادم-ميتا. من فضلك حاول ثانية فيما بعد. metaServer.communicationError=حدث خطأ أثناء الاتصال مع خادم الميتا. من فضلك حاول مرة ثانية فيما بعد. @@ -1391,8 +1386,11 @@ boycottedGoods.text=بما أن %goods% تمت مقاطعتها بواسطة ا buy.moreGold=سل عن السعر الأرخص buy.takeOffer=اقبل العرض buy.text=%nation% يودون بيع %goods% مقابل %gold%: +# Fuzzy confirmHostile.alliance=أنت لا يمكنك مهاجمة أمة حليفة! هل ترغب فعلا في كسر تحالفك مع %nation% وإعلان الحرب؟ +# Fuzzy confirmHostile.ceaseFire=أنت وقعت وقفا لإطلاق النار مع %nation%. هل تود فعلا الهجوم؟ +# Fuzzy confirmHostile.peace=أنت في سلام مع %nation%. هل ترغب فعلا في إعلان الحرب؟ error.noSuchFile=الملف المحدد غير موجود أو ليس ملفا عاديا. # Fuzzy @@ -1440,7 +1438,9 @@ clearSpeciality.areYouSure=هل أنت متأكد أنك تريد تنزيل %ol clearSpeciality.impossible=%unit% لا يمكن تنزيلها! defeated.text=لقد هزمت! هل تريد: defeated.yes=ابق و راقب +# Fuzzy diplomacy.offerAccepted=%nation% قبلوا عرضك الكريم. +# Fuzzy diplomacy.offerRejected=%nation% رفضوا عرضك الكريم. disbandUnit.text=هل أنت متأكد أنك تريد نزع هذه الوحدة؟ disbandUnit.yes=أزل المعدات @@ -1497,6 +1497,7 @@ server.fileNotFound=لم يمكن العثور على الملف بالاسم ا server.incompatibleVersions=اللعبة المحفوظة التي تحاول تحميلها غير متوافقة مع هذه النسخة من فري كول. server.invalidPlayerNations=كل اللاعبين يحتاجون إلى اختيار أمة فريدة قبل أن تبدأ اللعبة. server.maximumPlayers=عذرا، لقد وصل عدد اللاعبين إلى الحد الأقصى. +# Fuzzy server.noRouteToServer=الخادم لا يمكن أن يصبح عاما. يجب عليك تعديل إعدادات حائط النار للسماح بالاتصالات على المنفذ الذي حددته. server.notAllReady=ليس كل اللاعبين جاهزين للعب اللعبة! server.onlyAdminCanLaunch=عذرا، فقط إداري الخادم يمكنه أن يطلق اللعبة. @@ -1560,6 +1561,7 @@ colopedia.unit.price=السعر في أوروربا: # Fuzzy colopedia.unit.productionBonus=معدل الإنتاج (معدلو الإنتاج): colopedia.unit.requirements=المتطلبات: +# Fuzzy colopedia.unit.school=المدرسة المطلوبة للتدريب: colopedia.unit.skill=المهارة: report.labour.allColonists=كل المستعمرين @@ -1627,12 +1629,14 @@ report.requirements.surplus=المستعمرات التالية تنتج فائ report.trade.afterTaxes=الدخل بعد الضرائب report.trade.beforeTaxes=الدخل قبل الضرائب report.trade.cargoUnits=الوحدات في الحمولة +# Fuzzy report.trade.hasCustomHouse=* هذه المستعمرة لديها منزل معدل؛ هذه البضائع تصدر. report.trade.totalDelta=إجمالي الإنتاج report.trade.totalUnits=إجمالي الوحدات report.trade.unitsSold=الوحدات المشتراة أو المباعة report.turn.filter=لا تعرض هذا النوع من الرسائل (%type%) report.turn.ignore=تجاهل هذه الرسالة (المستعمرة: %colony%، البضائع: %goods%) +# Fuzzy report.turn.playerNation=%nation% الخاصة ب%player% # Fuzzy aboutPanel.copyright=حقوق التأليف والنشر محفوظة © 2002-2013 فريق فري كول @@ -1664,7 +1668,9 @@ colonyPanel.notBestTile=%unit% يمكن أن تنتج المزيد من %goods% confirmDeclarationDialog.areYouSure.no=ربما فيما بعد confirmDeclarationDialog.areYouSure.text=لنترك استبداد %monarch% الظالم ولنعلن استقلال مستعمراتنا من التاج! confirmDeclarationDialog.areYouSure.yes=الحرية أو الموت! +# Fuzzy confirmDeclarationDialog.defaultCountry=الولايات المتحدة ل%nation% +# Fuzzy confirmDeclarationDialog.defaultNation=%nation% الحرة confirmDeclarationDialog.enterCountry=من الآن فصاعدا، ستُعرف دولتنا باسم confirmDeclarationDialog.enterNation=وكل مواطن من أمتنا المجيدة سيفتخر بأن يُدعى @@ -1674,8 +1680,10 @@ difficultyDialog.name=صعوبة negotiationDialog.accept=قبول negotiationDialog.add=أضف negotiationDialog.cancel=إلغاء +# Fuzzy negotiationDialog.demand=%nation% يتطلب من %otherNation% negotiationDialog.exchange=في مقابل +# Fuzzy negotiationDialog.offer=%nation% يعرض على %otherNation% negotiationDialog.send=أرسل editSettlementDialog.removeSettlement=إزالة مستوطنة diff --git a/data/strings/FreeColMessages_arz.properties b/data/strings/FreeColMessages_arz.properties index bd3219ebe..fe8029ffa 100644 --- a/data/strings/FreeColMessages_arz.properties +++ b/data/strings/FreeColMessages_arz.properties @@ -119,8 +119,9 @@ cli.no-java-check=تجاوز التحقق من نسخه الجافا cli.no-memory-check=تجاوز التحقق من الذاكرة cli.no-sound=شغل فرى كول بدون صوت cli.private=ابدأ خادما سريا (غير منشور إلى الخادم العام) -cli.server-name=حدد NAME مخصصا للخادم +# Fuzzy cli.server=ابدأ خادما منفردا فى المنفذ المحدد +cli.server-name=حدد NAME مخصصا للخادم cli.splash=اعرض شاشه صوره FILE أثناء تحميل اللعبة cli.tc=حمل التحويل الإجمالى بالاسم المعطى cli.version=اعرض رقم النسخه واخرج @@ -160,7 +161,6 @@ colopediaAction.goods.name=بضائع colopediaAction.nations.name=أمم colopediaAction.nationTypes.name=مميزات وطنية colopediaAction.resources.name=موارد الجائزة -colopediaAction.skills.name=مهارات colopediaAction.terrain.name=أنواع الأرض colopediaAction.units.name=وحدات declareIndependenceAction.name=أعلن الاستقلال @@ -1083,22 +1083,30 @@ model.building.locationLabel=فى %location% model.colony.badGovernment=حكومه %colony% غير كفء. عقوبات إنتاج تطبق. model.colony.governmentImproved1=حكومه %colony% تحسنت، لكنها مازالت غير كفؤه. عقوبات الإنتاج مازالت ساريه. model.colony.governmentImproved2=حكومه %colony% تحسنت. عقوبات الإنتاج لم تعد منطبقه. +# Fuzzy model.colony.insufficientProduction=%outputAmount% أكثر %outputType% يمكن إنتاجه فى %colony%، فقط لو كنا نملك %inputAmount% أكثر %inputType% زائد. model.colony.minimumColonySize=%object% يمنع تخفيض السكان أكثر من هذا. model.colony.veryBadGovernment=حكومه %colony% غير كفء جدا. عقوبات إنتاج عاليه تطبق. model.historyEventType.abandonColony.description=أنت تهجر مستعمره %colony%. +# Fuzzy model.historyEventType.cityOfGold.description=أنت تكتشف %city%, واحده من مدن الذهب السبعة, وكنز من %treasure% ذهب. +# Fuzzy model.historyEventType.colonyConquered.description=مستعمرتك %colony% تم غزوها بواسطه %nation%. +# Fuzzy model.historyEventType.colonyDestroyed.description=مستعمرتك %colony% تم تدميرها بواسطه %nation%. # Fuzzy model.historyEventType.declareIndependence.description=أنت تدمر مستوطنه %settlement% %nation%الخاصه ب. +# Fuzzy model.historyEventType.destroyNation.description=أنت تدمر %nation%. model.historyEventType.discoverNewWorld.description=أنت تكتشف العالم الجديد. +# Fuzzy model.historyEventType.discoverRegion.description=أنت تكتشف %region%. model.historyEventType.foundColony.description=أنت تؤسس مستعمره %colony%. model.historyEventType.foundingFather.description=%father% ينضم إلى الكونجرس القارى. model.historyEventType.independence.description=أنت تحقق الاستقلال عن التاج. +# Fuzzy model.historyEventType.meetNation.description=أنت تلتقى ب%nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=ال%nation% مدمّره. model.indianSettlement.mostHatedNone=لا شيء model.indianSettlement.nameUnknown=غير معروف @@ -1140,6 +1148,7 @@ model.nationState.notAvailable.name=غير متوفر model.player.forces=قوات %nation% model.player.independentMarket=أوروبا model.player.startGame=بعد شهور فى البحر، وصلت أخيرا إلى ساحل قاره غير معروفه. ابحر غربا لاستكشاف العالم الجديد ولتطالب به للتاج. +# Fuzzy model.player.waitingFor=بانتظار: %nation% model.regionType.coast.name=ساحل model.regionType.coast.unknown=منطقه ساحليه غير معروفة @@ -1187,9 +1196,9 @@ model.unit.underRepair=تحت الإصلاح (%turns% يدور لليسار) model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S +# Fuzzy model.unit.unitState.skipped=W model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G @@ -1213,6 +1222,7 @@ model.colony.warehouseOverfull=مستودعك فى %colony% وصل إلى سعت model.colony.warehouseSoonFull=مستودعك فى %colony% سيتجاوز سعته من %goods% خلال الدور التالى. %amount% وحده من %goods% ستهدر. model.colony.warehouseWaste=مستودعك فى %colony% تجاوز سعته ل %goods%. %waste% وحده تم إهدارها. model.colonyTile.resourceExhausted=المورد %resource% تم إجهاده فى %colony% +# Fuzzy model.game.spanishSuccession=سعادتك، انتهت حرب الوراثه الإسبانيه فى أوروبا. وأجبرت %loserNation% على تسليم كل المستعمرات فى العالم الجديد ل%nation% تحت معاهده أوتريخت! model.player.colonyGoodsParty.harbour=مستعمروك فى %colony% ألقوا %amount% وحده من %goods% إلى الميناء احتجاجا على هذه الضريبه غير العادله بواسطه التاج! model.player.colonyGoodsParty.horses=مستعمروك فى %colony% أطلقوا %amount% حصان احتجاج على ضرائبهم غير العادله بواسطه التاج! @@ -1221,12 +1231,16 @@ model.player.emigrate=فى %europe%، %unit% قررت الهجره. model.player.foundingFatherJoinedCongress=%foundingFather% انضم للكونجرس!\n\n%description% model.player.soLDecrease=عضويه أبناء الحريه فى مستعمراتك انخفضت إلى %newSoL% فى المائة! model.player.soLIncrease=عضويه أبناء الحريه فى مستعمراتك ارتفعت إلى %newSoL% فى المائة! +# Fuzzy model.player.stance.alliance.declared=جلالتك، %nation% فى تحالف معنا! model.player.stance.alliance.others=جلالتك، %attacker% فى تحالف مع %defender%. +# Fuzzy model.player.stance.ceaseFire.declared=جلالتك، %nation% وافقت على وقف إطلاق النار معنا! model.player.stance.ceaseFire.others=جلالتك، %attacker% وافقت على وقف إطلاق النار مع %defender%. +# Fuzzy model.player.stance.peace.declared=جلالتك، %nation% فى سلام معنا! model.player.stance.peace.others=جلالتك، %attacker% فى سلام مع %defender%. +# Fuzzy model.player.stance.war.declared=أخبار سيئه، فخامتك، %nation% أعلنوا الحرب علينا! model.player.stance.war.others=فخامتك، %attacker% أعلنت الحرب على %defender%. combat.automaticDefence=%unit% فى %colony% أخذت أسلحه لتدافع عن المستعمرة! @@ -1241,6 +1255,7 @@ combat.enemyShipEvaded=%enemyNation% %enemyUnit% تفادت هجوما بواس combat.enemyShipSunk=%unit% أغرقت %enemyNation% %enemyUnit%! combat.equipmentCaptured=احترس، شجعان %nation% اكتسبوا %equipment%! combat.goodsStolen=%enemyNation% %enemyUnit% تسرق %amount% %goods% فى %colony%! +# Fuzzy combat.indianPlunder=%enemyNation% %enemyUnit% بلندر %amount% من %colony%. combat.indianTreasure=أنت تأخذ %amount% من %settlement%. combat.nativeCapitalBurned=أنت أحرقت %name%، عاصمه %nation%. %nation% تستسلم لقوتك! @@ -1288,6 +1303,7 @@ error.couldNotLoad=حدث خطأ أثناء محاوله تحميل اللعبة # Fuzzy error.couldNotSave=حدث خطأ أثناء محاوله حفظ اللعبة! main.defaultPlayerName=اسم اللاعب +# Fuzzy client.choicePlayer=من فضلك اختر لاعبا: metaServer.couldNotConnect=عذرا، لم يمكن الاتصال بخادم-ميتا. من فضلك حاول ثانيه فيما بعد. metaServer.communicationError=حدث خطأ أثناء الاتصال مع خادم الميتا. من فضلك حاول مره ثانيه فيما بعد. @@ -1296,8 +1312,11 @@ boycottedGoods.text=بما أن %goods% تمت مقاطعتها بواسطه ا buy.moreGold=سل عن السعر الأرخص buy.takeOffer=اقبل العرض buy.text=%nation% يودون بيع %goods% مقابل %gold%: +# Fuzzy confirmHostile.alliance=أنت لا يمكنك مهاجمه أمه حليفة! هل ترغب فعلا فى كسر تحالفك مع %nation% وإعلان الحرب؟ +# Fuzzy confirmHostile.ceaseFire=أنت وقعت وقفا لإطلاق النار مع %nation%. هل تود فعلا الهجوم؟ +# Fuzzy confirmHostile.peace=أنت فى سلام مع %nation%. هل ترغب فعلا فى إعلان الحرب؟ error.noSuchFile=الملف المحدد غير موجود أو ليس ملفا عاديا. # Fuzzy @@ -1347,7 +1366,9 @@ clearSpeciality.areYouSure=هل أنت متأكد أنك تريد تنزيل %ol clearSpeciality.impossible=%unit% لا يمكن تنزيلها! defeated.text=لقد هزمت! هل تريد: defeated.yes=ابق و راقب +# Fuzzy diplomacy.offerAccepted=%nation% قبلوا عرضك الكريم. +# Fuzzy diplomacy.offerRejected=%nation% رفضوا عرضك الكريم. disbandUnit.text=هل أنت متأكد أنك تريد نزع هذه الوحدة؟ disbandUnit.yes=أزل المعدات @@ -1408,6 +1429,7 @@ server.fileNotFound=لم يمكن العثور على الملف بالاسم ا server.incompatibleVersions=اللعبه المحفوظه التى تحاول تحميلها غير متوافقه مع هذه النسخه من فرى كول. server.invalidPlayerNations=كل اللاعبين يحتاجون إلى اختيار أمه فريده قبل أن تبدأ اللعبه. server.maximumPlayers=عذرا، لقد وصل عدد اللاعبين إلى الحد الأقصى. +# Fuzzy server.noRouteToServer=الخادم لا يمكن أن يصبح عاما. يجب عليك تعديل إعدادات حائط النار للسماح بالاتصالات على المنفذ الذى حددته. server.notAllReady=ليس كل اللاعبين جاهزين للعب اللعبة! server.onlyAdminCanLaunch=عذرا، فقط إدارى الخادم يمكنه أن يطلق اللعبه. @@ -1473,6 +1495,7 @@ colopedia.unit.price=السعر فى أوروربا: # Fuzzy colopedia.unit.productionBonus=معدل الإنتاج (معدلو الإنتاج): colopedia.unit.requirements=المتطلبات: +# Fuzzy colopedia.unit.school=المدرسه المطلوبه للتدريب: colopedia.unit.skill=المهارة: report.labour.allColonists=كل المستعمرين @@ -1541,12 +1564,14 @@ report.requirements.surplus=المستعمرات التاليه تنتج فائ report.trade.afterTaxes=الدخل بعد الضرائب report.trade.beforeTaxes=الدخل قبل الضرائب report.trade.cargoUnits=الوحدات فى الحمولة +# Fuzzy report.trade.hasCustomHouse=* هذه المستعمره لديها منزل معدل؛ هذه البضائع تصدر. report.trade.totalDelta=إجمالى الإنتاج report.trade.totalUnits=إجمالى الوحدات report.trade.unitsSold=الوحدات المشتراه أو المباعة report.turn.filter=لا تعرض هذا النوع من الرسائل (%type%) report.turn.ignore=تجاهل هذه الرساله (المستعمرة: %colony%، البضائع: %goods%) +# Fuzzy report.turn.playerNation=%nation% الخاصه ب%player% # Fuzzy aboutPanel.copyright=حقوق التأليف والنشر محفوظه © 2002-2013 فريق فرى كول @@ -1568,7 +1593,9 @@ colonyPanel.royalistLabel=الملكيون: %number% confirmDeclarationDialog.areYouSure.no=ربما فيما بعد confirmDeclarationDialog.areYouSure.text=لنترك استبداد %monarch% الظالم ولنعلن استقلال مستعمراتنا من التاج! confirmDeclarationDialog.areYouSure.yes=الحريه أو الموت! +# Fuzzy confirmDeclarationDialog.defaultCountry=الولايات المتحده ل%nation% +# Fuzzy confirmDeclarationDialog.defaultNation=%nation% الحرة confirmDeclarationDialog.enterCountry=من الآن فصاعدا، ستُعرف دولتنا باسم confirmDeclarationDialog.enterNation=وكل مواطن من أمتنا المجيده سيفتخر بأن يُدعى diff --git a/data/strings/FreeColMessages_be-tarask.properties b/data/strings/FreeColMessages_be-tarask.properties index e348360ac..9ca3bea99 100644 --- a/data/strings/FreeColMessages_be-tarask.properties +++ b/data/strings/FreeColMessages_be-tarask.properties @@ -160,8 +160,9 @@ cli.no-memory-check=прапусьціць праверку памяці cli.no-sound=запусьціць FreeCol бяз гуку cli.private=запусьціць прыватны сэрвэр (не публікаваць на мэта-сэрвэры) cli.seed=прадстаўляе ПАЧАТКОВЫ ЛІК для генэратара псэўда-выпадковых лікаў -cli.server-name=пазначыць нестандартную НАЗВУ сэрвэра +# Fuzzy cli.server=запусьціць адзіночны сэрвэр на пазначаным порце +cli.server-name=пазначыць нестандартную НАЗВУ сэрвэра cli.splash=паказваць застаўку з ФАЙЛА пад час загрузкі гульні cli.tc=загрузіць набор правілаў з пададзенай НАЗВАЙ cli.timeout=тэрмін чаканьня сэрвэрам адказу на пытаньне ў сэкундах @@ -218,7 +219,6 @@ colopediaAction.goods.name=Тавары colopediaAction.nations.name=Нацыі colopediaAction.nationTypes.name=Нацыянальныя перавагі colopediaAction.resources.name=Бонусныя рэсурсы -colopediaAction.skills.name=Умеласьці colopediaAction.terrain.name=Тыпы мясцовасьці colopediaAction.units.name=Адзінкі colopediaAction.name=%object% (Калапэдыя) @@ -1309,6 +1309,7 @@ model.building.locationLabel=У %location% model.colony.badGovernment=Урад %colony% неэфэктыўны. Уводзяцца штрафы на вытворчасьць. model.colony.governmentImproved1=Урад %colony% палепшаны, але ўсё яшчэ неэфэктыўны. Штрафы на вытворчасьць захоўваюцца. model.colony.governmentImproved2=Урад %colony% палепшаны. Штрафы на вытворчасьць скасоўваюцца. +# Fuzzy model.colony.insufficientProduction=Можна зрабіць на %outputAmount% болей %outputType% у %colony%, калі там было на %inputAmount% %inputType% болей. model.colony.minimumColonySize=%object% робіць немагчымым зьмяншэньне насельніцтва. model.colony.unbuildable=%colony% ня можа пабудаваць %object% за гэты час. %object% быў выдалены з чаргі на будоўлю. @@ -1322,21 +1323,29 @@ model.direction.SW.name=паўднёвы захад model.direction.W.name=захад model.direction.NW.name=паўночны захад model.historyEventType.abandonColony.description=Вы пакінулі калёнію %colony%. +# Fuzzy model.historyEventType.cityOfGold.description=%nation% знайшлі %city%, адзін з Сямі Залатых Гарадоў, здабыча склала %treasure% золата. +# Fuzzy model.historyEventType.colonyConquered.description=Ваша калёнія %colony% была захопленая %nation%. +# Fuzzy model.historyEventType.colonyDestroyed.description=Ваша калёнія %colony% была зьнішчаная %nation%. # Fuzzy model.historyEventType.conquerColony.description=Вы пасьмелі прыняць нашыя літасныя ўмовы, але яшчэ не заплацілі? Такая дурасьць можа выклікаць нашую незадаволенасьць. # Fuzzy model.historyEventType.declareIndependence.description=Вы зьнішчылі паселішча %settlement%, якое належала %nation%. +# Fuzzy model.historyEventType.destroyNation.description=Вы зьнішчылі %nation%. model.historyEventType.discoverNewWorld.description=Вы адкрылі Новы Сьвет. +# Fuzzy model.historyEventType.discoverRegion.description=%nation% адкрылі %region%. model.historyEventType.foundColony.description=Вы заснавалі калёнію %colony%. model.historyEventType.foundingFather.description=%father% далучыўся да Кантынэнтальнага Кангрэсу. model.historyEventType.independence.description=Вы дасягнулі незалежнасьці ад Кароны. +# Fuzzy model.historyEventType.meetNation.description=Вы сустрэлі %nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=%nation% болей няма ў Новым сьвеце. +# Fuzzy model.historyEventType.spanishSuccession.description=%loserNation% перадалі ўсе свае калёніі ў Новым Сьвеце нацыі %nation%. model.indianSettlement.mostHatedNone=Нічога model.indianSettlement.nameUnknown=Невядомая @@ -1380,6 +1389,7 @@ model.messageType.warehouseCapacity.name=Умяшчальнасьць схові model.messageType.warning.name=Папярэджаньні model.monarch.action.addToRef.text=Карона дадала %number% {{plural:%number%|%unit%}} да Каралеўскіх экспэдыцыйных сілаў. Каляніяльныя лідэры занепакоеныя. model.monarch.action.addToRef.no=Выканана +# Fuzzy model.monarch.action.declareWar.text=Нахабства %nation% прымушае нас абвясьціць ім вайну! model.monarch.action.declareWar.no=Выканана # Fuzzy @@ -1422,6 +1432,7 @@ model.noClaimReason.worked.description=Іншае паселішча ўжо вы model.player.forces=Сілы %nation% model.player.independentMarket=Эўропа model.player.startGame=Пасьля некалькіх месяцаў плаваньня, Вы нарэшце прыбылі да ўзьбярэжжа невядомага кантынэнту. Плывіце {{tag:%direction%|west=на захад|east=на ўсход|default=па ветры}}, каб дасьледаваць Новы Сьвет і абвесьціць яго ўласнасьцю Кароны. +# Fuzzy model.player.waitingFor=Чакаем: %nation% model.regionType.coast.name=Узьбярэжжа model.regionType.coast.unknown=Невядомае ўзьбярэжжа @@ -1475,9 +1486,9 @@ model.unit.underRepair=Рамантуецца (%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=Ф model.unit.unitState.fortifying=Ф -model.unit.unitState.improving=# model.unit.unitState.inColony=К model.unit.unitState.sentry=В +# Fuzzy model.unit.unitState.skipped=П model.unit.unitState.toAmerica=Н model.unit.unitState.toEurope=Н @@ -1514,23 +1525,29 @@ model.colony.warehouseOverfull=Вашае сховішча ў %colony% дася model.colony.warehouseSoonFull=Вашае сховішча ў %colony% перавысіць максымальную ўмяшчальнасьць для %goods% на працягу наступнага ходу. %amount% адзінак %goods% будуць выкінутыя. model.colony.warehouseWaste=Вашае сховішча ў %colony% утрымлівала зашмат %goods%. %waste% адзінак давялося выкінуць. model.colonyTile.resourceExhausted=У %colony% скончыўся рэсурс %resource% +# Fuzzy model.game.spanishSuccession=Ваша Сьветласьць, у Эўропе скончылася вайна за Гішпанскую спадчыну. Згодна з Утрыхцкай мірнай дамовай, %loserNation% вымушаныя перадаць %nation% усе свае калёніі ў Новым Сьвеце! model.indianSettlement.mission.denounced=Ваш місіянэр у %settlement% быў асуджаны і пакараны сьмерцю! model.player.colonyGoodsParty.harbour=Вашыя каляністы ў %colony% выкінулі %amount% адзінак %goods% у затоку ў знак пратэсту супраць несправядлівага падаткаабкладаньня з боку Кароны! model.player.colonyGoodsParty.horses=Вашыя каляністы ў %colony% выпусьцілі на волю %amount% коней у знак пратэсту супраць несправядлівага падаткаабкладаньня Каронай! model.player.colonyGoodsParty.landLocked=Вашыя каляністы ў %colony% спалілі %amount% адзінак %goods% на кірмашы ў знак пратэсту супраць несправядлівага падаткаабкладаньня з боку Кароны! +# Fuzzy model.player.dead.european=Ваша Сьветласьць, %nation% абвясьцілі, што поўнасьцю выходзяць са справаў у Новым Сьвеце! model.player.dead.native=Ваша Сьветласьць, %nation% былі зьнішчаныя. model.player.emigrate=У %europe%, %unit% вырашыла эмігрыраваць. model.player.foundingFatherJoinedCongress=%foundingFather% далучыўся да кангрэсу!\n\n%description% model.player.soLDecrease=Колькасьць Сыноў Свабоды ў Вашых калёніях зьнізілася да %newSoL% адсоткаў! model.player.soLIncrease=Колькасьць Сыноў Свабоды ў Вашых калёніях павялічылася да %newSoL% адсоткаў! +# Fuzzy model.player.stance.alliance.declared=Ваша Сьветласьць, %nation% у саюзе з намі! model.player.stance.alliance.others=Ваша Сьветласьць, %attacker% у саюзе з %defender%. +# Fuzzy model.player.stance.ceaseFire.declared=Ваша Сьветласьць, %nation% дамовіліся пра спыненьне агню з намі! model.player.stance.ceaseFire.others=Ваша Сьветласьць, %attacker% дамовіліся пра спыненьне агню з %defender%. +# Fuzzy model.player.stance.peace.declared=Ваша Сьветласьць, %nation% маюць мірную дамову з намі! model.player.stance.peace.others=Ваша Сьветласьць, %attacker% маюць мірную дамову з %defender%. +# Fuzzy model.player.stance.war.declared=Дрэнныя навіны, Ваша Сьветласьць, %nation% абвясьцілі нам вайну! model.player.stance.war.others=Ваша Сьветласьць, %attacker% абвясьцілі вайну супраць %defender%. combat.automaticDefence=Вашая %unit% у %colony% узяла зброю для абароны калёніі! @@ -1546,6 +1563,7 @@ combat.enemyShipEvaded=%enemyNation% %enemyUnit% пазьбегнуў атакі combat.enemyShipSunk=%unit% патапіла %enemyNation% %enemyUnit%! combat.equipmentCaptured=Увага, ваяры %nation% атрымалі %equipment%! combat.goodsStolen=%enemyNation% %enemyUnit% скрала %amount% %goods% у %colony%! +# Fuzzy combat.indianPlunder=%enemyNation% %enemyUnit% нарабавала %amount% у %colony%. combat.indianRaid=Нашыя выведчыкі паведамляюць, што %nation% зьдзейсьнілі напад на калёнію %colonyNation% %colony%. combat.indianSurprise=%nation% зьдзейсьніла нечаканы напад на %colony%, які ўсхваляваў нашых каляністаў. Уладар %nation% адмаўляе гэты факт. @@ -1597,6 +1615,7 @@ error.couldNotLoad=Адбылася памылка пад час спробы з # Fuzzy error.couldNotSave=Адбылася памылка пад час спробы захаваньня гульні! main.defaultPlayerName=Імя гульца +# Fuzzy client.choicePlayer=Калі ласка, выберыце гульца: metaServer.couldNotConnect=Прабачце, немагчыма далучыцца да мэта-сэрвэра. Калі ласка, паспрабуйце пазьней. metaServer.communicationError=Пад час далучэньня з мэта-сэрвэрам адбылася памылка. Калі ласка, паспрабуйце пазьней. @@ -1606,8 +1625,11 @@ buy.moreGold=Папрасіць зьнізіць цану buy.takeOffer=Прыняць прапанову buy.text=%nation% жадаюць прадаць іх %goods% за %gold%: clearTradeRoute.text=Ваша %unit% прызначаная ў гандлёвы маршрут %route%. Устаноўка мэтавага пункту зьніме яе з гандлёвага маршруту. Вы ўпэўнены, што жадаеце гэта зрабіць? +# Fuzzy confirmHostile.alliance=Вы ня можаце атакаваць саюзьнікаў! Вы сапраўды жадаеце разарваць саюз з %nation% і абвясьціць вайну? +# Fuzzy confirmHostile.ceaseFire=Вы падпісалі дамову пра прыпыненьне вайсковых дзеяньняў з %nation%. Вы сапраўды жадаеце атакаваць? +# Fuzzy confirmHostile.peace=Вы ў міры з %nation%. Вы сапраўды жадаеце абвясьціць вайну? error.noSuchFile=Пазначаны файл няслушны альбо не існуе. # Fuzzy @@ -1656,7 +1678,9 @@ clearSpeciality.areYouSure=Вы ўпэўнены, што жадаеце пані clearSpeciality.impossible=%unit% ня можа быць паніжаны! defeated.text=Вы пераможаны! Ці жадаеце Вы: defeated.yes=Застацца і назіраць +# Fuzzy diplomacy.offerAccepted=%nation% прынялі Вашу шчодрую прапанову. +# Fuzzy diplomacy.offerRejected=%nation% адмовіліся ад Вашай шчодрай прапановы. disbandUnit.text=Вы ўпэўнены, што жадаеце распусьціць гэтую адзінку? disbandUnit.yes=Расфарміраваць @@ -1699,7 +1723,9 @@ move.noAccessContact=Ваша Сьветласьць, спачатку нам н move.noAccessGoods=%nation% ня будзе гандляваць з пустой %unit%. move.noAccessSettlement=%nation% не дазваляюць нашаму %unit% уваходзіць у іх паселішчы. move.noAccessSkill=Наша %unit% ня можа вучыцца ў тубыльцаў. +# Fuzzy move.noAccessTrade=Мы ня маем дазволу гандляваць з іншымі эўрапейскімі нацыямі, такімі як %nation%. +# Fuzzy move.noAccessWar=Мы ня можам гандляваць з %nation% пад час вайны. move.noAccessWater=Наш %unit% павінен высадзіцца на бераг перад тым як уваходзіць у паселішча. move.noAttackWater=Нашая %unit% павінна высадзіцца перад тым як атакаваць. @@ -1731,6 +1757,7 @@ server.fileNotFound=Немагчыма знайсьці файл з пададз server.incompatibleVersions=Захаваная гульня, якую Вы спрабуеце загрузіць, несумяшчальная з гэтай вэрсіяй FreeCol. server.invalidPlayerNations=Перад пачаткам гульні неабходна, каб кожны гулец выбраў унікальную нацыю. server.maximumPlayers=Прабачце, дасягнутая максымальная колькасьць гульцоў. +# Fuzzy server.noRouteToServer=Сэрвэр ня можа быць публічным. Вам неабходна зьмяніць устаноўкі фаерволу, каб дазволіць злучэньне па выбраным порце. server.notAllReady=Ня ўсе гульцы гатовыя пачаць гульню! server.onlyAdminCanLaunch=Прабачце, толькі адміністратар сэрвэра можа пачаць гульню. @@ -1814,6 +1841,7 @@ colopedia.unit.price=Цана ў Эўропе: # Fuzzy colopedia.unit.productionBonus={{plural:%number%|one=Мадыфікатар вытворчасьці|few=Мадыфікатары вытворчасьці|many=Мадыфікатараў вытворчасьці}} colopedia.unit.requirements=Патрабаваньні: +# Fuzzy colopedia.unit.school=Неабходная школа для трэніроўкі: colopedia.unit.skill=Вопыт: report.labour.allColonists=Усе каляністы @@ -1855,13 +1883,13 @@ report.colony.making.noconstruction.description=%colony%: Не занятая б report.colony.making.noteach.description=%colony%: %teacher% ня мае навучэнцаў report.colony.name.description=Сьпіс калёніяў report.colony.name.header=Калёнія -report.colony.plow.description=Колькасьць клетак калёніі, якія прынясуць прыбытак ад ўзараньня +# Fuzzy report.colony.production.description=%colony%: агульная вытворчасьць %goods% = %amount% +# Fuzzy report.colony.production.export.description=%colony%: агульная вытворчасьць %goods% %amount% (экспартуецца звыш %export%) report.colony.production.header=Агульная вытворчасьць %goods% +# Fuzzy report.colony.production.waste.description=%colony%: агульная вытворчасьць %goods% = %amount%, сховішча будзе перапоўненае, %waste% будзе страчана -report.colony.road.description=Колькасьць клетак калёніі, якія прынясуць прыбытак ад пабудовы дарогі -report.colony.roadBuilding.description=%colony% атрымае прыбытак ад пабудовы {{plural:%amount%|one=%amount% дарогі|few=%amount% дарогаў|many=%amount% дарогаў}} # Fuzzy report.continentalCongress.elected=Выбраныя: report.continentalCongress.none=(няма) @@ -1903,27 +1931,26 @@ report.production.selectGoods=Выбар тавараў report.production.update=Абнавіць report.requirements.badAssignment=%colony% мае %expert%, які зараз працуе як %expertWork%, у той час як %nonExpert% працуе як %nonExpertWork%. Вытворчасьць павялічыцца, калі каляністы памяняюцца працамі. report.requirements.canTrainExperts={{plural:2|%unit%}} можна навучыць у -report.requirements.clearTile=%type% на %direction% ад %colony% прынясе прыбытак ад расчысткі. +# Fuzzy report.requirements.exploreTile=%type% на %direction% ад %colony% прынясе прыбытак ад распрацоўкі. report.requirements.met=Усе патрабаваньні выкананыя. report.requirements.missingGoods=%colony% вырабляе %goods%, але неабходна болей %input%. # Fuzzy report.requirements.misusedExperts=Ёсьць {{plural:2|%unit%}}, якія не працуюць як %work% знаходзяцца ў report.requirements.noExpert=%colony% вырабляе %goods%, але там няма %unit%. -report.requirements.plowCenter=%colony% атрымае прыбытак, калі гэтая клетка будзе ўзараная. -report.requirements.plowTile=%type% на %direction% ад %colony% прынясе прыбытак ад узараньня. -report.requirements.roadTile=%type% на %direction% ад %colony% прынясе прыбытак ад пабудовы дарогі. report.requirements.severalExperts=Некалькі {{plural:2|%unit%}} знаходзіцца ў report.requirements.surplus=Лішак %goods% вырабляецца ў report.trade.afterTaxes=Прыбытак пасьля падаткаў report.trade.beforeTaxes=Прыбытак да падаткаў report.trade.cargoUnits=Адзінак у перавозцы +# Fuzzy report.trade.hasCustomHouse=* Гэтая калёнія мае мытню; гэтыя тавары экспартуюцца. report.trade.totalDelta=Агульная вытворчасьць report.trade.totalUnits=Усяго адзінак report.trade.unitsSold=Адзінак куплена ці прададзена report.turn.filter=Не выводзіць гэты тып паведамленьняў (%type%) report.turn.ignore=Ігнараваць гэтае паведамленьне (Калёнія: %colony%, Тавары: %goods%) +# Fuzzy report.turn.playerNation=%player% %nation% # Fuzzy aboutPanel.copyright=Аўтарскія правы © 2002-2013 каманда FreeCol @@ -1957,7 +1984,9 @@ colonyPanel.notBestTile=%unit% можа вырабляць болей %goods% н confirmDeclarationDialog.areYouSure.no=Можа потым. confirmDeclarationDialog.areYouSure.text=Адкінем несправядлівую тыранію %monarch% і абвясьцім незалежнасьць нашых калёніяў ад Кароны! confirmDeclarationDialog.areYouSure.yes=Свабода альбо сьмерць! +# Fuzzy confirmDeclarationDialog.defaultCountry=%nation% Злучаныя Штаты +# Fuzzy confirmDeclarationDialog.defaultNation=Свабодныя %nation% confirmDeclarationDialog.enterCountry=З гэтага моманту наша краіна будзе вядома як confirmDeclarationDialog.enterNation=кожны грамадзянін нашай вялікай нацыі павінен ганарыцца тым, што ён будзе вядомы як @@ -1966,8 +1995,10 @@ constructionPanel.turnsToComplete=(Хадоў да выкананьня: %number negotiationDialog.accept=Прыняць negotiationDialog.add=Дадаць negotiationDialog.cancel=Адмяніць +# Fuzzy negotiationDialog.demand=%nation% патрабуюць ад %otherNation% negotiationDialog.exchange=у абмен на +# Fuzzy negotiationDialog.offer=%nation% прапануюць %otherNation% negotiationDialog.send=Даслаць editSettlementDialog.removeSettlement=Зруйнаваць паселішча diff --git a/data/strings/FreeColMessages_br.properties b/data/strings/FreeColMessages_br.properties index a622e18d2..4c5900541 100644 --- a/data/strings/FreeColMessages_br.properties +++ b/data/strings/FreeColMessages_br.properties @@ -100,6 +100,7 @@ cashInTreasureTrain=Arc'hant e Karrigenn an teñzor clearOrders=Nullañ an urzhioù colonists=Trevadennerien colopedia=Trevpedia +countryName={{tag:country|%nation%}} difficulty=Diaester docks=Kaeoù dumpCargo=Teurel al lestrad @@ -203,8 +204,9 @@ cli.no-memory-check=mont dreist da wiriadur ar vemor cli.no-sound=lakaat FreeCol da vont hep son cli.private=digeriñ ur servijer prevez (n'eo ket embannet er metaservijer) cli.seed=a bourchas un HADENN evit ar ganer niveroù damzargouezhek -cli.server-name=diferañ un ANV boaz evit ar servijer +# Fuzzy cli.server=digeriñ ur servijer emren war ar porzh diferet +cli.server-name=diferañ un ANV boaz evit ar servijer cli.splash=diskouez RESTR un dapadenn-skramm pa vez ar c'hoariadenn o kargañ cli.tc=kargañ holl an amdroidigezh gant an ANV roet cli.timeout=niver a eilennoù gortozet gant ar servijer evit respont d'ur goulenn @@ -229,6 +231,7 @@ menuBar.debug.addLiberty=Ouzhpennañ frankiz da bep trevadenn menuBar.debug.compareMaps.checkComplete=Kontroll echu. Disinkroneladur ebet dizoloet. menuBar.debug.compareMaps.problem=Kudennoù a c'hell bezañ. Lennit an titouroù skrivet war ar skramm, mar plij. menuBar.debug.compareMaps=O kontrollañ disinkroneladur ar gartenn +menuBar.debug.displayAIMissions=Diskwel an holl gefridioù menuBar.debug.displayErrorMessage=Diskwel ar c'hemennad fazi menuBar.debug.displayEuropeStatus=Diskouez statud Europa menuBar.debug.displayMonarchPanel=Diskwel panell ar Roue @@ -267,7 +270,6 @@ colopediaAction.goods.name=Madoù colopediaAction.nations.name=Broadoù colopediaAction.nationTypes.name=Perzhioù mat broadel colopediaAction.resources.name=Danvezioù bonuz -colopediaAction.skills.name=Barregezhioù colopediaAction.terrain.name=Doare an dachenn colopediaAction.units.name=Unvezioù colopediaAction.name=%object% (Colopedia) @@ -1552,7 +1554,7 @@ model.improvement.road.description=Hent model.improvement.road.name=Hent model.improvement.road.occupationString=H model.limit.independence.coastalColonies.name=Bevenn trevaennoù war an aod -model.limit.independence.coastalColonies.description=Rankout a reot kaout %limit% trevadenn war an aod da nebeutañ evit disklêriañ ho tizalc'hiezh. +model.limit.independence.coastalColonies.description=Rankout a reot kaout %limit% {{plural:%limit%|one=trevadenn|other=trevadennoù}} war an aod da nebeutañ evit disklêriañ ho tizalc'hiezh. model.limit.independence.rebels.name=Bevenn a emsavidi model.limit.independence.rebels.description=D'an nebeutañ %limit%% eus ho entrevidi a rank souten an dizalc'hiezh. model.limit.independence.year.name=Bloavezh Harz @@ -1900,7 +1902,7 @@ model.colony.badGovernment=Diefedus eo gouarnamant %colony%. Kastizoù zo lakaet model.colony.goodGovernment=Gwellaet eo efedusted ar gouarnamant! Mibien ar frankiz n'eo ket mui par pe a ya bremañ d'ober muioc'h eget %number% dre gant ar gumuniezh e %colony%. model.colony.governmentImproved1=Gwellaet eo gouarnamant %colony%, daoust dezhañ chom diefedus. Kastizoù a zo lakaet war ar produerezh c'hoazh. model.colony.governmentImproved2=Gwellaet eo gouarnamant %colony%. Lamet eo bet ar c'hastizoù war ar produerezh. -model.colony.insufficientProduction=%outputAmount% %outputType% muioc'h a c'hellfe bezañ produet e %colony% gant ma vefe un dreistad a %inputAmount% %inputType% ganeomp. +model.colony.insufficientProduction=%outputAmount% %outputType% muioc'h a c'hellfe bezañ produet e %colony% gant ma vefe un dreistad a %consumptionDeficit% ganeomp. model.colony.lostGoodGovernment=Koazhet eo efedusted ar gouarnamant! Mibien ar frankiz n'eo ket mui par pe a ya bremañ d'ober muioc'h eget %number% dre gant ar gumuniezh e %colony%. N'eus bonuz produiñ ebet ken gant an drevadenn. model.colony.lostVeryGoodGovernment=Koazhet eo efedusted ar gouarnamant! Mibien ar frankiz n'eo ket mui par pe a ya bremañ d'ober nebeutoc'h eget %number% dre gant ar gumuniezh e %colony%. Kollet ez eus bet holl he bonuzoù produiñ gant an drevadenn. model.colony.minimumColonySize=%object% a vir ouzh ar boblañs da zigreskiñ betek re. @@ -1914,13 +1916,13 @@ model.colony.veryBadGovernment=Diefedus a-grenn eo gouarnamant %colony%. Kastizo model.colony.veryGoodGovernment=Gwellaet eo bet efedusted ar gournamant! Par eo ar santadur disuj er %colony% pe mont a ra dreist bremañ da %number% dre gant... model.colonyTile.claim=(%direction% ar goulenn) model.diplomaticTrade.receive.contact=Gant hor gwellañ gourc'hemennoù a-berzh ar vroad illur %nation%. -model.diplomaticTrade.receive.diplomatic=Kevraouomp gant %nation%. +model.diplomaticTrade.receive.diplomatic=Kevraouomp gant {{tag:country|%nation%}}. model.diplomaticTrade.receive.trade=Roomp studi da ginnig kenwerzhel %nation%. -model.diplomaticTrade.receive.tribute=%nation% zo o c'houlenn un truaj diganeoc'h ! +model.diplomaticTrade.receive.tribute={{tag:country|%nation%]] zo o c'houlenn un truaj diganeoc'h ! model.diplomaticTrade.send.contact=Kejet hon eus ouzh izili eus ar vroad %nation%. -model.diplomaticTrade.send.diplomatic=Roomp studi d'hor stad diplomatel gant %nation% -model.diplomaticTrade.send.trade=Roomp studi d'ur c'henwerzh gant %nation% e %settlement%. -model.diplomaticTrade.send.tribute=Goulenn a reomp un truaj digant %nation% e % %settlement%. +model.diplomaticTrade.send.diplomatic=Roomp studi d'hor stad diplomatel gant {{tag:country|%nation%}}. +model.diplomaticTrade.send.trade=Roomp studi d'ur c'henwerzh gant {{tag:%nation%}} e %settlement%. +model.diplomaticTrade.send.tribute=Goulenn a reomp un truaj digant {{tag:country|%nation%}} e % %settlement%. model.direction.N.name=norzh model.direction.NE.name=biz model.direction.E.name=reter @@ -1930,28 +1932,25 @@ model.direction.SW.name=mervent model.direction.W.name=kornôg model.direction.NW.name=gwalarn model.historyEventType.abandonColony.description=Dilezel a rit trevadenn %colony%. -model.historyEventType.ceaseFire.description=Un harz-tennañ zo bet sinet gant %nation% -model.historyEventType.cityOfGold.description=An %nation% a zizolo %city%, unan eus ar Seizh Keoded aour Kollet, hag un teñzor a %treasure% unanenn aour. -model.historyEventType.colonyConquered.description=Aloubet eo bet ho trevadenn %colony% gant %nation%. -model.historyEventType.colonyDestroyed.description=Distrujet eo bet ho trevadenn %colony% gant %nation%. -# Fuzzy -model.historyEventType.conquerColony.description=Krediñ a reot degemer hon aozioù brokus ha tremen a rit, koulskoude, hep paeañ ? Aze ez eus trubarderezh ! Setu perak n'omp ket plijet gant hoc'h emzaclc'h. -# Fuzzy -model.historyEventType.declareIndependence.description=Distrujañ a rit kêriadenn %settlement% %nation%. -model.historyEventType.declareWar.description=Disklêriet eo ar brezel gant %nation% -model.historyEventType.destroyNation.description=Gant an %nation% eo bet distrujet an %nativeNation%. -# Fuzzy -model.historyEventType.destroySettlement.description=Distrujañ a rit ar gêriadenn %settlement e %nation% +model.historyEventType.ceaseFire.description=Un harz-tennañ zo bet sinet gant {{tag:country|%nation%}}. +model.historyEventType.cityOfGold.description={{tag:country|%nation%}} a zizolo %city%, unan eus ar Seizh Keoded aour Kollet, hag un teñzor a %treasure% unanenn aour. +model.historyEventType.colonyConquered.description=Aloubet eo bet ho trevadenn %colony% gant {{tag:country|%nation%}}. +model.historyEventType.colonyDestroyed.description=Distrujet eo bet ho trevadenn %colony% gant {{tag:country|%nation%}}. +model.historyEventType.conquerColony.description=Aloubet ho peus an drevadenn %nation% colony eus %colony%. +model.historyEventType.declareIndependence.description=Disklêriañ a rit an dizalc'hiezh ouzh ar Gururenn. +model.historyEventType.declareWar.description=Disklêriet eo ar brezel gant {{tag:country|%nation%}}. +model.historyEventType.destroyNation.description=An {{tag:country|%nation%}} a zistuj an %nativeNation%. +model.historyEventType.destroySettlement.description=Distrujañ a rit ar gêriadenn %settlement% e %nation% model.historyEventType.discoverNewWorld.description=Dizoleiñ a rit an Douar Nevez. -model.historyEventType.discoverRegion.description=An %nation% a zizolo %region%. -model.historyEventType.formAlliance.description=Un emglev zo bet siner gant %nation% +model.historyEventType.discoverRegion.description={{tag:country|%nation%}} a zizolo %region%. +model.historyEventType.formAlliance.description=Un emglev zo bet siner gant {{tag:country|%nation%}}. model.historyEventType.foundColony.description=Sevel a rit trevadenn %colony%. model.historyEventType.foundingFather.description=Emezelañ a ra %father% ouzh ar C'hendalc'h Kevandirel. model.historyEventType.independence.description=An Dizalc'hiezh ho peus gounezet diouzh ar Gurunenn. -model.historyEventType.makePeace.description=Un emglev peoc'h zo bet sinet gant %nation%. +model.historyEventType.makePeace.description=Un emglev peoc'h zo bet sinet gant {{tag:country|%nation%}}. model.historyEventType.meetNation.description=En em gavout a rit gant %nation%. model.historyEventType.nationDestroyed.description=N'eus ket mui eus !!%nation% er Bed Nevez. -model.historyEventType.spanishSuccession.description=%loserNation% a lez holl o zrevadennoù en Douar Nevez da %nation%. +model.historyEventType.spanishSuccession.description={{tag:country|%loserNation%}}a lez holl o zrevadennoù en Douar Nevez da {{tag:country|%nation%}}. model.indianSettlement.mostHatedNone=Hini ebet model.indianSettlement.mostHatedUnknown=Dianav model.indianSettlement.nameUnknown=Dianav @@ -2004,9 +2003,9 @@ model.messageType.warehouseCapacity.name=Barregezh ar sanailh model.messageType.warning.name=Kemennoù diwall model.monarch.action.addToRef.text=Ouzhpennet eo bet gant ar Gurunenn {{plural:%number%|%unit%}} d'ar Bagad Brezel Roueel. Ankeniet eo renerien an trevadennoù. model.monarch.action.addToRef.no=Graet -model.monarch.action.declarePeace.text=Asantet hon eus skoulmañ un emglev peoc'h gant an %nation%. +model.monarch.action.declarePeace.text=Asantet hon eus skoulmañ un emglev peoc'h gant {{tag:country|%nation%}}. model.monarch.action.declarePeace.no=Graet -model.monarch.action.declareWar.text=Rediet omp, abalamour d'ho rogoni, da zisklêriañ brezel d'an %nation% ! +model.monarch.action.declareWar.text=Rediet omp, abalamour d'ho rogoni, da zisklêriañ brezel da {{tag:country|%nation%}} ! model.monarch.action.declareWar.no=Graet # Fuzzy model.monarch.action.displeasure.text=Disklêriañ a rit Dizalchiezh diouzh ar Gurunenn. @@ -2050,8 +2049,7 @@ model.advantages.selectable.name=A c'haller dibab model.advantages.selectable.shortDescription=Ar spledoù broadel a c'haller dibab ha n'o deus ket da vezañ dibar. model.nationState.aiOnly.name=NA nemetken model.nationState.available.name=hegerz -# Fuzzy -model.nationState.available.shortDescription=Aloubiñ a rit %colony%, un drevadenn eus ar vroad %nation%. +model.nationState.available.shortDescription=Gallout a rit c'hoari ar vroad-mañ model.nationState.notAvailable.name=n'eo ket hegerz model.nationState.notAvailable.shortDescription=N'haller ket kaout ar vroad-se model.noClaimReason.europeans.description=Ur vroad europat all a embann piaouañ an douar-mañ dija. @@ -2066,7 +2064,7 @@ model.player.colonialIndependence=N'eus nemet ar c'hoarierien drevadennel a c'ha model.player.forces=Nerzhioù %nation% model.player.independentMarket=Europa model.player.startGame=Goude mizioù war vor emaoc'h degouezhet a-vaez da aodoù ur c'hevandir dianav. Lakait penn {{tag:%direction%|west=d'ar C'hornôg|east=ar Reter|default=dindan an avel}} evit dizoleiñ an Douar Nevez ha piaouañ anezhañ en anv ar Gurunenn. -model.player.waitingFor=O c'hortoz ma vo echuet o zro gant : %nation% +model.player.waitingFor=O c'hortoz : {{tag:country|%nation%}} model.regionType.coast.name=Aod model.regionType.coast.unknown=Rannvro arvorek dianav model.regionType.desert.name=Dezerzh @@ -2105,7 +2103,7 @@ model.tradeItem.gold.name=Aour model.tradeItem.gold.description=ar sammad a %amount% aour model.tradeItem.goods.name=Marc'hadourezh model.tradeItem.incite.name=Disklêriañ ar brezel da -model.tradeItem.incite.description=brezel a-enep an %nation% +model.tradeItem.incite.description=brezel a-enep {{tag:country|%nation%}} model.tradeItem.stance.name=Darempredoù model.tradeItem.unit.name=Unvez model.tradeRoute.allEmpty=Goullo eo an holl zrsavioù. @@ -2127,7 +2125,6 @@ model.unit.underRepair=Dresañ (%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=K model.unit.unitState.fortifying=K -model.unit.unitState.improving=# model.unit.unitState.inColony=L model.unit.unitState.sentry=G model.unit.unitState.skipped=T @@ -2157,6 +2154,7 @@ model.colony.colonyStarved=Trevadenner diwezhañ %colony% zo marvet gant an naon model.colony.customs.sale=Gwerzhet ez eus bet %data% e Maltouterezh %colony%. model.colony.customs.saleData=%amount% %goods% evit %gold% model.colony.famineFeared=Emañ an naonegezh o c'hourdrouz %colony%. A-benn %number% tro ne chomo tamm boued ebet ken. +model.colony.starving=%colony% marnaoniet model.colony.newColonist=Trevadenner nevez e %colony%. model.colony.newConvert=Un ezel eus ar vroad %nation% gounezet gant ar feiz nevez zo degouezhet e %colony%. model.colony.notBuildingAnything=N'emeur o sevel netra e %colony%. @@ -2170,7 +2168,7 @@ model.colony.warehouseSoonFull=Ho sanailh e %colony% a yay en tu all d'he barreg model.colony.warehouseWaste=Ho sanailh e %colony% a zo aet en tu all d'he barregezh sanailhañ %goods%. Foranet eo bet %waste% unanenn. model.colony.workersEvicted=E %colony% ne c'hall ket ho trevadennerien labourat war %location% abalamour ma'z eus %enemyUnit% war al lec'h. model.colonyTile.resourceExhausted=Danvez %resource% kaset da get e %colony% -model.game.spanishSuccession=Ho Meurdez, ar Brezel Hêrezh Spagnol a zo echuet en Europa. Hervez Skrid-emglev Utrecht eo bet rediet ar vroad %loserNation% da lezel holl he zrevadennoù en Douar Nevez da %nation%! +model.game.spanishSuccession=Ho Meurdez, ar Brezel Hêrezh Spagnol a zo echuet en Europa. Hervez Skrid-emglev Utrecht eo bet rediet ar vroad {{tag:country|%loserNation%}} da lezel holl he zrevadennoù en Douar Nevez da {{tag:country|%nation%}}! model.indianSettlement.mission.denounced=Ho misioner a oa e %settlement% a zo bet diskulhiet ha kaset d'ar marv! model.indianSettlement.mission.destroyed=Marvet eo ho misioner e %settlement% pa'z eo bet distrujet ar c'hampadur-se. model.player.alarmIncrease.tension.angry=Penn %nation% à %settlement% a ro da c'houzout emañ ar re galonek o c'hoant d'ober ar brezel ouzh an %enemy% evit skarzhañ ho trevadennerien aloubus hag ho prezelourien lorc'hus warhon douaroù. @@ -2179,7 +2177,7 @@ model.player.autoRecruit=An trubuilhoù relijiel en %europe% a laka %unit% da zi model.player.colonyGoodsParty.harbour=Ho trevadennerien a %colony% o deus bannet %amount% unanenn %goods% er porzh da reiñ mouezh a-enep an taosoù direizh savet gant ar Gurunenn ! model.player.colonyGoodsParty.horses=Ho trevadennerien a %colony% o deus dieubet %amount% marc'h da reiñ mouezh a-enep an taosoù direizh savet gant ar Gurunenn ! model.player.colonyGoodsParty.landLocked=Ho trevadennerien a %colony% o deus devet %amount% unvez %goods% war blasenn ar marc'had da reiñ mouezh a-enep an taosoù direizh savet gant ar Gurunenn! -model.player.dead.european=Ho Meurdez, %nation% o deus disklêriet bezañ aet maez aferioù an Douar Nevez krenn ha krak! +model.player.dead.european=Ho Meurdez, {{tag:country|%nation%}} he deus disklêriet bezañ aet maez aferioù an Douar Nevez krenn ha krak! model.player.dead.native=Ho Meurdez, distrujet eo bet an %nation%. model.player.disaster.bankruptcy.start=N'ho peus paeet mann ebet evit derc'hel kempenn an holl savadurioù. Lakaet e viot da baeañ maluzoù produiñ bras. model.player.disaster.bankruptcy.stop=E-tail emaoc'h, ur wech ouzhpenn, da baeañ kempenn an holl savadurioù. Dilamet eo bet ar maluzoù produiñ. @@ -2193,7 +2191,7 @@ model.player.soLDecrease=Koazhet eo ar feur emezelañ ouzh Mibien ar Frankiz bet model.player.soLIncrease=Kresket eo ar feur emezelañ ouzh Mibien ar Frankiz betek %newSoL% %! model.player.stance.alliance.declared=Ho Meurdez, an %nation% a zo kevredet ganeomp! model.player.stance.alliance.others=Ho Meurdez, %attacker% a zo kevredet gant %defender%. -model.player.stance.ceaseFire.declared=Ho Meurdez, %nation% o deus skoulmet un arsav-tennañ ganeomp! +model.player.stance.ceaseFire.declared=Ho Meurdez, %nation% he deus skoulmet un arsav-tennañ ganeomp! model.player.stance.ceaseFire.others=Ho Meurdez, %attacker% en deus skoulmet un arsav-tennañ gant %defender%. model.player.stance.peace.declared=Ho Meurdez, an %nation% a zo e peoc'h ganeomp! model.player.stance.peace.others=Ho Meurdez, %attacker% a zo e peoc'h gant %defender%. @@ -2212,6 +2210,7 @@ combat.enemyShipEvaded=%enemyUnit% %enemyNation% a zo tremenet hebiou d'un dagad combat.enemyShipSunk=%enemyUnit% %enemyNation% zo aet d'ar strad abalamour da %unit%! combat.equipmentCaptured=Diwallit, paotred dispont %nation% o deus tapet %equipment%! combat.goodsStolen=%enemyUnit% %enemyNation% a laer %amount% %goods% digant %colony%! +# Fuzzy combat.indianPlunder=%enemyUnit% %enemyNation% en deus preizhet %amount% e %colony%. combat.indianRaid=Hor spierien a ro dimp da c'houzout he deus graet ar %nation% ur raid e %colonyNation% %colony%. combat.indianSurprise=%nation% he deus graet ur raid dic'hortoz e %colony%, o trechalañ hon trevadennerien. Penn %nation% a lavar n'eo ket bet rouestlet er raid-se. @@ -2267,7 +2266,7 @@ main.javaVersion=An doare %minVersion% eus Java pe un doare gwelloc'h egetañ zo main.memory=Rankout a reot deverkañ muioc'h %memory% okted memor d'ar JVM.\nAdloc'hit FreeCol gant java -Xmx%minMemory%M -jar FreeCol.jar main.userDir.fail=Ne c'hall ket Freecol kavout kavlec'hioù a zere evit saveteiñ roadennoù enno. Kenderc'hel, met bezit war soñj kaout trubuilhoù. client.baseData=Dibosupl eo kavout ar c'havlec'h roadennoù tarzh%dir%. Ar restroù roadennoù ne c'hallont ket bezañ kavet gant FreeCol. Bezit sur ez eus anezho. Ma klask FreeCol er c'havlec'h fall, lañsit ar jeu gant un arventenn el linenn urzhiañ : -freecol-data -client.choicePlayer=Dibabit ur c'hoarier mar plij : +client.choicePlayer=Dibabit ur vroad mar plij : client.classic=C'hwitet eo bet pa'z eo bet karget kartennouriezh ar roadennoù adal ar rummad reolennoù "klasel". client.debugConnect=Ne c'hallit ket kevreañ ouzh ur bartiad zo anezhi er mod dizreinañ. client.ending=Echuet eo ar bartiad. @@ -2279,8 +2278,9 @@ metaServer.couldNotConnect=Hon digarez, n'eus ket bet tu da gevreañ ouzh ar met metaServer.communicationError=Ur fazi zo bet e-ser mont e darempred gant ar meta-servijer. Klaskit en-dro diwezhatoc'h mar plij. abandonEducation.action.studying=o studiañ abandonEducation.action.teaching=O kelenn -abandonEducation.no=Nann, kenderc'hel ar stummadur +abandonEducation.no=Stummadur dibaouez abandonEducation.text=Ma ya ho %unit% kuit eus %colony% e tilezo %action% er %building% ; ha c'hoant ho peus e lezfe anezhañ ennañ ? +# Fuzzy abandonEducation.yes=Ya, kuitait an drevadenn abandonTeaching.text=Ma ya ho %unit% kuit eus ar %building% e paouezo da gelenn, ha sur eo ho peus c'hoant da vont kuit ? armedUnitSettlement.attack=Tagañ @@ -2292,16 +2292,16 @@ buy.takeOffer=Asantiñ d'ar c'hinnig buy.text=%nation% a venn gwerzhañ %goods% evit %gold%: clearTradeRoute.text=Deverket eo ho %unit% d'an hent kenwerzh %route%. Arventenniñ penn e hent a ray dezhañ bezañ lakaet maez eus an hent. Ha sur oc'h e fell deoc'h en ober? client.fullScreen=Ne vez ket embreget ar mod skramm leun evit an drobarzell c'hrafik-mañ.\nDistriñ d'ar mod prenestret. +# Fuzzy confirmHostile.alliance=N'oc'h ket evit tagañ ur vroad kevredet ! Ha fellout a ra deoc'h terriñ ho emglev gant %nation% ha disklêriañ ar brezel ? -confirmHostile.ceaseFire=Sinet hoc'h eus un harz-brezel gant ar %nation%. Ha sur oc'h e fell deoc'h tagañ anezho? -confirmHostile.peace=E peoc'h emaoc'h gant %nation%. Ha sur oc'h e fell deoc'h disklêriañ ar brezel? +confirmHostile.ceaseFire=Sinet hoc'h eus un harz-brezel gant {{tag:country|%nation%}}. Ha sur oc'h e fell deoc'h tagañ anezho? +confirmHostile.peace=E peoc'h emaoc'h gant {{tag:country|%nation%}}. Ha sur oc'h e fell deoc'h disklêriañ ar brezel? confirmHostile.yes=Ya,distagomp ar chas-brezel ! -confirmTribute.broke=Hor spierien a ro dimp da c'houzout emañ kras an traoù gant ar %nation%. Arabat dimp koll hon amzer gant goulennoù truajoù. +confirmTribute.broke=Hor spierien a ro dimp da c'houzout emañ kras an traoù gant {{tag:country|%nation%}}. Arabat dimp koll hon amzer gant goulennoù truajoù. confirmTribute.european=Ar %nation% %danger%, ha %finance%.\nPegement e rankomp goulenn groñs diganto ? confirmTribute.happy=Mignoned vat ganeomp eo an %nation% e %settlement%. Pec'hed e vefe ober gaou ouzh hon emglev. confirmTribute.no=Gwelloc'h e vefe marteze -# Fuzzy -confirmTribute.normal=Goulenn un truaj habaskaet +confirmTribute.normal=Diaes eo bezañ sur eus an dra-se met %nation% e %settlement% a c'hall kaout un dra bennak a dalvoudegezh. Ha rankout a reomp goulenn un truaj diganto ? confirmTribute.unwise=Kreñv ha niverus eo an %nation% ; ne vefe ket fur, a-dra-sur, atahinañ anezho. confirmTribute.warLikely=Diwallit, ur goulenn truaj a c'hallfe digeriñ brezel en-dro gant an %nation%. confirmTribute.yes=Goulenn an truaj @@ -2361,8 +2361,8 @@ defeated.text=Faezhet oc'h bet ! Ha fellout a ra deoc'h : defeated.yes=Chom da sellet defeatedSinglePlayer.text=Trec'het oc'h bet !\n\nSetu deuet amzer strobinellus an noz, pa zigor ar bezioù ha pa zic'hwezh an ifern e anal flaerius war ar bed. Adalek bremañ e c'hellimp evañ gwad ha derc'hel d'hol labour ken euzhus ma kreno ar bed ken nemet gant gwelet ac'hanomp ! defeatedSinglePlayer.yes=Ober gant ar mod Dial -diplomacy.offerAccepted=Degemeret eo bet ho kinnig brokus gant an %nation% -diplomacy.offerRejected=Distaolet eo bet ho kinnig brokus gant an %nation% +diplomacy.offerAccepted=Degemeret eo bet ho kinnig brokus gant an {{tag:country|%nation%}}. +diplomacy.offerRejected=Distaolet eo bet ho kinnig brokus gant an {{tag:country|%nation%}}. disbandUnit.text=Ha sur oc'h e fell deoc'h divodañ an unanenn-mañ ? disbandUnit.yes=Divodañ disembark.text=Gourc'hemennoù martolod, ha dilestrañ a fell deoc'h da vat ? @@ -2407,7 +2407,7 @@ move.noAccessGoods=Ne genwerzho ket %nation% gant un %unit% goullo. move.noAccessMissionBan=Nac'hañ a ran ar %nation% mont e darempred gant holl ho misionerien. move.noAccessSettlement=Ne aotre ket an %nation% e yafe hor %unit% en o zrevadenn. move.noAccessSkill=Ne c'hell ket hor %unit% deskiñ gant an henvroad. -move.noAccessTrade=N'emañ ket an aotrouniezh ganeomp evit kenwerzh gant Europiz all evel %nation%. +move.noAccessTrade=N'emañ ket an aotrouniezh ganeomp evit kenwerzh gant Europiz all evel {{tag:country|%nation%}}. move.noAccessWar=Ne c'hellomp ket kenwerzhañ gant %nation% p' emaomp o brezeliñ move.noAccessWater=Hor %unit% a rank mont war an douar a-raok mont e-barzh an trevadenn. move.noAttackWater=Ret eo da %unit% douarañ a-raok gallout tagañ. @@ -2438,8 +2438,7 @@ tradeRoute.loadStopBlocked=%goods% dic'hortoz kavet e bourzh tradeRoute.loadStopExport=%amount% %goods% karget c'hoazh gant %more% a chom er sanailh. tradeRoute.loadStopImport=%amount% %goods% karget, mankout a ra plas evit %more% ouzhpenn. tradeRoute.loadStopNoExport=N'eus ket a %goods% karget c'hoazh %more% a chom er sanailh. -# Fuzzy -tradeRoute.loadStopNone=Tamm marc'hadourezh ebet karget en un sanailh goullo. +tradeRoute.loadStopNone=Tamm %goods% ebet karget en un sanailh goullo. tradeRoute.pathStop=Ne c'haller ket kavout un hent war-zu %location%. tradeRoute.prefix=%route%, %unit%:%data% tradeRoute.skipped=Lammet @@ -2465,6 +2464,7 @@ server.invalidPlayerNations=Pep c'hoarier a rank dibab ur vroad a-raok kregiñ g server.maximumPlayers=Ho tigarez, tizhet eo an niver brasañ a c'hoarierien. server.missingUserName=N'eus anv implijer ebet er goulenn kevreañ. server.missingVersion=N'emañ an doare FreeCol er goulenn kevreañ. +# Fuzzy server.noRouteToServer=N'hall ket ar servijer bezañ hegerzh gant an holl. Kefluniit ho maltouter evit aotren ar c'hevreadennoù ouzh ar porzh spisaet ganeoc'h. server.noSuchPlayer=Er bartiad-mañ n'eus c'hoarier ebet anvet : %player% server.notAllReady=N'eo ket prest an holl c'hoarierien da gregiñ ganti c'hoazh ! @@ -2474,7 +2474,7 @@ server.timeOut=Re bell eo padet ar c'hlask kevreañ ouzh ar servijer. server.userNameInUse=Implijet eo an anv implijer spisaet dija. server.userNameNotPresent=N'eo ket spisaet an anv implijer er c'hoari-mañ. server.wrongFreeColVersion=Stummoù pratik ha servijer Freecol ne glotont ket an eil gant egile. -buildColony.others=Ar "%nation% o deus diazezet trevadenn nevez %colony% e %region%. +buildColony.others={{tag:country|%nation%}} he deus diazezet an drevadenn nevez eus %colony% e %region%. cashInTreasureTrain.colonial=Un teñzor a %amount% pezh aour a zo bet dilestret en Europa. %cashInAmount% pezh aour a zo bet enkefiet ganeoc'h. cashInTreasureTrain.independent=Un teñzor a %amount% a zo bet ouzhpennet d'o teñzor broadel. cashInTreasureTrain.otherColonial=Un teñzor a %amount% zo bet lakaet en Europa. Plijet eo, evit doare unpenn an %nation%. @@ -2578,6 +2578,7 @@ colopedia.unit.offensivePower=Galloud tagañ : colopedia.unit.price=Priz en Europa : colopedia.unit.productionBonus={{plural:%number%|one=Kemmer|other=Kemmerien}} produiñ : colopedia.unit.requirements=Redioù: +# Fuzzy colopedia.unit.school=Skol rekis evit deskiñ : colopedia.unit.skill=Barregezh : report.labour.allColonists=Holl an drevadennerien @@ -2610,11 +2611,9 @@ report.colony.exploring.description=Interest he defe %colony% da ergerzhet {{plu report.colony.grow.description=Niver a unvezioù a c'hall an drevadenn diorren hep ober gaou ouzh he froduadur. report.colony.grow.header=+ report.colony.growing.description=Ne c'hall ket %colony% kreskiñ a {{plural:%amount%|one=un unvez|other=%amount% unvez}} hep noazout ouzh he froadudur. -# Fuzzy -report.colony.improve.description=Unvezioù a c'hallfe gwellaat ar produadur e-keñver an unvez zo oc'h ober al labour +report.colony.improve.description=Unvezioù a c'hallfe gwellaat ar produadur. report.colony.improve.header=Gwellaat -report.colony.improving.description=%colony% : Evit produiñ %amount% %goods% ouzhpenn, lakait %unit% e-lec'h %oldUnit% -report.colony.wanting.description=%colony% : Evit produiñ %amount% muioc'h a %goods%, ouzhpennit %unit% +report.colony.improving.description=%colony% %location%: Evit produiñ %amount% %goods% ouzhpenn, lakait %unit% e-lec'h %oldUnit% report.colony.making.blocking.description=%colony%: nevez:%amount% %goods% ret evit %buildable% {{plural:%turns%|one=er c'hentañ tro|other=e %turns% tro}} report.colony.making.constructing.description=%colony%: nevez: %buildable% echuet {{plural:%turns%|one=er c'hentañ tro|other=e %turns% tro}} report.colony.making.description=Petra emañ an drevadenenn-mañ o fardañ @@ -2624,21 +2623,21 @@ report.colony.making.noconstruction.description=%colony% :N'emeur o sevel mann e report.colony.making.noteach.description=%colony%: %teacher% n'en deus studier ebet report.colony.name.description=Roll an trevadennoù report.colony.name.header=Trevadenn -report.colony.plow.description=Niver a garrezennoù trevadenn a denno splet eus an arat -report.colony.plow.header=P -report.colony.plowing.description=Interest he defe %colony% da labourat douar en {{plural:%amount%|one=ur garrezenn|other=%amount% karrezenn}} -report.colony.production.description=%colony% : produadur rik a %goods% = %amount% +report.colony.production.description=%colony% : %amount% %goods% zo bet produet +# Fuzzy report.colony.production.export.description=%colony% : ar produadur rik a %goods% zo %amount% (ezporzhiet en tu all da %export%) report.colony.production.header=Produadur rik a %goods% +# Fuzzy report.colony.production.high.description=%colony% : produadur rik a %goods% = %amount%, aet da netra {{plural:%turns%|one=er ch'entañ tro|other=e %turns% tro}} +# Fuzzy report.colony.production.low.description=%colony% : produadur rik a %goods% = %amount%, aet da netra {{plural:%turns%|one=kentañ tro|other=a-benn %turns% tro}} +# Fuzzy report.colony.production.waste.description=%colony%: produadur kriz a %goods%= %amount%. Leun-chouk eo ar sanailh, %waste% a vo kollet. -report.colony.road.description=Niver a garrezennoù a denno splet eus savidigezh un hent -report.colony.road.header=R -report.colony.roadBuilding.description=Mat e vefe da %colony% sevel {{plural:%amount%|one=un hent|other=%amount% hentoù}} report.colony.shrinking.description=Ne c'hall ket %colony% kreskiñ a {{plural:%amount%|one=un unvez|other=%amount% unvez}} hep ober gaou ouzh he froduadur. report.colony.starving.description=%colony%: naonegezh {{plural:%turns%|one=er c'hentañr|other=a-benn%turns% tro}} # Fuzzy +report.colony.wanting.description=%colony% : Evit produiñ %amount% muioc'h a %goods%, ouzhpennit %unit% +# Fuzzy report.continentalCongress.elected=Dilennet: %tum% report.continentalCongress.none=(hini ebet) report.continentalCongress.recruiting=O tuta @@ -2681,29 +2680,28 @@ report.production.selectGoods=Dibab madoù report.production.update=Hizivaat report.requirements.badAssignment=%colony% en deus ur %expert% a labour bremañ evel %expertWork%, tra ma labour ur %nonExpert% evel %nonExpertWork%. Produet e vefe muioc'h ma eskemme ar drevadennerien o implijoù an eil re gant ar re all. report.requirements.canTrainExperts={{plural:2|%unit%}} a c'hall bezañ gourdonet e : -report.requirements.clearTile=%type% war-zu %direction% %colony% a vefe dedennus evit an difraostañ. +# Fuzzy report.requirements.exploreTile=%type% war-zu %direction% de %colony% report.requirements.met=Holl an amplegadoù a zo gwalc'het. report.requirements.missingGoods=Emañ %colony% o produiñ %goods%, hogen he deus ezhomm muioc'h a %input%. report.requirements.misusedExperts=Bez' ez eus {{plural:2|%unit%} na labouront ket evel %work% zo e report.requirements.noExpert=Emañ %colony% o produiñ %goods%, hogen n'he deus %unit% ebet. -report.requirements.plowCenter=Mat e vefe da %colony% arat he c'harrezenn. -report.requirements.plowTile=%type% war-zu %direction% %colony% a vefe dedennus evit an difraostañ. -report.requirements.roadTile=%type% war-zu %direction% %colony% a vefe emsav dezhi sevel un hent. report.requirements.severalExperts=Meur a {{plural:2|%unit%}} a gaver e report.requirements.surplus=An trevadennoù da-heul a brodu ur revec'h a %goods% e: report.trade.afterTaxes=Korvoder goude an taosoù report.trade.beforeTaxes=Korvoder a-raok an taosoù report.trade.cargoUnits=Unvezioù karget +# Fuzzy report.trade.hasCustomHouse=* An drevadenn-se a zo enni un Ti ar valtouterien; ar marc'hadourezhioù-se a zo ezporzhiet. report.trade.totalDelta=Hollad ar produerezh report.trade.totalUnits=Hollad an unvezioù report.trade.unitsSold=Unvezioù prenet pe gwerzhet report.turn.filter=Ober a-seurt ne vo ket diskouezet ken an doare kemennoù-se (%type%) report.turn.ignore=Ober van eus ar gemenadenn-se (Trevadenn : %colony%, Marc'hadourezh : %goods%) -report.turn.playerNation=%nation% ar %player% +report.turn.playerNation={{tag:country|%nation%}}ar %player% aboutPanel.copyright=Copyright © 2002-2014 Skipailh FreeCol aboutPanel.legalDisclaimer=FreeCol a zo ur c'hoari digor an tarzh anezhañ : gallout a rit addasparzhañ ha/pe kemmañ anezhañ diwar termenoù diferadennoù ar GNU Aotre-implijout Foran Hollek, evel m'eo embannet gant ar Free Software Foundation en e stumm 2 pe en ur stumm nevesoc'h. +aboutPanel.manual=Pellgargañ FreeCol dre zorn aboutPanel.officialSite=Lec'hienn ofisiel : aboutPanel.sfProject=Raktres SourceForge : aboutPanel.version=Stumm : @@ -2741,7 +2739,7 @@ confirmDeclarationDialog.areYouSure.no=Diwezhatoc'hik marteze confirmDeclarationDialog.areYouSure.text=Hol leuskit da dreiñ kein da diranterezh direizh %monarch% ha da zisklêriañ hon dizalc'hiezh diouzh ar gurunenn! confirmDeclarationDialog.areYouSure.yes=Bezañ dieub pe mervel ! confirmDeclarationDialog.createFlag=hag hon enebourien da grenañ gant ar spont pa welint hor banniel disuj. -confirmDeclarationDialog.defaultCountry=Stadoù Unanet %nation% +confirmDeclarationDialog.defaultCountry=Stadoù-Unanet {{tag:country|%nation%}} confirmDeclarationDialog.defaultNation=%nation% dieub confirmDeclarationDialog.enterCountry=Adal bremañ e vo anavezet ho pro evel confirmDeclarationDialog.enterNation=ha kement keodedour hor broad klodus a dlefe bezañ lorc'h ennañ da vezañ anavezet evel @@ -2792,10 +2790,10 @@ negotiationDialog.add=Ouzhpennañ negotiationDialog.cancel=Nullañ negotiationDialog.clear=Diverkañ negotiationDialog.contact.tutorial=Kejañ a rit ouzh Europiz all. Keveziñ a raint ganeoc'h da gaout douaroù ha pinvidigezhioù, ha brezeliñ ouzhoc'h marteze. Kerkent hag anvet Jan a Witt er C'hendalc'h Kevandirel e c'helloc'h ober kenwerzh ganto. -negotiationDialog.demand=%nation% a c'houlenn groñs digant %otherNation% +negotiationDialog.demand={{tag:country|%nation%}} a c'houlenn groñs digant {{tag:country|%otherNation%}} negotiationDialog.exchange=en eskemm ouzh negotiationDialog.goldAvailable=(%amount% aour a c'haller kaout) -negotiationDialog.offer=%nation% a ginnig da %otherNation% +negotiationDialog.offer={{tag:country|%nation%}} a ginnig da {{tag:country|%otherNation%}} negotiationDialog.send=Kas negotiationDialog.title.contact=Kejañ ouzh Europiz all negotiationDialog.title.diplomatic=Kevraouiñ diplomatel @@ -2817,10 +2815,10 @@ findSettlementPanel.displayAll=Kavout ar c'hampadurioù findSettlementPanel.displayOnlyEuropean=Kavout ar c'hampadurioù europat hepken findSettlementPanel.displayOnlyNatives=Ganet er c'hampadurioù henvroat findSettlementPanel.name=Klask ur gêriadenn -firstContactDialog.meeting.natives=Kejañ ouzh ar pobloù henvroat. . . +firstContactDialog.meeting.natives=Kejañ ouzh an henvroidi firstContactDialog.meeting.natives.tutorial=Kejañ a rit ouzh henvroidi. Kasit ho sklêrijennerien d'o c'hêriadennoù evit gouzout hiroc'h diwar o fenn,hag ho mevelien kevratet hag ho trevadennerien evit deskiñ traoù diganto. Kasit ho pigi hag ho Trenioù davet o c'hêriadennoù ma fell deoc'h ober kenwerzh ganto. -firstContactDialog.meeting.AZTEC=Ar vroad Aztek... -firstContactDialog.meeting.INCA=An impalaeriezh inka. . . +firstContactDialog.meeting.aztec=Ar vroad Aztek +firstContactDialog.meeting.inca=An Impalaeriezh inka. . . firstContactDialog.welcomeOffer.text=%nation% ho salud. Broad klodus kamp %camps% %settlementType% emomp-ni. Da lidañ hor mignoniezh e profomp deoc'h an douaroù emaoc'h warno. Hag asantiñ a rit d'hor feur-emglev ? Hag asantiñ a rit chom ganeomp da vevañ e peoc'h evel breudeur? firstContactDialog.welcomeSimple.text=%nation% ho salud. Broad klodus kamp %camps% %settlementType% omp-ni. Hag a santiñ a rit d'hor feur-emglev hag asantiñ a rit chom ganeomp da vevañ e peoc'h evel breudeur? abandonColony.no=Nullañ @@ -2863,6 +2861,7 @@ freecol.map.Australia=Aostralia freecol.map.Caribbean_basin=Diazad ar C'harib mapSizeDialog.mapSize=Diuzañ ment ar gartenn modifierFormat.unknown=??? +modifierFormat.scopeMethod.isIndian.name=henvroidi monarchDialog.default=Ur gemennadenn a-berzh ar Gurunenn newPanel.editDifficulty=Kemmañ an diaester newPanel.getServerList=Tapout roll ar servijer diff --git a/data/strings/FreeColMessages_ca.properties b/data/strings/FreeColMessages_ca.properties index 8fd96ca20..1ba4bdb82 100644 --- a/data/strings/FreeColMessages_ca.properties +++ b/data/strings/FreeColMessages_ca.properties @@ -206,8 +206,9 @@ cli.no-memory-check=salta la comprovació de memòria cli.no-sound=executa FreeCol sense so cli.private=inicia un servidor privat (no publicat en el metaserver) cli.seed=proporciona una LLAVOR per al generador de nombres pseudo-aleatoris -cli.server-name=especifica un NOM per el servidor +# Fuzzy cli.server=inicia un servidor únic en el port especificat +cli.server-name=especifica un NOM per el servidor cli.splash=mostra una imatge del FITXER a la pantalla mentre es carrega el joc cli.tc=carrega la conversió total amb el NOM donat cli.timeout=nombre de segons que el servidor espera d'una resposta a una pregunta @@ -271,7 +272,6 @@ colopediaAction.goods.name=Mercaderies colopediaAction.nations.name=Nacions colopediaAction.nationTypes.name=Avantatges Nacionals colopediaAction.resources.name=Recursos Addicionals -colopediaAction.skills.name=Aptituds colopediaAction.terrain.name=Tipus de Terreny colopediaAction.units.name=Unitats colopediaAction.name=%object% (Colopèdia) @@ -1399,6 +1399,7 @@ model.improvement.road.description=Carretera model.improvement.road.name=Carretera model.improvement.road.occupationString=R model.limit.independence.coastalColonies.name=Límit costaner de la colònia +# Fuzzy model.limit.independence.coastalColonies.description=Com a mínim necessiteu %limit% de colònies costaneres per declarar la independència. model.limit.independence.rebels.name=Límit dels Rebels model.limit.independence.rebels.description=Com a mínim un %limit%% del vostres colons ha de donar suport a la Independència. @@ -1733,6 +1734,7 @@ model.colony.badGovernment=El govern de %colony% és ineficient. S'apliquen pena model.colony.goodGovernment=L'eficiència del govern ha millorat! El sentiment rebel a %colony% és ara igual o superior a un %number% per cent. model.colony.governmentImproved1=El govern de %colony% ha millorat, però encara és ineficient. Les penalitzacions a la producció es mantenen. model.colony.governmentImproved2=El govern de %colony% ha millorat. Desapareixen les penalitzacions a la producció. +# Fuzzy model.colony.insufficientProduction=Es podrien produir %outputAmount% %outputType% de més a %colony%, si tinguéssim %inputAmount% unitats de %inputType% de més per torn. model.colony.lostVeryGoodGovernment=L'eficiència del govern ha disminuït! El sentiment rebel a %colony% ja no iguala o supera un %number% per cent. model.colony.minimumColonySize=%object% impedeix la reducció de la població. @@ -1746,12 +1748,17 @@ model.colony.veryBadGovernment=El govern de %colony% és molt ineficient. S'apli model.colony.veryGoodGovernment=L'eficiència del govern ha millorat! El sentiment rebel a %colony% és ara igual o superior a un %number% per cent. model.colonyTile.claim=(reclamar %direction%) model.diplomaticTrade.receive.contact=Salutacions fraternal de la gloriosa nació %nation%. +# Fuzzy model.diplomaticTrade.receive.diplomatic=Anem a negociar amb els %nation%. model.diplomaticTrade.receive.trade=Anem a considerar l'oferta de comerç dels %nation%. +# Fuzzy model.diplomaticTrade.receive.tribute=Els %nation% ens demanen impostos! model.diplomaticTrade.send.contact=Hem trobat membres de la nació %nation%. +# Fuzzy model.diplomaticTrade.send.diplomatic=Hem de considerar la nostra situació diplomàtica amb els %nation% +# Fuzzy model.diplomaticTrade.send.trade=Proposem-nos comerç amb els %nation% a %settlement% +# Fuzzy model.diplomaticTrade.send.tribute=Exigim un impost als %nation% a %settlement% model.direction.N.name=nord model.direction.NE.name=nord-est @@ -1762,23 +1769,35 @@ model.direction.SW.name=sud-oest model.direction.W.name=oest model.direction.NW.name=nord-oest model.historyEventType.abandonColony.description=Abandoneu la colònia de %colony%. +# Fuzzy model.historyEventType.ceaseFire.description=Alto el foc amb %nation% +# Fuzzy model.historyEventType.cityOfGold.description=%nation% descobreix %city%, una de les Set Ciutats d'Or, i un tresor de %treasure% peces d'or. +# Fuzzy model.historyEventType.colonyConquered.description=La vostra colònia de %colony% és conquerida per %nation%. +# Fuzzy model.historyEventType.colonyDestroyed.description=La vostra colònia de %colony% és destruïda per %nation%. model.historyEventType.conquerColony.description=Has conquerit la colònia %nation% de %colony%. model.historyEventType.declareIndependence.description=Declareu la independència de la Corona. +# Fuzzy model.historyEventType.declareWar.description=Guerra declarada amb %nation%. +# Fuzzy model.historyEventType.destroyNation.description=Els %nation% destrueix els %nativeNation%. model.historyEventType.discoverNewWorld.description=Descobriu el Nou Món. +# Fuzzy model.historyEventType.discoverRegion.description=Els %nation% descobreixen %region%. +# Fuzzy model.historyEventType.formAlliance.description=Aliança negociada amb %nation% model.historyEventType.foundColony.description=Establiu la colònia de %colony%. model.historyEventType.foundingFather.description=%father% s'uneix al Congrés Continental. model.historyEventType.independence.description=He aconseguit la Independència de la Corona. +# Fuzzy model.historyEventType.makePeace.description=Acord de pau amb %nation% +# Fuzzy model.historyEventType.meetNation.description=Has conegut la %nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=Els %nation% ja no estan presents en el Nou Món. +# Fuzzy model.historyEventType.spanishSuccession.description=%loserNation% cedeix totes les seves colònies en el Nou Món a %nation%. model.indianSettlement.mostHatedNone=Cap model.indianSettlement.mostHatedUnknown=Desconegut @@ -1828,8 +1847,10 @@ model.messageType.warehouseCapacity.name=Capacitat del Magatzem model.messageType.warning.name=Avisos model.monarch.action.addToRef.text=La Corona ha afegit %number% {{plural:%number%|%unit%}} a la Reial Força Expedicionària. Els líders colonials expressen la seva preocupació. model.monarch.action.addToRef.no=Fet +# Fuzzy model.monarch.action.declarePeace.text=Amablement hem acordat un tractat de pau amb els %nation%. model.monarch.action.declarePeace.no=Fet +# Fuzzy model.monarch.action.declareWar.text=La insolència dels %nation% ens obliga a declarar-los la guerra! model.monarch.action.declareWar.no=Fet model.monarch.action.displeasure.text=T'atreveixes a acceptar els nostres generosos terminis i encara vols eludir el pagament? Aquesta duplicitat recollirà l'amarga recompensa de la nostra contrarietat. @@ -1887,6 +1908,7 @@ model.player.colonialIndependence=Únicament els jugadors colonials poden declar model.player.forces=Exèrcit de %nation% model.player.independentMarket=Europa model.player.startGame=Després de mesos al mar, finalment has arribat a la costa d'un continent desconegut. Navega cap {{tag:%direction%|west=a l'oest|east=a l'est|default=al vent}} per descobrir el Nou Món i reclamar-lo per a la Corona. +# Fuzzy model.player.waitingFor=Esperant a: %nation% model.regionType.coast.name=Costa model.regionType.coast.unknown=Regió costanera desconeguda @@ -1926,6 +1948,7 @@ model.tradeItem.gold.name=Or model.tradeItem.gold.description=La quantitat de %amount% monedes d'or model.tradeItem.goods.name=Mercaderies model.tradeItem.incite.name=Declarar la guerra contra +# Fuzzy model.tradeItem.incite.description=guerra amb els %nation% model.tradeItem.stance.name=Postura model.tradeItem.unit.name=Unitat @@ -1948,9 +1971,9 @@ model.unit.underRepair=Reparar(%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S +# Fuzzy model.unit.unitState.skipped=W model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G @@ -1990,6 +2013,7 @@ model.colony.warehouseOverfull=El vostre magatzem a %colony% no pot guardar més model.colony.warehouseSoonFull=El magatzem de %colony% superarà la capacitat per guardar %goods% durant el següent torn. Es perdran %amount% unitats de %goods%. model.colony.warehouseWaste=El magatzem de %colony% ha sobrepassat la seva capacitat per guardat %goods%. S'han perdut %waste% unitats. model.colonyTile.resourceExhausted=S'ha esgotat el recurs %resource% a %colony% +# Fuzzy model.game.spanishSuccession=Sa Exceŀlència, la Guerra de Successió Española ha acabat a Europa. En el Tractat d'Utrech, els %loserNation% han estat forçats a cedir totes les seves colònies del Nou Món als %nation%. model.indianSettlement.mission.denounced=El vostre missioner a %settlement% ha estat denunciat i executat! model.indianSettlement.mission.destroyed=El missioner a %settlement% ha mort en la destrucció del assentament. @@ -1997,6 +2021,7 @@ model.player.autoRecruit=Disturbis religiosos a %europe% demanda que %unit% emig model.player.colonyGoodsParty.harbour=Els vostres colons a %colony% han llançat %amount% unitats de %goods% al port en protesta per aquest impost injust per part de la Corona! model.player.colonyGoodsParty.horses=Els seus colons a %colony% han alliberat %amount% cavalls en senyal de protesta per aquest impost injust de la Corona! model.player.colonyGoodsParty.landLocked=Els vostres colons a %colony% han cremat %amount% unitats de %goods% a la plaça del mercat per aquest impost injust per part de la Corona! +# Fuzzy model.player.dead.european=Sa Exceŀlència, els %nation% han declarat la seva retirada incondicional dels assumptes del Nou Món! model.player.dead.native=Sa Exceŀlència, els %nation% han estat destruïts. model.player.disaster.bankruptcy.start=No heu pogut pagar el manteniment de tots els edificis. S'apliquen sancions greus a la producció. @@ -2008,12 +2033,16 @@ model.player.foundingFatherJoinedCongress=%foundingFather% s'ha unit al Congrés model.player.interventionForceArrives=La força d'intervenció promesa ha arribat! model.player.soLDecrease=Els membres dels Fills de la Llibertat a les vostres colònies ha disminuït al %newSoL% per cent! model.player.soLIncrease=Els membres dels Fills de la Llibertat a les vostres colònies han augmentat al %newSoL% per cent! +# Fuzzy model.player.stance.alliance.declared=Sa Exceŀlència, els %nation% són aliats nostres! model.player.stance.alliance.others=Sa Exceŀlència, els %attacker% són aliats dels %defender%. +# Fuzzy model.player.stance.ceaseFire.declared=Sa Exceŀlència, els %nation% han acordat un cessament de les hostilitats amb nosaltres! model.player.stance.ceaseFire.others=Sa Exceŀlència, els %attacker% han acordat un cessament de les hostilitats amb els %defender%. +# Fuzzy model.player.stance.peace.declared=Sa Exceŀlància, els %nation% estan en pau amb nosaltres! model.player.stance.peace.others=Sa Exceŀlència, els %attacker% estan en pau amb els %defender%. +# Fuzzy model.player.stance.war.declared=Males notícies, sa Exceŀlència, els %nation% ens han declarat la guerra! model.player.stance.war.others=Sa Exceŀlència, els %attacker% han declarat la guerra als %defender% combat.automaticDefence=Vostre %unit% a %colony% ha pres les armes per defensar la colònia! @@ -2029,6 +2058,7 @@ combat.enemyShipEvaded=%enemyUnit% %enemyNation% aconsegueix escapar a un atac p combat.enemyShipSunk=%unit% ha enfonsat %enemyUnit% %enemyNation%! combat.equipmentCaptured=Vigileu, els guerrers dels %nation% han aconseguit %equipment%! combat.goodsStolen=%enemyUnit% %enemyNation% roba %amount% %goods% a %colony%! +# Fuzzy combat.indianPlunder=%enemyUnit% %enemyNation% saqueja %amount% de %colony%. combat.indianRaid=Els nostres espies informen %nation% ha saquejat el %colonyNation% colònia de %colony%. combat.indianSurprise=Els %nation% fan una batuda sorpresa a %colony%, alarmant els nostres colons. El cap dels %nation% nega la seva participació. @@ -2082,6 +2112,7 @@ main.defaultPlayerName=Nom del jugador main.javaVersion=Es recomana la versió de Java %minVersion% o superior per poder jugar a FreeCol (s'ha detectat la versió %version%, useu --no-java-check per obviar aquesta verificació). main.memory=És necessari assignar més de %memory% bytes de memòria a la JVM. Reinicia FreeCol amb: java -Xmx%minMemory%M -jar FreeCol.jar main.userDir.fail=FreeCol no ha pogut trobar els directoris adequats per desar les dades d'usuari. Continua, però potser hi ha problemes. +# Fuzzy client.choicePlayer=Per favor escolliu un jugador: client.classic=No s'ha pogut carregar l'assignació de recursos del conjunt de regles 'clàssic'. client.debugConnect=No podeu connectar a un joc existent en mode de depuració. @@ -2094,8 +2125,10 @@ metaServer.couldNotConnect=Disculpeu, no es pot connectar el meta-servidor. Prov metaServer.communicationError=Hi ha hagut un error en comunicar amb el meta-servidor. Torneu-ho a provar més tard. abandonEducation.action.studying=estudiant abandonEducation.action.teaching=ensenyant +# Fuzzy abandonEducation.no=No, continuar l'educació abandonEducation.text=Si el teu %unit% marxa de %colony% abandonarà %action% en el %building%, esteu segurs que ha de marxar? +# Fuzzy abandonEducation.yes=Sí, deixar la colònia abandonTeaching.text=Si el teu %unit% deixa el %building%, pararà l'ensenyament, esteu segurs que ha de marxar? armedUnitSettlement.attack=Atacar @@ -2107,9 +2140,13 @@ buy.takeOffer=Accepta la oferta buy.text=Els %nation% us voldrien vendre %goods% per %gold%: clearTradeRoute.text=Vostre %unit% és assignada a la ruta de comerç %route%. Si establiu la seva destinació farà que surti d'aquesta ruta. Esteu segur de voler fer-ho? client.fullScreen=El mode de pantalla complerta no està suportat per aquest dispositiu gràfic.\nTornant al mode de finestra. +# Fuzzy confirmHostile.alliance=No podeu atacar una nació aliada! De debò voleu trencar la nostra aliança amb els %nation% i declarar la guerra? +# Fuzzy confirmHostile.ceaseFire=Vós heu signat un alto el foc amb %nation%. De debò voleu atacar-los? +# Fuzzy confirmHostile.peace=Estem en pau amb els %nation%. De debò voleu declarar la guerra? +# Fuzzy confirmTribute.broke=Els nostres espies informen que els %nation% estan totalment escurats. No cal perdre el temps exigent tributs. confirmTribute.european=Els %nation% %danger%, i %finance%. Quina quantitat de tributs els hem d'exigir? confirmTribute.happy=Els %nation% a %settlement% són bons amics, seria una llàstima estroncar la nostra amistat. @@ -2171,7 +2208,9 @@ defeated.text=Heu estat derrotat! Què voldríeu: defeated.yes=Ens Quedem i Mirem defeatedSinglePlayer.text=L'han derrotat!\n\nAra és el moment de les bruixes de la nit, quan els cementiris badallen i el mateix infern contagia aquest món, ara podria beure sang calenta! i realitzaria actes tant amargs, que el mateix dia tremolaria de veure'ls. defeatedSinglePlayer.yes=Iniciar Mode de Revenja +# Fuzzy diplomacy.offerAccepted=Els %nation% han acceptat la vostra generosa oferta. +# Fuzzy diplomacy.offerRejected=Els %nation% han refusat la vostra generosa oferta. disbandUnit.text=Esteu segur que voleu dissoldre aquesta unitat ? disbandUnit.yes=Dissol @@ -2217,7 +2256,9 @@ move.noAccessGoods=Els %nation% no comerciaran amb %unit%s sense càrrega. move.noAccessMissionBan=Els %nation% rebutgen tot contacte amb els teus missioners. move.noAccessSettlement=Els %nation% no permet que nostre %unit% entri al seu assentament. move.noAccessSkill=Nostre %unit% no pot aprendre dels indígenes. +# Fuzzy move.noAccessTrade=No tenim l'autoritat necessària per comerciar amb altres nacions Europees com els %nation%. +# Fuzzy move.noAccessWar=No podem comerciar amb els %nation% mentre hi estiguem en guerra. move.noAccessWater=Nostre %unit% ha de desembarcar abans d'entrar a l'assentament. move.noAttackWater=Nostra %unit% ha de desembarcar abans d'atacar. @@ -2270,6 +2311,7 @@ server.invalidPlayerNations=Tots el jugadors han d'escollir una nació diferent server.maximumPlayers=Ho sento, s'ha assolit el nombre màxim de jugadors. server.missingUserName=Manca el nom d'usuari en la sol·licitud d'inici de sessió. server.missingVersion=La versió de FreeCol falta en la sol·licitud d'inici de sessió. +# Fuzzy server.noRouteToServer=El servidor no es pot fer públic. Heu de modificar la configuració del vostre tallafocs per permetre connexions al port que heu especificat. server.noSuchPlayer=El joc no conté cap jugador anomenat: %player% server.notAllReady=No tots els jugadors estan preparats per començar la partida! @@ -2279,6 +2321,7 @@ server.timeOut=El temps d'espera per connectar-se al servidor s'ha exhaurit. server.userNameInUse=El nom d'usuari especificat ja està en ús. server.userNameNotPresent=El nom d'usuari especificat no està en aquest joc. server.wrongFreeColVersion=Les versions de client i de servidor de FreeCol no coincideixen. +# Fuzzy buildColony.others=Els %nation% han fundat una nova colònia de %colony% a %region%. cashInTreasureTrain.colonial=Un tresor amb %amount% peces d'or ha desembarcat a Europa. Es troben disponibles %cashInAmount% peces d'or més. cashInTreasureTrain.independent=Un tresor de %amount% ha estat afegit al tresor nacional. @@ -2378,6 +2421,7 @@ colopedia.unit.offensivePower=Potència Ofensiva: colopedia.unit.price=Preu a Europa: colopedia.unit.productionBonus={{plural:%number%|one=modificador|other=modificadors}} de producció: colopedia.unit.requirements=Requeriments +# Fuzzy colopedia.unit.school=Centre requerit per ensenyar: colopedia.unit.skill=Nivell d'habilitat: report.labour.allColonists=Tots els Colons @@ -2412,8 +2456,8 @@ report.colony.grow.header=+ report.colony.growing.description=%colony% pot créixer en {{plural:%amount%|one=una unitat|altres=%amount% unitats}} sense danyar la producció report.colony.improve.description=Unitats que podrien millorar la producció. report.colony.improve.header=Millora +# Fuzzy report.colony.improving.description=%colony%: Per fer %amount% %goods% més, substituïu %oldUnit% per %unit% -report.colony.wanting.description=%colony%: per fer %amount% %goods%més, afegiu %unit% report.colony.making.blocking.description=%colony%: es necessitaran %amount% %goods% per %buildable% {{plural:%turns%|one=el proper torn|other=en %turns% torns}} report.colony.making.constructing.description=%colony%: %buildable% es completa {{plural:%turns%|one=en un torn|other=en %turns% torns}} report.colony.making.description=Què està fent aquesta colònia @@ -2423,20 +2467,21 @@ report.colony.making.noconstruction.description=%colony% : Actualment no s'està report.colony.making.noteach.description=%colony%: %teacher% no té estudiants report.colony.name.description=La llista de colònies report.colony.name.header=Colònia -report.colony.plow.description=Nombre de caselles de la Colònia que es beneficiarien al ser llaurades -report.colony.plow.header=L -report.colony.plowing.description=%colony% es beneficiaria de llaurar {{plural:%amount%|one=una casella|other=%amount% caselles}} +# Fuzzy report.colony.production.description=%colony%: producció neta de %goods% = %amount% +# Fuzzy report.colony.production.export.description=%colony%: producció neta de %goods% is %amount% (exportant %export%) report.colony.production.header=Producció neta de %goods% +# Fuzzy report.colony.production.high.description=%colony%: producció neta de %goods% = %amount%, complet {{plural:%turns%|one=en un torn|other=en %turns% torns}} +# Fuzzy report.colony.production.low.description=%colony%: producció neta de %goods% = %amount%, desapareix {{plural:%turns%|one=en un torn|other=en %turns% torns}} +# Fuzzy report.colony.production.waste.description=%colony%: producció neta de %goods% = %amount%, el magatzem es desbordarà, {{plural:%waste%|one=1 és malgastarà|other=es malgastaran %waste%}} -report.colony.road.description=Nombre de caselles de la Colònia que es beneficiarien de construir una carretera. -report.colony.road.header=C -report.colony.roadBuilding.description=%colony% es beneficiaria de construir {{plural:%amount%|one=una caretera|other=%amount% carreteres}} report.colony.shrinking.description=%colony% s'ha de reduir en {{plural:%amount%|one=una unitat|other=%amount% unitats}} per millorar la producció report.colony.starving.description=%colony%: inanició {{plural:%turns%|one=en un torn|other=en %turns% torns}} +# Fuzzy +report.colony.wanting.description=%colony%: per fer %amount% %goods%més, afegiu %unit% report.continentalCongress.available=Disponible report.continentalCongress.elected=Elegit: %turn% report.continentalCongress.none=(cap) @@ -2480,26 +2525,25 @@ report.production.selectGoods=Seleccionar les mercaderies report.production.update=Actualitza report.requirements.badAssignment=%colony% compta amb un %expert% que actualment treballa com a %expertWork%, mentre que un %nonExpert% està treballant de %nonExpertWork%. La producció seria major si els colons intercanviessin els llocs de treball. report.requirements.canTrainExperts={{plural:2|%unit%}} es pot educar a -report.requirements.clearTile=%type% al %direction% de %colony% es beneficiaria d'una desforestació +# Fuzzy report.requirements.exploreTile=%type% al %direction% de %colony% mereixerien una exploració. report.requirements.met=Es compleixen tots els requisits. report.requirements.missingGoods=%colony% està produint %goods%, però requereix més %input%. report.requirements.misusedExperts=Actualment hi ha {{plural:2|%unit%}} no treballant com a %work% a report.requirements.noExpert=%colony% està produint %goods%, però no té %unit%. -report.requirements.plowCenter=%colony% es beneficiaria de llaurar la seva casella. -report.requirements.plowTile=%type% al %direction% de %colony% es beneficiaria de ser llaurada. -report.requirements.roadTile=%type% al %direction% de %colony% es beneficiaria de construir una carretera. report.requirements.severalExperts=Diversos {{plural:2|%unit%}} estan presents a report.requirements.surplus=Un excés de %goods% s'està produint a report.trade.afterTaxes=Benefici després d'impostos report.trade.beforeTaxes=Beneficis abans d'impostos report.trade.cargoUnits=Unitats Transportades +# Fuzzy report.trade.hasCustomHouse=* Aquesta colònia té una duana; aquestes mercaderies s'han exportat report.trade.totalDelta=Producció Total report.trade.totalUnits=Unitats Totals report.trade.unitsSold=Unitats comprades o venudes report.turn.filter=No mostris aquest tipus de missatge ( %type% ) report.turn.ignore=Ignora aquest missatge (Colònia: %colony%, Mercaderies: %goods%) +# Fuzzy report.turn.playerNation=Els %nation% de %player% aboutPanel.copyright=© 2002–2015 de l’equip del FreeCol aboutPanel.legalDisclaimer=FreeCol és programari lliure: podeu redistribuir i/o modificar-lo sota els termes de la Llicència Pública General GNU publicada per la Free Software Foundation, versió 2 de la Llicència, o qualsevol versió posterior. @@ -2524,6 +2568,7 @@ chooseFoundingFatherDialog.title=Nomineu un Pare de la Pàtria colonyPanel.colonyUnits=Unitats de colònia colonyPanel.inPort=Al port colonyPanel.outsideColony=Les afores de la colònia +# Fuzzy colonyPanel.producing=Produint: colonyPanel.reducePopulation=Si reduïu la població per sota de %number%, %colony% ja no serà capaç de construir %buildable%. colonyPanel.traceWork=Rastre de treball @@ -2538,7 +2583,9 @@ confirmDeclarationDialog.areYouSure.no=Potser més endavant confirmDeclarationDialog.areYouSure.text=Renunciem a la injusta tirania de %monarch% i declarem la independència de les nostres colònies de la corona! confirmDeclarationDialog.areYouSure.yes=Llibertat o Mort! confirmDeclarationDialog.createFlag=i els nostres enemics tremolaran a la vista del nostre pendó desafiant. +# Fuzzy confirmDeclarationDialog.defaultCountry=Estats Units de %nation% +# Fuzzy confirmDeclarationDialog.defaultNation=%nation% lliure confirmDeclarationDialog.enterCountry=D'ara endavant, el nostre país es coneixerà com confirmDeclarationDialog.enterNation=i cada ciutadè de la nostra gloriosa nació ha d'estar orgullós de ser conegut com @@ -2590,8 +2637,10 @@ negotiationDialog.add=Afegeix negotiationDialog.cancel=Canceŀla negotiationDialog.clear=Neteja negotiationDialog.contact.tutorial=Trobada amb els Europeus. Competiran amb nosaltres per la terra i les riqueses, inclús lluitant contra nosaltres. Però després d'incorporar a Jan de Witt al Congrés Continental, podrem comerciar amb ells. +# Fuzzy negotiationDialog.demand=Els %nation% requereixen de la %otherNation% negotiationDialog.exchange=a canvi de +# Fuzzy negotiationDialog.offer=Els %nation% ofereixen la %otherNation% negotiationDialog.send=Envia negotiationDialog.title.contact=Reunió companys Europeus @@ -2614,10 +2663,9 @@ findSettlementPanel.displayAll=Trobar tots els assentaments findSettlementPanel.displayOnlyEuropean=Trobar només assentaments europeus findSettlementPanel.displayOnlyNatives=Trobar només assentaments nadius findSettlementPanel.name=Trobar un assentament +# Fuzzy firstContactDialog.meeting.natives=Trobada amb els nadius... firstContactDialog.meeting.natives.tutorial=Coneixeràs als nadius. Envieu els vostres exploradors als seus assentaments per aprendre més sobre ells, i als servents contractats i colons lliures per aprendre d'ells. Envieu els vostres vaixells i caravanes als seus assentaments si voleu comerciar amb ells. -firstContactDialog.meeting.AZTEC=La nació asteca... -firstContactDialog.meeting.INCA=L’imperi inca... firstContactDialog.welcomeOffer.text=%nation% et dóna la benvinguda. Som una gloriosa nació amb %camps% %settlementType%. Per celebrar la nostra amistat, t'oferim generosament la terra que ocupes com a present actualment. Acceptes el nostre tracte i la nostra pau fraternal? firstContactDialog.welcomeSimple.text=Els %nation% us donem la benvinguda. Som una nació gloriosa de %camps% %settlementType%. Accepteu el nostre tracte i la nostra pau fraternal? abandonColony.no=Canceŀla diff --git a/data/strings/FreeColMessages_cs_CZ.properties b/data/strings/FreeColMessages_cs_CZ.properties index 60c4b280c..25a14f3b2 100644 --- a/data/strings/FreeColMessages_cs_CZ.properties +++ b/data/strings/FreeColMessages_cs_CZ.properties @@ -209,8 +209,9 @@ cli.no-memory-check=přeskočit kontrolu paměti cli.no-sound=spustit FreeCol bez zvuku cli.private=spustit privátní server (nepublikovaný pro metaserver) cli.seed=poskytnout SEED pro pseudo-generátor náhodných čísel -cli.server-name=určit JMÉNO pro server +# Fuzzy cli.server=spustí samostatný server na určeném portu +cli.server-name=určit JMÉNO pro server cli.splash=při nahrávání hry zobrazí SOUBOR jako úvodní obrázek (splash screen) cli.tc=nahraje úplnou konverzi určeného JMÉNA cli.timeout=počet sekund, po které sever čeká odpověď na otázku @@ -275,7 +276,6 @@ colopediaAction.goods.name=Zboží colopediaAction.nations.name=Národy colopediaAction.nationTypes.name=Národní výhody colopediaAction.resources.name=Bonusové zdroje -colopediaAction.skills.name=Dovednosti colopediaAction.terrain.name=Typy terénu colopediaAction.units.name=Jednotky colopediaAction.name=%object% (Colopedie) @@ -1568,6 +1568,7 @@ model.improvement.road.description=Cesta model.improvement.road.name=Cesta model.improvement.road.occupationString=R model.limit.independence.coastalColonies.name=Limit pobřežní kolonie +# Fuzzy model.limit.independence.coastalColonies.description=Pro vyhlášení nezávislosti potřebuješ aspoň %limit% pobřežních kolonií. model.limit.independence.rebels.name=Limit Rebelů model.limit.independence.rebels.description=Aspoň %limit%% tvých kolonistů musí podporovat nezávislost. @@ -1916,6 +1917,7 @@ model.colony.badGovernment=Vláda kolonie %colony% je neefektivní. Produkce byl model.colony.goodGovernment=Efektivita vlády se zvýšila! V %colony% se nyní sympatie k Rebelům rovnají nebo překračují %number% procent. model.colony.governmentImproved1=Vláda kolonie %colony% se zlepšila, ale je stále neefektivní. Penalizace produkce stále platí. model.colony.governmentImproved2=Vláda kolonie %colony% se zlepšila. Penalizace produkce byly zrušeny. +# Fuzzy model.colony.insufficientProduction=V %colony% by mohla být produkce %outputType% vyšší o %outputAmount% kusů, pokud by tam bylo o %inputAmount% %inputType% více. model.colony.lostGoodGovernment=Efektivita vlády se snížila! V %colony% se sympatie k Rebelům již nerovnají či nepřekračují %number% procent. Kolonie tedy již nezískává žádné produkční bonusy. model.colony.lostVeryGoodGovernment=Efektivita vlády se snížila! V %colony% se sympatie k Rebelům již nerovnají či nepřekračují %number% procent. Některé produkční bonusy byly ztraceny. @@ -1930,12 +1932,17 @@ model.colony.veryBadGovernment=Vláda kolonie %colony% je velmi neefektivní. Pr model.colony.veryGoodGovernment=Efektivita vlády se zvýšila! V %colony% se nyní sympatie k Rebelům rovnají nebo překračují %number% procent. model.colonyTile.claim=(požadavek %direction%) model.diplomaticTrade.receive.contact=Přátelské pozdravy od slavného %nation% národu. +# Fuzzy model.diplomaticTrade.receive.diplomatic=Pojďme vyjednávat s %nation%. model.diplomaticTrade.receive.trade=Nechte nás zvážit %nation% obchodní nabídku. +# Fuzzy model.diplomaticTrade.receive.tribute=%nation% po nás požadují tribut! model.diplomaticTrade.send.contact=Setkali jsme se s členy %nation% národa. +# Fuzzy model.diplomaticTrade.send.diplomatic=Zvažme naši diplomatickou situaci s %nation%. +# Fuzzy model.diplomaticTrade.send.trade=Dovolte nám navrhnout obchod s %nation% v %settlement%. +# Fuzzy model.diplomaticTrade.send.tribute=Požadujeme tribut od %nation% z %settlement%. model.direction.N.name=sever model.direction.NE.name=severovýchod @@ -1946,24 +1953,37 @@ model.direction.SW.name=jihozápad model.direction.W.name=západ model.direction.NW.name=severozápad model.historyEventType.abandonColony.description=Opustil jsi kolonii %colony%. +# Fuzzy model.historyEventType.ceaseFire.description=Zastavit palbu proti %nation%. +# Fuzzy model.historyEventType.cityOfGold.description=%nation% objevili %city%, jedno ze sedmi Zlatých měst a poklad v hodnotě %treasure% zlata. +# Fuzzy model.historyEventType.colonyConquered.description=Tvoji kolonii %colony% dobyli %nation%. +# Fuzzy model.historyEventType.colonyDestroyed.description=Tvoji kolonii %colony% zničili %nation%. model.historyEventType.conquerColony.description=Dobil jsi od %nation% kolonii %colony%. model.historyEventType.declareIndependence.description=Vyhlásil jsi nezávislost na Koruně. +# Fuzzy model.historyEventType.declareWar.description=Vyhlášena válka s %nation%. +# Fuzzy model.historyEventType.destroyNation.description=%nation% zničili %nativeNation%. +# Fuzzy model.historyEventType.destroySettlement.description=Znič %nation% osadu %settlement%. model.historyEventType.discoverNewWorld.description=Objevil jsi Nový svět. +# Fuzzy model.historyEventType.discoverRegion.description=%nation% objevili %region%. +# Fuzzy model.historyEventType.formAlliance.description=Uzavřena aliance s %nation%. model.historyEventType.foundColony.description=Založil jsi kolonii %colony%. model.historyEventType.foundingFather.description=Ke kontinentálnímu kongresu se připojil %father%. model.historyEventType.independence.description=Dosáhl jsi nezávislosti na Koruně. +# Fuzzy model.historyEventType.makePeace.description=Uzavřena mírová dohoda s %nation%. +# Fuzzy model.historyEventType.meetNation.description=Potkal jsi %nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=V Novém Světě Již nejsou žádní %nation%. +# Fuzzy model.historyEventType.spanishSuccession.description=Národ %loserNation% podstoupil všechny své kolonie v Novém světě národu %nation%. model.indianSettlement.mostHatedNone=Nic model.indianSettlement.mostHatedUnknown=Neznámo @@ -2017,9 +2037,12 @@ model.messageType.warehouseCapacity.name=Kapacita skladiště model.messageType.warning.name=Varování model.monarch.action.addToRef.text=Koruna přidala %number% {{plural:%number%|%unit%}} ke Královským expedičním silám. Koloniální vůdci vyjadřují znepokojení. model.monarch.action.addToRef.no=Hotovo +# Fuzzy model.monarch.action.declarePeace.text=Laskavě jsme souhlasili s uzavřením mírové smlouvy s %nation%. model.monarch.action.declarePeace.no=Hotovo +# Fuzzy model.monarch.action.declareWar.text=%nation% nestoudnost nás nutí, abychom jim vyhlásili válku! +# Fuzzy model.monarch.action.declareWarSupported.text=%nation% drzost Nás nutí vyhlásit jim válku! Pro urychlení této věci, naši loajální vojáci (%force%) očekávají tvoje rozkazy a také suma %gold% zlata byla přidána do tvého pokladu. model.monarch.action.declareWar.no=Hotovo model.monarch.action.displeasure.text=Jak se opovažuješ akceptovat Naše velkorysé podmínky a pak se vyhýbat placení? Takové pokrytectví sklidí trpké ovoce Naší nelibosti. @@ -2079,6 +2102,7 @@ model.player.colonialIndependence=Pouze koloniální hráči mohou vyhlásit nez model.player.forces=%nation% síly model.player.independentMarket=Evropa model.player.startGame=Po měsících na moři jsi konečně doplul k pobřeží neznámého kontinentu. Pluj {{tag:%direction%|west=na západ|east=na východ|default=proti větru}}, abys objevil Nový svět a nárokoval ho Koruně. +# Fuzzy model.player.waitingFor=Čekání na: %nation% model.regionType.coast.name=Pobřeží model.regionType.coast.unknown=Neznámý pobřežní region @@ -2119,6 +2143,7 @@ model.tradeItem.gold.name=Zlato model.tradeItem.gold.description=sumu %amount% zlata model.tradeItem.goods.name=Zboží model.tradeItem.incite.name=Vyhlásit válku proti +# Fuzzy model.tradeItem.incite.description=válka proti %nation% model.tradeItem.stance.name=Stav model.tradeItem.unit.name=Jednotka @@ -2141,9 +2166,9 @@ model.unit.underRepair=Oprava(%turns% {{plural:%turns%|one=tah|other=tahů|defau model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S +# Fuzzy model.unit.unitState.skipped=W model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G @@ -2184,6 +2209,7 @@ model.colony.warehouseSoonFull=Tvoje skladiště v %colony% během příštího model.colony.warehouseWaste=Tvoje skladiště v %colony% přesáhlo pro %goods% svoji maximální kapacitu. %waste% jednotek bylo ztraceno. model.colony.workersEvicted=Tvůj kolonista v %colony% nemůže kvůli přítomnosti %enemyUnit% nadále pracovat na %location%. model.colonyTile.resourceExhausted=Zdroj %resource% byl v kolonii %colony% vyčerpán +# Fuzzy model.game.spanishSuccession=Vaše Excelence, válka v Evropě o španělské následnictví skončila. Podle Utrechtské smlouvy byl národ %loserNation% přinucen podstoupit všechny své kolonie v Novém světě národu %nation%! model.indianSettlement.mission.denounced=Tvůj misionář v %settlement% byl odsouzen a popraven! model.indianSettlement.mission.destroyed=Tvůj misionář v %settlement% zahynul při zničení osady. @@ -2193,6 +2219,7 @@ model.player.autoRecruit=Náboženské nepokoje v %europe% vyzívají %unit% model.player.colonyGoodsParty.harbour=Tvoji kolonisté v %colony% hodily do moře %amount% jednotek %goods%, na protest proti nespravedlivým daním od Krále! model.player.colonyGoodsParty.horses=Vaši kolonisté v %colony% pustili na svobodu %amount% koní, jako protest proti nespravedlivému zdanění Korunou. model.player.colonyGoodsParty.landLocked=Tvoji kolonisté v %colony% spálili na tržišti %amount% jednotek %goods%, na protest proti nespravedlivým daním od Krále! +# Fuzzy model.player.dead.european=Vaše Excelence, %nation% vyhlásil bezpodmínečné stažená ze záležitostí Nového světa! model.player.dead.native=Vaše Excelence, %nation% byli zničeni. model.player.disaster.bankruptcy.start=Selhal jste v platbě za údržbu všech vašich budov. Jsou použity sankce na výrobu. @@ -2206,12 +2233,16 @@ model.player.ignoredTax=Koruna zvýšila daňovou sazbu na %amount%%, jak bylo d model.player.interventionForceArrives=Dorazily slíbené intervenční síly! model.player.soLDecrease=Počet Synů svobody ve tvých koloniích klesl na %newSoL% procent! model.player.soLIncrease=Počet Synů svobody ve tvých koloniích vzrostl na %newSoL% procent! +# Fuzzy model.player.stance.alliance.declared=Vaše excelence, %nation% jsou s námi v alianci! model.player.stance.alliance.others=Vaše excelence, %attacker% jsou v alianci s %defender%. +# Fuzzy model.player.stance.ceaseFire.declared=Vaše excelence, %nation% se s námi dohodli o zastavení palby! model.player.stance.ceaseFire.others=Vaše excelence, %attacker% se s %defender% dohodli o zastavení palby. +# Fuzzy model.player.stance.peace.declared=Vaše excelence, mezi %nation% a námi je mír! model.player.stance.peace.others=Vaše excelence, mezi %attacker% a %defender% je mír. +# Fuzzy model.player.stance.war.declared=Špatné zprávy, vaše Excelence, %nation% nám vyhlásili válku! model.player.stance.war.others=Vaše Excelence, %attacker% vyhlásili válku proti %defender%. combat.automaticDefence=Tvá jednotka %unit% v %colony% pozvedla zbraně pro obranu kolonie! @@ -2227,6 +2258,7 @@ combat.enemyShipEvaded=%enemyNation% %enemyUnit% se vyhnula útoku jednotky %uni combat.enemyShipSunk=%unit% potopila %enemyNation% %enemyUnit%! combat.equipmentCaptured=Pozor, %nation% divoši získali %equipment%! combat.goodsStolen=%enemyNation% %enemyUnit% ukradl v kolonii %colony% %amount% kusů %goods%! +# Fuzzy combat.indianPlunder=%enemyNation% %enemyUnit% z kolonie %colony% vydrancoval %amount% zlata. combat.indianRaid=Naši špioni hlásí, že %nation% přepadli kolonii %colony%, která patří %colonyNation%. combat.indianSurprise=%nation% provedli překvapivý nájezd na %colony%, což znepokojilo naše kolonisty. %nation% náčelník odmítá zodpovědnost. @@ -2282,6 +2314,7 @@ main.javaVersion=Pro spuštění FreeCol je doporučena Java verze %minVersion% main.memory=Pro JVM je nutné přiřadit více než %memory% bajtů paměti.\nRestartujte FreeCol s parametry: java -Xmx%minMemory%M -jar FreeCol.jar main.userDir.fail=FreeCol nemůže najít vhodný adresář pro uložení uživatelských dat. Pokračuji, ale lze čekat problémy. client.baseData=Nelze nalézt adresář %dir% pro základní data.\n FreeCol nemůže nalézt datové soubory.\n Prosím zkontrolujte, zda jsou přítomny.\n Pokud FreeCol hledá ve špatném adresáři,\n spusťte hru s parametrem:\n --freecol-data +# Fuzzy client.choicePlayer=Prosím zvol hráče: client.classic=Nepodařilo se načíst mapování zdrojů z "klasické" sady pravidel. client.debugConnect=V režimu ladění se nelze připojit k existující hře. @@ -2294,8 +2327,10 @@ metaServer.couldNotConnect=Omlouvám se, nemohu se připojit k meta-serveru. Pro metaServer.communicationError=Při komunikaci s meta-serverem se vyskytla chyba. Prosím, zkuste to znovu později. abandonEducation.action.studying=studuje abandonEducation.action.teaching=učí +# Fuzzy abandonEducation.no=Ne, pokračovat ve výuce. abandonEducation.text=Pokud %unit% odejde z %colony%, pak opustí %action% v %building%. Určitě má odejít? +# Fuzzy abandonEducation.yes=Ano, opustit kolonii abandonTeaching.text=Pokud tvůj %unit% opustí %building%, tak ukončí výuku. Jsi si jistý, že má odejít? armedUnitSettlement.attack=Útok @@ -2307,10 +2342,14 @@ buy.takeOffer=Souhlasit s nabídkou buy.text=%nation% by rádi prodali %goods% za %gold%: clearTradeRoute.text=Váš %unit% je přiřazen na obchodní trasu %route%. Nastavení této destinace jej stáhne z obchodní trasy. Opravdu si to přejete udělat? client.fullScreen=Toto Grafické zařízení nepodporuje režim celé obrazovky.\nVracím se do režimu zobrazení v okně. +# Fuzzy confirmHostile.alliance=Nemůžete útočit na spojenecký národ! Opravdu si přejete zrušit naši alianci s %nation% a vyhlásit jim válku? +# Fuzzy confirmHostile.ceaseFire=S %nation% bylo podepsáno příměří. Opravdu si přejete zaútočit? +# Fuzzy confirmHostile.peace=Nyní s %nation% žijeme v míru. Opravdu si přejete vyhlásit válku? confirmHostile.yes=Ano, vypusťte psy války! +# Fuzzy confirmTribute.broke=Naši špioni hlásí, že %nation% jsou naprosto na mizině. Neztrácejme čas požadavkem tributu. confirmTribute.european=%nation% %danger% a %finance%. Jak velký tribute od nich máme požadovat? confirmTribute.happy=%nation% ze %settlement% jsou naši dobří přátelé, byla by škoda poškodit naše vztahy. @@ -2330,6 +2369,7 @@ indianLand.cancel=Opustit pozemek. indianLand.pay=Nabídnout %amount% zlata za pozemek indianLand.take=Vzít si, co nám právem patří indianLand.text=Tato země je vlastněna %player%. Přeješ si: +# Fuzzy indianLand.unknown=V těchto zemích žijí neznámí lidé. Přejete si: info.autodetectLanguageSelected=Zvolena autodetekce jazyka. Autodetekce se provede při dalším restartu hry. info.enterSomeText=Prosím, zadej nějaký text. @@ -2375,7 +2415,9 @@ defeated.text=Byl jsi poražen! Přeješ si: defeated.yes=Zůstat a sledovat defeatedSinglePlayer.text=Byl jsi poražen!\n\nUž je tu čarodějný noční čas, kdy z hrobů zívajících stoupá pach pekelné nákazy. Krev bych moh pít a dělat jiná zvěrstva, na něž by se den třás pomyslit. defeatedSinglePlayer.yes=Zahájit pomstu +# Fuzzy diplomacy.offerAccepted=%nation% přijímají tvou štědrou nabídku. +# Fuzzy diplomacy.offerRejected=%nation% odmítají tvou štědrou nabídku. disbandUnit.text=Jsi si jistý, že chceš tuto jednotku rozpustit? disbandUnit.yes=Rozpustit @@ -2421,7 +2463,9 @@ move.noAccessGoods=%nation% nebudou obchodovat s prázdným %unit%. move.noAccessMissionBan=%nation% odmítají jakýkoliv kontakt s tvými misionáři. move.noAccessSettlement=%nation% nepovolili našemu %unit% vstoupit do jejich osady. move.noAccessSkill=Náš %unit% se nemůže učit od domorodců. +# Fuzzy move.noAccessTrade=Nemáme oprávnění obchodovat s ostatními evropskými národy jako jsou %nation%. +# Fuzzy move.noAccessWar=Nemůžeme obchodovat s %nation%, dokud jsme ve válce. move.noAccessWater=Náš %unit% se musí vylodit, než vstoupí do osady. move.noAttackWater=%unit% se musí před útokem vylodit. @@ -2478,6 +2522,7 @@ server.invalidPlayerNations=Všichni hráči si musí před zahájením hry zvol server.maximumPlayers=Promiňte, bylo dosaženo maximálního počtu hráčů. server.missingUserName=V požadavku na přihlášení chybí uživatelské jméno. server.missingVersion=V požadavku na přihlášení chybí verze FreeCol. +# Fuzzy server.noRouteToServer=Server nemůže být nastaven jako veřejný. Měl byste upravit nastavení firewallu tak, aby bylo povoleno připojení na port, který jste zvolil. server.noSuchPlayer=Tato hra neobsahuje hráče se jménem: %player% server.notAllReady=Všichni hráči ještě nejsou připraveni zahájit hru! @@ -2487,6 +2532,7 @@ server.timeOut=Při připojování k serveru došlo k Timeoutu. server.userNameInUse=Zadané uživatelské jméno již existuje. server.userNameNotPresent=Zadané uživatelské jméno v této hře neexistuje. server.wrongFreeColVersion=Verze FreeCol klienta a serveru nesouhlasí. +# Fuzzy buildColony.others=%nation% založili v %region% novou kolonii %colony%. cashInTreasureTrain.colonial=Poklad v hodnotě %amount% zlata přistál v Evropě. Bylo inkasováno %cashInAmount% zlata. cashInTreasureTrain.independent=Poklad v hodnotě %amount% byl přidán do národní pokladnice. @@ -2496,6 +2542,7 @@ declareIndependence.announce=Kolonie %oldNation% vyhlásily nezávislost na %rul declareIndependence.continentalArmyMuster=Na podporu vašeho vyhlášení nezávislosti %number% {{plural:%number%|%oldUnit%}} v %colony% {{plural:%number%|one=byl povýšen|other=bylo povýšeno}} na {{plural:%number%|%unit%}}! declareIndependence.interventionForce={{tag:country|%nation%}} slavnostně slibují vyslat Intervenční síly pro podporu vašeho legitimního boje za nezávislost, pokud vytvoříte %number% {{plural:%number%|one=Zvon|other=Zvonůl}} Svobody, jako důkaz svého odhodlání. declareIndependence.nativeSupport=%nation% prohlásili, že opovrhují %ruler% a Královskými expedičními silami a slíbili, že je při každé příležitosti napadnou. +# Fuzzy declareIndependence.nativeHostile=Naši špioni hlásí, že Královské expediční síly ustavili s %nation% přátelský svazek. Mějme se na pozoru před jejich útokem! declareIndependence.resolution=Dnes kongresem prošla nejdůležitější rezoluce, která kdy byla v Americe vydána.\n\nDobře si uvědomuji dřinu, krev a bohatství, které nás bude stát udržení této deklarace a podpora a obrana těchto států. Avšak přes všechnu tu temnotu vidím paprsky úchvatného světla a slávy. Vidím, že konec je důležitější než cena. A že naši potomci budou v tento den slavit triumf, i když my toho můžeme litovat, ačkoliv věřím, že nebudeme.\n\nKrálovské expediční síly zde budou brzy. Pečlivě připravte naši obranu, zatímco my získáme dobrovolníky pro naši novou Kontinentální armádu. declareIndependence.unitsSeized=V reakci na tvoje vyhlášení nezávislosti ti koruna v Evropě a na moři zajala následující jednotky : %units% @@ -2594,6 +2641,7 @@ colopedia.unit.offensivePower=Útočná síla: colopedia.unit.price=Cena v Evropě: colopedia.unit.productionBonus={{plural:%number%|one=Modifikátor|other=Modifikátory}} produkce: colopedia.unit.requirements=Požadavky: +# Fuzzy colopedia.unit.school=Škola nutná pro vyškolení: colopedia.unit.skill=Dovednost: report.labour.allColonists=Všichni kolonisté @@ -2628,8 +2676,8 @@ report.colony.grow.header=+ report.colony.growing.description=%colony% může vyrůst o {{plural:%amount%|one=jednu jednotku|other=%amount% jednotek}} bez penalizace produkce report.colony.improve.description=Jednotky, které mohou zlepšit produkci. report.colony.improve.header=Vylepšit +# Fuzzy report.colony.improving.description=%colony%: K vytvoření o %amount% více %goods% nahraď %oldUnit% za %unit% -report.colony.wanting.description=%colony%: K získání o %amount% více %goods% přidej %unit% report.colony.making.blocking.description=%colony%: %amount% %goods% nutných pro %buildable% bude k dispozici {{plural:%turns%|one=příští tah|other=za %turns% tahů}} report.colony.making.constructing.description=%colony%: %buildable% dokončena {{plural:%turns%|one=příští tah|other=za %turns% tahů}} report.colony.making.description=Co kolonie staví @@ -2639,20 +2687,21 @@ report.colony.making.noconstruction.description=%colony%: Nic se nestaví report.colony.making.noteach.description=%colony%: %teacher% nemá koho učit report.colony.name.description=Seznam kolonií report.colony.name.header=Kolonie -report.colony.plow.description=Počet čtverců kolonie, které by mohly mít prospěch z polí. -report.colony.plow.header=P -report.colony.plowing.description=Kolonie %colony% by mohla mít prospěch ze zorání {{plural:%amount%|one=jednoho čtverce|other=%amount% čtverců}} +# Fuzzy report.colony.production.description=%colony%: čistá produkce %goods% = %amount% +# Fuzzy report.colony.production.export.description=%colony%: čistá produkce %goods% je %amount% (exportovat nad %export%) report.colony.production.header=Čistá produkce %goods% +# Fuzzy report.colony.production.high.description=%colony%: čistá produkce %goods% = %amount%, dosáhne maxima {{plural:%turns%|one=příští tah|other=za %turns% tahů}} +# Fuzzy report.colony.production.low.description=%colony%: čistá produkce %goods% = %amount%, bude vyčerpáno {{plural:%turns%|one=příští tah|other=za %turns% tahů}} +# Fuzzy report.colony.production.waste.description=%colony%: čistá produkce %goods% = %amount%, kapacita skladiště bude překročena a %waste% %goods% bude ztraceno -report.colony.road.description=Počet čtverců kolonie, které by mohly mít prospěch z postavení cest -report.colony.road.header=R -report.colony.roadBuilding.description=Kolonie %colony% by mohla mít prospěch z vybudování {{plural:%amount%|one=cesty|other=%amount% cest}} report.colony.shrinking.description=Pro zlepšení produkce se musí %colony% zmenšit o {{plural:%amount%|one=jednu jednotku|other=%amount% jednotek}} report.colony.starving.description=%colony%: hladovění {{plural:%turns%|one=příští tah|other=za %turns% tahů}} +# Fuzzy +report.colony.wanting.description=%colony%: K získání o %amount% více %goods% přidej %unit% report.continentalCongress.available=Dostupný report.continentalCongress.elected=Zvolen: %turn% report.continentalCongress.none=(nic) @@ -2696,26 +2745,25 @@ report.production.selectGoods=Vybrat zboží report.production.update=Update report.requirements.badAssignment=%colony% má %expert% pracujícího jako %expertWork%, zatímco %nonExpert% pracuje jako %nonExpertWork%. Produkce by mohla být vyšší, pokud by si tito kolonisté vyměnili práci. report.requirements.canTrainExperts={{plural:2|%unit%}} mohou být školeni v -report.requirements.clearTile=%type% na %direction% od %colony% by prospělo vymýcení. +# Fuzzy report.requirements.exploreTile=%type% na %direction% od %colony% by prospěl průzkum. report.requirements.met=Všechny požadavky jsou splněny. report.requirements.missingGoods=%colony% produkuje %goods%, ale potřebuje více %input%. report.requirements.misusedExperts=Jsou zde {{plural:2|%unit%}} nepracující jako %work% v report.requirements.noExpert=%colony% produkuje %goods%, ale nemá %unit%. -report.requirements.plowCenter=Osada %colony% by více prosperovala, kdyby bylo její políčko zoráno. -report.requirements.plowTile=%type% na %direction% od %colony% by prospělo pole. -report.requirements.roadTile=%type% na %direction% od %colony% by prospěla cesta. report.requirements.severalExperts=Několik {{plural:2|%unit%}} je přítomno v report.requirements.surplus=Nadbytek %goods% se produkuje v report.trade.afterTaxes=Příjmy po zdanění report.trade.beforeTaxes=Příjmy před zdaněním report.trade.cargoUnits=Naložené jednotky +# Fuzzy report.trade.hasCustomHouse=* Tato kolonie má obchod; tato zboží jsou exportována. report.trade.totalDelta=Celkem produkce report.trade.totalUnits=Celkem jednotek report.trade.unitsSold=Jednotky koupené/prodané report.turn.filter=Nezobrazovat tento typ zpráv (%type%) report.turn.ignore=Ignorovat tuto zprávu (Kolonie: %colony%, Zboží: %goods%) +# Fuzzy report.turn.playerNation=%player% – %nation% aboutPanel.copyright=Copyright © 2002-2015 FreeCol tým aboutPanel.legalDisclaimer=FreeCol je svobodný software: můžete jej kopírovat a/nebo upravovat v souladu s podmínkami licence GNU General Public License, tak jak byla publikována Free Software Foundation, buď ve verzi 2, nebo jakékoliv pozdější verzi. @@ -2741,6 +2789,7 @@ colonyPanel.buildQueue=Výrobní fronta colonyPanel.colonyUnits=Jednotky v kolonii colonyPanel.inPort=V přístavu colonyPanel.outsideColony=Mimo kolonii +# Fuzzy colonyPanel.producing=Produkuje: colonyPanel.reducePopulation=Pokud snížíte populaci pod %number%, %colony% již nebude schopna postavit %buildable%. colonyPanel.setGoods=Nastavit zboží @@ -2756,7 +2805,9 @@ confirmDeclarationDialog.areYouSure.no=Možná později confirmDeclarationDialog.areYouSure.text=Dovolte nám zavrhnout nespravedlivou tyranii %monarch% a vyhlasme nezávislost našich kolonií na koruně! confirmDeclarationDialog.areYouSure.yes=Svobodu nebo Smrt! confirmDeclarationDialog.createFlag=a naši nepřátelé se musí chvět při pohledu na náš prapor vzdoru. +# Fuzzy confirmDeclarationDialog.defaultCountry=Spojené státy %nation% +# Fuzzy confirmDeclarationDialog.defaultNation=Svobodný %nation% confirmDeclarationDialog.enterCountry=Od teď musí být naše země známa jako confirmDeclarationDialog.enterNation=a každý občan našeho slavného národa se musí hrdě považovat za @@ -2808,9 +2859,11 @@ negotiationDialog.add=Přidat negotiationDialog.cancel=Storno negotiationDialog.clear=Vyčistit negotiationDialog.contact.tutorial=Potkal jsi přátelské Evropany. Budou s tebou soupeřit o zemi a bohatství a mohou proti tobě vést válku. Až se ke kongresu připojí Jan de Witt, budeš s nimi moct také obchodovat. +# Fuzzy negotiationDialog.demand=%nation% požaduje od %otherNation% negotiationDialog.exchange=výměnou za negotiationDialog.goldAvailable=(%amount% zlata k dispozici) +# Fuzzy negotiationDialog.offer=%nation% nabízí pro %otherNation% negotiationDialog.send=Poslat negotiationDialog.title.contact=Setkání s přátelskými evropany @@ -2833,10 +2886,9 @@ findSettlementPanel.displayAll=Najít všechny osady findSettlementPanel.displayOnlyEuropean=Najít pouze Evropské osady findSettlementPanel.displayOnlyNatives=Najít pouze domorodé osady findSettlementPanel.name=Najít osadu +# Fuzzy firstContactDialog.meeting.natives=Setkání s domorodci... firstContactDialog.meeting.natives.tutorial=Potkal jsi domorodce. Pošli do jejich osad zvěda, aby ses o nich dozvěděl více a své smluvní sluhy a volné kolonisty, aby se od nich učili. Pošli svoje lodě a obchodní vozy do jejich osad, pokud s nimi chceš obchodovat. -firstContactDialog.meeting.AZTEC=Národ Aztéků... -firstContactDialog.meeting.INCA=Říše Inků... firstContactDialog.welcomeOffer.text=%nation% tě vítají. Jsme slavný národ %camps% %settlementType%. Na oslavu našeho přátelství vám šlechetně nabízíme darem zemi, kterou právě zabíráte. Přijímáte tuto smlouvu a budete s námi žít v míru jako bratři? firstContactDialog.welcomeSimple.text=%nation% tě vítají. Jsme slavný národ %camps% %settlementType%. Přijímáte tuto smlouvu a budete s námi žít v míru jako bratři? abandonColony.no=Zrušit diff --git a/data/strings/FreeColMessages_da.properties b/data/strings/FreeColMessages_da.properties index 9c1845ed8..3bd7b973e 100644 --- a/data/strings/FreeColMessages_da.properties +++ b/data/strings/FreeColMessages_da.properties @@ -195,8 +195,9 @@ cli.no-memory-check=Undlad hukommelses kontrol cli.no-sound=Kør FreeCol uden lyd cli.private=Start en privat server (som ikke offentliggøres på meta serveren) cli.seed=giver et frø til den pseudo-tilfældige tal generator -cli.server-name=angiv et brugerdefineret NAVN til serveren +# Fuzzy cli.server=Start en selvstændig server på den angivne port +cli.server-name=angiv et brugerdefineret NAVN til serveren cli.splash=Vis et splash vindue med billed fra FILE mens et spil indlæses cli.tc=Indlæs den totale konvertering med det angivne NAVN cli.timeout=antal sekunder, som serveren venter et svar på et spørgsmål @@ -261,7 +262,6 @@ colopediaAction.goods.name=Varer colopediaAction.nations.name=Nationer colopediaAction.nationTypes.name=Nationale fordele colopediaAction.resources.name=Bonusressurser -colopediaAction.skills.name=Kundskaber colopediaAction.terrain.name=Terræntyper colopediaAction.units.name=Enheder colopediaAction.name=%object% (Colopedia) @@ -1332,6 +1332,7 @@ model.improvement.road.description=Vej gør rejsen nemmere model.improvement.road.name=Vej model.improvement.road.occupationString=V model.limit.independence.coastalColonies.name=Kystnær koloni grænse +# Fuzzy model.limit.independence.coastalColonies.description=Du har brug for mindst %limit% kystnære kolonier for at kunne erklære uafhængighed. model.limit.independence.rebels.name=Oprørergrænse model.limit.independence.rebels.description=Mindst %limit%% af dine kolonister skal understøtte uafhængighed. @@ -1678,6 +1679,7 @@ model.colony.badGovernment=Forvaltningen af %colony% er ineffektiv. Produktions model.colony.goodGovernment=Forvaltningseffektiviteten er forbedret! Oprørsstemningen i %colony% er nu lig med, eller højere end, %number% procent. model.colony.governmentImproved1=Forvaltningen af %colony% er forbedret, men stadig ineffektivt. Produktions straffe gælder stadig. model.colony.governmentImproved2=Forvaltningen af %colony% er forbedret. Produktions straffe er ikke længere gældende. +# Fuzzy model.colony.insufficientProduction=%outputAmount% flere %outputType% kunne produceres i %colony%, hvis vi bare havde %inputAmount% flere %inputType% i overskud. model.colony.lostGoodGovernment=Forvaltningseffektiviteten er faldet! Oprørsstemningen i %colony% er nu mindre end %number% procent. Kolonien får ikke længere nogen produktionsbonusser. model.colony.lostVeryGoodGovernment=Forvaltningseffektiviteten er faldet! Oprørstemningen i %colony% er nu mindre end %number% procent. Nogle af produktionsbonusserne er bortfaldet. @@ -1692,12 +1694,17 @@ model.colony.veryBadGovernment=Forvaltningen af %colony% er meget ineffektiv! H model.colony.veryGoodGovernment=Forvaltningseffektiviteten er blevet forbedret! Oprørsstemningen i %colony% er den samme, eller højere end, %number% procent. model.colonyTile.claim=(kræv %direction%) model.diplomaticTrade.receive.contact=Broderlige hilsner fra den gloværdige %nation% nation. +# Fuzzy model.diplomaticTrade.receive.diplomatic=Lad os forhandle med %nation% . model.diplomaticTrade.receive.trade=Lad os overveje %nation%'s tilbud. +# Fuzzy model.diplomaticTrade.receive.tribute=%nation% kræver tribut af os! model.diplomaticTrade.send.contact=Vi har mødt medlemmer af den %nation% nation. +# Fuzzy model.diplomaticTrade.send.diplomatic=Lad os overveje vores diplomatiske situation i forhold til %nation% . +# Fuzzy model.diplomaticTrade.send.trade=Lad os foreslå en handel med den %nation% på %settlement% . +# Fuzzy model.diplomaticTrade.send.tribute=Vi kræver tribut af %nation% på %settlement% . model.direction.N.name=nord model.direction.NE.name=nord-øst @@ -1708,21 +1715,29 @@ model.direction.SW.name=syd-vest model.direction.W.name=vest model.direction.NW.name=nord-vest model.historyEventType.abandonColony.description=Du opgiver kolonien %colony%. +# Fuzzy model.historyEventType.cityOfGold.description=%nation% opdager %city%, af de Syv Byer af Guld, og en skat på %treasure% guld. +# Fuzzy model.historyEventType.colonyConquered.description=Din koloni %colony% er eroberet af %nation%. +# Fuzzy model.historyEventType.colonyDestroyed.description=Din koloni %colony% er ødelagt af %nation%. # Fuzzy model.historyEventType.conquerColony.description=Du vover at acceptere Vores generøse betingelser og alligevel unddrage dig betaling? En sådan dobbelthed skal bringe dig den bitre høst af Vores mishag. # Fuzzy model.historyEventType.declareIndependence.description=Du ødelægger %nation% lejr %settlement%. +# Fuzzy model.historyEventType.destroyNation.description=%nation% udsletter %nativeNation%. model.historyEventType.discoverNewWorld.description=Du opdager den nye Verden. +# Fuzzy model.historyEventType.discoverRegion.description=%nation% opdager %region%. model.historyEventType.foundColony.description=Du opretter kolonien %colony%. model.historyEventType.foundingFather.description=%father% træder ind i kongressen. model.historyEventType.independence.description=Du opnår uafhængighed fra kronen. +# Fuzzy model.historyEventType.meetNation.description=Du møder %nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=%nation% findes ikke længere i den Nye Verden. +# Fuzzy model.historyEventType.spanishSuccession.description=%loserNation% overgier alle sine kolonier i den Nye Verden til %nation%. model.indianSettlement.mostHatedNone=Ingen model.indianSettlement.mostHatedUnknown=Ukendt @@ -1773,8 +1788,10 @@ model.messageType.warehouseCapacity.name=Lagerkapacitet model.messageType.warning.name=Advarsler model.monarch.action.addToRef.text=Kronen har tilføjet %number% {{plural:%number%|%unit%}} til den Kongelige Ekspeditionsstyrke. Koloniledere udtrykker bekymring. model.monarch.action.addToRef.no=Udført +# Fuzzy model.monarch.action.declarePeace.text=Vi har allernådigst indgået en fredsaftale med %nation%. model.monarch.action.declarePeace.no=Udført +# Fuzzy model.monarch.action.declareWar.text=Frækheden af %nation% tvinger Os til at erklære krig mod dem! model.monarch.action.declareWar.no=Udført # Fuzzy @@ -1830,6 +1847,7 @@ model.noClaimReason.worked.description=En anden bebyggelse bruger allerede dette model.player.forces=%nation% styrker model.player.independentMarket=Europa model.player.startGame=Efter måneder til søs er du endelig nået frem til kysten af et ukendt kontinent. Sejl mod {{tag:%direction%|west=vest|east=øst|default=vinden}} for at opdage den Nye Verden og gør krav på den i kongens navn. +# Fuzzy model.player.waitingFor=Venter på: %nation% model.regionType.coast.name=Kyst model.regionType.coast.unknown=Ukendt kystområde @@ -1869,6 +1887,7 @@ model.tradeItem.gold.name=Guld model.tradeItem.gold.description=i alt %amount% guld model.tradeItem.goods.name=Varer model.tradeItem.incite.name=Erklære krig mod +# Fuzzy model.tradeItem.incite.description=krig mod den%nation% model.tradeItem.stance.name=Holdning model.tradeItem.unit.name=Enhed @@ -1889,9 +1908,9 @@ model.unit.underRepair=Under Reparation ( %turns% ) model.unit.unitState.active=A model.unit.unitState.fortified=B model.unit.unitState.fortifying=B -model.unit.unitState.improving=# model.unit.unitState.inColony=K model.unit.unitState.sentry=V +# Fuzzy model.unit.unitState.skipped=V model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=E @@ -1931,6 +1950,7 @@ model.colony.warehouseOverfull=Dit lager i %colony% har nået sin kapacitet for model.colony.warehouseSoonFull=Dit lager i %colony% vil overskride sin kapacitet af %goods% i næste tur. %amount% enheder af %goods% vil gå til spilde. model.colony.warehouseWaste=Dit lager i %colony% har overskredet sin kapacitet for %goods%. %waste% enheder gik til spilde. model.colonyTile.resourceExhausted=Resource %resource% udtømt i %colony% +# Fuzzy model.game.spanishSuccession=Deres Excellence, krigen om den Spanske trone er nu afsluttet i Europa. I traktaten fra Utrecht, er %loserNation% tvunget til at afstå alle deres kolonier i den Nye Verson til %nation%! model.indianSettlement.mission.denounced=Din missionær ved %settlement% er blevet afvist og henrettet! model.player.alarmIncrease.tension.angry=Den %nation% chef på %settlement% advarer om, at de braves forlanger åben krig med den %enemy% , for at befri os for dine bosættere og krigere på vores jord. @@ -1939,6 +1959,7 @@ model.player.autoRecruit=Religiøs uro i %europe% får %unit% til at emigrere. model.player.colonyGoodsParty.harbour=Dine kolonister i %colony% har kastet %amount% enheder af %goods% i havnen i protest mod den uretfærdige skat fra Kronen! model.player.colonyGoodsParty.horses=Dine kolonister i %colony% har frigivet %amount% heste i protest mod den uretfærdige skat fra Kronen! model.player.colonyGoodsParty.landLocked=Dine kolonister i %colony% har brændt %amount% enheder af %goods% på markedspladsen i protest mod den uretfærdige skat fra Kronen! +# Fuzzy model.player.dead.european=Deres højhed, %nation% har erklæret en betingelsesløs tilbagetrækning fra Den Nye Verden's affærer! model.player.dead.native=Deres højhed, %nation% er blevet udryddet. model.player.disaster.bankruptcy.start=Du betalte ikke for vedligehold af alle bygninger. Strenge produktionsstraffe er nu i værk. @@ -1950,12 +1971,16 @@ model.player.foundingFatherJoinedCongress=%foundingFather% har sluttet sig til k model.player.interventionForceArrives=Den lovede interventionsstyrke ankommer! model.player.soLDecrease=Frihedens sønner medlemskab i dine kolonier er faldet til %newSoL% procent! model.player.soLIncrease=Frihedens sønner medlemskab i dine kolonier er steget til %newSoL% procent! +# Fuzzy model.player.stance.alliance.declared=Deres Excellence, %nation% er nu allieret med os! model.player.stance.alliance.others=Deres Excellence, %attacker% er nu i alliance med %defender%. +# Fuzzy model.player.stance.ceaseFire.declared=Deres Excellence, %nation% er gået med til en våbenhvile med os! model.player.stance.ceaseFire.others=Deres Excellence, %attacker% er gået med til en våbenhvile med %defender%. +# Fuzzy model.player.stance.peace.declared=Deres Excellence, %nation% har nu fred med os! model.player.stance.peace.others=Deres Excellence, %attacker% har nu fred med %defender%. +# Fuzzy model.player.stance.war.declared=Dårlige nyheder, Deres Højhed, %nation% har erklæret krig mod os! model.player.stance.war.others=Deres Højhed, %attacker% har erklæret krig mod %defender%. combat.automaticDefence=Din %unit% i %colony% har taget våben for at forsvare kolonien! @@ -1971,6 +1996,7 @@ combat.enemyShipEvaded=%enemyNation% %enemyUnit% har undveget angreb fra %unit%. combat.enemyShipSunk=%unit% har sunket %enemyNation% %enemyUnit%! combat.equipmentCaptured=Vær på vagt, krigerne fra %nation% har fået fat i %equipment%! combat.goodsStolen=%enemyNation% %enemyUnit% stjæler %amount% %goods% fra %colony%! +# Fuzzy combat.indianPlunder=%enemyNation% %enemyUnit% plyndrer %amount% fra %colony%. combat.indianRaid=Vores spioner rapporterer at %nation% har plyndret %colonyNation%'s %colony%. combat.indianSurprise=%nation% har lavet en overraskelses angreb på %colony%, hvilket har alarmeret vores kolonister. %nation%'s høvding benægter at være ansvarlig. @@ -2025,13 +2051,16 @@ main.defaultPlayerName=Spillernavn main.javaVersion=Java version %minVersion% eller bedre anbefales for at køre FreeCol\n( %version% fundet, bruge--nr-java-check at springe denne check). main.memory=Du skal tildele mere end %memory% bytes af hukommelse til JVM.\n Genstart FreeCol med: java - Xmx %minMemory% M-jar FreeCol.jar main.userDir.fail=FreeCol kan ikke finde egnede mapper til at gemme brugerdata i. Fortsætter, men forvent problemer. +# Fuzzy client.choicePlayer=Vælg en spiller: metaServer.couldNotConnect=Kunne ikke forbinde til meta-server. Prøv igen senere. metaServer.communicationError=Der var en fejl ved kommunikation med meta-server. Prøv igen senere. abandonEducation.action.studying=oplæres abandonEducation.action.teaching=underviser +# Fuzzy abandonEducation.no=Nej, fortsæt oplæringen abandonEducation.text=Hvis din %unit% forlader %colony% vil den stoppe %action% i %building%. Er du sikker på den skal forlade kolonien? +# Fuzzy abandonEducation.yes=Ja, forlad kolonien abandonTeaching.text=Hvis din %unit% forlader den %building% det vil stoppe undervisning, er du sikker på, at den bør efterlades? armedUnitSettlement.attack=Angrib @@ -2041,9 +2070,13 @@ buy.moreGold=Bed om en mindre pris buy.takeOffer=Accepter tilbudet buy.text=%nation% vil gerne sælge deres %goods% for %gold%. clearTradeRoute.text=Enheden %unit% er på handelsrute %route%. At sætte dets bestemmelsessted vil fjerne den fra handelsruten. Er du sikker på at du vil gøre det? +# Fuzzy confirmHostile.alliance=Du kan ikke angribe en allieret nation! Ønsker du virkelig at bryde vores alliance med %nation% og erklærer krig? +# Fuzzy confirmHostile.ceaseFire=Du har indgået våbenhvile med %nation%. Vil du virkelig angribe? +# Fuzzy confirmHostile.peace=Du har fred med %nation%. Vil du virkelig erklære krig? +# Fuzzy confirmTribute.broke=Vores spioner rapport, at %nation% er fuldstændig fallit. Lad os ikke spilde vores tid med stille krav. confirmTribute.european=The %nation% %danger%, and %finance%. Hvor meget tribut bør vi kræve af dem? confirmTribute.happy=Den %nation% på %settlement% er gode venner med os, det er en skam at skade vores kammeratskab. @@ -2111,7 +2144,9 @@ defeated.text=Du er blevet slået! Vil du gerne: defeated.yes=Blive og se hvordan det går defeatedSinglePlayer.text=Du er blevet slået!\n\nDet er nu skumringstimen, hvor kirkegårde gaber og helvede selv spyr sin gift ud i denne verden, nu kunne jeg drikke varmt blod! og gøre så mørke gernninger, at dagen ville ryste ved at kigge på. defeatedSinglePlayer.yes=Gå på hævntogt +# Fuzzy diplomacy.offerAccepted=%nation% accepterer dit gavmilde tilbud. +# Fuzzy diplomacy.offerRejected=%nation% afslår dit gavmilde tilbud. disbandUnit.text=Er du sikker på at du vil opløse denne enhed? disbandUnit.yes=Opløs @@ -2155,7 +2190,9 @@ move.noAccessContact=Vi skal etablere kontakt med %nation% først, Deres højhed move.noAccessGoods=%nation% vil ikke handle med tomme %unit%. move.noAccessSettlement=%nation% tillader ikke vores %unit% at komme ind i deres bebyggelse. move.noAccessSkill=Vores %unit% kan ikke lære af de indfødte. +# Fuzzy move.noAccessTrade=Vi har ikke autoritet til at handle med andre europæiske nationer så som %nation%. +# Fuzzy move.noAccessWar=Vi kan ikke handle med %nation% sålænge vi er i krig. move.noAccessWater=Vores %unit% må i land før vi kan gå ind i bebyggelsen. move.noAttackWater=Vores %unit% skal lande før den kan angribe. @@ -2208,6 +2245,7 @@ server.invalidPlayerNations=Alle spillere er nødt til at vælge en unik nation server.maximumPlayers=Beklager, det maksimale antal spillere er nået. server.missingUserName=Brugernavnet mangler i loginanmodning. server.missingVersion=FreeCol-versionen mangler i loginanmodningen. +# Fuzzy server.noRouteToServer=Serveren kan ikke gøres åben. Du bør ændrer opsætningen på din firewall til at tillade forbindelser på den port du har angivet. server.notAllReady=Ikke alle spillere er klar til at begynde! server.onlyAdminCanLaunch=Beklager, kun server administratoren kan starte spillet. @@ -2215,6 +2253,7 @@ server.reject=Serveren kan ikke gøre dette. server.timeOut=Timeout, mens forbindelse prøves oprettet. server.userNameInUse=Det angivne brugernavn er allerede i brug server.wrongFreeColVersion=Klient og server versionerne af FreeCol passer ikke sammen. +# Fuzzy buildColony.others=%nation% har grundlagt den nye koloni af %colony% i %region% . cashInTreasureTrain.colonial=En skat på %amount% guld er ankommet til Europa. %cashInAmount% guld er lagt i skattekammeret. cashInTreasureTrain.independent=En skat på %amount% er blevt tilføjet den nationale skatte kiste. @@ -2311,6 +2350,7 @@ colopedia.unit.offensivePower=Angrebsstyrke: colopedia.unit.price=Pris i Europa: colopedia.unit.productionBonus=Produktions {{plural:%number%|one=modifikator|other=modifikatorer}}: colopedia.unit.requirements=Forudsætninger: +# Fuzzy colopedia.unit.school=Skole krævet for uddannelse: colopedia.unit.skill=Kundskabsniveau: report.labour.allColonists=Alle kolonister @@ -2346,8 +2386,8 @@ report.colony.growing.description=%colony% kan vokse med {{plural:%amount%|one=e # Fuzzy report.colony.improve.description=Enheder der kunne forbedre produktionen i forhold til enheden der udfører jobbet nu report.colony.improve.header=Forbedre +# Fuzzy report.colony.improving.description=%colony%: For at få %amount% mere %goods%, så erstat %oldUnit% med %unit% -report.colony.wanting.description=%colony%: For at producere %amount% mere %goods%, så tilføj %unit% report.colony.making.blocking.description=%colony%: %amount% %goods% mangler til %buildable% {{plural:%turns%|one=i næste tur|other=om %turns% ture}} report.colony.making.constructing.description=%colony%: %buildable% bliver færdigt {{plural:%turns%|one=i næste tur|other=om %turns% ture}} report.colony.making.description=Hvad laver denne koloni @@ -2357,21 +2397,22 @@ report.colony.making.noconstruction.description=%colony%: Intet er under konstru report.colony.making.noteach.description=%colony%: %teacher% mangler en elev report.colony.name.description=Listen over kolonier report.colony.name.header=Koloni -report.colony.plow.description=Antallet af kolonifelter, som ville blive bedre af at blive pløjet -report.colony.plow.header=P -report.colony.plowing.description=%colony% ville blive forbedret ved at pløje {{plural:%amount%|one=et felt|other=%amount% felter}} +# Fuzzy report.colony.production.description=%colony%: nettoproduktion af %goods% = %amount% +# Fuzzy report.colony.production.export.description=%colony%: netto %goods%, produktion er %amount% (eksport over %export%) report.colony.production.header=Nettoproduktion af %goods% +# Fuzzy report.colony.production.high.description=%colony%: nettoproduktion af %goods% = %amount%, fyldt {{plural:%turns%|one=i næste tur|other=om %turns% ture}} +# Fuzzy report.colony.production.low.description=%colony%: nettoproduktion af %goods% production = %amount%, indtil {{plural:%turns%|one=næste runde|other=%turns%. runde}} +# Fuzzy report.colony.production.waste.description=%colony%: nettoproduktion af %goods% = %amount%, varehuset vil blive overfyldt, %waste% vil blive kasseret -report.colony.road.description=Antallet af kolonifelter, som ville blive forbedret ved at anlægge en vej -report.colony.road.header=V -report.colony.roadBuilding.description=%colony% ville blive forbedret af at anlægge {{plural:%amount%|one=en vej|other=%amount% veje}} report.colony.shrinking.description=%colony% skal formindskes med {{plural:%amount%|one=en enhed|other=%amount% enheder}} for at forbedre produktiviteten report.colony.starving.description=%colony%: hungersnød {{plural:%turns%|one=i næste tur|other=om %turns% ture}} # Fuzzy +report.colony.wanting.description=%colony%: For at producere %amount% mere %goods%, så tilføj %unit% +# Fuzzy report.continentalCongress.elected=Valgt: report.continentalCongress.none=(ingen) report.continentalCongress.recruiting=Rekruter @@ -2412,26 +2453,25 @@ report.production.selectGoods=Vælg varer report.production.update=Opdater report.requirements.badAssignment=%colony% har en %expert% arbejdende som %expertWork%, mens en %nonExpert% arbejder som %nonExpertWork%. Produktionen ville være større, hvis de byttede job. report.requirements.canTrainExperts={{plural:2|%unit%}} kan undervises i -report.requirements.clearTile=%type% %direction%for %colony% ville blive forbedret af at blive ryddet. +# Fuzzy report.requirements.exploreTile=%type% %direction%for %colony% ville blive forbedret af at blive undersøgt. report.requirements.met=Alle forudsætninger er tilstede. report.requirements.missingGoods=%colony% producerer %goods%, men kræver mere %input%. report.requirements.misusedExperts=Der er {{plural:2|%unit%}}, der ikke arbejder som %work% i report.requirements.noExpert=%colony% producerer %goods%, men har ingen %unit%. -report.requirements.plowCenter=%colony% ville blive forbedret af at pløje dets felt. -report.requirements.plowTile=%type% %direction% for %colony% ville blive forbedret af at blive pløjet. -report.requirements.roadTile=%type% %direction% for %colony% kunne blive forbedret ved at bygge en vej. report.requirements.severalExperts=Several {{plural:2|%unit%}} er tilstede i report.requirements.surplus=Overskud af %goods% bliver produceret i: report.trade.afterTaxes=Indkomst efter skatter report.trade.beforeTaxes=Indkomst før skatter report.trade.cargoUnits=Enheder i last +# Fuzzy report.trade.hasCustomHouse=* Denne koloni har et told hus; disse varer er eksporteret. report.trade.totalDelta=Total produktion report.trade.totalUnits=Total enheder report.trade.unitsSold=Enheder købt eller solgt report.turn.filter=Vis ikke denne slags besked (%type%) report.turn.ignore=Ignorer denne besked (koloni: %colony%, vare: %goods%) +# Fuzzy report.turn.playerNation=%nation% for %player% # Fuzzy aboutPanel.copyright=Copyright © 2002-2013 FreeCol-teamet @@ -2458,6 +2498,7 @@ chooseFoundingFatherDialog.title=Nominer landsfader colonyPanel.colonyUnits=Kolonienheder colonyPanel.inPort=I havn colonyPanel.outsideColony=Udenfor kolonien +# Fuzzy colonyPanel.producing=Producerer: colonyPanel.reducePopulation=Hvis du reducere befolkningen under %number%, vil %colony% ikke længere kunne bygge %buildable%. colonyPanel.unitChange=Ved ankomst til din koloni er %oldType% blevet til en %newType%. @@ -2470,7 +2511,9 @@ confirmDeclarationDialog.areYouSure.no=Måske senere confirmDeclarationDialog.areYouSure.text=Lad os forsage den uretfærdige tyran af %monarch% og erklære vores koloniers uafhængighed fra kronen! confirmDeclarationDialog.areYouSure.yes=Frihed eller døden! confirmDeclarationDialog.createFlag=og vores fjender skal skælve ved synet af vores banner. +# Fuzzy confirmDeclarationDialog.defaultCountry=De forende stater af %nation% +# Fuzzy confirmDeclarationDialog.defaultNation=Frie %nation% confirmDeclarationDialog.enterCountry=For fremtiden skal vores land være kendt som confirmDeclarationDialog.enterNation=og enhver borger af vores glorværdige nation skal være stolte af at være kendt som @@ -2521,8 +2564,10 @@ negotiationDialog.add=Tilføj negotiationDialog.cancel=Afbryd negotiationDialog.clear=Ryd negotiationDialog.contact.tutorial=Du møder andre europæere. De vil konkurrere med dig om jord og rigdom og måske indlede krig mod dig. Men efter Jan de Witt har tilsluttet sig den kontinentale kongress, kan du handle med dem. +# Fuzzy negotiationDialog.demand=Den %nation% kræver af den %otherNation% negotiationDialog.exchange=i bytte for +# Fuzzy negotiationDialog.offer=Den %nation% tilbyder den%otherNation% negotiationDialog.send=Send negotiationDialog.title.contact=Møde andre europæere @@ -2545,10 +2590,9 @@ findSettlementPanel.displayAll=Find alle bosættelser findSettlementPanel.displayOnlyEuropean=Find kun europæiske bosættelser findSettlementPanel.displayOnlyNatives=Kun indfødte bosættelser findSettlementPanel.name=Find bosættelse +# Fuzzy firstContactDialog.meeting.natives=Møde de indfødte... firstContactDialog.meeting.natives.tutorial=Du møder indfødte. Send dine spejdere til deres bosættelser for at lære mere om dem, og din tjenere og frie kolonister for at lære af dem. Send dine skibe og vogntog til deres byer, hvis du ønsker at handle med dem. -firstContactDialog.meeting.AZTEC=Aztec nationen -firstContactDialog.meeting.INCA=Inkariget... firstContactDialog.welcomeOffer.text=%nation% hilser dig. Vi er en storslået nation på %camps% %settlementType%. For at fejre vores venskab, tilbyder vi dig generøst den jord som du optager nu, som en gave. Vil du accepterer vores regler og leve med os i fred som brødre? firstContactDialog.welcomeSimple.text=%nation% hilser dig. Vi er en storslået nation bestående af %camps% %settlementType%. Vil du accepterer vores regler og leve med os i fred som brødre? abandonColony.no=Afbryd diff --git a/data/strings/FreeColMessages_de.properties b/data/strings/FreeColMessages_de.properties index 01be0fa6e..3ff36c956 100644 --- a/data/strings/FreeColMessages_de.properties +++ b/data/strings/FreeColMessages_de.properties @@ -126,7 +126,9 @@ cargoOnCarrier=Ladung in Schiff cashInTreasureTrain=Schatz nach Europa transportieren clearOrders=Befehle löschen colonists=Kolonisten +colonyCenter=Koloniezentrum colopedia=Colopädie +countryName={{tag:country|%nation%}} difficulty=Schwierigkeitsgrad docks=Docks dumpCargo=Ladung über Bord @@ -201,6 +203,7 @@ cli.error.home.notDir=%string% ist kein Verzeichnis. cli.error.home.notExists=Das Verzeichnis %string% existiert nicht. cli.error.save=Das gespeicherte Spiel %string% konnte nicht gelesen werden. cli.error.serverPort=%string% ist keine gültige Portnummer. +cli.error.splash=Datei %name% nicht gefunden. cli.error.timeout=%string% ist zu kurz (weniger als %minimum%) cli.advantages=Den Typ der VORTEILE festlegen (%advantages%) cli.check-savegame.failure=Die Konsistenzprüfung des gespeicherten Spielstandes ist fehlgeschlagen. Die Einzelheiten können im Logbuch eingesehen werden. @@ -229,10 +232,12 @@ cli.no-intro=Intro-Video überspringen cli.no-java-check=überspringe die Java-Version-Überprüfung cli.no-memory-check=überspringe die Arbeitsspeicher-Überprüfung cli.no-sound=startet FreeCol ohne Tonwiedergabe +cli.no-splash=Den Splash-Bildschirm überspringen cli.private=starte einen privaten Server (nicht öffentlich über den Metaserver) cli.seed=bitte eine INITIALZAHL für den Pseudozufallszahlengenerator angeben -cli.server-name=einen benutzerdefinierten NAMEn für den Server angeben +# Fuzzy cli.server=startet einen eigenständigen Server am spezifizierten Port +cli.server-name=einen benutzerdefinierten NAMEn für den Server angeben cli.splash=Bilddatei FILE anzeigen, während das Spiel geladen wird cli.tc=das Spiel laden mit dem gegebenen NAME cli.timeout=Anzahl der Sekunden, die der Server auf eine Antwort zur Abfrage wartet @@ -297,7 +302,6 @@ colopediaAction.goods.name=Waren colopediaAction.nations.name=Nationen colopediaAction.nationTypes.name=Nationale Vorteile colopediaAction.resources.name=Bonus-Ressourcen -colopediaAction.skills.name=Fähigkeiten colopediaAction.terrain.name=Terraintypen colopediaAction.units.name=Einheiten colopediaAction.name=%object% (Colopedia) @@ -483,6 +487,10 @@ model.option.interventionForce.name=Eingreiftruppe model.option.interventionForce.shortDescription=Die zur Unterstützung deines Unabhängigkeitskriegs entsandte Eingreiftruppe. model.option.mercenaryForce.name=Söldnertruppe model.option.mercenaryForce.shortDescription=Die Söldnertruppe hat angeboten, Ihren Unabhängigkeitskrieg zu unterstützen. +model.option.warSupportForce.name=Kriegsunterstützungstruppe +model.option.warSupportForce.shortDescription=Die maximale Truppe wurde vom Monarchen angeboten, um Eure Kriege zu unterstützen. +model.option.warSupportGold.name=Gold zur Kriegsunterstützung +model.option.warSupportGold.shortDescription=Die maximale Goldmenge, die vom Monarchen angeboten wurde, um Eure Kriege zu unterstützen. model.difficulty.government.name=Regierung model.option.badGovernmentLimit.name=Limit für ineffiziente Regierung model.option.badGovernmentLimit.shortDescription=Die maximale Anzahl der Royalisten welche keine Produktionsstrafe verursachen. @@ -1546,7 +1554,7 @@ model.improvement.road.description=Straße model.improvement.road.name=Straße model.improvement.road.occupationString=R model.limit.independence.coastalColonies.name=Limit Küstenkolonien -model.limit.independence.coastalColonies.description=Für eine Unabhängigkeitserklärung brauchst du mindestens %limit% Küstenkolonien. +model.limit.independence.coastalColonies.description=Für eine Unabhängigkeitserklärung brauchst du mindestens {{plural:%limit%|one=eine Küstenkolonie|other=%limit% Küstenkolonien}}. model.limit.independence.rebels.name=Rebellenlimit model.limit.independence.rebels.description=Zumindest %limit%% der Kolonisten müssen die Unabhängigkeit unterstützen. model.limit.independence.year.name=Jahresbegrenzung @@ -1894,7 +1902,7 @@ model.colony.badGovernment=Die Regierung in %colony% ist ineffizient. Bei der Pr model.colony.goodGovernment=Die Effizienz der Regierung hat sich verbessert! Die Stimmung der Rebellen in %colony% entspricht jetzt %number% Prozent oder liegt darüber. model.colony.governmentImproved1=Die Regierung in %colony% hat sich verbessert, ist aber weiterhin ineffizient. Bei der Produktivität ergeben sich weiterhin Abzüge. model.colony.governmentImproved2=Die Regierung in %colony% hat sich verbessert. Bei der Produktivität ergeben sich keine Abzüge mehr. -model.colony.insufficientProduction=%outputAmount% %outputType% mehr könnten in %colony% produziert werden, wenn wir %inputAmount% mehr %inputType% hätten. +model.colony.insufficientProduction=%outputAmount% %outputType% mehr könnten in %colony% produziert werden, falls zusätzlich %consumptionDeficit% verfügbar wären. model.colony.lostGoodGovernment=Die Effizienz der Regierung ist zurückgegangen! Die Stimmung der Rebellen in %colony% entspricht nicht länger %number% Prozent oder liegt darunter. Die Kolonie erzielt keine Produktionsboni mehr. model.colony.lostVeryGoodGovernment=Die Effizienz der Regierung ist zurückgegangen! Die Stimmung der Rebellen in %colony% entspricht nicht länger %number% Prozent oder liegt darunter. Einige Produktionsboni sind verloren gegangen. model.colony.minimumColonySize=%object% verhindert, dass die Bevölkerungszahl weiter verringert werden kann. @@ -1908,13 +1916,13 @@ model.colony.veryBadGovernment=Die Regierung in %colony% ist sehr ineffizient. B model.colony.veryGoodGovernment=Die Effizienz der Regierung hat sich verbessert! Die Stimmung der Rebellen in %colony% entspricht jetzt %number% Prozent oder liegt darüber. model.colonyTile.claim=(beanspruche %direction%) model.diplomaticTrade.receive.contact=Brüderliche Grüße von den glorreichen %nation%. -model.diplomaticTrade.receive.diplomatic=Lasst uns mit den %nation% verhandeln. +model.diplomaticTrade.receive.diplomatic=Lasst uns mit den {{tag:country|%nation%}} verhandeln. model.diplomaticTrade.receive.trade=Lasst uns das Handelsangebot der %nation% prüfen. -model.diplomaticTrade.receive.tribute=Die %nation% fordern Tribut von uns! +model.diplomaticTrade.receive.tribute=Die {{tag:country|%nation%}} fordern Tribut von uns! model.diplomaticTrade.send.contact=Wir sind Mitgliedern der %nation% begegnet. -model.diplomaticTrade.send.diplomatic=Lasst uns unsere diplomatische Situation mit den %nation% prüfen. -model.diplomaticTrade.send.trade=Lasst uns einen Handel mit den %nation% bei %settlement% vorschlagen. -model.diplomaticTrade.send.tribute=Wir fordern Tribut von den %nation% bei %settlement%. +model.diplomaticTrade.send.diplomatic=Lasst uns unsere diplomatische Situation mit den {{tag:country|%nation%}} prüfen. +model.diplomaticTrade.send.trade=Lasst uns einen Handel mit den {{tag:country|%nation%}} bei %settlement% vorschlagen. +model.diplomaticTrade.send.tribute=Wir fordern Tribut von den {{tag:country|%nation%}} bei %settlement%. model.direction.N.name=nördlich model.direction.NE.name=nordöstlich model.direction.E.name=östlich @@ -1924,25 +1932,25 @@ model.direction.SW.name=südwestlich model.direction.W.name=westlich model.direction.NW.name=nordwestlich model.historyEventType.abandonColony.description=Ihr gebt die Kolonie %colony% auf. -model.historyEventType.ceaseFire.description=Feuer mit %nation% einstellen. -model.historyEventType.cityOfGold.description=Die %nation% haben %city% entdeckt - eine der sieben goldenen Städte - und Schätze im Wert von %treasure% erbeutet. -model.historyEventType.colonyConquered.description=Eure Kolonie %colony% wird durch die %nation% eingenommen. -model.historyEventType.colonyDestroyed.description=Eure Kolonie %colony% wird durch die %nation% niedergebrannt. +model.historyEventType.ceaseFire.description=Feuer mit {{tag:country|%nation%}} einstellen. +model.historyEventType.cityOfGold.description=Die {{tag:country|%nation%}} haben %city% entdeckt – eine der sieben goldenen Städte – und Schätze im Wert von %treasure% erbeutet. +model.historyEventType.colonyConquered.description=Eure Kolonie %colony% wird durch die {{tag:country|%nation%}} eingenommen. +model.historyEventType.colonyDestroyed.description=Eure Kolonie %colony% wird durch die {{tag:country|%nation%}} niedergebrannt. model.historyEventType.conquerColony.description=Du eroberst die %nation% Kolonie von %colony%. model.historyEventType.declareIndependence.description=Du erklärst die Unabhängigkeit von der Krone. -model.historyEventType.declareWar.description=Krieg erklärt mit %nation%. -model.historyEventType.destroyNation.description=Die %nation% löschen die %nativeNation% aus. +model.historyEventType.declareWar.description=Krieg erklärt mit {{tag:country|%nation%}}. +model.historyEventType.destroyNation.description=Die {{tag:country|%nation%}} löschen die %nativeNation% aus. model.historyEventType.destroySettlement.description=Du zerstörst die %nation% Siedlung %settlement%. model.historyEventType.discoverNewWorld.description=Ihr entdeckt die Neue Welt. -model.historyEventType.discoverRegion.description=Die %nation% entdecken %region%. -model.historyEventType.formAlliance.description=Bündnis mit %nation% ausgehandelt. +model.historyEventType.discoverRegion.description=Die {{tag:country|%nation%}} entdecken %region%. +model.historyEventType.formAlliance.description=Bündnis mit {{tag:country|%nation%}} ausgehandelt. model.historyEventType.foundColony.description=Ihr gründet die Kolonie %colony%. model.historyEventType.foundingFather.description=%father% tritt dem Kontinentalkongress bei. model.historyEventType.independence.description=Ihr erlangt Eure Unabhängigkeit von der Krone. -model.historyEventType.makePeace.description=Frieden mit %nation% vereinbart. +model.historyEventType.makePeace.description=Frieden mit {{tag:country|%nation%}} vereinbart. model.historyEventType.meetNation.description=Ihr trefft die %nation%. model.historyEventType.nationDestroyed.description=Die %nation% ist nicht länger in der Neuen Welt anwesend. -model.historyEventType.spanishSuccession.description=Die %loserNation% übergeben alle ihre Kolonien in der neuen Welt an die %nation%. +model.historyEventType.spanishSuccession.description=Die {{tag:country|%loserNation%}} übergeben alle ihre Kolonien in der neuen Welt an die {{tag:country|%nation%}}. model.indianSettlement.mostHatedNone=nichts model.indianSettlement.mostHatedUnknown=Unbekannt model.indianSettlement.nameUnknown=Unbekannt @@ -1995,10 +2003,10 @@ model.messageType.warehouseCapacity.name=Lagerkapazität model.messageType.warning.name=Warnungen model.monarch.action.addToRef.text=Die Krone hat dem königlichen Expeditionskorps %number% {{plural:%number%|%unit%}} hinzugefügt. Die Anführer der Kolonien äußern sich besorgt. model.monarch.action.addToRef.no=Fertig -model.monarch.action.declarePeace.text=Wir haben gnädigerweise einem Friedensvertrag mit %nation% zugestimmt. +model.monarch.action.declarePeace.text=Wir haben gnädigerweise einem Friedensvertrag mit {{tag:country|%nation%}} zugestimmt. model.monarch.action.declarePeace.no=Vereinbart -model.monarch.action.declareWar.text=Die Anmaßungen der %nation% zwingen Uns dazu, ihnen den Krieg zu erklären! -model.monarch.action.declareWarSupported.text=Die Anmaßungen der %nation% zwingen Uns, den Krieg gegen sie zu erklären! Zur Beschleunigung dieser Sache warten unsere loyalen Truppen (%force%) auf deine Befehle und weitere Summen an %gold% wurden deinem Schatz hinzugefügt. +model.monarch.action.declareWar.text=Die Anmaßungen der {{tag:country|%nation%}} zwingen Uns dazu, ihnen den Krieg zu erklären! +model.monarch.action.declareWarSupported.text=Die Anmaßungen der {{tag:country|%nation%}} zwingen Uns, den Krieg gegen sie zu erklären! Zur Beschleunigung dieser Sache warten unsere loyalen Truppen (%force%) auf deine Befehle und weitere Summen an %gold% wurden deinem Schatz hinzugefügt. model.monarch.action.declareWar.no=Fertig model.monarch.action.displeasure.text=Du wagst es, Unsere großzügigen Bedingungen zu akzeptieren und weichst sogar einer Bezahlung aus? Solche Doppelzüngigkeit soll den bitteren Lohn Unseres Unmutes ernten. model.monarch.action.displeasure.no=Fertig @@ -2057,7 +2065,7 @@ model.player.colonialIndependence=Nur Spieler mit einer Kolonie können eine Una model.player.forces=%nation% Streitkräfte model.player.independentMarket=Europa model.player.startGame=Nach Monaten auf See habt Ihr schließlich die Küste eines unbekannten Kontinents erreicht. Segelt weiter {{tag:%direction%|west=westwärts|east=ostwärts|default=mit dem Wind}}, um die Neue Welt zu entdecken und sie für die Krone in Anspruch zu nehmen. -model.player.waitingFor=Warten auf: %nation% +model.player.waitingFor=Warten auf: {{tag:country|%nation%}} model.regionType.coast.name=Küste model.regionType.coast.unknown=Unbekannte Küstenregion model.regionType.desert.name=Wüste @@ -2097,7 +2105,7 @@ model.tradeItem.gold.name=Gold model.tradeItem.gold.description=die Summe von %amount% Gold model.tradeItem.goods.name=Waren model.tradeItem.incite.name=Krieg erklären gegen -model.tradeItem.incite.description=Krieg gegen die %nation% +model.tradeItem.incite.description=Krieg gegen die {{tag:country|%nation%}} model.tradeItem.stance.name=Haltung model.tradeItem.unit.name=Einheit model.tradeRoute.allEmpty=Alle Haltestationen sind leer. @@ -2119,10 +2127,9 @@ model.unit.underRepair=Reparatur(%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S -model.unit.unitState.skipped=W +model.unit.unitState.skipped=X model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G model.noAddReason.alreadyPresent.description=Wir sind an diesem Standort bereits vertreten. @@ -2149,6 +2156,7 @@ model.colony.colonyStarved=Der letzte Kolonist in %colony% ist verhungert, so da model.colony.customs.sale=Das Zollamt in %colony% verkaufte: %data%. model.colony.customs.saleData=%amount% %goods% für %gold% model.colony.famineFeared=In %colony% wird eine Hungersnot befürchtet. Die Nahrung wird nur noch für %number% Runden reichen. +model.colony.starving=Die %colony% verhungert. model.colony.newColonist=Bevölkerungszuwachs in %colony%. model.colony.newConvert=Eine neuer Konvertit aus einer Siedlung der %nation% ist in %colony% eingetroffen. model.colony.notBuildingAnything=In %colony% wird nichts gebaut. @@ -2162,7 +2170,7 @@ model.colony.warehouseSoonFull=Unser Lagerhaus in %colony% wird seine Kapazität model.colony.warehouseWaste=Unser Lagerhaus in %colony% hat seine Kapazität für %goods% überschritten. %waste% Einheiten wurden verschwendet. model.colony.workersEvicted=Deine Kolonisten können wegen der Anwesenheit von %enemyUnit% nicht länger %location% bei %colony% arbeiten. model.colonyTile.resourceExhausted=Die Ressource %resource% in %colony% ist erschöpft! -model.game.spanishSuccession=Eure Exzellenz, der spanische Erbfolgekrieg in Europa ist beendet. Im Vertrag von Utrecht wurden die %loserNation% dazu gezwungen alle Kolonien in der Neuen Welt den %nation% zu überlassen! +model.game.spanishSuccession=Eure Exzellenz, der spanische Erbfolgekrieg in Europa ist beendet. Im Vertrag von Utrecht wurden die {{tag:country|%loserNation%}} dazu gezwungen alle Kolonien in der Neuen Welt den {{tag:country|%nation%}} zu überlassen! model.indianSettlement.mission.denounced=Euer Missionar in %settlement% wurde denunziert und hingerichtet! model.indianSettlement.mission.destroyed=Dein Missionar in %settlement% ist in der Zerstörung der Siedlung gestorben. model.player.alarmIncrease.tension.angry=Das %nation%-Oberhaupt in %settlement% warnt, dass die Tapferen offen nach einem Krieg mit den %enemy% rufen, um uns Eurer übergriffigen Siedler und Eurer hochmütigen Krieger auf unserem Lande zu entledigen. @@ -2171,7 +2179,7 @@ model.player.autoRecruit=Religiöse Unruhen in %europe% veranlassen %unit% zur A model.player.colonyGoodsParty.harbour=Unsere Kolonisten in %colony% haben %amount% %goods% in den Hafen geworfen, um gegen diese unfaire Besteuerung durch die Krone zu protestieren! model.player.colonyGoodsParty.horses=Die Bevölkerung in %colony% hat %amount% Pferde freigelassen um gegen die unfaire Besteuerung durch die Krone zu protestieren! model.player.colonyGoodsParty.landLocked=Unsere Kolonisten in %colony% haben %amount% %goods% auf dem Marktplatz verbrannt, um gegen diese unfaire Besteuerung durch die Krone zu protestieren! -model.player.dead.european=Eure Exzellenz, die %nation% haben einen vollständigen Rückzug aus der Neuen Welt verkündet! +model.player.dead.european=Eure Exzellenz, die {{tag:country|%nation%}} haben einen vollständigen Rückzug aus der Neuen Welt verkündet! model.player.dead.native=Eure Exzellenz, die %nation% wurden vernichtet. model.player.disaster.bankruptcy.start=Du hast nicht für die Instandhaltung aller Gebäude gezahlt. Schwere Produktionsstrafen wurden verhängt. model.player.disaster.bankruptcy.stop=Du bist wieder in der Lage für die Instandhaltung aller Gebäude zu zahlen. Die Produktionsstrafen wurden aufgehoben. @@ -2205,7 +2213,7 @@ combat.enemyShipEvaded=%enemyNation% %enemyUnit% ist einem Angriff durch %unit% combat.enemyShipSunk=%unit% versenkt %enemyNation% %enemyUnit%! combat.equipmentCaptured=Vorsicht, die Krieger der %nation% sind in den Besitz von %equipment% gelangt! combat.goodsStolen=%enemyNation% %enemyUnit% stehlen %amount% %goods% aus %colony%. -combat.indianPlunder=%enemyNation% %enemyUnit% plünderten %amount% in %colony%. +combat.indianPlunder=%enemyNation% %enemyUnit% plünderten %amount% Gold in %colony%. combat.indianRaid=Unsere Spione melden, dass die %nation% die %colony% der %colonyNation% überfallen haben. combat.indianSurprise=Die %nation% hat %colony% überraschend überfallen und so unsere Kolonisten alarmiert. Der Häuptling der %nation% leugnet jegliche Beteiligung. combat.indianTreasure=Sie haben %amount% von %settlement% geplündert. @@ -2260,7 +2268,7 @@ main.javaVersion=Zur korrekten Ausführung von FreeCol wird die Java-Version %mi main.memory=Es muss für JVM ein Speicher von mehr als %memory% Byte zugewiesen werden.\nFreeCol neu starten mit „java -Xmx%minMemory%M -jar FreeCol.jar“ main.userDir.fail=FreeCol konnte keine passenden Verzeichnisse zum Speichern der Benutzerdaten finden. Fahre fort, aber es werden Probleme erwartet. client.baseData=Das Basisdatenverzeichnis %dir% konnte nicht gefunden werden.\nDie Datendateien konnten von FreeCol nicht gefunden werden.\nStelle sicher, dass sie vorhanden sind.\nFalls FreeCol im falschen Verzeichnis sucht,\nführe das Spiel mit einem Kommandozeilenparameter aus:\n--freecol-data -client.choicePlayer=Bitte Spieler wählen: +client.choicePlayer=Bitte eine Nation auswählen: client.classic=Fehler beim Laden der Quellkarte von Regelsatz „classic“. client.debugConnect=Du kannst dich nicht mit einem vorhandenen Spiel im Fehlerbehebungsmodus verbinden. client.ending=Das Spiel endet. @@ -2272,9 +2280,9 @@ metaServer.couldNotConnect=Verbindung mit Meta-Server nicht möglich. Bitte vers metaServer.communicationError=Fehler bei der Kommunikation mit dem Meta-Server. Bitte versuchen Sie es später noch einmal. abandonEducation.action.studying=das Studium abandonEducation.action.teaching=die Ausbildung -abandonEducation.no=Nein, die Ausbildung fortsetzen +abandonEducation.no=Ausbildung fortsetzen abandonEducation.text=Sofern deine %unit% die Kolonie %colony% verlässt, wird sie %action% in der %building% aufgeben. Bist du sicher, dass sie aufbrechen soll? -abandonEducation.yes=Ja, die Kolonie verlassen +abandonEducation.yes=Ausbildung abbrechen abandonTeaching.text=Falls deine %unit% das %building% verlässt, wird die Ausbildung abgebrochen. Bist du sicher, dass das Gebäude verlassen werden soll? armedUnitSettlement.attack=Angriff armedUnitSettlement.tribute=Einen Tribut fordern @@ -2285,11 +2293,11 @@ buy.takeOffer=Angebot annehmen buy.text=Die %nation% würden ihre %goods% gerne für %gold% verkaufen: clearTradeRoute.text=%unit% ist der Handelsroute %route% zugewiesen. Wenn der Zielort verändert wird, wird die Zuweisung entfernt. Bist du sicher, dass du das tun willst? client.fullScreen=Der Vollbildmodus wird für dieses Grafikgerät nicht unterstützt.\nZurück zum Fenstermodus. -confirmHostile.alliance=Ihr könnt keine verbündete Nation angreifen! Möchtet Ihr wirklich die Allianz mit %nation% brechen und Ihnen den Krieg erklären? -confirmHostile.ceaseFire=Ihr habt einen Waffenstillstand mit den %nation% unterzeichnet. Möchtet Ihr wirklich angreifen? -confirmHostile.peace=Sie sind im Frieden mit %nation%. Möchtet Ihr wirklich den Krieg erklären? +confirmHostile.alliance=Ihr könnt keine verbündete Nation angreifen! Möchtet Ihr wirklich die Allianz mit {{tag:country|%nation%}} brechen und Ihnen den Krieg erklären? +confirmHostile.ceaseFire=Ihr habt einen Waffenstillstand mit den {{tag:country|%nation%}} unterzeichnet. Möchtet Ihr wirklich angreifen? +confirmHostile.peace=Sie sind im Frieden mit {{tag:country|%nation%}}. Möchtet Ihr wirklich den Krieg erklären? confirmHostile.yes=Ja, lasst die Kriegshunde los! -confirmTribute.broke=Unsere Spione melden, dass die %nation% völlig pleite sind. Lasst uns nicht unsere Zeit mit Tributforderungen verschwenden. +confirmTribute.broke=Unsere Spione melden, dass die {{tag:country|%nation%}} völlig pleite sind. Lasst uns nicht unsere Zeit mit Tributforderungen verschwenden. confirmTribute.european=Die %nation% %danger% und %finance%. Wie viel Tribut sollten wir von ihnen fordern? confirmTribute.happy=Die %nation% bei %settlement% sind für uns gute Freunde. Es ist schade, unsere Kameradschaft zu beschädigen. confirmTribute.no=Vielleicht sollten wir besser keinen fordern @@ -2308,7 +2316,7 @@ indianLand.cancel=Das Land verlassen indianLand.pay=%amount% Gold für das Land anbieten indianLand.take=Nehmen, was uns rechtmäßig zusteht indianLand.text=Dieses Land gehört den %player%. Möchtet Ihr: -indianLand.unknown=Einige unbekannte Menschen leben in diesen Ländern. Möchtest du: +indianLand.unknown=Einige unkontaktierte Menschen leben in diesen Ländern. Möchtest du: info.autodetectLanguageSelected=Sie haben die automatische Spracherkennung gewählt. Bitte starten Sie das Spiel neu, damit diese durchgeführt werden kann. info.enterSomeText=Bitte einen Text eingeben. info.newLanguageSelected=Ändert die Sprache auf %language%. Sie müssen das Spiel neu starten, damit die Änderungen wirksam werden. @@ -2353,8 +2361,8 @@ defeated.text=Ihr wurdet besiegt! Möchtet Ihr: defeated.yes=Bleiben und zusehen defeatedSinglePlayer.text=Ihr wurdet besiegt!\n\nNun ist die wahre Geisterstunde, in der Friedhöfe gähnen und die Hölle Verderben in diese Welt bringt. Nun tränk’ ich wohl heiß’ Blut, und täte manch’ Ding, dass beim bloßen Anblick der Tag schon schaudern würd’. defeatedSinglePlayer.yes=Revanche-Modus starten -diplomacy.offerAccepted=Die %nation% haben Euer großzügiges Angebot angenommen. -diplomacy.offerRejected=Die %nation% haben Euer großzügiges Angebot abgelehnt. +diplomacy.offerAccepted=Die {{tag:country|%nation%}} haben Euer großzügiges Angebot angenommen. +diplomacy.offerRejected=Die {{tag:country|%nation%}} haben Euer großzügiges Angebot abgelehnt. disbandUnit.text=Seid Ihr sicher, dass Ihr diese Einheit auflösen wollt? disbandUnit.yes=Auflösen disembark.text=Welche Truppen sollen hier an Land gehen, Eure Exzellenz? @@ -2399,7 +2407,7 @@ move.noAccessGoods=%nation% wird nicht mit einer unbeladenen %unit% handeln. move.noAccessMissionBan=Die %nation% lehnen jeglichen Kontakt mit unseren Missionaren ab. move.noAccessSettlement=Die %nation% verweigern unserem %unit% den Zutritt zu ihrer Siedlung. move.noAccessSkill=Unsere %unit% Einheit kann nichts von den Ureinwohnern lernen. -move.noAccessTrade=Wir sind nicht berechtigt mit anderen europäischen Nationen - wie die %nation% - Handel zu treiben. +move.noAccessTrade=Wir sind nicht berechtigt mit anderen europäischen Nationen – wie die {{tag:country|%nation%}} – Handel zu treiben. move.noAccessWar=Wir können mit den %nation% nicht handeln solange wir im Krieg sind. move.noAccessWater=Unser %unit% muss zuerst an Land gehen bevor er die Siedlung betreten kann. move.noAttackWater=Unsere %unit% muss vor dem Angriff an Land gehen. @@ -2456,6 +2464,7 @@ server.invalidPlayerNations=Alle Spieler müssen verschiedene Nationen wählen, server.maximumPlayers=Leider ist die maximale Spieleranzahl bereits erreicht. server.missingUserName=Der Spielername wurde bei der Anmeldung nicht angegeben. server.missingVersion=Die Version von FreeCol wurde bei der Anmeldung nicht angegeben. +# Fuzzy server.noRouteToServer=Der Server kann nicht öffentlich gemacht werden. Sie sollten Ihre Firewall-Einstellungen verändern, um Verbindungen zu dem von Ihnen gewählten Port zuzulassen. server.noSuchPlayer=Das Spiel enthält keinen Spieler namens %player% server.notAllReady=Nicht alle Spieler sind bereit, das Spiel zu beginnen! @@ -2465,7 +2474,7 @@ server.timeOut=Zeitüberschreitung beim Versuch mit dem Server zu verbinden. server.userNameInUse=Der angegebene Spielername wird bereits verwendet. server.userNameNotPresent=Der angegebene Benutzername ist nicht in diesem Spiel. server.wrongFreeColVersion=Die Versionen des Spiels auf dem Client sowie dem Server stimmen nicht überein. -buildColony.others=Die %nation% haben die neue Kolonie %colony% in %region% gegründet. +buildColony.others=Die {{tag:country|%nation%}} haben die neue Kolonie %colony% in %region% gegründet. cashInTreasureTrain.colonial=Ein Schatz mit %amount% Gold ist in Europa angekommen. Unsere Schatzkammer ist um %cashInAmount% Gold reicher! cashInTreasureTrain.independent=Ein Schatz im Wert von %amount% wurde unserem Nationalschatz hinzugefügt. cashInTreasureTrain.otherColonial=Ein Schatz von %amount% wurde in Europa entladen. Der Monarch von %nation% ist in der Tat erfreut. @@ -2572,7 +2581,7 @@ colopedia.unit.offensivePower=Angriffsstärke: colopedia.unit.price=Preis in Europa: colopedia.unit.productionBonus=Produktions{{plural:%number%|one=änderungsfaktor|other=änderungsfaktoren}} colopedia.unit.requirements=Vorraussetzungen: -colopedia.unit.school=Zur Ausbildung benötigtes Gebäude: +colopedia.unit.school=Darf ausbilden in: colopedia.unit.skill=Fertigkeit: report.labour.allColonists=Alle Kolonisten report.labour.amateursWorking=Amateure @@ -2597,40 +2606,60 @@ report.labour.unitTotal.tooltip=%unit% oder erlernte %unit% report.labour.workingAs=Arbeiten als report.labour.workingAsOther=andere report.colony.arriving.description=%colony%: neue %unit% {{plural:%turns%|one=in der nächsten Runde|other=in %turns% Runden}} +report.colony.arriving.summary.description=Die durchschnittliche Anzahl der Runden, bevor ein neuer Kolonist in den Kolonien dieses Kontinents ankommt report.colony.birth.description=Anzahl der Runden bis ein neuer Kolonist kommt oder verhungert report.colony.explore.description=Anzahl der an diese Kolonie angrenzenden Felder, die erforscht werden sollen report.colony.explore.header=E report.colony.exploring.description=%colony% würde von der Erforschung von {{plural:%amount%|one=einem Feld|other=%amount% Feldern}} profitieren +report.colony.exploring.summary.description=Gesamtanzahl der Koloniefelder, die vom Entdecken für diesen Kontinent profitieren würden. report.colony.grow.description=Anzahl der Einheiten, die die Kolonie wachsen kann, ohne dass die Produktion beeinträchtigt wird report.colony.grow.header=+ report.colony.growing.description=%colony% kann um {{plural:%amount%|one=eine Einheit|other=%amount% Einheiten}} wachsen, ohne dass die Produktion beeinträchtigt wird +report.colony.growing.summary.description=Die Gesamtanzahl der Kolonisten, die Kolonien dieses Kontinents ohne schadender Produktion beitreten können report.colony.improve.description=Einheiten welche die Produktion verbessern könnten. report.colony.improve.header=Verbessert -report.colony.improving.description=%colony%: Um %amount% %goods% zusätzlich herstellen zu können: %oldUnit% durch %unit% austauschen -report.colony.wanting.description=%colony%: Um %amount% %goods% zusätzlich herstellen zu können: %unit% hinzufügen +report.colony.improving.description=%colony% %location%: Um %amount% %goods% zusätzlich herstellen zu können: %oldUnit% durch %unit% austauschen +report.colony.improving.summary.description=Einheiten (Typ und Anzahl), die von Kolonien dieses Kontinents profitieren würden report.colony.making.blocking.description=%colony%: %amount% %goods% werden {{plural:%turns%|one=in der nächsten Runde|other=in %turns% Runden}} für %buildable% benötigt. report.colony.making.constructing.description=%colony%: %buildable% wird {{plural:%turns%|one=in der nächsten Runde|other=in %turns% Runden}} fertiggestellt report.colony.making.description=Was diese Kolonie macht report.colony.making.educating.description=%colony%: %teacher% schließt Ausbildung {{plural:%turns%|one=in der nächsten Runde|other=in %turns% Runden}} ab +report.colony.making.educationVacancy.description=%colony%: {{plural:%number%|one=Ein Schülerort ist|other=%number% Schülerorte sind}} vakant +report.colony.making.educating.summary.description=Einheiten (Typ und Anzahl), die voraussichtlich von Schulen dieses Kontinents aufsteigen report.colony.making.header=Erzeugt report.colony.making.noconstruction.description=%colony% : Es finden keine Bauarbeiten statt report.colony.making.noteach.description=%colony%: %teacher% ohne Student +report.colony.making.summary.description=Der Verlust von %goods% pro Runde während der unbefriedigenden Bauanforderungen dieses Kontinents report.colony.name.description=Die Liste der Kolonien report.colony.name.header=Kolonie -report.colony.plow.description=Anzahl der Felder einer Kolonie, die sich durch Pflügen verbessern ließen -report.colony.plow.header=P -report.colony.plowing.description=%colony% würde vom Pflügen von {{plural:%amount%|one=einem Feld|other=%amount% Feldern}} profitieren -report.colony.production.description=%colony%: %goods% Produktion (netto) = %amount% -report.colony.production.export.description=%colony%: %goods% Produktion (netto) beträgt %amount% (exportiere ab über %export%) +report.colony.name.summary.description=Die Region enthält weitere der obigen Kolonien dieses Kontinents +report.colony.production.description=%colony%: %amount% %goods% werden produziert +report.colony.production.export.description=%colony%: %amount% %goods% werden produziert (exportiert über %export%) report.colony.production.header=%goods% Produktion (netto) -report.colony.production.high.description=%colony%: %goods% Produktion (netto) = %amount%, voll bis {{plural:%turns%|one = nächste Runde|other = in %turns% Runden}} -report.colony.production.low.description=%colony%: %goods% Produktion (netto) = %amount%, leer bis {{plural:%turns%|one = nächste Runde|other = in %turns% Runden}} -report.colony.production.waste.description=%colony%: %goods% Produktion (netto) = %amount%. Das Warenlager wird überquellen, %waste% wird verschwendet -report.colony.road.description=Anzahl der Felder einer Kolonie, die sich durch das Bauen von Straßen verbessern ließen -report.colony.road.header=S -report.colony.roadBuilding.description=%colony% würde vom Bauen von {{plural:%amount%|one=einer Straße|other=%amount% Straßen}} profitieren +report.colony.production.high.description=%colony%: %amount% %goods% werden produziert, voll bis {{plural:%turns%|one=nächster Runde|other=in %turns% Runden}} +report.colony.production.low.description=%colony%: %amount% %goods% werden konsumiert, leer bis {{plural:%turns%|one=nächster Runde|other=in %turns% Runden}} +report.colony.production.maxConsumption.description=%colony%: %amount% %goods% werden konsumiert (könnte weitere %more% konsumieren) +report.colony.production.maxProduction.description=%colony%: %amount% %goods% werden produziert (könnte weitere %more% produzieren) +report.colony.production.summary.description=Die Menge an Gütern, die produziert oder konsumiert wird. +report.colony.production.waste.description=%colony%: %amount% %goods% werden produziert, Lagerhaus quillt über, %waste% wird verschwendet +report.colony.tile.clearForest.description=%colony% würde vom Roden von {{plural:%amount%|one=einem Feld|other=%amount% Feldern}} profitieren +report.colony.tile.clearForest.specific.description=%colony% würde vom Roden von %location% profitieren +report.colony.tile.clearForest.header=C +report.colony.tile.clearForest.header.description=Anzahl der Koloniefelder, die vom Roden profitieren würden. +report.colony.tile.clearForest.summary.description=Gesamtanzahl der Koloniefelder, die vom Roden für diesen Kontinent profitieren würden. +report.colony.tile.plow.description=%colony% würde vom Pflügen von {{plural:%amount%|one=einem Feld|other=%amount% Feldern}} profitieren +report.colony.tile.plow.specific.description=%colony% würde vom Pflügen von %location% profitieren +report.colony.tile.plow.header=P +report.colony.tile.plow.header.description=Anzahl der Koloniefelder, die vom Pflügen profitieren würden. +report.colony.tile.plow.summary.description=Gesamtanzahl der Koloniefelder, die vom Pflügen für diesen Kontinent profitieren würden. +report.colony.tile.road.description=%colony% würde vom Bau von {{plural:%amount%|one=einer Straße|other=%amount% Straßen}} profitieren +report.colony.tile.road.specific.description=%colony% würde vom Bau einer Straße bei %location% profitieren +report.colony.tile.road.header=R +report.colony.tile.road.header.description=Anzahl der Koloniefelder, die vom Straßenbau profitieren würden. +report.colony.tile.road.summary.description=Gesamtanzahl der Koloniefelder, die vom Straßenbau für diesen Kontinent profitieren würden. report.colony.shrinking.description=%colony% muss um {{plural:%amount%|one=eine Einheit|other=%amount% Einheiten}} schrumpfen, um die Produktion zu verbessern report.colony.starving.description=%colony%: Hungersnot {{plural:%turns%|one=in der nächsten Runde|other=in %turns% Runden}} +report.colony.wanting.description=%colony% %location%: Um %amount% %goods% zusätzlich herstellen zu können: %unit% hinzufügen report.continentalCongress.available=Verfügbar report.continentalCongress.elected=Gewählt wurde: %turn% report.continentalCongress.none=(keine) @@ -2675,29 +2704,30 @@ report.production.selectGoods=Güter auswählen report.production.update=Aktualisieren report.requirements.badAssignment=%colony% hat einen %expert%, der derzeit als %expertWork% arbeitet, während ein %nonExpert% als %nonExpertWork% tätig ist. Die Produktion würde größer sein, sofern beide Kolonisten ihre Arbeitsplätze tauschten. report.requirements.canTrainExperts={{plural:2|%unit%}} können ausgebildet werden, und zwar als -report.requirements.clearTile=%type% in %direction% %colony% würden von einer Rodung profitieren. -report.requirements.exploreTile=%type% in %direction% %colony% würden von einer Erforschung profitieren. +report.requirements.exploreTile=%location% würden von einer Erforschung profitieren. report.requirements.met=Alle Bedingungen sind erfüllt. report.requirements.missingGoods=%colony% produziert %goods% benötigt dafür aber mehr %input%. report.requirements.misusedExperts=Es sind {{plural:2|%unit%}} vorhanden, die nicht als %work% arbeiten: report.requirements.noExpert=%colony% produziert %goods%, hat aber keinen %unit%. -report.requirements.plowCenter=%colony% würde vom Pflügen seiner Felder profitieren. -report.requirements.plowTile=%type% in %direction% %colony% würden vom Pflügen profitieren. -report.requirements.roadTile=%type% in %direction% %colony% würden von Straßen profitieren. +report.requirements.tile.clearForest=%location% würde vom Roden profitieren. +report.requirements.tile.plow=%location% würde vom Pflügen profitieren. +report.requirements.tile.road=%location% würde vom Straßenbau profitieren. report.requirements.severalExperts=Mehrere {{plural:2|%unit%}} befinden sich in report.requirements.surplus=Ein Überangebot an %goods% wird produziert, und zwar in report.trade.afterTaxes=Einkommen nach Steuern report.trade.beforeTaxes=Einkommen vor Steuern report.trade.cargoUnits=Transportierte Einheiten -report.trade.hasCustomHouse=* Diese Kolonie hat ein Zollhaus; diese Waren werden exportiert. +report.trade.export=Exportiere %goods% über %amount% +report.trade.hasCustomHouse=* Diese Kolonie hat ein Zollhaus und darf Waren exportieren. report.trade.totalDelta=Gesamt Produktion report.trade.totalUnits=Gesamt Einheiten report.trade.unitsSold=Gekaufte oder verkaufte Einheiten report.turn.filter=Diese Art von Meldung nicht anzeigen (%type%) report.turn.ignore=Ignoriere diese Meldung (Kolonie: %colony%, Waren: %goods%) -report.turn.playerNation=%player%s %nation% +report.turn.playerNation=%player%s {{tag:country|%nation%}} aboutPanel.copyright=Copyright © 2002–2015 Das FreeCol-Team aboutPanel.legalDisclaimer=FreeCol ist Freie Software: Sie dürfen es weiter verteilen und/oder verändern unter Berücksichtigung der Regeln zur GNU General Public License wie veröffentlicht durch die Free Software Foundation, entweder Version 2 der Lizenz, oder jede höhere Version. +aboutPanel.manual=Manueller FreeCol-Download aboutPanel.officialSite=Offizielle Seite: aboutPanel.sfProject=SourceForge-Projekt: aboutPanel.version=Version: @@ -2735,8 +2765,8 @@ confirmDeclarationDialog.areYouSure.no=Vielleicht später confirmDeclarationDialog.areYouSure.text=Lasst uns der ungerechten Tyrannei des Monarchen von %monarch% entsagen und die Unabhängigkeit unserer Kolonien von der Krone erklären! confirmDeclarationDialog.areYouSure.yes=Freiheit oder Tod! confirmDeclarationDialog.createFlag=und unsere Feinde werden beim Anblick unserer aufsässigen Fahne zittern. -confirmDeclarationDialog.defaultCountry=Vereinigte Staaten von %nation% -confirmDeclarationDialog.defaultNation=Freie %nation% +confirmDeclarationDialog.defaultCountry=Vereinigte Staaten von {{tag:country|%nation%}} +confirmDeclarationDialog.defaultNation=Freie {{tag:country|%nation%}} confirmDeclarationDialog.enterCountry=Von diesem Tag an soll unser Land bekannt sein als confirmDeclarationDialog.enterNation=und jeder Bürger unserer glorreichen Nation möge stolz sein, bekannt zu sein als flag.background.FESSES=Balken @@ -2787,10 +2817,10 @@ negotiationDialog.add=Hinzufügen negotiationDialog.cancel=Abbrechen negotiationDialog.clear=Löschen negotiationDialog.contact.tutorial=Du triffst Europäische Kameraden. Sie werden mit dir um Land und Reichtümer wetteifern und es wohl wagen, Krieg gegen dich zu führen. Aber nachdem Jan de Witt dem Kontinentalkongress beigetreten ist, kannst du mit ihnen handeln. -negotiationDialog.demand=Die %nation% fordern von den %otherNation% +negotiationDialog.demand=Die {{tag:country|%nation%}} fordern von den {{tag:country|%otherNation%}} negotiationDialog.exchange=im Gegenzug für negotiationDialog.goldAvailable=(%amount% Gold verfügbar) -negotiationDialog.offer=Die %nation% bieten den %otherNation% +negotiationDialog.offer=Die {{tag:country|%nation%}} bieten den {{tag:country|%otherNation%}} negotiationDialog.send=Abschicken negotiationDialog.title.contact=Europäische Kameraden treffen negotiationDialog.title.diplomatic=Diplomatische Verhandlung @@ -2813,10 +2843,10 @@ findSettlementPanel.displayOnlyEuropean=Nur Europäische Siedlungen finden findSettlementPanel.displayOnlyNatives=Nur Eingeborenensiedlungen finden findSettlementPanel.name=Siedlung finden findSettlementPanel.settlement=%name%%capital% (%nation%) -firstContactDialog.meeting.natives=Treffen mit den Ureinwohnern... +firstContactDialog.meeting.natives=Treffen mit den Ureinwohnern firstContactDialog.meeting.natives.tutorial=Du triffst Ureinwohner. Sende deine Späher zu ihren Siedlungen, um mehr über sie zu erfahren und deine Schuldknechte und freien Kolonisten, um mehr von ihnen zu lernen. Sende deine Schiffe und Wagenzüge zu ihren Siedlungen, wenn du vorhast, mit ihnen zu handeln. -firstContactDialog.meeting.AZTEC=Das Reich der Azteken... -firstContactDialog.meeting.INCA=Das Reich der Inka... +firstContactDialog.meeting.aztec=Die Azteken +firstContactDialog.meeting.inca=Das Inkareich firstContactDialog.welcomeOffer.text=Die %nation% grüßen Euch. Wir sind eine glorreiche Nation die %camps% %settlementType% umfasst. Um unsere Freundschaft zu feiern bieten wir Euch das Land welches Ihr derzeit besetzt als Geschenk an. Werdet Ihr diesen Vertrag akzeptieren und mit uns in Frieden als Brüder leben? firstContactDialog.welcomeSimple.text=Die %nation% grüßen Euch. Wir sind eine glorreiche Nation die %camps% %settlementType% umfasst. Werdet Ihr unseren Vertrag akzeptieren und mit uns in Frieden als Brüder leben? abandonColony.no=Abbrechen @@ -2859,6 +2889,7 @@ freecol.map.Australia=Australien freecol.map.Caribbean_basin=Karibischer Becken mapSizeDialog.mapSize=Kartengröße wählen modifierFormat.unknown=??? +modifierFormat.scopeMethod.isIndian.name=Eingeborene monarchDialog.default=Eine Nachricht von der Krone newPanel.editDifficulty=Schwierigkeit bearbeiten newPanel.getServerList=Serverliste abrufen diff --git a/data/strings/FreeColMessages_el.properties b/data/strings/FreeColMessages_el.properties index 120e1f4d1..0bcb733be 100644 --- a/data/strings/FreeColMessages_el.properties +++ b/data/strings/FreeColMessages_el.properties @@ -204,7 +204,6 @@ colopediaAction.goods.name=Αγαθά colopediaAction.nations.name=Ἐθνη colopediaAction.nationTypes.name=Εθνικά Πλεονεκτήματα colopediaAction.resources.name=Μπόνους Πόροι -colopediaAction.skills.name=Ικανότητες colopediaAction.terrain.name=Τύποι εδάφους colopediaAction.units.name=Μονάδες declareIndependenceAction.name=Διακύρηξε την Ανεξαρτησία σου @@ -885,18 +884,24 @@ model.direction.SW.name=νοτιοδυτικά model.direction.W.name=δυτικά model.direction.NW.name=βορειοδυτικά model.historyEventType.abandonColony.description=Εγκαταλείπεις την αποικία του %colony%. +# Fuzzy model.historyEventType.cityOfGold.description=Ανακαλύπτεις μια %city%, μια από τις Επτά Πόλεις του Χρυσού, και έναν θησαυρό χρυσού %treasure%. +# Fuzzy model.historyEventType.colonyConquered.description=Η αποικία %colony% κυριεύεται από το %nation%. +# Fuzzy model.historyEventType.colonyDestroyed.description=Η αποικία %colony% καταστρέφεται από το %nation%. # Fuzzy model.historyEventType.declareIndependence.description=Καταστρέφεις τον %nation% καταυλισμό %settlement%. +# Fuzzy model.historyEventType.destroyNation.description=Καταστρέφεις το %nation%. model.historyEventType.discoverNewWorld.description=Ανακάλυψες το Νέο Κόσμο. +# Fuzzy model.historyEventType.discoverRegion.description=Ανακαλύπτεις το %region%. model.historyEventType.foundColony.description=Κατοχυρώνεις την αποικία του %colony%. model.historyEventType.foundingFather.description=Ο %father% λαμβάνει μέρος στο Ηπειρωτικό Κογκρέσο. model.historyEventType.independence.description=Επιτυγχάνεις ανεξαρτησία από το Στέμμα. -model.historyEventType.meetNation.description=Συναντάς το %nation%. +model.historyEventType.meetNation.description=Συναντάς το έθνος %nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=Το %nation% καταστρέφεται. model.indianSettlement.mostHatedNone=Κανένα model.indianSettlement.nameUnknown=Άγνωστο @@ -929,6 +934,7 @@ model.nationState.available.shortDescription=Κυριεύεις την %nation% model.nationState.notAvailable.name=μη διαθέσιμοι model.player.independentMarket=Ευρώπη model.player.startGame=Μετά από μήνες στη θάλασσα, έχεις φτάσει στην ακτή μιας άγνωστης ηπείρου. Πλεύσε δυτικά προκειμένου να ανακαλύψεις τον νέο κόσμο και να τον διεκδικήσεις για τον λαό σου. +# Fuzzy model.player.waitingFor=Αναμονή για: %nation% model.regionType.coast.name=Ακτή model.regionType.desert.name=Έρημος @@ -980,9 +986,9 @@ model.unit.underRepair=Υπό επισκευή (%turns% {{plural:%turns%|one=tur model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S +# Fuzzy model.unit.unitState.skipped=W model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G @@ -1010,6 +1016,7 @@ error.couldNotLoad=Παρουσιάστηκε σφάλμα κατά την πρ # Fuzzy error.couldNotSave=Παρουσιάστηκε ένα σφάλμα κατά την προσπάθεια να αποθηκεύσετε το παιχνίδι! main.defaultPlayerName=Όνομα Παίχτη +# Fuzzy client.choicePlayer=Παρακαλώ επιλέξτε έναν παίκτη: metaServer.couldNotConnect=Λυπούμαστε, αλλά δεν μπόρεσε να συνδεθεί με το μετα-διακομιστή. Παρακαλώ δοκιμάστε αργότερα. metaServer.communicationError=Παρουσιάστηκε ένα σφάλμα κατά την επικοινωνία με το μετα-διακομιστή. Παρακαλούμε προσπαθήστε ξανά αργότερα. @@ -1055,7 +1062,8 @@ cashInTreasureTrain.free=Ο βασιλιάς σου θα μεταφέρει το cashInTreasureTrain.pay=Ο βασιλιάς θα μεταφέρει το θησαυρό σου αν πάρει το 50% της αξίας του. defeated.text=Ηττηθήκατε! Τί θέλετε τώρα; defeated.yes=Ας μείνω να παρακολουθήσω -diplomacy.offerAccepted=Οι %nation% αποδέχθηκαν τη γενναιόδωρη προσφορά σας. +diplomacy.offerAccepted=Οι {{tag:country|%nation%}} αποδέχθηκαν τη γενναιόδωρη προσφορά σας. +# Fuzzy diplomacy.offerRejected=Οι %nation% αρνήθηκαν τη γενναιόδωρη προσφορά σας. disbandUnit.text=Σίγουρα θέλετε να διαλύσετε αυτή τη μονάδα; disbandUnit.yes=Αποστράτευση @@ -1138,6 +1146,7 @@ colopedia.unit.price=Τιμή στην Ευρώπη: # Fuzzy colopedia.unit.productionBonus=Τροποποιητές παραγωγής: colopedia.unit.requirements=Απαιτήσεις: +# Fuzzy colopedia.unit.school=Σχολείο που απαιτείται για την εκπαίδευση: colopedia.unit.skill=Ικανότητα: report.labour.allColonists=Όλοι οι άποικοι @@ -1179,6 +1188,7 @@ report.production.update=Ενημέρωση report.trade.totalDelta=Συνολική Παραγωγή report.trade.totalUnits=Συνολικές Μονάδες report.turn.ignore=Αγνόησή αυτού του μηνύματος (Αποικία: %colony%, Αγαθά: %goods%) +# Fuzzy report.turn.playerNation=%nation% του %player% # Fuzzy aboutPanel.copyright=Copyright (C) 2002-2014 Η ομάδα του FreeCol @@ -1205,8 +1215,8 @@ colonyPanel.notBestTile=%unit% θα μπορούσε να παράγει περ confirmDeclarationDialog.areYouSure.no=Ίσως Αργότερα confirmDeclarationDialog.areYouSure.text=Ας αποκηρύξουμε την άδικη τυραννία του %monarch% και ας διακηρύξουμε την \nανεξαρτησία των αποικιών μας από το στέμμα! confirmDeclarationDialog.areYouSure.yes=Ελευθερία ή Θάνατος! -confirmDeclarationDialog.defaultCountry=Ηνωμένες Πολιτείες %nation% -confirmDeclarationDialog.defaultNation=Ελεύθερο %nation% +confirmDeclarationDialog.defaultCountry=Ηνωμένες Πολιτείες {{tag:country|%nation%}} +confirmDeclarationDialog.defaultNation=Ελεύθεροι {{tag:country|%nation%}} confirmDeclarationDialog.enterCountry=Εφεξής, η χώρα μας θα είναι γνωστή ως confirmDeclarationDialog.enterNation=και κάθε πολίτης του ένδοξου έθνους μας θα είναι υπερήφανοι που θα αποκαλούνται constructionPanel.clickToBuild=Πατήστε στη μεριά κτιρίων για να επιλέξτε ένα κτίριο ή μια μονάδα για να χτίσετε. diff --git a/data/strings/FreeColMessages_eo.properties b/data/strings/FreeColMessages_eo.properties index af6f828d2..1ef43b3a8 100644 --- a/data/strings/FreeColMessages_eo.properties +++ b/data/strings/FreeColMessages_eo.properties @@ -189,8 +189,9 @@ cli.no-memory-check=ignori la memoran kontroladon cli.no-sound=funkciigi FreeCol sen sono cli.private=starti privatan servilon (ne publikita al la metaservilo) cli.seed=provizi KERNO-n por la duon-hazarda nombro-generilo -cli.server-name=specifigi memfaritan NOMOn por la servilo +# Fuzzy cli.server=starti memstaran servilon ĉe la specifita pordo +cli.server-name=specifigi memfaritan NOMOn por la servilo cli.splash=montri salutŝildan bildon DOSIERON kiam ŝarĝante ludon cli.tc=ŝarĝi la tutan konverton kun la donata NOMO cli.timeout=nombron da sekundoj atendis la servilo por respondo de demando @@ -251,7 +252,6 @@ colopediaAction.goods.name=Varoj colopediaAction.nations.name=Nacioj colopediaAction.nationTypes.name=Naciaj Avantaĝoj colopediaAction.resources.name=Bonusaj Rimedoj -colopediaAction.skills.name=Fakuloj colopediaAction.terrain.name=Tipoj de tereno colopediaAction.units.name=Unuoj colopediaAction.name=%object% (Kolopedio) @@ -1185,6 +1185,7 @@ model.improvement.road.description=Vojo model.improvement.road.name=Vojo model.improvement.road.occupationString=V model.limit.independence.coastalColonies.name=Limo de marborda kolonio +# Fuzzy model.limit.independence.coastalColonies.description=Vi bezonas almenaŭ %limit% marbordajn koloniojn por proklami sendependecon. model.limit.independence.rebels.name=Limo de ribeluloj model.limit.independence.rebels.description=Almenaŭ %limit%% de viaj koloniistoj devas subteni sendependecon. @@ -1512,18 +1513,24 @@ model.building.locationLabel=En %location% model.colony.badGovernment=La estraro de %colony% estas rendimenta. Minusoj por produktado estas aplikita. model.colony.governmentImproved1=La registaro de %colony% pliboniĝis, se ĝi ankoraŭ estas malrendimenta. Minusoj por produktado ankoraŭ aplikas. model.colony.governmentImproved2=La registaro de %colony% pliboniĝis. Minusoj por produktado ne jam aplikas. +# Fuzzy model.colony.insufficientProduction=%outputAmount% pliaj %outputType%j estus produktata en %colony%, se nur ni havus %inputAmount% pliajn unuojn de %inputType%. model.colony.minimumColonySize=%object% malhelpas malpligrandante la loĝantaron. model.colony.unbuildable=%colony% ne povas konstrui %object%n ĉi-momente. %object% estis forigita de la konstrulisto. model.colony.veryBadGovernment=La registaro de %colony% estas tre malrendimenta. Altaj minusoj por produktado estas aplikataj. model.colonyTile.claim=(depostula %direction%) model.diplomaticTrade.receive.contact=Fratecajn salutojn de la glora nacio de %nation%. +# Fuzzy model.diplomaticTrade.receive.diplomatic=Ni negocu kun la %nation%. model.diplomaticTrade.receive.trade=Ni konsideru la komercoferto de %nation%. +# Fuzzy model.diplomaticTrade.receive.tribute=La %nation% postulas tributon de ni! model.diplomaticTrade.send.contact=Ni renkontas membrojn de la nacio %nation%. +# Fuzzy model.diplomaticTrade.send.diplomatic=Ni konsideru nian diplomatian situacion kun la %nation%. +# Fuzzy model.diplomaticTrade.send.trade=Ni proponu komercon kun la %nation% ĉe %settlement%. +# Fuzzy model.diplomaticTrade.send.tribute=Ni postulas tributon de la %nation% ĉe %settlement%. model.direction.N.name=norden model.direction.NE.name=nordorienten @@ -1534,21 +1541,29 @@ model.direction.SW.name=sudokcidenten model.direction.W.name=okcidenten model.direction.NW.name=nordokcidenten model.historyEventType.abandonColony.description=Vi forlasas la kolonion %colony%. +# Fuzzy model.historyEventType.cityOfGold.description=La %nation% malkovras %city%n, unu el la sep urboj de oro, kaj trezoron de ora %treasure%. +# Fuzzy model.historyEventType.colonyConquered.description=Via kolonio %colony% estas venkita de la %nation%. +# Fuzzy model.historyEventType.colonyDestroyed.description=Via kolonio %colony% estas detruita de la %nation%. # Fuzzy model.historyEventType.conquerColony.description=Ĉu vi aŭdacas akcepti Niajn malavarajn preskribojn kaj tamen eviti pagi? Por tia ruzemo vi rikoltos la maldolĉan rekompencon de Nia malplezuro. # Fuzzy model.historyEventType.declareIndependence.description=Vi detruis %settlement%n de %nation%. +# Fuzzy model.historyEventType.destroyNation.description=La %nation% detruis la %nativeNation%n. model.historyEventType.discoverNewWorld.description=Vi malkovris la Novan Mondon. +# Fuzzy model.historyEventType.discoverRegion.description=La %nation% malkovras %region%n. model.historyEventType.foundColony.description=Vi establi la kolonion %colony%. model.historyEventType.foundingFather.description=%father% aligas la Kontinentan Kongreson. model.historyEventType.independence.description=Vi atingas sendependeco de la Krono. +# Fuzzy model.historyEventType.meetNation.description=Vi renkontas la %nation%n. +# Fuzzy model.historyEventType.nationDestroyed.description=La %nation% ne plu existas en la Nova Mondo. +# Fuzzy model.historyEventType.spanishSuccession.description=La %loserNation% cedas ĉiujn iliajn koloniojn en la Nova Mondo al la %nation%. model.indianSettlement.mostHatedNone=Neniu model.indianSettlement.mostHatedUnknown=Nekonata @@ -1634,6 +1649,7 @@ model.noClaimReason.worked.description=Alia vilaĝo jam pretendas ĉi tiun areon model.player.forces=Trupoj de %nation% model.player.independentMarket=Eŭropo model.player.startGame=Post monatoj ĉe maro, vi finfine aliĝas apud la marlimo de nekonata kontinento. Vojaĝu {{tag:%direction%|west=okcidenten|east=orienten|default=laŭventen}} por malkovri la Novan Mondon kaj ekposedi ĝin por la Kronestro. +# Fuzzy model.player.waitingFor=Atendas: %nation%n model.regionType.coast.name=Marlimo model.regionType.coast.unknown=Nekonata Marlimo @@ -1673,6 +1689,7 @@ model.tradeItem.gold.name=Orpecoj model.tradeItem.gold.description=la sumo de %amount% orpecoj model.tradeItem.goods.name=Varoj model.tradeItem.incite.name=Deklari militon kontraŭ +# Fuzzy model.tradeItem.incite.description=milito kontraŭ la %nation%. model.tradeItem.stance.name=Sinteno model.tradeItem.unit.name=Unuo @@ -1691,9 +1708,9 @@ model.unit.underRepair=Riparante (%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=G +# Fuzzy model.unit.unitState.skipped=~ model.unit.unitState.toAmerica=A model.unit.unitState.toEurope=E @@ -1724,10 +1741,12 @@ model.colony.warehouseOverfull=Via vardomo en %colony% atingis ĝian maksimumon model.colony.warehouseSoonFull=Via vardomo en %colony% troigos ĝian tenkapablon de %goods% dum la posta vico. %amount% unuoj de %goods% estas malŝparitaj. model.colony.warehouseWaste=Via vardomo en %colony% atingis ĝian maksimumon de %goods%. %waste% unuoj malŝpariĝis. model.colonyTile.resourceExhausted=Rimedo %resource% estas forkonsumita en %colony%. +# Fuzzy model.game.spanishSuccession=Moŝto, la Milito de Hispana Sinsekvo finiĝis en Eŭropo. En la Traktato de Utrecht, la %loserNation% devis cedi ĉiujn koloniojn en la Nova Mondo al la %nation%! model.player.colonyGoodsParty.harbour=Viaj koloniistoj en %colony% forĵetis %amount% de %goods% en la maro por protesti la maljusta impostado de la Krono! model.player.colonyGoodsParty.horses=Viaj koloniistoj en %colony% liberigas %amount% ĉevalojn por protesti la nejustan impostadon de la Krono! model.player.colonyGoodsParty.landLocked=Viaj koloniistoj en %colony% bruligis %amount% unuojn de %goods% en la komercejo por protesti ĉi tiun maljustan impostadon de la Krono! +# Fuzzy model.player.dead.european=Moŝto, la %nation% estas deklarita nekondiĉan eligon de Mondaj aferoj! model.player.dead.native=Moŝto, la %nation% estis detruita. model.player.disaster.effect.colonyDestroyed=%colony% tute detruiĝis. @@ -1737,12 +1756,16 @@ model.player.foundingFatherJoinedCongress=%foundingFather% kunigas la Kongreson! model.player.interventionForceArrives=La promesita Intervena Armeo alvenas! model.player.soLDecrease=Membreco en la Filoj de Libereco en viaj kolonioj malaltiĝis al %newSoL% procentoj! model.player.soLIncrease=Membreco en la Filoj de Libereco en viaj kolonioj altiĝis al %newSoL% procentoj! +# Fuzzy model.player.stance.alliance.declared=Moŝto, la %nation% alianciĝis kun ni! model.player.stance.alliance.others=Moŝto, la %attacker% estas aliancaj kun la %defender%. +# Fuzzy model.player.stance.ceaseFire.declared=Moŝto, la %nation% konsentas paciĝi kun ni! model.player.stance.ceaseFire.others=Moŝto, la %attacker% konstentas ĉesigi batalon kun la %defender%. +# Fuzzy model.player.stance.peace.declared=Moŝto, la %nation% estas pacema kun ni! model.player.stance.peace.others=Moŝto, la %attacker% estas paca kun la %defender%. +# Fuzzy model.player.stance.war.declared=Bedaŭrinde, Moŝto, la %nation% deklaris militon kontraŭ ni! model.player.stance.war.others=Moŝto, la %attacker% deklaris militon kontraŭ la %defender%. combat.automaticDefence=Via %unit% en %colony% ektenas pafilojn por defendi la kolonion! @@ -1758,6 +1781,7 @@ combat.enemyShipEvaded=%enemyUnit% de %enemyNation% evitis atakon de %unit%. combat.enemyShipSunk=%enemyNation% %enemyUnit% estas sinkita de %unit%! combat.equipmentCaptured=Avertu: la tribanoj de la %nation% akiris %equipment%n! combat.goodsStolen=%enemyUnit% de %enemyNation% ŝtelas %amount% %goods%n ĉe %colony%! +# Fuzzy combat.indianPlunder=%enemyUnit% de %enemyNation% ŝtelis %amount% orpecojn de %colony%. combat.indianTreasure=Vi ŝtelas %amount% de la vilaĝo de %settlement%. combat.nativeCapitalBurned=Vi bruligis %name%, la ĉefvilaĝo de la %nation%. La %nation% kapitulacas al via fortegeco! @@ -1810,12 +1834,15 @@ main.defaultPlayerName=Nomo de ludanto main.javaVersion=La versio de Java %minVersion% aŭ pli nova estas rekomenda por funkcii FreeCol\n(%version% detektiĝis. Uzu --no-java-check por ignori ĉi tiun kontrolon). main.memory=Vi devas asigni pli ol %memory% bitokojn da memoro al la JVM.\n Restartu FreeCol-on per: java -Xmx%minMemory%M -jar FreeCol.jar main.userDir.fail=FreeCol ne eblas trovi taŭgajn dosierujojn por konservi datumojn. Kontinuante, sed atentante problemojn. +# Fuzzy client.choicePlayer=Bonvolu elekti ludanton: metaServer.couldNotConnect=Bedaŭrinde, la metaservilo ne estas konektebla. Bonvolu reprovi poste. metaServer.communicationError=Okazis eraro dum komunikado kun la meta-servilo. Bonvolu reprovi baldaŭ. abandonEducation.action.studying=lernante abandonEducation.action.teaching=instruante +# Fuzzy abandonEducation.no=Ne, kontinuu la edukadon. +# Fuzzy abandonEducation.yes=Jes, forlasu la kolonion. armedUnitSettlement.attack=Ataki armedUnitSettlement.tribute=Postuli tributon @@ -1824,8 +1851,11 @@ boycottedGoods.text=Ĉar %goods% estis bojkotita de la Krono, vi ne povas vendi buy.moreGold=Negocii por pli malalta prezo buy.takeOffer=Akcepti la proponon buy.text=La %nation% volus vendi ties %goods% por %gold%: +# Fuzzy confirmHostile.alliance=Vi ne povas ataki aliancan nacion! Ĉu vi ja volas rompi vian aliancon kun la %nation% kaj deklari militon? +# Fuzzy confirmHostile.ceaseFire=Vi antaŭe subskribis pactraktaton kun la %nation%. Ĉu vi ja volas ataki? +# Fuzzy confirmHostile.peace=Vi estas pacema kun la %nation%. Ĉu vi ja volas deklari militon? confirmTribute.no=Eble ni ne faros tion. # Fuzzy @@ -1885,7 +1915,9 @@ defeated.text=Vi estis venkita! Ĉu vi volas: defeated.yes=Resti kaj spekti defeatedSinglePlayer.text=Vi estis venkita!\n\nĜi estas nun la tre sorĉa tempo de nokto. Kiam kirkkortaj tombejoj faŭkas kaj infero mem elspiras kontaĝon al ĉi tiu mondo, nun mi trinkus varman sangon kaj fari tiajn maldolĉan farojn kiel la tago tremus rigardi. defeatedSinglePlayer.yes=Eniri Venĝeman Modalon +# Fuzzy diplomacy.offerAccepted=La %nation% akceptis vian malavaran proponon. +# Fuzzy diplomacy.offerRejected=La %nation% malakceptis vian malavaran proponon. disbandUnit.text=Ĉu vi ja volas disigi ĉi tiun unuon? disbandUnit.yes=Disigi @@ -1929,7 +1961,9 @@ move.noAccessContact=Ni unue establu kontakton kun la %nation%, Moŝto. move.noAccessGoods=La %nation% ne komercos kun malplena %unit%. move.noAccessSettlement=La %nation% ne permesas al nia %unit% por eniri ties vilaĝon. move.noAccessSkill=Nia %unit% ne povas lerni de la indiĝenoj. +# Fuzzy move.noAccessTrade=Aŭtoritato mankas de ni komerci kun aliaj eŭropaj nacioj kiel %nation%. +# Fuzzy move.noAccessWar=Ni ne povas komerci kun la %nation% dum ni militas. move.noAccessWater=Nia %unit% devas surlandigi antaŭ enirante la kolonion. move.noAttackWater=Nia %unit% surlandiĝu antaŭ atakante. @@ -1973,6 +2007,7 @@ server.invalidPlayerNations=Ĉiuj ludantoj nepre selektu unikan nacion antaŭ la server.maximumPlayers=Bedaŭrinde, la maksimuma nombro de ludantoj estis atingita. server.missingUserName=La salutnomo mankas de la ensaluta peto. server.missingVersion=La versio de FreeCol mankas de la ensaluta peto. +# Fuzzy server.noRouteToServer=La servilo ne povas esti publikigita. Vi modifu viajn agordojn de fajroŝirmilo por permesi konektojn en la volata pordo. server.notAllReady=Ne ĉiuj ludantoj pretas komenci la ludon! server.onlyAdminCanLaunch=Bedaŭrinde, nur la servila administranto povas starti la ludon. @@ -2067,6 +2102,7 @@ colopedia.unit.offensivePower=Ataka Potenco: colopedia.unit.price=Prezo en Eŭropo colopedia.unit.productionBonus={{plural:%number%|one=Modifigo|other=Modifigoj}} de produktado: colopedia.unit.requirements=Necesoj: +# Fuzzy colopedia.unit.school=Lernejo bezonita por trejni: colopedia.unit.skill=Spertnivelo: report.labour.allColonists=Ĉiuj Kolonistoj @@ -2097,26 +2133,27 @@ report.colony.explore.header=E report.colony.exploring.description=Esplori {{plural:%amount%|one=unu kahelon|other=%amount% kahelojn}} helpus %colony%n report.colony.grow.header=+ report.colony.improve.header=Plibonigi +# Fuzzy report.colony.improving.description=%colony%: Por fari %amount% pli de %goods%
anstataŭigu %oldUnit%n kun %unit%n -report.colony.wanting.description=%colony%: Por fari %amount% pli da %goods%, aldonu %unit%n report.colony.making.description=Kion ĉi tiu kolonio faras. report.colony.making.educating.description=%colony%: %teacher% diplomiĝos {{plural:%turns%|one=dum la sekva vico|other=en %turns% vicoj}} report.colony.making.header=Faras report.colony.making.noteach.description=%colony%: %teacher% mankas studenton report.colony.name.description=La listo de kolonioj report.colony.name.header=Kolonio -report.colony.plow.description=Nombro de kolonio-kaheloj kiun plugado helpus. -report.colony.plow.header=R -report.colony.plowing.description=Plugi {{plural:%amount%|one=unu kahelon|other=%amount% kahelojn}} helpus %colony%n +# Fuzzy report.colony.production.description=%colony%: neta produktado de %goods% = %amount% +# Fuzzy report.colony.production.export.description=%colony%: neta produktado de %goods% estas %amount% (eksportado superas %export%) report.colony.production.header=Neta produktado de %goods% +# Fuzzy report.colony.production.high.description=%colony%: neta produktado de %goods% = %amount%, pleniĝos {{plural:%turns%|one=en sekva vico|other=en %turns% vicoj}} +# Fuzzy report.colony.production.low.description=%colony%: neta produktado de %goods% = %amount%, malpleniĝos {{plural:%turns%|one=en sekva vico|other=en %turns% vicoj}} +# Fuzzy report.colony.production.waste.description=%colony%: neta produktado de %goods% = %amount%, la staplo superfluos, %waste% estos malŝparita. -report.colony.road.description=Nombro de kolonio-kaheloj kiun vojkonstruado helpus. -report.colony.road.header=V -report.colony.roadBuilding.description=Konstrui {{plural:%amount%|one=vojon|other=%amount% vojojn}} helpus %colony%n +# Fuzzy +report.colony.wanting.description=%colony%: Por fari %amount% pli da %goods%, aldonu %unit%n # Fuzzy report.continentalCongress.elected=Deputita: report.continentalCongress.none=(nenio) @@ -2166,12 +2203,14 @@ report.requirements.surplus=Troaĵon de %goods% estas produktita ĉe report.trade.afterTaxes=Enspezo post imposto report.trade.beforeTaxes=Enspezo antaŭ imposto report.trade.cargoUnits=Unuoj en Kargo +# Fuzzy report.trade.hasCustomHouse=* Ĉi tiu kolonio havas doganan domon; ĉi tiuj varoj estas eksportitaj. report.trade.totalDelta=Ĉiu Produktado report.trade.totalUnits=Ĉiuj Unuoj report.trade.unitsSold=Unuoj aĉetitaj aŭ venditaj report.turn.filter=Ne montri ĉi tian mesaĝon (%type%) report.turn.ignore=Ignori ĉi tiun mesaĝon: (Kolonio: %colony%, Varoj: %goods%) +# Fuzzy report.turn.playerNation=%nation% de %player% aboutPanel.copyright=Aŭtorrajto © 2002–2015 La Teamo FreeCol aboutPanel.legalDisclaimer=FreeCol estas libera programaro: vi rajtas distribui kaj/aŭ modifi ĝin laŭ la reguloj de la GNU Ĝenerala Publika Permesilo kiel ĝi estas publikigita de la Fondaĵo de Libera Programaro, aŭ versio 2 de la Permesilo, aŭ iu posta versio. @@ -2195,6 +2234,7 @@ chooseFoundingFatherDialog.title=Kandidatigu naciofondonton colonyPanel.colonyUnits=Koloniaj unuoj colonyPanel.inPort=En havenurbo colonyPanel.outsideColony=Ekster la kolonio +# Fuzzy colonyPanel.producing=Produktas: colonyPanel.reducePopulation=Se vi malpligrandigus sub %number% la loĝantaron en %colony%, %buildable% ne plu estus konstrueble tie. colonyPanel.bonusLabel=Bonuso: %number%%extra% @@ -2205,7 +2245,9 @@ colonyPanel.notBestTile=%unit% ne povis produkti pliajn %goods%n en %tile%. confirmDeclarationDialog.areYouSure.no=Eble baldaŭ confirmDeclarationDialog.areYouSure.text=Ni forlasu la maljustan tiranon de %monarch% kaj deklaru la sendependecon de niaj kolonioj for la krono! confirmDeclarationDialog.areYouSure.yes=Libereco aŭ Morto! +# Fuzzy confirmDeclarationDialog.defaultCountry=Unigitaj Ŝtatoj de %nation% +# Fuzzy confirmDeclarationDialog.defaultNation=Libera %nation% confirmDeclarationDialog.enterCountry=Ekde nun, nia lando estas konata kiel confirmDeclarationDialog.enterNation=kaj ĉiu civitano de nia glora lando fiere estos konata kiel @@ -2256,8 +2298,10 @@ negotiationDialog.add=Aldoni negotiationDialog.cancel=Nuligi negotiationDialog.clear=Nuligi negotiationDialog.contact.tutorial=Vi renkontas aliajn eŭropanojn. Ili rivalas vin por teritorio kaj riĉaĵoj, kaj eble militos kontraŭ vi. Sed post Jan de Witt aligas la Kontinentan Kongreson, vi povas komerci kun ili. +# Fuzzy negotiationDialog.demand=La %nation% postulas de la %otherNation% negotiationDialog.exchange=kompense por +# Fuzzy negotiationDialog.offer=La %nation% proponas al la %otherNation% negotiationDialog.send=Sendi negotiationDialog.title.contact=Renkontante aliajn eŭropanojn. @@ -2280,9 +2324,8 @@ findSettlementPanel.displayAll=Trovi ĉiujn loĝejoj findSettlementPanel.displayOnlyEuropean=Trovi nur eŭropajn loĝejojn findSettlementPanel.displayOnlyNatives=Trovi nur indiĝenajn loĝejojn findSettlementPanel.name=Trovi Loĝejojn +# Fuzzy firstContactDialog.meeting.natives=Renkontante la indiĝenulojn... -firstContactDialog.meeting.AZTEC=La Azteka nacio... -firstContactDialog.meeting.INCA=La Inkaa imperio... abandonColony.no=Nuligi abandonColony.text=Ĉu ni ja forlasos nian kolonion? abandonColony.yes=Dislasi diff --git a/data/strings/FreeColMessages_es_ES.properties b/data/strings/FreeColMessages_es_ES.properties index a7ee8b13d..20ef728c3 100644 --- a/data/strings/FreeColMessages_es_ES.properties +++ b/data/strings/FreeColMessages_es_ES.properties @@ -125,6 +125,7 @@ cashInTreasureTrain=Dinero en carruaje de tesoro clearOrders=Eliminar órdenes colonists=Colonos colopedia=Colopedia +countryName={{tag:country|%nation%}} difficulty=Dificultad docks=Muelles dumpCargo=Verter cargamento @@ -227,8 +228,9 @@ cli.no-memory-check=saltar la comprobación de la memoria cli.no-sound=ejecutar FreeCol sin sonido cli.private=iniciar un servidor privado (no publicado en el metaserver) cli.seed=proporcionar una SEMILLA para el generador de números pseudoaleatorio -cli.server-name=especifica un NOMBRE para el servidor +# Fuzzy cli.server=inicia un único servidor para el puerto especificado +cli.server-name=especifica un NOMBRE para el servidor cli.splash=muestra una imagen de pantalla del ARCHIVO mientras carga el juego cli.tc=carga la conversión total con el NOMBRE dado cli.timeout=número de segundos que el servidor esperará una respuesta a una pregunta @@ -293,7 +295,6 @@ colopediaAction.goods.name=Bienes colopediaAction.nations.name=Naciones colopediaAction.nationTypes.name=Ventajas Nacionales colopediaAction.resources.name=Recursos Bonificados -colopediaAction.skills.name=Habilidades colopediaAction.terrain.name=Tipos de Terreno colopediaAction.units.name=Unidades colopediaAction.name=%object% (Colopedia) @@ -535,7 +536,7 @@ model.option.turnsToSail.shortDescription=El número de turnos que se necesita p model.option.settlementLimitModifier.name=Modificador del límite del asentamiento model.option.settlementLimitModifier.shortDescription=Cantidad añadida a un límite de asentamiento, tales como el número de vagones construibles. model.option.fogOfWar.name=Niebla de Guerra -model.option.fogOfWar.shortDescription=¿Deben estar ocultas las unidades enemigas que están fuera de nuestra linea de visión? +model.option.fogOfWar.shortDescription=¿Deben estar ocultas las unidades enemigas que están fuera de nuestra línea de visión? model.option.explorationPoints.name=Puntos de exploración model.option.explorationPoints.shortDescription=¿Se deben otorgar puntos de exploración por cada descubrimiento? model.option.amphibiousMoves.name=Movimientos anfibios @@ -957,7 +958,7 @@ model.option.colonyReport.shortDescription=Un resumen de la actividad en cada co clientOptions.messages.colonyReport.classic.name=Clásico clientOptions.messages.colonyReport.classic.shortDescription=Un resumen de colonia informativo y con muchas imágenes. clientOptions.messages.colonyReport.compact.name=Compacto -clientOptions.messages.colonyReport.compact.shortDescription=Un resumen de colonia compacto que intenta mostrar lo máximo posible en sólo una linea por colonia. +clientOptions.messages.colonyReport.compact.shortDescription=Un resumen de colonia compacto que intenta mostrar lo máximo posible en sólo una línea por colonia. model.option.labourReport.name=Informe de Trabajo model.option.labourReport.shortDescription=Un resumen de la actividad de cada unidad clientOptions.messages.labourReport.classic.name=Clásico @@ -1511,6 +1512,7 @@ model.improvement.road.description=Camino model.improvement.road.name=Camino model.improvement.road.occupationString=R model.limit.independence.coastalColonies.name=Límite de colonia costera +# Fuzzy model.limit.independence.coastalColonies.description=Necesitas al menos %limit% colonias costeras para declarar la independencia. model.limit.independence.rebels.name=Límite de rebeldes model.limit.independence.rebels.description=Al menos %limit%% de tus colonos debe apoyar la independencia. @@ -1846,6 +1848,7 @@ model.colony.badGovernment=El gobierno de %colony% es ineficiente. Hay penalizac model.colony.goodGovernment=¡Ha mejorado la eficiencia gubernamental! El sentimiento rebelde en %colony% ahora es igual o superior al %number% por ciento. model.colony.governmentImproved1=El gobierno de %colony% ha mejorado, pero todavía es ineficiente. Todavía hay penalizaciones a la producción. model.colony.governmentImproved2=El gobierno de %colony% ha mejorado. Ya no hay penalizaciones a la producción. +# Fuzzy model.colony.insufficientProduction=%outputAmount% más de %outputType% se podrían producir en %colony%, si tuviéramos %inputAmount% más de %inputType%. model.colony.lostGoodGovernment=¡La eficiencia gubernamental ha disminuido! El sentimiento rebelde en %colony% ya no es igual o superior a %number% por ciento. La colonia ya no consigue bonificaciones de producción. model.colony.lostVeryGoodGovernment=La eficiencia gubernamental ha disminuido! El sentimiento rebelde en %colony% ya no es igual o superior al %number% por ciento. Algunas bonificaciones de producción se han perdido. @@ -1860,12 +1863,16 @@ model.colony.veryBadGovernment=El gobierno de %colony% es muy ineficiente. Hay e model.colony.veryGoodGovernment=¡Ha mejorado la eficiencia del Gobierno! El sentimiento rebelde en %colony% ahora es igual o superior a %number% por ciento. model.colonyTile.claim=(reivindicar %direction%) model.diplomaticTrade.receive.contact=Saludos fraternos de la gloriosa nación %nation%. +# Fuzzy model.diplomaticTrade.receive.diplomatic=Negociemos con la %nation%. model.diplomaticTrade.receive.trade=Consideremos la oferta de comercio de %nation%. +# Fuzzy model.diplomaticTrade.receive.tribute=¡Los %nation% están exigiendo tributo de nosotros! model.diplomaticTrade.send.contact=Nos hemos encontrado con los miembros de la nación %nation% +# Fuzzy model.diplomaticTrade.send.diplomatic=Consideremos nuestra situación diplomática con el %nation%. -model.diplomaticTrade.send.trade=Vamos a proponer un negocio con el %nation% en %settlement%. +model.diplomaticTrade.send.trade=Vamos a proponer un negocio con {{tag:country|%nation%}} en %settlement%. +# Fuzzy model.diplomaticTrade.send.tribute=Exigimos tributo de %nation% en %settlement%. model.direction.N.name=norte model.direction.NE.name=noreste @@ -1876,24 +1883,33 @@ model.direction.SW.name=suroeste model.direction.W.name=oeste model.direction.NW.name=noroeste model.historyEventType.abandonColony.description=Abandona la colonia de %colony%. +# Fuzzy model.historyEventType.ceaseFire.description=Alto el fuego con %nation%. +# Fuzzy model.historyEventType.cityOfGold.description=La %nation% descubre %city%, una de la siete ciudades de oro, y un tesoro de %treasure% oro. +# Fuzzy model.historyEventType.colonyConquered.description=Su colonia %colony% ha sido conquistada por el gorbenante %nation%. +# Fuzzy model.historyEventType.colonyDestroyed.description=Su colonia %colony% ha sido destruida por los %nation%. model.historyEventType.conquerColony.description=Conquistaste la colonia %nation% de %colony%. model.historyEventType.declareIndependence.description=Declaras independencia de la Corona. +# Fuzzy model.historyEventType.declareWar.description=Guerra declarada con %nation%. +# Fuzzy model.historyEventType.destroyNation.description=Los %nation% destruyen a los %nativeNation% . model.historyEventType.discoverNewWorld.description=Descubres el Nuevo Mundo. -model.historyEventType.discoverRegion.description=La %nation% descubre %region%. +model.historyEventType.discoverRegion.description={{tag:country|%nation%}} descubre %region%. +# Fuzzy model.historyEventType.formAlliance.description=Alianza negociada con %nation%. model.historyEventType.foundColony.description=Establece la colonia de %colony%. model.historyEventType.foundingFather.description=%father% se une al Congreso Continental. model.historyEventType.independence.description=Consigue la independencia de la Corona. +# Fuzzy model.historyEventType.makePeace.description=Acuerdo de paz con %nation%. -model.historyEventType.meetNation.description=Encuentra la %nation%. +model.historyEventType.meetNation.description=Encuentras a la nación %nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=La %nation% no está más presente en el nuevo mundo. -model.historyEventType.spanishSuccession.description=La %loserNation% cede todas sus colonias en el Nuevo Mundo a la %nation%. +model.historyEventType.spanishSuccession.description={{tag:country|%loserNation%}} cede todas sus colonias en el Nuevo Mundo a {{tag:country|%nation%}}. model.indianSettlement.mostHatedNone=Ninguno model.indianSettlement.mostHatedUnknown=Desconocido model.indianSettlement.nameUnknown=Desconocido @@ -1946,9 +1962,12 @@ model.messageType.warehouseCapacity.name=Capacidad del almacén model.messageType.warning.name=Avisos model.monarch.action.addToRef.text=La Corona ha añadido %number% {{plural:%number%|%unit%}} a la Real Fuerza Expedicionaria. Los líderes coloniales expresan su preocupación. model.monarch.action.addToRef.no=Hecho +# Fuzzy model.monarch.action.declarePeace.text=Hemos acordado amablemente un tratado de paz con los %nation%. model.monarch.action.declarePeace.no=Hecho +# Fuzzy model.monarch.action.declareWar.text=¡La insolencia de %nation% nos obliga a declararles la guerra! +# Fuzzy model.monarch.action.declareWarSupported.text=La insolencia de la %nation% ¡Nos obliga a declararles la guerra! Para agilizar este asunto, nuestras tropas leales (%force%) esperan sus órdenes y una nueva suma de %gold% ha sido añadido a su tesoro. model.monarch.action.declareWar.no=Hecho model.monarch.action.displeasure.text=Te atreves a aceptar Nuestros generosos términos y, sin embargo, evadir el pago? Tal duplicidad cosechará la amarga recompensa de Nuestro desagrado. @@ -2007,7 +2026,7 @@ model.player.colonialIndependence=Solamente los jugadores coloniales pueden decl model.player.forces=Ejército %nation% model.player.independentMarket=Europa model.player.startGame=Después de meses en el mar, ha llegado finalmente a la costa de un continente desconocido. Navegue {{tag:%direction%|west=hacia el oeste|east=hacia el este|default=de cara al viento}} para descubrir el Nuevo Mundo y reclámelo para la Corona. -model.player.waitingFor=Esperando a: %nation% +model.player.waitingFor=Esperando a: {{tag:country|%nation%}} model.regionType.coast.name=Costa model.regionType.coast.unknown=Región Costera Desconocida model.regionType.desert.name=Desierto @@ -2046,6 +2065,7 @@ model.tradeItem.gold.name=Oro model.tradeItem.gold.description=La suma de %amount% de oro model.tradeItem.goods.name=Mercancías model.tradeItem.incite.name=Declarar la guerra contra +# Fuzzy model.tradeItem.incite.description=la guerra en contra de %nation% model.tradeItem.stance.name=Postura model.tradeItem.unit.name=Unidad @@ -2068,10 +2088,9 @@ model.unit.underRepair=Reparación(%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S -model.unit.unitState.skipped=W +model.unit.unitState.skipped=X model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G model.noAddReason.alreadyPresent.description=Ya presente en este lugar. @@ -2111,6 +2130,7 @@ model.colony.warehouseSoonFull=El almacén de %colony% excederá su capacidad de model.colony.warehouseWaste=El almacén de %colony% ha excedido su capacidad de %goods%. %waste% unidades se han perdido. model.colony.workersEvicted=En %colony%, tus colonos no pueden trabajar en %location%, debido a la presencia de %enemyUnit%. model.colonyTile.resourceExhausted=Se ha agotado el recurso %resource% en %colony% +# Fuzzy model.game.spanishSuccession=Su excelencia, la guerra de sucesión española ha terminado en Europa. En el tratado de Utrecht, la %loserNation% fue forzada a ceder todas las colonias en el Nuevo Mundo a la %nation%! model.indianSettlement.mission.denounced=Tu misionero en %settlement% ha sido denunciado y ejecutado! model.indianSettlement.mission.destroyed=Tu misionero en %settlement% ha muerto en la destrucción del asentamiento. @@ -2120,7 +2140,7 @@ model.player.autoRecruit=Disturbios religiosos en %europe% provocan que %unit model.player.colonyGoodsParty.harbour=¡Sus colonos de %colony% han arrojado %amount% unidades de %goods% al mar en protesta por este impuesto injusto de la Corona! model.player.colonyGoodsParty.horses=¡Sus colonos de %colony% han liberado %amount% caballos en protesta por este impuesto injusto de la Corona! model.player.colonyGoodsParty.landLocked=¡Sus colonos de %colony% han quemado la cantidad de %amount% de %goods% en el mercado en protesta de este impuesto injusto de la Corona! -model.player.dead.european=Su excelencia, la %nation% ha declarado una retirada incondicional de los asuntos del Nuevo Mundo! +model.player.dead.european=Su excelencia, ¡{{tag:country|%nation%}} ha declarado una retirada incondicional de los asuntos del Nuevo Mundo! model.player.dead.native=Su Excelencia, la %nation% ha sido destruída. model.player.disaster.bankruptcy.start=No has podido pagar el mantenimiento de todos los edificios. Se aplicarán sanciones de producción severas. model.player.disaster.bankruptcy.stop=Nuevamente, eres capaz de pagar por el mantenimiento de todos los edificios. Se han levantado las sanciones de la producción. @@ -2133,12 +2153,16 @@ model.player.ignoredTax=La Corona ha elevado la tasa de impuesto a %amount%% com model.player.interventionForceArrives=¡Llega la fuerza de intervención prometida! model.player.soLDecrease=¡Los Hijos de la Libertad en sus colonias han disminuido al %newSoL% por ciento! model.player.soLIncrease=¡Los Hijos de la Libertad en sus colonias han aumentado al %newSoL% por ciento! +# Fuzzy model.player.stance.alliance.declared=Su Excelencia, ¡El gobernante %nation% es nuestro aliado! model.player.stance.alliance.others=Su Excelencia, ¡los gobernantes %attacker% y %defender% son aliados!. +# Fuzzy model.player.stance.ceaseFire.declared=Su Excelencia, ¡el gobernante %nation% ha accedido a un alto el fuego con nosotros! model.player.stance.ceaseFire.others=Su Excelencia, el %attacker% ha accedido a un alto el fuego con el %defender%. +# Fuzzy model.player.stance.peace.declared=Su Excelencia, ¡estamos en paz con el gobernante %nation%! model.player.stance.peace.others=Su Excelencia, los gobernantes %attacker% y %defender% están en paz. +# Fuzzy model.player.stance.war.declared=Malas noticias, Su Excelencia, ¡el gobernador %nation% nos ha declarado la guerra! model.player.stance.war.others=Su Excelencia, el gobernador %attacker% le ha declarado la guerra al %defender%. combat.automaticDefence=¡Su %unit% en %colony% ha tomado armas para defender la colonia! @@ -2154,6 +2178,7 @@ combat.enemyShipEvaded=Un %enemyUnit% %enemyNation% ha evadido el ataque de %uni combat.enemyShipSunk=¡Un %unit% ha hundido un %enemyUnit% %enemyNation%! combat.equipmentCaptured=¡Precaución, los guerreros %nation% han conseguido %equipment%! combat.goodsStolen=¡Un %enemyUnit% %enemyNation% roba %amount% unidades de %goods% en %colony%! +# Fuzzy combat.indianPlunder=Un %enemyUnit% %enemyNation% saquea %amount% de %colony%. combat.indianRaid=Nuestros espías informan que %nation% ha invadido la colonia %colonyNation% de %colony%. combat.indianSurprise=%nation% hace un ataque sorpresa en %colony%, asustando a nuestros colonos. El jefe de %nation% niega su participación. @@ -2208,7 +2233,7 @@ main.javaVersion=La versión de Java %minVersion% o mejor es recomendada para po main.memory=Necesitas asignar más de %memory% bytes de memoria para JVM.\n Reinicia FreeCol con: java -Xmx%minMemory%M -jar FreeCol.jar main.userDir.fail=FreeCol no puede encontrar directorios adecuados para guardar los datos de usuario. Procediendo, pero se esperan problemas. client.baseData=No se encontró el directorio de la base de datos %dir%.\n No se encontraron los archivos de datos de FreeCol.\n Por favor, asegúrate de que existen.\n Si FreeCol está buscando en el directorio equivocado,\n ejecuta el juego con el parámentro de línea de comando:\n --freecol-data -client.choicePlayer=Elija un jugador: +client.choicePlayer=Elige una nación: client.classic=Error al cargar la asignación de recursos del conjunto de reglas 'clásico'. client.ending=La partida está terminándose. client.headlessDebug=El modo sin cabeza requiere una ejecución en depuración. @@ -2219,9 +2244,10 @@ metaServer.couldNotConnect=No se pudo conectar al meta-server. Por favor, pruebe metaServer.communicationError=Hubo un error al comunicarse con el meta-server. Por favor, pruebe otra vez. abandonEducation.action.studying=estudiando abandonEducation.action.teaching=enseñando +# Fuzzy abandonEducation.no=No, continuar la educación abandonEducation.text=Si tu %unit% abandona %colony% abandonará %action% en el %building%, ¿estás seguro que desea abandonar? -abandonEducation.yes=Sí, salir de la colonia +abandonEducation.yes=Abandonar la educación abandonTeaching.text=Si tu %unit% deja el %building%, dejará de enseñanzar, ¿estás seguro que debe irse? armedUnitSettlement.attack=Atacar armedUnitSettlement.tribute=Exigir tributo @@ -2232,10 +2258,14 @@ buy.takeOffer=Aceptar la oferta buy.text=Los %nation% querríamos vender nuestros %goods% por %gold%: clearTradeRoute.text=Tu %unit% esta asignada para comerciar la ruta %route%. Configurando su destino lo cambiara por la ruta de comercio.¿Estás seguro de querer hacerlo? client.fullScreen=El modo en pantalla completa no es compatible con este GraphicsDevice.\nVolver al modo de ventana. +# Fuzzy confirmHostile.alliance=No puedes atacar una nación aliada! Realmente deseas romper tu alianza con el %nation% y declarar la guerra? +# Fuzzy confirmHostile.ceaseFire=Habéis firmado un alto el fuego con el gobernador %nation%. ¿Realmente queréis atacar? +# Fuzzy confirmHostile.peace=Estás en paz con el %nation%. Realmente deseas declarar la guerra? confirmHostile.yes=¡Si, evitemos los perros de la guerra! +# Fuzzy confirmTribute.broke=Nuestros espías informan que los %nation% están totalmente arruinados. No perdamos nuestro tiempo exigiendo tributos. confirmTribute.european=Los %nation% %danger%, y %finance%. ¿Cuánto tributo debemos de exigir de ellos? confirmTribute.happy=Los %nation% en %settlement% son buenos amigos, es una lástima dañar nuestra amistad. @@ -2255,6 +2285,7 @@ indianLand.cancel=Abandonar las tierras indianLand.pay=Ofrecer %amount% de oro por las tierras indianLand.take=Tomar lo que es nuestro por derecho indianLand.text=Estas tierras son de %player%. Querría: +# Fuzzy indianLand.unknown=Gentes desconocidas viven en estas tierras. Quieres: info.autodetectLanguageSelected=Ha elegido autodetectar el idioma. Esto se realizará la próxima vez que inicie el juego. info.enterSomeText=Por favor, introduzca texto. @@ -2300,7 +2331,9 @@ defeated.text=¡Ha sido derrotado!. Quiere: defeated.yes=Permanecer y Mirar defeatedSinglePlayer.text=¡Has sido derrotado!\n\nAhora es el período oscuro de la noche, cuando los campanarios bostezan y el mismo infierno inunda este mundo., ¡Ahora podrías beber sangre caliente! y realizar actos tan abominables que el mismo día temblaría al verlos. defeatedSinglePlayer.yes=Entrar en modo de venganza +# Fuzzy diplomacy.offerAccepted=Los %nation% han aceptado su generosa oferta. +# Fuzzy diplomacy.offerRejected=Los %nation% han rechazado su generosa oferta. disbandUnit.text=¿Está seguro de querer eliminar esta unidad? disbandUnit.yes=Disolver @@ -2346,7 +2379,9 @@ move.noAccessGoods=La %nation% no comercia con una %unit% vacía . move.noAccessMissionBan=Los %nation% rechazan tener cualquier contacto con tus misioneros. move.noAccessSettlement=La %nation% no permite a nuestra %unit% entrar en su asentamiento. move.noAccessSkill=Nuestra %unit% no puede aprender de los nativos. +# Fuzzy move.noAccessTrade=No tenemos autoridad para comerciar con otras naciones europeas tales como la %nation%. +# Fuzzy move.noAccessWar=No podemos comerciar con la %nation% mientras haya guerra. move.noAccessWater=Nuestra %unit% debe desembarcar primero antes de entrar al asentamiento. move.noAttackWater=Nuestra %unit% debe aterrizar antes de atacar. @@ -2399,6 +2434,7 @@ server.invalidPlayerNations=Todos los jugadores deben escoger una nación distin server.maximumPlayers=Perdone, pero se ha alcanzado el número máximo de jugadores. server.missingUserName=Falta el nombre de usuario en la solicitud de inicio de sesión. server.missingVersion=Falta la versión de FreeCol en la solicitud de inicio de sesión. +# Fuzzy server.noRouteToServer=El servidor no puede ser hecho público. Deberías modificar la configuración del cortafuegos para permitir conexiones en el puerto que has especificado. server.noSuchPlayer=El juego no contiene un jugador llamado: %player% server.notAllReady=¡No todos los jugadores están preparados para empezar la partida! @@ -2408,6 +2444,7 @@ server.timeOut=Se excedió el tiempo al conectarse al servidor. server.userNameInUse=El nombre de usuario especificado ya está en uso. server.userNameNotPresent=El nombre de usuario especificado no está en esta partida. server.wrongFreeColVersion=No coinciden las versiones cliente y servidor de FreeCol. +# Fuzzy buildColony.others=La %nation% han fundado la nueva colonia de %colony% en %region%. cashInTreasureTrain.colonial=Un tesoro de %amount% doblones de oro ha llegado a Europa. %cashInAmount% doblones de oro más están disponibles. cashInTreasureTrain.independent=Un tesoro de %amount% ha sido agregado al tesoro nacional. @@ -2515,6 +2552,7 @@ colopedia.unit.offensivePower=Poder Ofensivo: colopedia.unit.price=Precio en Europa: colopedia.unit.productionBonus={{plural:%number%|one=modificador|other=modificadores}} de producción: colopedia.unit.requirements=Requerimientos: +# Fuzzy colopedia.unit.school=Centro requerido para enseñar: colopedia.unit.skill=Habilidad: report.labour.allColonists=Todos los Colonos @@ -2549,8 +2587,8 @@ report.colony.grow.header=+ report.colony.growing.description=%colony% puede aumentar {{plural:%amount%|one=en una unidad|other=en %amount% unidades}} sin perjudicar la producción report.colony.improve.description=Unidades que podrían mejorar la producción. report.colony.improve.header=Mejorar +# Fuzzy report.colony.improving.description=%colony%: Para producir %amount% más %goods%, substituye %oldUnit% por %unit% -report.colony.wanting.description=%colony%: Para producir %amount% más %goods%, añade %unit% report.colony.making.blocking.description=%colony%: %amount% %goods% necesarios para %buildable% {{plural:%turns%|one=en el siguiente turno|other=en %turns% turnos}} report.colony.making.constructing.description=%colony%: %buildable% se completa {{plural:%turns%|one=en el siguiente turno|other=en %turns% turnos}} report.colony.making.description=Lo que está haciendo esta colonia @@ -2560,20 +2598,24 @@ report.colony.making.noconstruction.description=%colony%: No hay construcciones report.colony.making.noteach.description=%colony%: %teacher% no tiene estudiantes report.colony.name.description=La lista de colonias report.colony.name.header=Colonia -report.colony.plow.description=Número de cuadrantes de la colonia que se beneficiarían del arado -report.colony.plow.header=P -report.colony.plowing.description=%colony% se beneficiaría de arar {{plural:%amount%|one=un cuadrante|other=%amount% cuadrantes}} +# Fuzzy report.colony.production.description=%colony%: produción neta de %goods% = %amount% +# Fuzzy report.colony.production.export.description=%colony%: la produción neta de %goods% es de %amount% (exportación superior a %export%) report.colony.production.header=Produción neta de %goods% +# Fuzzy report.colony.production.high.description=%colony%: produción neta de %goods% = %amount%; completa {{plural:%turns%|one=en el siguiente turno|other=en %turns% turnos}} +# Fuzzy report.colony.production.low.description=%colony%: produción neta de %goods% = %amount%; desaparecerá {{plural:%turns%|one=en el siguiente turno|other=en %turns% turnos}} +# Fuzzy report.colony.production.waste.description=%colony%: produción neta de %goods% = %amount%; el almacén se desbordará, se perderán %waste% -report.colony.road.description=Número de cuadrantes de la colonia que se beneficiarían de construir carreteras -report.colony.road.header=R -report.colony.roadBuilding.description=%colony% se beneficiaría de construir {{plural:%amount%|one=una carretera|other=%amount% carreteras}} +report.colony.tile.clearForest.header=C +report.colony.tile.plow.header=P +report.colony.tile.road.header=R report.colony.shrinking.description=%colony% debe disminuir {{plural:%amount%|one=en una unidad|other=en %amount% unidades}} para mejorar la producción report.colony.starving.description=%colony%: hambre {{plural:%turns%|one=en el siguiente turno|other=en %turns% turnos}} +# Fuzzy +report.colony.wanting.description=%colony%: Para producir %amount% más %goods%, añade %unit% report.continentalCongress.available=Disponible report.continentalCongress.elected=Elegido: %turn% report.continentalCongress.none=(ninguno) @@ -2617,29 +2659,29 @@ report.production.selectGoods=Seleccionar bienes report.production.update=Actualizar report.requirements.badAssignment=La colonia %colony% tiene un %expert% trabajando como %expertWork%, mientras un %nonExpert% está trabajando como %nonExpertWork%. La producción sería mayor si los colonos intercambiaran funciones. report.requirements.canTrainExperts={{plural:2|%unit%}} pueden ser entrenadas en -report.requirements.clearTile=%type% hacia la %direction% de %colony% se beneficiaría de la limpieza. +# Fuzzy report.requirements.exploreTile=%type% hacia la %direction% de %colony% se beneficiaría de la exploración. report.requirements.met=Posee todo lo necesario. report.requirements.missingGoods=En %colony% se producen %goods%, pero necesita más %input%. report.requirements.misusedExperts=Hay {{plural:2|%unit%}} que no están trabajando como %work% en report.requirements.noExpert=En %colony% se producen %goods%, pero no tiene %unit%. -report.requirements.plowCenter=%colony% se beneficiaría de arar su cuadrante. -report.requirements.plowTile=%type% hacia la %direction% de %colony% se beneficiaría de arar. -report.requirements.roadTile=%type% hacia la %direction% de %colony% se beneficiaría de construir carreteras. report.requirements.severalExperts=Varias {{plural:2|%unit%}} están presentes en report.requirements.surplus=Un excedente de %goods%: está siendo producido en report.trade.afterTaxes=Beneficio después de impuestos report.trade.beforeTaxes=Beneficio antes de impuestos report.trade.cargoUnits=Unidades en Transporte +# Fuzzy report.trade.hasCustomHouse=* Esta colonia tiene una aduana; estos bienes se exportan. report.trade.totalDelta=Producción Total report.trade.totalUnits=Unidades Totales report.trade.unitsSold=Unidades compradas o vendidas report.turn.filter=No mostrar este tipo de mensaje: (%type%) report.turn.ignore=Ignorar este mensaje (Colonia: %colony%, Bienes: %goods%) +# Fuzzy report.turn.playerNation=%nation% de %player% aboutPanel.copyright=Derechos de autor © 2002-2015 del equipo de FreeCol aboutPanel.legalDisclaimer=Freecol es software libre: Puede redistribuirlo y/o modificarlo bajo los términos de LPG Licencia Pública General tal y como se ha publicado por la Fundación del Software Libre, bien por la versión 2 de la Licencia, o cualquier versión posterior. +aboutPanel.manual=Descarga del manual de FreeCol aboutPanel.officialSite=Sitio oficial: aboutPanel.sfProject=Proyecto SourceForge: aboutPanel.version=Versión: @@ -2662,7 +2704,7 @@ colonyPanel.buildQueue=Edificios en espera colonyPanel.colonyUnits=Unidades de la colonia colonyPanel.inPort=En el puerto colonyPanel.outsideColony=Fuera de la colonia -colonyPanel.producing=Produciendo: +colonyPanel.producing=produciendo: colonyPanel.reducePopulation=Si reduces la población debajo de %number%, %colony% no será más capaz de contruir %buildable%. colonyPanel.unitChange=En %colony%, un %oldType% se ha convertido en un %newType%. colonyPanel.warehouse=Almacén @@ -2675,8 +2717,8 @@ confirmDeclarationDialog.areYouSure.no=Quizá más tarde confirmDeclarationDialog.areYouSure.text=Renunciemos a la injusta tiranía de %monarch% y declaremos la independencia de nuestras colonias de la corona! confirmDeclarationDialog.areYouSure.yes=¡Libertad o Muerte! confirmDeclarationDialog.createFlag=y nuestros enemigos temblarán a la vista de nuestro estandarte desafiante. -confirmDeclarationDialog.defaultCountry=Estados Unidos de %nation% -confirmDeclarationDialog.defaultNation=%nation% libre +confirmDeclarationDialog.defaultCountry=Estados Unidos de {{tag:country|%nation%}} +confirmDeclarationDialog.defaultNation=Liberar a {{tag:country|%nation%}} confirmDeclarationDialog.enterCountry=De ahora en adelante, nuestro país deberá ser conocido como confirmDeclarationDialog.enterNation=y todo ciudadano de nuestra gloriosa nación deberá estar orgulloso de ser conocido como flag.background.PALES=Límites @@ -2726,8 +2768,9 @@ negotiationDialog.add=Añadir negotiationDialog.cancel=Cancelar negotiationDialog.clear=Vaciar negotiationDialog.contact.tutorial=Encuentra colegas Europeos.Competirá con usted por tierras y riquezas, y pueden posiblemente declararle la guerra. Pero después de que Jan de Witt se haya unido al Congreso Continental, puede comerciar con ellos. -negotiationDialog.demand=Los %nation% exigen de los %otherNation% +negotiationDialog.demand={{tag:country|%nation%}} exigen de {{tag:country|%otherNation%}} negotiationDialog.exchange=a cambio de +# Fuzzy negotiationDialog.offer=Los %nation% ofrecen los %otherNation% negotiationDialog.send=Enviar negotiationDialog.title.contact=Encuentro de compañeros europeos @@ -2751,10 +2794,10 @@ findSettlementPanel.displayOnlyEuropean=Encontrar solo asentamientos europeos findSettlementPanel.displayOnlyNatives=Encontrar solo asentamientos nativos findSettlementPanel.name=Encontrar asentamiento findSettlementPanel.settlement=%name%%capital% (%nation%) -firstContactDialog.meeting.natives=Conociendo a los nativos... +firstContactDialog.meeting.natives=Conociendo a los nativos firstContactDialog.meeting.natives.tutorial=Conocerás a los nativos. Envía a tus exploradores a sus asentamientos para aprender más sobre ellos y a tus sirvientes contratados y colonos libres con el fin de aprender de ellos. Envía tus barcos y trenes de carro a sus asentamientos si deseas comerciar con ellos. -firstContactDialog.meeting.AZTEC=La Nación Azteca... -firstContactDialog.meeting.INCA=El Imperio Inca... +firstContactDialog.meeting.aztec=La nación Azteca +firstContactDialog.meeting.inca=El imperio Inca firstContactDialog.welcomeOffer.text=La %nation% te da la bienvenida.Somos una gloriosa nación de %camps% %settlementType%. Para celebrar nuestra amistad, Nosotros generosamente te ofrecemos la tierra que ahora ocupas como un regalo. Aceptarás nuestro tratado y estarás en paz con nosotros como hermanos? firstContactDialog.welcomeSimple.text=La %nation% te da la bienvenida. Somos una gloriosa nación de %camps% %settlementType%. Aceptarás nuestro tratado y vivirás con nosotros en paz como hermanos? abandonColony.no=Cancelar @@ -2797,6 +2840,7 @@ freecol.map.Australia=Australia freecol.map.Caribbean_basin=Cuenca del Caribe mapSizeDialog.mapSize=Seleccionar tamaño de mapa modifierFormat.unknown=??? +modifierFormat.scopeMethod.isIndian.name=nativos monarchDialog.default=Un mensaje de la Corona newPanel.editDifficulty=Editar la dificultad newPanel.getServerList=Obtener lista de servidores diff --git a/data/strings/FreeColMessages_fi.properties b/data/strings/FreeColMessages_fi.properties index dd598eb24..0dee51a5f 100644 --- a/data/strings/FreeColMessages_fi.properties +++ b/data/strings/FreeColMessages_fi.properties @@ -8,6 +8,7 @@ # Author: Kulmalukko # Author: Lliehu # Author: Macofe +# Author: Mashoi7 # Author: McSalama # Author: Midorime # Author: MrTapsa @@ -45,6 +46,7 @@ all=Kaikki and=ja browse=Selaa... cancel=Peruuta +client=Asiakasohjelma close=Sulje color=Väri connect=Yhdistä @@ -61,7 +63,6 @@ load=Lataa many=monta medium=keskiverto more=lisää... -# Fuzzy music=Musiikki name=Nimi no=Ei @@ -77,12 +78,10 @@ remove=Tyhjennä rename=Nimeä uudelleen reset=Palauta save=Tallenna -# Fuzzy -server=Palvelinnimi +server=Palvelin skip=Ohita small=pieni statistics=Tilastot -# Fuzzy test=Kokeile true=kyllä unload=Pura @@ -110,7 +109,6 @@ inPort=Satamassa mission=Tehtävä modifiers=Mukautukset nation=Kansallisuus -# Fuzzy newWorld=Uusi maailma notApplicable=– payArrears=Maksa alueista @@ -174,8 +172,9 @@ cli.no-memory-check=ohita muistin tarkastus cli.no-sound=suorita FreeCol äänettömänä cli.private=käynnistä yksityinen palvelin (ei julkaista metapalvelimelle) cli.seed=anna SIEMEN pseudosatunnaislukugeneraattorille -cli.server-name=määritä palvelimelle oma NIMI +# Fuzzy cli.server=käynnistä itsenäinen palvelin määrättyyn porttiin +cli.server-name=määritä palvelimelle oma NIMI cli.splash=näytä pelin latauksen aikana aloitusruutukuvana TIEDOSTO cli.version=näytä versionumero ja lopeta # Fuzzy @@ -225,7 +224,6 @@ colopediaAction.goods.name=Tavarat colopediaAction.nations.name=Kansat colopediaAction.nationTypes.name=Kansalliset edut colopediaAction.resources.name=Luonnonvarat -colopediaAction.skills.name=Taidot colopediaAction.terrain.name=Maaston tyypit colopediaAction.units.name=Yksiköt colopediaAction.name=%object% (Colopedia) @@ -1248,6 +1246,7 @@ model.building.locationLabel=rakennuksessa %location% model.colony.badGovernment=%colony%: Hallitus on tehoton. Tuotantomäärät laskevat. model.colony.governmentImproved1=%colony%: Hallituksen tehokkuus on parantunut, mutta se on silti tehoton. Tuotantomäärät ovat alhaisia. model.colony.governmentImproved2=%colony%: Hallituksen tehokkuus on parantunut. Tuotantomäärät ovat palanneet normaalille tasolle. +# Fuzzy model.colony.insufficientProduction=Siirtokunnassa %colony% voitaisiin tuottaa %outputAmount% %outputType% lisää, jos meillä olisi %inputAmount% %inputType% enemmän ylimääräistä. model.colony.minimumColonySize=%object% estää siirtokunnan väkimäärän vähentämisen nykyistä vähemmäksi. model.colony.unbuildable=%colony% ei voi rakentaa kohdetta %object% tällä hetkellä. %object% poistettiin rakennusjonosta. @@ -1261,18 +1260,25 @@ model.direction.SW.name=lounas model.direction.W.name=länsi model.direction.NW.name=luode model.historyEventType.abandonColony.description=Hylkäät siirtokunnan %colony%. +# Fuzzy model.historyEventType.cityOfGold.description=Löydät kadonneen kaupungin, jonka uumenista löytyy %treasure% kultarahan arvosta aarteita. +# Fuzzy model.historyEventType.colonyConquered.description=%nation% valloittaa siirtokunnan %colony%. +# Fuzzy model.historyEventType.colonyDestroyed.description=%nation% tuhoaa siirtokunnan %colony%. # Fuzzy model.historyEventType.declareIndependence.description=Tuhoat %nation%-kansan intiaanikylän. +# Fuzzy model.historyEventType.destroyNation.description=Tuhoat %nation%-kansan. model.historyEventType.discoverNewWorld.description=Löydät uuden maailman. +# Fuzzy model.historyEventType.discoverRegion.description=Kansa %nation% löysi alueen %region%. model.historyEventType.foundColony.description=Perustat uuden siirtokunnan %colony%. model.historyEventType.foundingFather.description=%father% liittyy mannermaakongressiin. model.historyEventType.independence.description=Saavutat itsenäisyyden. +# Fuzzy model.historyEventType.meetNation.description=Tapaat kansan %nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=%nation% on kukistettu. model.indianSettlement.mostHatedNone=– model.indianSettlement.nameUnknown=Tuntematon @@ -1317,6 +1323,7 @@ model.nationState.notAvailable.name=kyllä model.player.forces={{tag:gen|%nation%}} sotajoukot model.player.independentMarket=Eurooppa model.player.startGame=Kuukausien merellä purjehtimisen jälkeen olet viimein saapunut tuntemattoman mantereen rannikolle. Purjehdi länteen löytääksesi Uuden maailman ja julistaaksesi sen Kruunun omaisuudeksi. +# Fuzzy model.player.waitingFor=%nation% model.regionType.coast.name=Rannikko model.regionType.coast.unknown=Tuntematon rannikkoalue @@ -1371,9 +1378,9 @@ model.unit.underRepair=Korjauksessa (%turns% {{plural:%turns%|one=vuoro|other=vu model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S +# Fuzzy model.unit.unitState.skipped=W model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G @@ -1403,6 +1410,7 @@ model.player.emigrate=Yksikkö %unit% on muuttanut Euroopasta. model.player.foundingFatherJoinedCongress=%foundingFather% on liittynyt kongressiin!\n\n%description% model.player.soLDecrease=Itsenäisyyden kannattajien jäsenmäärä siirtokunnissa on laskenut %newSoL% prosenttiin. model.player.soLIncrease=Itsenäisyyden kannattajien jäsenmäärä siirtokunnissa on noussut %newSoL% prosenttiin. +# Fuzzy model.player.stance.war.declared=Huonoja uutisia! %nation% on julistanut sodan meitä vastaan. model.player.stance.war.others=%attacker% on julistanut sodan. %defender% valmistautuu puolustamaan alueitaan. combat.buildingDamaged=%enemyUnit% (%enemyNation%) on tuhonnut rakennuksen %building% siirtokunnassa %colony%! @@ -1413,6 +1421,7 @@ combat.colonyCapturedBy=Pelaaja %player% on valloittanut siirtokunnan %colony%. combat.enemyShipDamaged=Merellä käydyssä taistelussa, jonka osapuolina olivat %unit% ja %enemyUnit% (%enemyNation%), %unit% vahingoitti vihollisaluksen korjauskuntoon. combat.enemyShipDamagedByBombardment=Siirtokunnasta %colony% pommitettiin laivaa. %unit% (%nation%) sai pahoja vaurioita, jonka takia sen täytyy palata korjattavaksi. combat.goodsStolen=%enemyUnit% (%enemyNation%) varastaa %amoun% %goods% siirtokunnasta %colony%! +# Fuzzy combat.indianPlunder=%enemyUnit% (%enemyNation%) ryöstää %amoun% siirtokunnasta %colony%! combat.indianTreasure=Ryöstösaalis %indian%-kylästä on %amount% kultarahaa. combat.newConvertFromAttack=Pelokas %nation%käännynnäinen liittyy sinun joukkoihin! @@ -1453,6 +1462,7 @@ error.couldNotLoad=Pelin lataus päättyi virheeseen! # Fuzzy error.couldNotSave=Pelin tallennus päättyi virheeseen! main.defaultPlayerName=Pelaajan nimi +# Fuzzy client.choicePlayer=Pelaaja client.headlessDebug=Palvelintila vaatii vianjäljitysajon. client.headlessRequires=Palvelintila vaatii tallennuksen tai sääntömääritelmän. @@ -1462,8 +1472,11 @@ metaServer.communicationError=Keskustelu metapalvelimen kanssa päättyi virhees buy.moreGold=Pyydä alhaisempaa hintaa buy.takeOffer=Hyväksy tarjous buy.text=%nation% haluaisi myydä sinulle tuotteensa %goods% hintaan %gold% kultaa: +# Fuzzy confirmHostile.alliance=Et voi hyökätä liittoutuneen pelaajan %nation% kimppuun. Liitto täytyy ensin purkaa. +# Fuzzy confirmHostile.ceaseFire=Olet solminut tulitauon pelaajan %nation% kanssa. Haluatko hyökätä? +# Fuzzy confirmHostile.peace=Haluatko julistaa sodan pelaajalle %nation%? error.noSuchFile=Valittua tiedostoa ei ole olemassa tai se ei kelpaa. # Fuzzy @@ -1511,7 +1524,9 @@ cashInTreasureTrain.free=Kuningas voi kuljettaa aarteesi Eurooppaan maksutta – cashInTreasureTrain.pay=Kuningas voi kuljettaa aarteesi Eurooppaan, jos hän saa puolet ryöstösaaliista. defeated.text=Sinut on päihitetty! Haluatko: defeated.yes=jäädä katsomaan +# Fuzzy diplomacy.offerAccepted=%nation% on hyväksynyt anteliaan tarjouksenne. +# Fuzzy diplomacy.offerRejected=%nation% on kieltäytynyt anteliaasta tarjouksestanne. disbandUnit.text=Haluatko kotiuttaa tämän yksikön? disbandUnit.yes=Lakkauta @@ -1573,6 +1588,7 @@ server.fileNotFound=Pyydettyä tiedostoa ei löytynyt. server.incompatibleVersions=Tallennus ei ole yhteensopiva tämän FreeColin version kanssa. server.invalidPlayerNations=Kaikkien pelaajien pitää valita eri kansallisuus ennen pelin alkua. server.maximumPlayers=Peliin ei mahdu enempää pelaajia. +# Fuzzy server.noRouteToServer=Palomuuriasetukset estävät julkisen palvelimen tekemisen. Käytettävä portti on oltava avoin. server.noSuchPlayer=Tässä pelissä ei ole pelaajaa nimeltä: %player% server.notAllReady=Kaikki pelaajat eivät ole valmiita aloittamaan peliä. @@ -1639,6 +1655,7 @@ colopedia.unit.offensivePower=Hyökkäysvoima colopedia.unit.price=Hinta Euroopassa colopedia.unit.productionBonus={{plural:%number%|one=Tuotantomuuttuja|other=Tuotantomuuttujat}}: colopedia.unit.requirements=Vaatimukset: +# Fuzzy colopedia.unit.school=Koulutus mahdollista colopedia.unit.skill=Taidot report.labour.allColonists=Kaikki siirtolaiset @@ -1704,12 +1721,14 @@ report.requirements.surplus=Seuraavat siirtokunnat tuottavat ylimäärin {{tag:a report.trade.afterTaxes=Tulot verojen jälkeen report.trade.beforeTaxes=Tulot ennen veroja report.trade.cargoUnits=Yksikköä lastina +# Fuzzy report.trade.hasCustomHouse=* Tässä siirtokunnassa on tullilaitos; näitä tuotteita viedään. report.trade.totalDelta=Kokonaistuotanto report.trade.totalUnits=Yksiköitä yhteensä report.trade.unitsSold=Ostettu tai myyty report.turn.filter=Älä näytä tämäntyyppisiä viestejä jatkossa (%type%) report.turn.ignore=Älä näytä tätä viestiä jatkossa (siirtokunta: %colony%, tuote: %goods%) +# Fuzzy report.turn.playerNation=%player% (%nation%) aboutPanel.copyright=Tekijänoikeudet © 2002–2015 FreeCol-ryhmä aboutPanel.legalDisclaimer=FreeCol on vapaa ohjelma: voit levittää sitä edelleen ja/tai muokata sitä GNU General Public Licensen ehtojen mukaan sellaisina kuin Free Software Foundation ne on julkaissut, joko lisenssin versio 2, tai minkä tahansa myöhempi versio. @@ -1737,6 +1756,7 @@ colonyPanel.notBestTile=%unit% tuottaisi enemmän {{tag:acc|%goods%}} ruudussa % confirmDeclarationDialog.areYouSure.no=Ehkä myöhemmin confirmDeclarationDialog.areYouSure.text=Haluatko julistaa itsenäisyyden? confirmDeclarationDialog.areYouSure.yes=Itsenäisyys tai kuolema! +# Fuzzy confirmDeclarationDialog.defaultNation=Vapaa %nation% constructionPanel.clickToBuild=Valitse rakennettava rakennus tai yksikkö napsauttamalla rakennustyömaata. constructionPanel.turnsToComplete=(%number% {{plural:%number%|one=vuoro|other=vuoroa}} valmistumiseen) diff --git a/data/strings/FreeColMessages_fr.properties b/data/strings/FreeColMessages_fr.properties index d33b291e2..839deae71 100644 --- a/data/strings/FreeColMessages_fr.properties +++ b/data/strings/FreeColMessages_fr.properties @@ -41,6 +41,7 @@ # Author: Urhixidur # Author: Verdy p # Author: Windes +# Author: Wladek92 # Author: Wyz # Author: Y-M D # Author: Yann.fauche @@ -58,24 +59,24 @@ model.option.refStrength.name=Force CER model.option.refStrength.shortDescription=Augmente la taille du Corps expéditionnaire royal (CER). type=Type source=Source -main.userDir.macosx=FreeCol enregistre maintenant les données de préférence dans Library/Preferences/freecol et celles de l’utilisateur dans Library/Application Support/freecol. Les données trouvées dans les anciens emplacements .freecol ou Library/FreeCol ont été copiées vers le nouvel emplacement, amis non supprimées. +main.userDir.macosx=FreeCol enregistre maintenant les données de préférence dans Library/Preferences/freecol et celles de l’utilisateur dans Library/Application Support/freecol. Les données trouvées dans les anciens emplacements .freecol ou Library/FreeCol ont été copiées vers le nouvel emplacement, mais non supprimées. main.userDir.unix=FreeCol stocke dorénavant les données utilisateur selon le standard XDG, avec les fichiers de configuration dans ~/.config/freecol, les fichiers de données dans ~/.local/share/freecol, et les fichiers de journalisation dans ~/.cache/freecol. Les données trouvées dans l’ancien emplacement ~/.freecol ont été copiées vers les nouveaux emplacements, mais n’ont pas été supprimées. main.userDir.windows=FreeCol stocke dorénavant les données utilisateur sous « freecol » dans votre répertoire de documents. Les données trouvées dans l’ancien répertoire « FreeCol » ont été copiées dans le nouvel emplacement, mais non supprimées. -chilly=Froid -cold=Très froid -dry=Sec -hot=Très chaud -temperate=Tempéré -veryDry=Très sec +chilly=Fraîche +cold=Froide +dry=Sèche +hot=Torride +temperate=Tempérée +veryDry=Très sèche veryHigh=Très rapide -veryLarge=Très grand +veryLarge=Très grande veryLow=Très lent -verySmall=Très petit +verySmall=Très petite veryWet=Très humide -warm=Chaud +warm=Chaude wet=Humide freecol.desktopEntry.GenericName=Jeu de stratégie -freecol.desktopEntry.Comment=Un jeu de stratégie au tour par tour basé sur « Colonization » de Sid Meier. +freecol.desktopEntry.Comment=Un jeu de stratégie au tour par tour basé sur « Sid Meier’s Colonization ». accept=Accepter all=Tout and=et @@ -92,17 +93,17 @@ height=Hauteur help=Aide high=Rapide host=Serveur -large=Grand +large=Grande load=Charger -low=Bas +low=Lent many=beaucoup -medium=Moyen +medium=Moyenne more=plus... music=Musique name=Nom no=Non none=Aucun -normal=Normal +normal=Normale nothing=Rien ok=Valider options=Options @@ -117,7 +118,7 @@ save=Enregistrer select=Sélectionner server=Nom du serveur : skip=Sauter -small=Petit +small=Petite statistics=Statistiques test=Test true=Vrai @@ -130,32 +131,34 @@ abilities=Aptitudes activateAllUnits=Activer toutes les unités activateUnit=Activer l’unité assignTradeRoute=Attribuer une route commerciale -building=bâtiment +building=Bâtiment capital=Capitale cargo=Fret cargoOnCarrier=Cargaison transportée cashInTreasureTrain=Or dans le convoi de trésor clearOrders=Effacer les ordres colonists=Colons +colonyCenter=centre de la colonie colopedia=Colonipédie +countryName={{ucfirst:{{tag:country|%nation%}}}} difficulty=Difficulté docks=Quais -dumpCargo=Décharger la cargaison +dumpCargo=Jeter la cargaison finalResult=Résultat final fortify=Fortifier gold=Or goldAmount=%amount% {{plural:%amount%|one=or|other=or|default=or}} goods=Marchandises goToEurope=Aller en Europe -goToThisTile=Allez à cette case +goToThisTile=Aller à cette case immigrants=Immigrants inPort=Au port -leaveShip=Abandonner le navire +leaveShip=Quitter le navire mission=Mission -modifiers=Modificateurs : +modifiers=Modificateurs nation=Nation newWorld=Nouveau Monde -notApplicable=n/a +notApplicable=s/o payArrears=Payer les arriérés player=Joueur purchase=Acheter @@ -166,7 +169,7 @@ sailingToEurope=En route vers l’Europe sales=Ventes sentry=Mettre en veille setSail=Naviguer -settlement=Campement +settlement=Agglomération showProductionModifiers=Afficher les indicateurs de production skillTaught=Compétence enseignée startGame=Lancer le jeu @@ -183,10 +186,10 @@ list.up=Monter status.loadingGame=Patience : Chargement du jeu status.savingGame=Patience : Sauvegarde du jeu status.startingGame=Patience : Démarrage du jeu -cli.arg.advantages=AVANTAGES -cli.arg.clientOptions=FICHIER D'OPTIONS +cli.arg.advantages=ATOUTS +cli.arg.clientOptions=FICHIER D’OPTIONS cli.arg.debug=MODES DE DÉBOGAGE -cli.arg.debugRun=TOURS [, SAVENAME] +cli.arg.debugRun=TOURS[,SAVENAME] cli.arg.difficulty=DIFFICULTÉ cli.arg.dimensions=LARGEURxHAUTEUR cli.arg.directory=DOSSIER @@ -199,135 +202,137 @@ cli.arg.name=NOM cli.arg.port=PORT cli.arg.seed=GRAINE cli.arg.timeout=DÉLAI DÉPASSÉ -cli.error.advantages=Type d’avantages (%advantages%) attendu, trouvé: %arg% -cli.error.badTC=Erreur à l’ouverture de jeu de règles: %tc%. -cli.error.clientOptions=Ignorer le fichier d'options client illisible:%string% -cli.error.debug=Liste de mode de débogage (%modes%) attendu. +cli.error.advantages=Type d’atout (%advantages%) attendu, trouvé: %arg% +cli.error.badTC=Erreur à l’ouverture du jeu de règles : %tc%. +cli.error.clientOptions=Ignorer le fichier d’options client illisible : %string% +cli.error.debug=Liste de mode de débogage (%modes%) attendue. cli.error.difficulties=Niveau de difficulté (%difficulties%) attendu, trouvé : %arg% cli.error.europeans=Le nombre de nations européennes doit être au moins de %min% -cli.error.gui-scale=Pourcentage d’échelle (%scales%) de l’IHM attendu, trouvé : %arg% +cli.error.gui-scale=Pourcentage d’échelle (%scales%) de l’interface graphique attendu, trouvé : %arg% cli.error.home.noRead=Impossible de lire depuis %string%. cli.error.home.noWrite=Impossible d’écrire sur %string%. -cli.error.home.notDir=%string% n’est pas un répertoire. -cli.error.home.notExists=Le répertoire %string% n’existe pas. +cli.error.home.notDir=%string% n’est pas un dossier. +cli.error.home.notExists=Le dossier %string% n’existe pas. cli.error.save=Impossible de lire la partie sauvegardée %string%. cli.error.serverPort=%string% n’est pas un numéro de port valide. +cli.error.splash=Fichier d’accueil %name% non trouvé. cli.error.timeout=%string% est trop court (moins de %minimum%). -cli.advantages=définit le type de ADVANTAGES (%advantages%) -cli.check-savegame.failure=Le contrôle de cohérence de la sauvegarde de la partie a échoué, vérifiez le journal pour les détails. -cli.check-savegame.success=Contrôle de cohérence de la sauvegarde de la partie terminé, vérifiez le journal pour les détails. -cli.check-savegame=vérifie la cohérence du FICHIER de partie sauvegardée +cli.advantages=définir le type d’ATOUTS (%advantages%) +cli.check-savegame.failure=Le contrôle de cohérence de la sauvegarde de la partie a échoué, consultez le journal pour les détails. +cli.check-savegame.success=Contrôle de cohérence de la sauvegarde de la partie terminé, consultez le journal pour les détails. +cli.check-savegame=vérifier la cohérence du fichier de partie sauvegardée cli.clientOptions=Fichier XML contenant les options utilisateur du client. -cli.debug-run=exécuter N tours en mode debug, puis éventuellement sauvegardez et quittez -cli.debug-start=démarre immédiatement une nouvelle partie solo -cli.debug=définit les modes de débogage de FreeCol (%modes%) -cli.default-locale=définit la localisation par défaut (LANGUE[_PAYS[_VARIANTE]]) -cli.difficulty=définit le niveau de DIFFICULTÉ +cli.debug-run=exécuter N tours en mode débogage, puis éventuellement sauvegarder et quitter +cli.debug-start=démarrer immédiatement une nouvelle partie solo +cli.debug=définir les modes de débogage de FreeCol (%modes%) +cli.default-locale=définir la localisation par défaut (LANGUE[_PAYS[_VARIANTE]]) +cli.difficulty=définir le niveau de DIFFICULTÉ cli.european-count=fixer le nombre de nations actives (EUROPÉENS colonisateurs) cli.fast=ignorer toutes les boîtes de dialogue de configuration cli.font=définir la police par défaut -cli.freecol-data=définit le DOSSIER des données de FreeCol (ayant un sous-dossier 'base') +cli.freecol-data=définir le DOSSIER des données de FreeCol (ayant un sous-dossier 'base') cli.full-screen=exécuter FreeCol en mode plein écran -cli.gui-scale=éléments d’échelle IHM, avec ÉCHELLE (%scales%) facultative -cli.headless=exécuter en mode stupide -cli.help=affiche cet écran d’aide -cli.load-savegame=charge le FICHIER d’une partie sauvegardée -cli.log-console=journalise vers la console en plus du fichier -cli.log-file=définit le FICHIER de journalisation de FreeCol (FreeCol.log par défaut) -cli.log-level=définit le niveau de journalisation de Java à NIVEAUJOURNAL -cli.name=fournit un NOM pour le joueur -cli.no-intro=passer la vidéo introductive -cli.no-java-check=saute la vérification de la version de Java -cli.no-memory-check=saute la vérification de mémoire -cli.no-sound=exécute FreeCol sans son -cli.private=démarre un serveur privé (non publié sur le méta-serveur) -cli.seed=fournit une GRAINE pour le générateur de nombres pseudo-aléatoires -cli.server-name=définit un NOM personnalisé pour le serveur -cli.server=démarre un serveur indépendant sur le PORT spécifié -cli.splash=affiche le FICHIER d’image dans l’écran d’accueil durant le chargement du jeu -cli.tc=charge la conversion totale avec le NOM donné +cli.gui-scale=éléments d’échelle d’interface graphique, avec ÉCHELLE (%scales%) facultative +cli.headless=exécuter sans interface graphique +cli.help=afficher cet écran d’aide +cli.load-savegame=charger le FICHIER d’une partie sauvegardée +cli.log-console=journaliser vers la console en plus du fichier +cli.log-file=définir le fichier de journalisation de FreeCol (FreeCol.log par défaut) +cli.log-level=définir le niveau de journalisation de Java à NIVEAUJOURNAL +cli.name=fournir un NOM pour le joueur +cli.no-intro=passer la vidéo d’introduction +cli.no-java-check=passer la vérification de la version de Java +cli.no-memory-check=passer la vérification de mémoire +cli.no-sound=exécuter FreeCol sans son +cli.no-splash=passer la page d’accueil +cli.private=démarrer un serveur privé (non publié sur le méta-serveur) +cli.seed=fournir une GRAINE pour le générateur de nombres pseudo-aléatoires +# Fuzzy +cli.server=démarrer un serveur indépendant sur le PORT spécifié +cli.server-name=définir un NOM personnalisé pour le serveur +cli.splash=afficher le FICHIER d’image comme écran d’accueil durant le chargement du jeu +cli.tc=charger la conversion totale avec le NOM donné cli.timeout=nombre de secondes pendant lequel le serveur attend la réponse à une question -cli.user-cache-directory=fixer le RÉPERTOIRE de cache utilisateur de FreeCol -cli.user-config-directory=définit le RÉPERTOIRE de configiration utilisateur de FreeCol -cli.user-data-directory=définit le RÉPERTOIRE de données utilisateur de FreeCol -cli.version=affiche le numéro de version et sort -cli.windowed=exécuter FreeCol en mode fenêtré, avec DIMENSIONS facultatif +cli.user-cache-directory=fixer le DOSSIER de cache utilisateur de FreeCol +cli.user-config-directory=définir le DOSSIER de configuration utilisateur de FreeCol +cli.user-data-directory=définir le DOSSIER de données utilisateur de FreeCol +cli.version=afficher le numéro de version et quitter +cli.windowed=exécuter FreeCol en mode fenêtré, avec DIMENSIONS facultatives menuBar.colopedia=Colonipédie menuBar.game=Jeu menuBar.orders=Ordres -menuBar.report=Rapports +menuBar.report=Rapport menuBar.tools=Outils menuBar.view=Voir -menuBar.statusLine=Points : %score% | Or : %gold% | Taxes : %tax% % | An : %year% +menuBar.statusLine=Points : %score% | Or : %gold% | Taxes : %tax% % | Année : %year% menuBar.debug=Déboguer menuBar.debug.addBuilding=Ajouter un bâtiment à chaque colonie menuBar.debug.addFoundingFather=Ajouter un père fondateur menuBar.debug.addGold=Ajouter de l’or -menuBar.debug.addImmigration=Ajouter l’immigration +menuBar.debug.addImmigration=Ajouter de l’immigration menuBar.debug.addLiberty=Ajouter des points de liberté à chaque colonie menuBar.debug.compareMaps.checkComplete=Contrôle effectué. Aucune désynchronisation relevée. menuBar.debug.compareMaps.problem=Un problème possible a été découvert. Lisez les informations fournies sur la sortie standard. menuBar.debug.compareMaps=Contrôle des désynchronisations de la carte -menuBar.debug.displayAIMissions=Afichatge de l'IA de las missions -menuBar.debug.displayAdditionalAIMissionInfo=Afichar mai de IA mission d'informacion -menuBar.debug.displayErrorMessage=Afficher le message d'erreur +menuBar.debug.displayAIMissions=Affichage des missions de l’IA +menuBar.debug.displayAdditionalAIMissionInfo=Afficher plus d’information sur les missions de l’IA +menuBar.debug.displayErrorMessage=Afficher le message d’erreur menuBar.debug.displayEuropeStatus=Panneau Europe menuBar.debug.displayMonarchPanel=Panneau Monarque -menuBar.debug.displayPanels=Afficher panneaux +menuBar.debug.displayPanels=Afficher les panneaux menuBar.debug.displayUnits=Afficher les unités menuBar.debug.hideEntireMap=Masquer toute la carte menuBar.debug.memoryManager.gc=Lancer le ramasse-miettes menuBar.debug.memoryManager=Gestionnaire de mémoire menuBar.debug.revealEntireMap=Révéler toute la carte -menuBar.debug.runMonarch=Définir l'action suivante du monarque -menuBar.debug.searchTrace=Journal des traces de recherche complète -menuBar.debug.showColonyValue=Montrer les valeurs de colonie -menuBar.debug.showCoordinates=Montrer les coordonnées -menuBar.debug.showResourceKeys=Montrer les ressources clé +menuBar.debug.runMonarch=Définir l’action suivante du monarque +menuBar.debug.searchTrace=Journaliser des traces de recherche complètes +menuBar.debug.showColonyValue=Afficher les valeurs des colonies +menuBar.debug.showCoordinates=Afficher les coordonnées +menuBar.debug.showResourceKeys=Afficher les ressources-clés menuBar.debug.skipTurns=Passer des tours -menuBar.debug.stepRandomNumberGenerator=Lancer le générateur de nombre aléatoire +menuBar.debug.stepRandomNumberGenerator=Lancer le générateur de nombres aléatoires menuBar.debug.stopSkippingTurns=Arrêter de passer des tours -menuBar.debug.useAI=Utiliser AI +menuBar.debug.useAI=Utiliser l’IA aboutAction.name=À propos de FreeCol activeAction.name=Activer l’unité -assignTradeRouteAction.name=Suivre une route commerciale +assignTradeRouteAction.name=Attribuer une route commerciale buildColonyAction.name=Construire/rejoindre une colonie -centerAction.name=Centre -changeAction.enterColony.name=Entrez dans la colonie +centerAction.name=Centrer +changeAction.enterColony.name=Entrer dans la colonie changeAction.name=Unité suivante dans la case changeAction.nextUnitOnTile.name=Unité suivante dans la case -changeAction.selectCarrier.name=Choisissez le transporteur +changeAction.selectCarrier.name=Choisir le transporteur changeWindowedModeAction.name=Mode plein écran chatAction.name=Clavardage -clearForestAction.name=Déforester -clearOrdersAction.name=Annulez les ordres -colopediaAction.buildings.name=Constructions +clearForestAction.name=Défricher +clearOrdersAction.name=Annuler les ordres +colopediaAction.buildings.name=Bâtiments colopediaAction.concepts.name=Concepts colopediaAction.fathers.name=Pères fondateurs colopediaAction.goods.name=Marchandises colopediaAction.nations.name=Nations colopediaAction.nationTypes.name=Atouts nationaux colopediaAction.resources.name=Ressources bonifiées -colopediaAction.skills.name=Métiers colopediaAction.terrain.name=Terrains colopediaAction.units.name=Unités -colopediaAction.name=%object% (Colopedia) +colopediaAction.name=%object% (Colonipédie) continueAction.name=Continuer de jouer -debugAction.name=(Dés)activer le mode déboggage +debugAction.name=(Dés)activer le mode débogage declareIndependenceAction.name=Déclaration d’indépendance determineHighSeasAction.name=Déterminer les zones de haute mer difficultyAction.name=Afficher le niveau de difficulté disbandUnitAction.name=Dissoudre displayBordersAction.name=Afficher les frontières displayGridAction.name=Afficher la grille -displayTileTextAction.empty.name=Afficher aucun texte dans les cases -displayTileTextAction.names.name=Afficher le nom des cases +displayTileTextAction.empty.name=N’afficher aucun texte dans les cases +displayTileTextAction.names.name=Afficher les noms des cases displayTileTextAction.owners.name=Afficher les propriétaires des cases displayTileTextAction.regions.name=Afficher la région des cases endTurnAction.name=Fin du tour europeAction.name=Europe -executeGotoOrdersAction.name=Exécuter les ordres en suspens -findSettlementAction.name=Chercher un lieu +executeGotoOrdersAction.name=Exécuter les ordres de mouvement +findSettlementAction.name=Chercher une agglomération fortifyAction.name=Fortifier gameOptionsAction.name=Afficher les options du jeu gotoAction.name=Aller à @@ -342,25 +347,25 @@ miniMapToggleBordersAction.secondary.name=Basculer la vue entre politique et éc miniMapToggleFogOfWarAction.name=Inverser le brouillard de guerre miniMapToggleFogOfWarAction.secondary.name=Inverser le brouillard de guerre (secondaire) miniMapZoomInAction.name=Zoomer la mini-carte -miniMapZoomInAction.secondary.name=Zoom sur la minicarte (secondaire) +miniMapZoomInAction.secondary.name=Zoom sur la mini-carte (secondaire) miniMapZoomOutAction.name=Dézoomer la mini-carte -miniMapZoomOutAction.secondary.name=Dézoom sur la minicarte (secondaire) -moveAction.E.name=Déplacer vers l’Est -moveAction.E.secondary.name=Déplacer vers l’Est (secondaire) -moveAction.N.name=Déplacer vers le Nord -moveAction.N.secondary.name=Déplacer vers le Nord (secondaire) -moveAction.NE.name=Déplacer vers le Nord-Est -moveAction.NE.secondary.name=Déplacer vers le Nord-Est (secondaire) -moveAction.NW.name=Déplacer vers le Nord-Ouest -moveAction.NW.secondary.name=Déplacer vers le Nord-Ouest (secondaire) -moveAction.S.name=Déplacer vers le Sud -moveAction.S.secondary.name=Déplacer vers le Sud (secondaire) -moveAction.SE.name=Déplacer vers le Sud-Est -moveAction.SE.secondary.name=Déplacer vers le Sud-Est (secondaire) -moveAction.SW.name=Déplacer vers le Sud-Ouest -moveAction.SW.secondary.name=Déplacer vers le Sud-Ouest (secondaire) -moveAction.W.name=Déplacer vers l’Ouest -moveAction.W.secondary.name=Déplacer vers l’Ouest (secondaire) +miniMapZoomOutAction.secondary.name=Dézoom sur la mini-carte (secondaire) +moveAction.E.name=Aller à l’Est +moveAction.E.secondary.name=Aller à l’Est (secondaire) +moveAction.N.name=Aller au Nord +moveAction.N.secondary.name=Aller au Nord (secondaire) +moveAction.NE.name=Aller au Nord-Est +moveAction.NE.secondary.name=Aller au Nord-Est (secondaire) +moveAction.NW.name=Aller au Nord-Ouest +moveAction.NW.secondary.name=Aller au Nord-Ouest (secondaire) +moveAction.S.name=Aller au Sud +moveAction.S.secondary.name=Aller au Sud (secondaire) +moveAction.SE.name=Aller au Sud-Est +moveAction.SE.secondary.name=Aller au Sud-Est (secondaire) +moveAction.SW.name=Aller au Sud-Ouest +moveAction.SW.secondary.name=Aller au Sud-Ouest (secondaire) +moveAction.W.name=Aller à l’Ouest +moveAction.W.secondary.name=Aller à l’Ouest (secondaire) newAction.name=Nouveau newEmptyMapAction.name=Nouvelle carte vide openAction.name=Ouvrir @@ -368,14 +373,14 @@ plowAction.name=Labourer preferencesAction.name=Préférences quitAction.name=Quitter reconnectAction.name=Reconnexion -renameAction.name=Changez de nom -reportCargoAction.name=Transport de marchandises +renameAction.name=Renommer +reportCargoAction.name=Rapport des transports reportColonyAction.name=Conseiller aux Colonies reportCongressAction.name=Congrès continental reportEducationAction.name=Rapport d’éducation reportExplorationAction.name=Rapport d’exploration reportForeignAction.name=Conseiller aux Affaires étrangères -reportHighScoresAction.name=Plus haut scores +reportHighScoresAction.name=Plus hauts pointages reportHistoryAction.name=Rapport historique reportIndianAction.name=Conseiller aux Affaires indiennes reportLabourAction.name=Conseiller au Travail @@ -388,13 +393,13 @@ reportTradeAction.name=Conseiller au Commerce reportTurnAction.name=Bilan annuel retireAction.name=Se retirer roadAction.name=Construire une route -saveAction.name=Enregistrer +saveAction.name=Sauvegarder saveAndQuitAction.name=Sauvegarder et quitter scaleMapAction.name=Dimensionner la carte -sentryAction.name=Veiller +sentryAction.name=Mettre en veille showMainAction.name=Retour au menu skipUnitAction.name=Passer -tilePopupAction.name=Montrer la case +tilePopupAction.name=Afficher la case toggleViewModeAction.name=Voir unités/terrains tradeRouteAction.name=Routes commerciales unloadAction.name=Décharger @@ -414,86 +419,90 @@ model.difficulty.custom.shortDescription=Un niveau de difficulté réglable. model.difficulty.immigration.name=Immigration model.option.crossesIncrement.name=Incrément de croix model.option.crossesIncrement.shortDescription=Nombre de croix supplémentaires requises pour chaque nouvel immigrant. -model.option.recruitPriceIncrease.name=Augmentation du prix de recrutement -model.option.recruitPriceIncrease.shortDescription=Augmente le coût de recrutement de nouveaux immigrants. -model.option.lowerCapIncrease.name=Augmentation du prix minimal -model.option.lowerCapIncrease.shortDescription=Augmente le prix minimum de recrutement pour chaque nouvel immigrant. -model.option.priceIncreasePerType.name=Augmentation du prix par type d’unité -model.option.priceIncreasePerType.shortDescription=Si l’augmentation du prix s’applique ou non à chaque type d’unité. -model.option.priceIncrease.artillery.name=Augmentation des prix pour l’artillerie -model.option.priceIncrease.artillery.shortDescription=Hausse du prix de chaque nouvelle pièce d’artillerie. +model.option.recruitPriceIncrease.name=Augmentation du coût de recrutement +model.option.recruitPriceIncrease.shortDescription=Augmente le coût de recrutement des nouveaux immigrants. +model.option.lowerCapIncrease.name=Augmentation du coût minimal +model.option.lowerCapIncrease.shortDescription=Augmente le coût minimum de recrutement pour chaque nouvel immigrant. +model.option.priceIncreasePerType.name=Augmentation du coût par type d’unité +model.option.priceIncreasePerType.shortDescription=Si l’augmentation du coût s’applique ou non à chaque type d’unité. +model.option.priceIncrease.artillery.name=Augmentation des coûts pour l’artillerie +model.option.priceIncrease.artillery.shortDescription=Hausse du coût de chaque nouvelle pièce d’artillerie. model.option.expertStartingUnits.name=Unités de départ expertes -model.option.expertStartingUnits.shortDescription=Fait de toutes les unités de départ des experts. +model.option.expertStartingUnits.shortDescription=Faire de toutes les unités de départ des experts. model.option.immigrants.name=Immigrants -model.option.immigrants.shortDescription=Les premiers immigrants d'Europe. +model.option.immigrants.shortDescription=Les premiers immigrants d’Europe. model.difficulty.natives.name=Indigènes -model.option.landPriceFactor.name=Facteur du prix des terres +model.option.landPriceFactor.name=Facteur de coût des terres model.option.landPriceFactor.shortDescription=Augmente le coût d’achat des terres indigènes. model.option.nativeConvertProbability.name=Probabilité de conversion indigène -model.option.nativeConvertProbability.shortDescription=Augmente la probabilité que les indigènes d’une colonie détruite se convertissent. -model.option.burnProbability.name=Probabilité d’incendie des colonies +model.option.nativeConvertProbability.shortDescription=Augmente la probabilité que les indigènes d’une agglomération détruite se convertissent. +model.option.burnProbability.name=Probabilité d’incendie des agglomérations model.option.burnProbability.shortDescription=Augmente la probabilité que les indigènes brûlent les colonies. model.option.nativeDemands.name=Demandes indigènes model.option.nativeDemands.shortDescription=Augmente la quantité de demandes indigènes. model.option.rumourDifficulty.name=Difficulté de rumeur -model.option.rumourDifficulty.shortDescription=Plus ce nombre est élevé, moins les rumeurs auront des chances de devenir positives. +model.option.rumourDifficulty.shortDescription=Plus ce nombre est élevé, moins les rumeurs positives seront fréquentes. model.option.shipTradePenalty.name=Pénalité de commerce maritime model.option.shipTradePenalty.shortDescription=Pénalité en pourcentage sur les prix offerts par les indigènes aux navires de commerce. -model.option.destroySettlementScore.name=Score de destruction de colonie -model.option.destroySettlementScore.shortDescription=Pénalité au score pour la destruction d’un campement indigène +model.option.destroySettlementScore.name=Pointage de destruction d’agglomération +model.option.destroySettlementScore.shortDescription=Pénalité au pointage pour la destruction d’une agglomération indigène model.option.buildOnNativeLand.name=Construire sur une terre autochtone -model.option.buildOnNativeLand.shortDescription=Si les colonies peuvent être fondées sur une terre autochtone. +model.option.buildOnNativeLand.shortDescription=Si les colonies peuvent être fondées sur des terres autochtones. model.option.buildOnNativeLand.always.name=Toujours model.option.buildOnNativeLand.always.shortDescription=La construction sur une terre autochtone est toujours possible. model.option.buildOnNativeLand.first.name=La première -model.option.buildOnNativeLand.first.shortDescription=Votre première colonie peut être construite sur une terre autochtone. +model.option.buildOnNativeLand.first.shortDescription=Seule votre première colonie peut être construite sur une terre autochtone. model.option.buildOnNativeLand.firstAndUncontacted.name=La première sans contact -model.option.buildOnNativeLand.firstAndUncontacted.shortDescription=Votre première colonie peut être construite sur une terre autochtone tant que la tribu propriétaire n’a pas été contactée. +model.option.buildOnNativeLand.firstAndUncontacted.shortDescription=Votre première colonie ne peut être construite sur une terre autochtone que si la tribu propriétaire n’a pas été contactée. model.option.buildOnNativeLand.never.name=Jamais model.option.buildOnNativeLand.never.shortDescription=Construire sur une terre autochtone n’est pas autorisé. -model.option.settlementNumber.name=Nombre de lieux habités indigènes -model.option.settlementNumber.shortDescription=Détermine le nombre de campement indigènes sur les cartes générées +model.option.settlementNumber.name=Nombre d’agglomérations indigènes +model.option.settlementNumber.shortDescription=Détermine le nombre d’agglomérations indigènes sur les cartes générées model.option.settlementNumber.verySmall.name=Très petit -model.option.settlementNumber.verySmall.shortDescription=Pas gaire d'establiments indigènas +model.option.settlementNumber.verySmall.shortDescription=Très peu d’agglomérations indigènes model.option.settlementNumber.small.name=Petit -model.option.settlementNumber.small.shortDescription=Nombre de luòcs abitats indigènas +model.option.settlementNumber.small.shortDescription=Peu d’agglomérations indigènes model.option.settlementNumber.medium.name=Moyen -model.option.settlementNumber.medium.shortDescription=Nombre mejan d'establiments indigènas +model.option.settlementNumber.medium.shortDescription=Nombre moyen d’agglomérations indigènes model.option.settlementNumber.large.name=Grand -model.option.settlementNumber.large.shortDescription=Grand nombre d'establiments indigènas -model.option.settlementNumber.veryLarge.name=Fòrt grand -model.option.settlementNumber.veryLarge.shortDescription=Establiments indigènas abondants +model.option.settlementNumber.large.shortDescription=Beaucoup d’agglomérations indigènes +model.option.settlementNumber.veryLarge.name=Très grand +model.option.settlementNumber.veryLarge.shortDescription=Les agglomérations indigènes sont abondantes model.difficulty.monarch.name=Monarque model.option.monarchMeddling.name=Ingérence monarchique model.option.monarchMeddling.shortDescription=Augmente l’importance et la sévérité de l’ingérence du monarque. model.option.taxAdjustment.name=Ajustement des taxes model.option.taxAdjustment.shortDescription=Accroît la sévérité des augmentations d’impôts model.option.mercenaryPrice.name=Prix des mercenaires -model.option.mercenaryPrice.shortDescription=Augmente le prix offert aux mercenaires par le monarque. +model.option.mercenaryPrice.shortDescription=Augmente le prix des mercenaires offerts par le monarque. model.option.maximumTax.name=Taxe maximale model.option.maximumTax.shortDescription=La valeur maximale à laquelle le monarque peut augmenter les taxes. model.option.monarchSupport.name=Soutien du monarque model.option.monarchSupport.shortDescription=Le soutien militaire fourni par le monarque. -model.option.treasureTransportFee.name=Frais de transport d'un trésor -model.option.treasureTransportFee.shortDescription=Le pourcentage d'un trésor que le couronne gardera pour la transporter. -model.option.interventionBells.name=Cloches d'intervention -model.option.interventionBells.shortDescription=Le nombre de cloches nécessaires pour faire intervenir la Force d'Intervention. -model.option.interventionTurns.name=Tours d'intervention -model.option.interventionTurns.shortDescription=Le nombre de tours entre les ajouts à la Force d'Intervention. -model.option.refSize.name=Taille de la Force expéditionnaire royale -model.option.refSize.shortDescription=Le nombre et le type d'unités composant le corps expéditionnaire royal. +model.option.treasureTransportFee.name=Frais de transport d’un trésor +model.option.treasureTransportFee.shortDescription=Le pourcentage d’un trésor payé à la Couronne pour son transport. +model.option.interventionBells.name=Cloches d’intervention +model.option.interventionBells.shortDescription=Le nombre de cloches nécessaires pour faire intervenir la Force d’intervention. +model.option.interventionTurns.name=Tours d’intervention +model.option.interventionTurns.shortDescription=Le nombre de tours entre les ajouts à la Force d’intervention. +model.option.refSize.name=Taille du Corps expéditionnaire royal +model.option.refSize.shortDescription=Le nombre et le type d’unités composant le Corps expéditionnaire royal. model.option.refSize.soldiers.name=Infanterie -model.option.refSize.soldiers.shortDescription=Le nombre d'unités d'infanterie. +model.option.refSize.soldiers.shortDescription=Le nombre d’unités d’infanterie. model.option.refSize.dragoons.name=Cavalerie -model.option.refSize.dragoons.shortDescription=Le nombre d'unités de cavalerie. -model.option.refSize.menOfWar.name=Navires de guerre -model.option.refSize.menOfWar.shortDescription=Le nombre de navires de guerre. +model.option.refSize.dragoons.shortDescription=Le nombre d’unités de cavalerie. +model.option.refSize.menOfWar.name=Vaisseaux de ligne +model.option.refSize.menOfWar.shortDescription=Le nombre de vaisseaux de ligne. model.option.refSize.artillery.name=Artillerie -model.option.refSize.artillery.shortDescription=Le nombre d'unités d'artillerie. -model.option.interventionForce.name=Force d'intervention -model.option.interventionForce.shortDescription=La Force d'Intervention dépêchée à l'appui de votre guerre d'indépendance. +model.option.refSize.artillery.shortDescription=Le nombre d’unités d’artillerie. +model.option.interventionForce.name=Force d’intervention +model.option.interventionForce.shortDescription=La Force d’intervention dépêchée en soutien à votre guerre d’indépendance. model.option.mercenaryForce.name=Force mercenaire -model.option.mercenaryForce.shortDescription=La Force mercenaire propose de soutenir votre Guerre d'Indépendance. +model.option.mercenaryForce.shortDescription=La Force mercenaire propose de soutenir votre Guerre d’indépendance. +model.option.warSupportForce.name=Force de soutien de guerre +model.option.warSupportForce.shortDescription=La Force maximale offerte par le monarque en soutien à vos guerres. +model.option.warSupportGold.name=Or de soutien de guerre +model.option.warSupportGold.shortDescription=La quantité maximale d’or offerte par le monarque en soutien à vos guerres. model.difficulty.government.name=Gouvernement model.option.badGovernmentLimit.name=Limite de mauvais gouvernement model.option.badGovernmentLimit.shortDescription=Le nombre maximum de royalistes qui n’entraînent pas de pénalité de production. @@ -502,10 +511,10 @@ model.option.veryBadGovernmentLimit.shortDescription=Le nombre maximum de royali model.option.goodGovernmentLimit.name=Limite de bon gouvernement model.option.goodGovernmentLimit.shortDescription=Le pourcentage minimal de rebelles qui provoque un bonus de production. model.option.veryGoodGovernmentLimit.name=Limite de très bon gouvernement -model.option.veryGoodGovernmentLimit.shortDescription=Le pourcentage minimal de rebelles qui provoque un bonus accru de la production. +model.option.veryGoodGovernmentLimit.shortDescription=Le pourcentage minimal de rebelles qui provoque un bonus accru de production. model.difficulty.other.name=Autres -model.option.startingMoney.name=Argent initial -model.option.startingMoney.shortDescription=La quantité d’argent dont vous disposez au début du jeu. +model.option.startingMoney.name=Or initial +model.option.startingMoney.shortDescription=La quantité d’or dont vous disposez au début du jeu. model.option.foundingFatherFactor.name=Facteur de père fondateur model.option.foundingFatherFactor.shortDescription=Augmente le coût d’élection d’un nouveau père fondateur. model.option.arrearsFactor.name=Facteur d’arriérés @@ -514,72 +523,72 @@ model.option.unitsThatUseNoBells.name=Colons qui n’utilisent pas de cloche de model.option.unitsThatUseNoBells.shortDescription=Le nombre de colons dans une colonie qui n’utilisent aucune cloche de la Liberté. model.option.tileProduction.name=Production des cases model.option.tileProduction.shortDescription=La production des cases avec production variable. -model.option.tileProduction.veryLow.name=Fòrt long +model.option.tileProduction.veryLow.name=Très basse model.option.tileProduction.veryLow.shortDescription=Production de case très faible model.option.tileProduction.low.name=Basse model.option.tileProduction.low.shortDescription=Production de case faible -model.option.tileProduction.medium.name=Moyen +model.option.tileProduction.medium.name=Moyenne model.option.tileProduction.medium.shortDescription=Production de case moyenne -model.option.tileProduction.high.name=Haut -model.option.tileProduction.high.shortDescription=Production de case haute -model.option.tileProduction.veryHigh.name=Très haut -model.option.tileProduction.veryHigh.shortDescription=Production de case très haute +model.option.tileProduction.high.name=Haute +model.option.tileProduction.high.shortDescription=Production de case élevée +model.option.tileProduction.veryHigh.name=Très haute +model.option.tileProduction.veryHigh.shortDescription=Production de case très élevée model.option.badRumour.name=Chance de mauvaise rumeur -model.option.badRumour.decription=Pourcentage de chance qu’une rumeur ait un mauvais résultat. +model.option.badRumour.decription=Probabilité qu’une rumeur ait un mauvais résultat (en pourcentage). model.option.goodRumour.name=Chance de bonne rumeur -model.option.goodRumour.decription=Pourcentage de chance qu’une rumeur ait un bon résultat. -model.difficulty.cheat.name=Triche de l'IA -model.option.liftBoycottCheat.name=Lever d'un boycott -model.option.liftBoycottCheat.shortDescription=Pourcentage de chances par tour qu'un joueur IA ait un boycott levé sans payer d'arriérés. -model.option.equipScoutCheat.name=Équiper l'éclaireur -model.option.equipScoutCheat.shortDescription=Pourcentage de chances par tour qu'une IA équipe gratuitement une unité en Europe en tant qu'éclaireur. +model.option.goodRumour.decription=Probabilité qu’une rumeur ait un bon résultat (en pourcentage). +model.difficulty.cheat.name=Triche de l’IA +model.option.liftBoycottCheat.name=Lever d’un boycott +model.option.liftBoycottCheat.shortDescription=Pourcentage par tour qu’un joueur IA ait un boycott levé sans payer d’arriérés. +model.option.equipScoutCheat.name=Équiper l’éclaireur +model.option.equipScoutCheat.shortDescription=Pourcentage par tour qu’une IA équipe gratuitement une unité en Europe en tant qu’éclaireur. model.option.equipPioneerCheat.name=Équiper un pionnier -model.option.equipPioneerCheat.shortDescription=Pourcentage de chances par tour qu’une IA équipe gratuitement une unité en Europe comme pionnier. +model.option.equipPioneerCheat.shortDescription=Pourcentage par tour qu’une IA équipe gratuitement une unité en Europe comme pionnier. model.option.landUnitCheat.name=Obtenir une unité terrestre -model.option.landUnitCheat.shortDescription=Pourcentage de chances par tour qu'une IA obtienne gratuitement une unité terrestre offensive en Europe. +model.option.landUnitCheat.shortDescription=Pourcentage par tour qu’une IA obtienne gratuitement une unité terrestre offensive en Europe. model.option.offensiveLandUnitCheat.name=Obtenir une unité terrestre offensive model.option.offensiveNavalUnitCheat.name=Obtenir une unité navale offensive -model.option.offensiveNavalUnitCheat.shortDescription=Pourcentage de chances dégressif (en fonction de la force navale) par tour qu'une IA construise gratuitement une unité navale offensive en Europe. +model.option.offensiveNavalUnitCheat.shortDescription=Pourcentage dégressif (en fonction de la force navale) par tour qu’une IA construise gratuitement une unité navale offensive en Europe. model.option.transportNavalUnitCheat.name=Obtenir une unité navale de transport -model.option.transportNavalUnitCheat.shortDescription=Pourcentage de chances par tour qu'une IA construise gratuitement une unité navale de transport en Europe (si elle a du travail pour davantage d'unités de transport). +model.option.transportNavalUnitCheat.shortDescription=Pourcentage par tour qu’une IA construise gratuitement une unité navale de transport en Europe (si elle a du travail pour davantage d’unités de transport). gameOptions.name=Options de jeu -gameOptions.shortDescription=Options de règles de jeu. +gameOptions.shortDescription=Options de règles de jeu gameOptions.map.name=Carte gameOptions.map.shortDescription=Options d’affichage sur le panneau de la carte. -model.option.turnsToSail.name=Virements de bords -model.option.turnsToSail.shortDescription=Le nombre de changements de bords nécessaires pour naviguer de l’Europe vers le Nouveau Monde. -model.option.settlementLimitModifier.name=Modificateur de la limite de villages -model.option.settlementLimitModifier.shortDescription=Quantité ajoutée à la limite d'un village, comme pour le nombre de chariots pouvant être construits. -model.option.fogOfWar.name=Brouillard de bataille +model.option.turnsToSail.name=Tours de navigation +model.option.turnsToSail.shortDescription=Le nombre de tours nécessaires pour naviguer de l’Europe vers le Nouveau Monde. +model.option.settlementLimitModifier.name=Modificateur de la limite d’agglomération +model.option.settlementLimitModifier.shortDescription=Quantité ajoutée à la limite d’une agglomération, comme pour le nombre de chariots pouvant être construits. +model.option.fogOfWar.name=Brouillard de guerre model.option.fogOfWar.shortDescription=Les unités ennemies au-delà de notre rayon de vision doivent-elles être masquées ? model.option.explorationPoints.name=Points d’exploration model.option.explorationPoints.shortDescription=Les points d’exploration doivent-ils être remis pour toutes les découvertes ? model.option.amphibiousMoves.name=Déplacements amphibies -model.option.amphibiousMoves.shortDescription=Permettre le déplacement directement dans les établissements, à partir d'unités navales. +model.option.amphibiousMoves.shortDescription=Permettre le déplacement à partir d’unités navales directement dans les agglomérations. model.option.emptyTraders.name=Unités commerciales vides -model.option.emptyTraders.shortDescription=Autorise les unités commerciales vides à commercer avec les campements indigènes. -model.option.settlementActionsContactChief.name=Contact principal -model.option.settlementActionsContactChief.shortDescription=Toutes les actions avec un village contactent son chef et consument le bonus de reconnaissance. +model.option.emptyTraders.shortDescription=Autorise les unités commerciales vides à commercer avec les agglomérations indigènes. +model.option.settlementActionsContactChief.name=Contacter le chef +model.option.settlementActionsContactChief.shortDescription=Toutes les actions avec une agglomération contactent son chef et consomment le bonus de reconnaissance. model.option.enhancedMissionaries.name=Missionnaires améliorés -model.option.enhancedMissionaries.shortDescription=Les missionnaires améliorent le commerce d'un village et les compétences enseignées, et donnent de la visibilité sur les environs. +model.option.enhancedMissionaries.shortDescription=Les missionnaires améliorent le commerce d’une agglomération et les compétences enseignées, et donnent de la visibilité sur les environs. model.option.missionInfluence.name=Influence de la mission -model.option.missionInfluence.shortDescription=La force de l’influence d’une mission sur le niveau d’alarme des indigènes dans un campement. +model.option.missionInfluence.shortDescription=La force de l’influence d’une mission sur le niveau d’alarme des indigènes dans une agglomération. model.option.giftProbability.name=Probabilité de cadeau -model.option.giftProbability.shortDescription=Pourcentage de chances par tour qu'un campement indigène pacifique avec un surplus l'offre en cadeau à un campement européen amical proche. +model.option.giftProbability.shortDescription=Pourcentage par tour qu’une agglomération indigène pacifique ayant un surplus l’offre en cadeau à une agglomération européenne amicale proche. model.option.demandProbability.name=Probabilité de demande -model.option.demandProbability.shortDescription=Pourcentage de chances par tour qu'un campement indigène hostile demande un tribut à un campement européen adverse proche. -model.option.continueFoundingFatherRecruitment.name=Continuer à recruter des Pères fondateurs. -model.option.continueFoundingFatherRecruitment.shortDescription=Continuer à recruter des Pères fondateurs une fois que l'indépendance est accordée. -model.option.teleportREF.name=Téléporter REF -model.option.teleportREF.shortDescription=REF apparaît sur le site d'atterrissage pour sa première cible. +model.option.demandProbability.shortDescription=Pourcentage par tour qu’une agglomération indigène hostile demande un tribut à une agglomération européenne proche. +model.option.continueFoundingFatherRecruitment.name=Continuer à recruter des Pères fondateurs +model.option.continueFoundingFatherRecruitment.shortDescription=Continuer à recruter des Pères fondateurs une fois que l’indépendance est accordée. +model.option.teleportREF.name=Téléporter CEF +model.option.teleportREF.shortDescription=Le CEF apparaît sur le site d’atterrissage pour sa première cible. model.option.startingPositions.name=Positions de départ model.option.startingPositions.shortDescription=Détermine les positions de départ des joueurs européens. model.option.startingPositions.classic.name=Classique -model.option.startingPositions.classic.shortDescription=Les nations européennes commencent sur la limite en haute mer à l’est du Nouveau Monde. +model.option.startingPositions.classic.shortDescription=Les nations européennes commencent à la limite de haute mer à l’Est du Nouveau Monde. model.option.startingPositions.random.name=Aléatoire -model.option.startingPositions.random.shortDescription=Les nations européennes commencent sur la limite en haute mer n’importe où sur la carte. +model.option.startingPositions.random.shortDescription=Les nations européennes commencent à la limite de haute mer n’importe où sur la carte. model.option.startingPositions.historical.name=Historique -model.option.startingPositions.historical.shortDescription=Les nations européennes commencent sur les limites en haute mer proches de leur première colonie historique dans le Nouveau Monde. +model.option.startingPositions.historical.shortDescription=Les nations européennes commencent aux limites de haute mer proches de leur première colonie historique dans le Nouveau Monde. model.option.initialImmigration.name=Cible d’immigration initiale model.option.initialImmigration.shortDescription=Nombre de croix à produire avant que le premier émigrant européen n’apparaisse. model.option.peaceProbability.name=Probabilité de paix @@ -589,13 +598,13 @@ model.option.europeanUnitImmigrationPenalty.shortDescription=Pénalité par tour model.option.playerImmigrationBonus.name=Bonus d’immigration du joueur model.option.playerImmigrationBonus.shortDescription=Bonus par tour pour l’ensemble de la production de croix. model.option.equipEuropeanRecruits.name=Équiper les recrues européennes -model.option.equipEuropeanRecruits.shortDescription=Les unités nouvellement entraînées ou recrutées en Europe sont équipées en accord avec leur rôle par défaut. +model.option.equipEuropeanRecruits.shortDescription=Les unités nouvellement formées ou recrutées en Europe sont équipées en accord avec leur rôle par défaut. gameOptions.colony.name=Colonies gameOptions.colony.shortDescription=Contient les options relatives au comportement des colonies. model.option.bellAccumulationCapped.name=Accumulation de cloches plafonnée model.option.bellAccumulationCapped.shortDescription=Les colonies ne peuvent pas accumuler plus de cloches tant que le taux de 100% de rebelles n’est pas atteint -model.option.captureUnitsUnderRepair.name=Unités capturées en réparation -model.option.captureUnitsUnderRepair.shortDescription=Les unités capturées sont en réparation quand une colonie est conquise. +model.option.captureUnitsUnderRepair.name=Capture des unités en réparation +model.option.captureUnitsUnderRepair.shortDescription=Les unités en réparation sont capturées quand une colonie est conquise. model.option.customIgnoreBoycott.name=Les douanes ignorent les boycotts model.option.customIgnoreBoycott.shortDescription=Les douanes peuvent vendre les marchandises boycottées. model.option.customsOnCoast.name=Bâtiments des douanes sur la côte @@ -605,98 +614,98 @@ model.option.disembarkInColony.shortDescription=Toutes les unités débarquent q model.option.expertsHaveConnections.name=Les experts ont des relations model.option.expertsHaveConnections.shortDescription=Les experts peuvent utiliser leurs relations pour fournir un minimum de matières premières aux manufactures, même quand il n’y en a plus ! model.option.foundColonyDuringRebellion.name=Fonder des colonies pendant la rébellion -model.option.foundColonyDuringRebellion.shortDescription=Un joueur peut continuer à fonder des colonies lors de la Guerre d’Indépendance. +model.option.foundColonyDuringRebellion.shortDescription=Un joueur peut continuer à fonder des colonies pendant la Guerre d’indépendance. model.option.payForBuilding.name=Payer pour construire model.option.payForBuilding.shortDescription=Les constructions peuvent être terminées plus rapidement en payant pour les biens manquants. model.option.saveProductionOverflow.name=Conserver les surplus de production model.option.saveProductionOverflow.shortDescription=Conserve les surplus de production de marteaux, de cloches et de croix. model.option.clearHammersOnConstructionSwitch.name=Effacer les marteaux lors du changement de construction -model.option.clearHammersOnConstructionSwitch.shortDescription=Mettre à zéro les marteaux accumulés su la construction courante change. +model.option.clearHammersOnConstructionSwitch.shortDescription=Mettre à zéro les marteaux accumulés si la construction courante change. model.option.allowStudentSelection.name=Autoriser la sélection des étudiants -model.option.allowStudentSelection.shortDescription=Permet d’assigner les étudiants manuellement plutôt qu’automatiquement +model.option.allowStudentSelection.shortDescription=Permet d’assigner les étudiants manuellement plutôt qu’automatiquement. model.option.enableUpkeep.name=Les bâtiments ont besoin d’entretien (EXPÉRIMENTAL) -model.option.enableUpkeep.shortDescription=Payer pour l'entretien des bâtiments ou subir un malus de production. +model.option.enableUpkeep.shortDescription=Payer pour l’entretien des bâtiments ou subir un malus de production. model.option.onlyNaturalImprovements.name=Améliorations naturelles uniquement -model.option.onlyNaturalImprovements.shortDescription=Seules les améliorations des cases naturelles contribuent à la production de bien non alimentaires sur la case centrale de la colonie. +model.option.onlyNaturalImprovements.shortDescription=Seules les améliorations des cases naturelles contribuent à la production de biens non alimentaires sur la case centrale de la colonie. model.option.naturalDisasters.name=Catastrophes naturelles -model.option.naturalDisasters.shortDescription=La probabilité de catastrophes naturelles par tour. +model.option.naturalDisasters.shortDescription=La probabilité de catastrophe naturelle par tour. gameOptions.victoryConditions.name=Victoire gameOptions.victoryConditions.shortDescription=Conditions de victoire. model.option.victoryDefeatREF.name=Premier joueur à acquérir l’indépendance -model.option.victoryDefeatREF.shortDescription=Le premier joueur humain qui bat les Corps expéditionnaires royaux remporte la victoire. +model.option.victoryDefeatREF.shortDescription=Le premier joueur humain qui bat le Corps expéditionnaire royal remporte la victoire. model.option.victoryDefeatEuropeans.name=Défaite de tous les autres Européens model.option.victoryDefeatEuropeans.shortDescription=Le joueur qui défait tous les autres joueurs européens remporte la victoire. model.option.victoryDefeatHumans.name=Défaite de tous les autres joueurs humains model.option.victoryDefeatHumans.shortDescription=Le joueur qui défait tous les autres joueurs humains remporte la victoire. -gameOptions.years.name=Options Année +gameOptions.years.name=Options de calendrier gameOptions.years.shortDescription=Contient les options relatives aux diverses années spéciales. model.option.startingYear.name=Année de départ -model.option.startingYear.shortDescription=L'année à laquelle le jeu débute. +model.option.startingYear.shortDescription=L’année à laquelle le jeu débute. model.option.seasonYear.name=Saison model.option.seasonYear.shortDescription=La première année pendant laquelle il y a deux saisons. model.option.mandatoryColonyYear.name=Année de colonie obligatoire -model.option.mandatoryColonyYear.shortDescription=L'année en laquelle posséder une colonie devient obligatoire. +model.option.mandatoryColonyYear.shortDescription=L’année en laquelle posséder une colonie devient obligatoire. model.option.lastYear.name=Dernière année du jeu model.option.lastYear.shortDescription=La toute dernière année du jeu. model.option.lastColonialYear.name=Dernière année coloniale du jeu model.option.lastColonialYear.shortDescription=La dernière année du jeu pour un joueur colonial. -model.option.independenceTurn.name=L'Indépendance De Tour -model.option.independenceTurn.shortDescription=Un bonus au score est accordé pour avoir déclaré l’indépendance avant ce tour. +model.option.independenceTurn.name=Le tour d’Indépendance +model.option.independenceTurn.shortDescription=Un bonus au pointage est accordé pour avoir déclaré l’Indépendance avant ce tour. model.option.ages.name=Âges de recrutement des pères fondateurs -model.option.ages.shortDescription=Les deux ans au cours de laquelle le père fondateur changements de pondération (séparés par des virgules). +model.option.ages.shortDescription=Les deux années au cours desquelles la pondération des pères fondateurs change (séparées par des virgules). model.option.seasons.name=Saisons model.option.seasons.shortDescription=Le nombre de saisons dans une année gameOptions.prices.name=Options de prix gameOptions.prices.shortDescription=Contient des options générées par le jeu pour contrôler les prix initiaux. model.option.food.minimumPrice.name=Prix initial minimal pour la nourriture model.option.food.maximumPrice.name=Prix initial maximal pour la nourriture -model.option.food.spread.name=Différence entre les prix d'achat et de vente pour la nourriture +model.option.food.spread.name=Différence entre les prix d’achat et de vente pour la nourriture model.option.sugar.minimumPrice.name=Prix initial minimal pour le sucre model.option.sugar.maximumPrice.name=Prix initial maximal pour le sucre -model.option.sugar.spread.name=Différence entre les prix d'achat et de vente pour le sucre +model.option.sugar.spread.name=Différence entre les prix d’achat et de vente pour le sucre model.option.tobacco.minimumPrice.name=Prix initial minimal pour le tabac model.option.tobacco.maximumPrice.name=Prix initial maximal pour le tabac -model.option.tobacco.spread.name=Différence entre les prix d'achat et de vente pour le tabac +model.option.tobacco.spread.name=Différence entre les prix d’achat et de vente pour le tabac model.option.cotton.minimumPrice.name=Prix initial minimal pour le coton model.option.cotton.maximumPrice.name=Prix initial maximal pour le coton -model.option.cotton.spread.name=Différence entre les prix d'achat et de vente pour le coton +model.option.cotton.spread.name=Différence entre les prix d’achat et de vente pour le coton model.option.furs.minimumPrice.name=Prix initial minimal pour les fourrures model.option.furs.maximumPrice.name=Prix initial maximal pour les fourrures -model.option.furs.spread.name=Différence entre les prix d'achat et de vente pour les fourrures +model.option.furs.spread.name=Différence entre les prix d’achat et de vente pour les fourrures model.option.lumber.minimumPrice.name=Prix initial minimal pour le bois model.option.lumber.maximumPrice.name=Prix initial maximal pour le bois -model.option.lumber.spread.name=Différence entre les prix d'achat et de vente pour le bois +model.option.lumber.spread.name=Différence entre les prix d’achat et de vente pour le bois model.option.ore.minimumPrice.name=Prix initial minimal pour le minerai model.option.ore.maximumPrice.name=Prix initial maximal pour le minerai -model.option.ore.spread.name=Différence entre les prix d'achat et de vente pour le minerai -model.option.silver.minimumPrice.name=Prix initial minimal pour l'argent -model.option.silver.maximumPrice.name=Prix initial maximal pour l'argent -model.option.silver.spread.name=Différence entre les prix d'achat et de vente pour l'argent +model.option.ore.spread.name=Différence entre les prix d’achat et de vente pour le minerai +model.option.silver.minimumPrice.name=Prix initial minimal pour l’argent +model.option.silver.maximumPrice.name=Prix initial maximal pour l’argent +model.option.silver.spread.name=Différence entre les prix d’achat et de vente pour l’argent model.option.rum.minimumPrice.name=Prix initial minimal pour le rhum model.option.rum.maximumPrice.name=Prix initial maximal pour le rhum -model.option.rum.spread.name=Différence entre les prix d'achat et de vente pour le rhum +model.option.rum.spread.name=Différence entre les prix d’achat et de vente pour le rhum model.option.cigars.minimumPrice.name=Prix initial minimal pour les cigares model.option.cigars.maximumPrice.name=Prix initial maximal pour les cigares -model.option.cigars.spread.name=Différence entre les prix d'achat et de vente pour les cigares -model.option.cloth.minimumPrice.name=Prix initial minimal pour les vêtements -model.option.cloth.maximumPrice.name=Prix initial maximal pour les vêtements -model.option.cloth.spread.name=Différence entre les prix d'achat et de vente pour les vêtements -model.option.coats.minimumPrice.name=Prix initial minimal pour les manteaux -model.option.coats.maximumPrice.name=Prix initial maximal pour les manteaux -model.option.coats.spread.name=Différence entre les prix d'achat et de vente pour les manteaux +model.option.cigars.spread.name=Différence entre les prix d’achat et de vente pour les cigares +model.option.cloth.minimumPrice.name=Prix initial minimal pour le tissu +model.option.cloth.maximumPrice.name=Prix initial maximal pour le tissu +model.option.cloth.spread.name=Différence entre les prix d’achat et de vente pour le tissu +model.option.coats.minimumPrice.name=Prix initial minimal pour les pelisses +model.option.coats.maximumPrice.name=Prix initial maximal pour les pelisses +model.option.coats.spread.name=Différence entre les prix d’achat et de vente pour les pelisses model.option.tools.minimumPrice.name=Prix initial minimal pour les outils model.option.tools.maximumPrice.name=Prix initial maximal pour les outils -model.option.tools.spread.name=Différence entre les prix d'achat et de vente pour les outils +model.option.tools.spread.name=Différence entre les prix d’achat et de vente pour les outils model.option.muskets.minimumPrice.name=Prix initial minimal pour les mousquets model.option.muskets.maximumPrice.name=Prix initial maximal pour les mousquets -model.option.muskets.spread.name=Différence entre les prix d'achat et de vente pour les mousquets -model.option.tradeGoods.minimumPrice.name=Prix initial minimal pour les biens commerciaux -model.option.tradeGoods.maximumPrice.name=Prix initial maximal pour les biens commerciaux -model.option.tradeGoods.spread.name=Différence entre les prix d'achat et de vente pour les biens commerciaux +model.option.muskets.spread.name=Différence entre les prix d’achat et de vente pour les mousquets +model.option.tradeGoods.minimumPrice.name=Prix initial minimal pour les marchandises commerciales +model.option.tradeGoods.maximumPrice.name=Prix initial maximal pour les marchandises commerciales +model.option.tradeGoods.spread.name=Différence entre les prix d’achat et de vente pour les marchandises commerciales model.option.horses.minimumPrice.name=Prix initial minimal pour les chevaux model.option.horses.maximumPrice.name=Prix initial maximal pour les chevaux -model.option.horses.spread.name=Différence entre les prix d'achat et de vente pour les chevaux -model.option.hammers.price.name=Prix pour les marteaux lors de l'achat de bâtiments et d'unités pouvant être construits +model.option.horses.spread.name=Différence entre les prix d’achat et de vente pour les chevaux +model.option.hammers.price.name=Prix pour les marteaux lors de l’achat de bâtiments et d’unités constructibles mapGeneratorOptions.name=Options du générateur de carte mapGeneratorOptions.shortDescription=Options du générateur de carte. mapGeneratorOptions.landGenerator.name=Générateur de continents @@ -705,97 +714,97 @@ model.option.mapWidth.name=Largeur de la carte model.option.mapWidth.shortDescription=Permet de choisir la largeur de la carte générée. model.option.mapHeight.name=Hauteur de la carte model.option.mapHeight.shortDescription=Permet de choisir la hauteur de la carte générée. -model.option.landMass.name=Masse des continents +model.option.landMass.name=Masses continentales model.option.landMass.shortDescription=Permet de choisir le pourcentage de terre par rapport à l’océan sur la carte. -model.option.landGeneratorType.name=Type de surface (EXPÉRIMENTAL !) -model.option.landGeneratorType.shortDescription=Options pour définir le type de générateur de pays à utiliser. +model.option.landGeneratorType.name=Type de continents (EXPÉRIMENTAL !) +model.option.landGeneratorType.shortDescription=Définir le type de générateur de terres à utiliser. model.option.landGeneratorType.classic.name=Classique model.option.landGeneratorType.classic.shortDescription=Un grand continent et quelques îles. model.option.landGeneratorType.continent.name=Continent -model.option.landGeneratorType.continent.shortDescription=La plupart des terres est sur un unique continent. +model.option.landGeneratorType.continent.shortDescription=La plupart des terres sont sur un unique continent. model.option.landGeneratorType.archipelago.name=Archipel model.option.landGeneratorType.archipelago.shortDescription=Plusieurs îles de taille moyenne. model.option.landGeneratorType.islands.name=Îles model.option.landGeneratorType.islands.shortDescription=De nombreuses petites îles. model.option.preferredDistanceToEdge.name=Distance au bord préférée model.option.preferredDistanceToEdge.shortDescription=La distance préférée au bord de la carte. -model.option.maximumDistanceToEdge.name=Distance maximum du bord +model.option.maximumDistanceToEdge.name=Distance maximale du bord model.option.maximumDistanceToEdge.shortDescription=La distance maximale au bord de la carte. model.option.distanceToHighSea.name=Distance de la haute mer model.option.distanceToHighSea.shortDescription=La distance préférée entre la côte et la haute mer. mapGeneratorOptions.terrainGenerator.name=Générateur de terrains mapGeneratorOptions.terrainGenerator.shortDescription=Options du générateur de terrain -model.option.minimumLatitude.name=Latitude minimum -model.option.minimumLatitude.shortDescription=La latitude la plus au nord. Une valeur négative indique une latitude de l'hémisphère nord. +model.option.minimumLatitude.name=Latitude minimale +model.option.minimumLatitude.shortDescription=La latitude la plus au Nord. Une valeur négative indique une latitude de l’hémisphère nord. model.option.maximumLatitude.name=Latitude maximale -model.option.maximumLatitude.shortDescription=La latitude la plus au sud. Une valeur positive indique une latitude de l'hémisphère sud. -model.option.riverNumber.name=Proportion de rivières -model.option.riverNumber.shortDescription=Détermine le nombre de rivière dans les terres. +model.option.maximumLatitude.shortDescription=La latitude la plus au Sud. Une valeur positive indique une latitude de l’hémisphère sud. +model.option.riverNumber.name=Nombre de rivières +model.option.riverNumber.shortDescription=Détermine le nombre de rivières dans les terres. model.option.riverNumber.verySmall.name=Très petit model.option.riverNumber.verySmall.shortDescription=Très peu de rivières model.option.riverNumber.small.name=Petit -model.option.riverNumber.small.shortDescription=Pichon nombre de ribièras +model.option.riverNumber.small.shortDescription=Peu de rivières model.option.riverNumber.medium.name=Moyen model.option.riverNumber.medium.shortDescription=Nombre moyen de rivières model.option.riverNumber.large.name=Grand model.option.riverNumber.large.shortDescription=Grand nombre de rivières -model.option.riverNumber.veryLarge.name=Fòrt grand +model.option.riverNumber.veryLarge.name=Très grand model.option.riverNumber.veryLarge.shortDescription=Rivières abondantes -model.option.mountainNumber.name=Proportion de montagnes -model.option.mountainNumber.shortDescription=Détermine le pourcentage de chaînes montagneuses. +model.option.mountainNumber.name=Nombre de montagnes +model.option.mountainNumber.shortDescription=Détermine la quantité de chaînes montagneuses. model.option.mountainNumber.verySmall.name=Très petit model.option.mountainNumber.verySmall.shortDescription=Très peu de montagnes model.option.mountainNumber.small.name=Petit -model.option.mountainNumber.small.shortDescription=Pichon nombre de montanhas +model.option.mountainNumber.small.shortDescription=Peu de montagnes model.option.mountainNumber.medium.name=Moyen model.option.mountainNumber.medium.shortDescription=Nombre moyen de montagnes model.option.mountainNumber.large.name=Grand model.option.mountainNumber.large.shortDescription=Grand nombre de montagnes -model.option.mountainNumber.veryLarge.name=Fòrt grand +model.option.mountainNumber.veryLarge.name=Très grand model.option.mountainNumber.veryLarge.shortDescription=Montagnes abondantes -model.option.rumourNumber.name=Proportion de rumeurs de cité perdue +model.option.rumourNumber.name=Nombre de rumeurs de cité perdue model.option.rumourNumber.shortDescription=Détermine le nombre de rumeurs de cité perdue. model.option.rumourNumber.verySmall.name=Très petit model.option.rumourNumber.verySmall.shortDescription=Très peu de rumeurs model.option.rumourNumber.small.name=Petit -model.option.rumourNumber.small.shortDescription=Pichon nombre de rumors +model.option.rumourNumber.small.shortDescription=Peu de rumeurs model.option.rumourNumber.medium.name=Moyen model.option.rumourNumber.medium.shortDescription=Nombre moyen de rumeurs model.option.rumourNumber.large.name=Grand model.option.rumourNumber.large.shortDescription=Grand nombre de rumeurs -model.option.rumourNumber.veryLarge.name=Fòrt grand +model.option.rumourNumber.veryLarge.name=Très grand model.option.rumourNumber.veryLarge.shortDescription=Rumeurs abondantes model.option.forestNumber.name=Proportion de forêts model.option.forestNumber.shortDescription=Détermine le pourcentage de cases couvertes de forêts. model.option.forestNumber.verySmall.name=Très petit model.option.forestNumber.verySmall.shortDescription=Très peu de forêts model.option.forestNumber.small.name=Petit -model.option.forestNumber.small.shortDescription=Pichon nombre de bòsques +model.option.forestNumber.small.shortDescription=Peu de forêts model.option.forestNumber.medium.name=Moyen model.option.forestNumber.medium.shortDescription=Nombre moyen de forêts model.option.forestNumber.large.name=Grand model.option.forestNumber.large.shortDescription=Grand nombre de forêts -model.option.forestNumber.veryLarge.name=Fòrt grand +model.option.forestNumber.veryLarge.name=Très grand model.option.forestNumber.veryLarge.shortDescription=Forêts abondantes model.option.bonusNumber.name=Proportion de cases bonifiées model.option.bonusNumber.shortDescription=Détermine le pourcentage de cases contenant des bonis. model.option.bonusNumber.verySmall.name=Très petit -model.option.bonusNumber.verySmall.shortDescription=Très peu de bonus +model.option.bonusNumber.verySmall.shortDescription=Très peu de bonis model.option.bonusNumber.small.name=Petit -model.option.bonusNumber.small.shortDescription=Petit nombre de forêts +model.option.bonusNumber.small.shortDescription=Peu de bonis model.option.bonusNumber.medium.name=Moyen -model.option.bonusNumber.medium.shortDescription=Nombre moyen de bonus +model.option.bonusNumber.medium.shortDescription=Nombre moyen de bonis model.option.bonusNumber.large.name=Grand -model.option.bonusNumber.large.shortDescription=Grand nombre de bonus -model.option.bonusNumber.veryLarge.name=Fòrt grand -model.option.bonusNumber.veryLarge.shortDescription=Bonus abondants +model.option.bonusNumber.large.shortDescription=Grand nombre de bonis +model.option.bonusNumber.veryLarge.name=Très grand +model.option.bonusNumber.veryLarge.shortDescription=Bonis abondants model.option.humidity.name=Humidité model.option.humidity.shortDescription=Option pour modifier l’humidité moyenne de la carte -model.option.humidity.veryDry.name=Très sec +model.option.humidity.veryDry.name=Très sèche model.option.humidity.veryDry.shortDescription=Humidité très basse -model.option.humidity.dry.name=Sec +model.option.humidity.dry.name=Sèche model.option.humidity.dry.shortDescription=Humidité basse -model.option.humidity.normal.name=Normal +model.option.humidity.normal.name=Normale model.option.humidity.normal.shortDescription=Humidité normale model.option.humidity.wet.name=Humide model.option.humidity.wet.shortDescription=Une forte humidité @@ -803,16 +812,16 @@ model.option.humidity.veryWet.name=Très humide model.option.humidity.veryWet.shortDescription=Très forte humidité model.option.temperature.name=Température model.option.temperature.shortDescription=Option pour modifier la température moyenne de la carte -model.option.temperature.cold.name=Froid +model.option.temperature.cold.name=Froide model.option.temperature.cold.shortDescription=Température très basse -model.option.temperature.chilly.name=Freg -model.option.temperature.chilly.shortDescription=Temperatura bassa -model.option.temperature.temperate.name=Tempéré +model.option.temperature.chilly.name=Fraîche +model.option.temperature.chilly.shortDescription=Température basse +model.option.temperature.temperate.name=Tempérée model.option.temperature.temperate.shortDescription=Température normale -model.option.temperature.warm.name=Caud -model.option.temperature.warm.shortDescription=À haute température -model.option.temperature.hot.name=Fòrt caud -model.option.temperature.hot.shortDescription=À très haute température +model.option.temperature.warm.name=Chaude +model.option.temperature.warm.shortDescription=Température élevée +model.option.temperature.hot.name=Torride +model.option.temperature.hot.shortDescription=Température très élevée mapGeneratorOptions.import.name=Importer mapGeneratorOptions.import.shortDescription=Permet d’importer une carte ou une sauvegarde. model.option.importFile.name=Importer le fichier @@ -823,11 +832,11 @@ model.option.importBonuses.name=Importer les bonis model.option.importBonuses.shortDescription=Active l’importation des bonis. model.option.importRumours.name=Importer les rumeurs model.option.importRumours.shortDescription=Active l’importation des rumeurs de cité perdue. -model.option.importSettlements.name=Importer les lieux habités -model.option.importSettlements.shortDescription=Active l’importation des lieux habités indigènes +model.option.importSettlements.name=Importer les agglomérations +model.option.importSettlements.shortDescription=Active l’importation des agglomérations indigènes clientOptions.name=Préférences clientOptions.shortDescription=Options préférées du client -clientOptions.personal.name=Personnel +clientOptions.personal.name=Personnelles clientOptions.personal.shortDescription=Options spécifiques au joueur. model.option.playerName.name=Nom du joueur : clientOptions.gui.name=Affichage @@ -839,8 +848,8 @@ model.option.guiMinNumberToDisplayGoodsCount.name=Afficher les quantités de mar model.option.guiMinNumberToDisplayGoodsCount.shortDescription=La quantité de marchandises sera affichée lorsqu’elle atteint ou dépasse ce nombre. model.option.guiMaxNumberOfGoodsImages.name=Nombre maximum d’images de marchandises : model.option.guiMaxNumberOfGoodsImages.shortDescription=Indique le nombre maximum d’images à afficher pour chaque type de marchandise. -model.option.guiMinNumberToDisplayGoods.name=Cacher les quantités de marchandises en dépôt inférieures à : -model.option.guiMinNumberToDisplayGoods.shortDescription=Les marchandises seront affichées dans la colonie si elles atteignent ou dépassent cette quantité. +model.option.guiMinNumberToDisplayGoods.name=Masquer les quantités de marchandises en dépôt inférieures à : +model.option.guiMinNumberToDisplayGoods.shortDescription=Les marchandises ne seront affichées dans la colonie que si elles atteignent ou dépassent cette quantité. model.option.alwaysCenter.name=Toujours centrer la case sélectionnée model.option.alwaysCenter.shortDescription=Toujours recentrer la vue sur une case nouvellement sélectionnée. model.option.jumpToActiveUnit.name=Centrer sur l’unité active @@ -861,16 +870,16 @@ model.option.unitLastMoveDelay.name=Délai du dernier mouvement d’une unité model.option.unitLastMoveDelay.shortDescription=S’il faut faire une courte pause lors du dernier mouvement d’une unité ou non. model.option.usePixmaps.name=Utiliser des pixmaps pour stocker les images model.option.usePixmaps.shortDescription=Essayez de désactiver cela si le mouvement des unités ordinaires est très lent. -model.option.rememberPanelPositions.name=Se rappeler des positions des fenêtres -model.option.rememberPanelPositions.shortDescription=Se rappeler de la position des différentes fenêtres. -model.option.rememberPanelSizes.name=Se souvenir de la taille des fenêtres -model.option.rememberPanelSizes.shortDescription=Se souvenir de la taille des différentes fenêtres. +model.option.rememberPanelPositions.name=Se rappeler des positions des panneaux +model.option.rememberPanelPositions.shortDescription=Se rappeler de la position des différents panneaux. +model.option.rememberPanelSizes.name=Se souvenir de la taille des panneaux +model.option.rememberPanelSizes.shortDescription=Se souvenir de la taille des différents panneaux. model.option.smoothRendering.name=Lissage -model.option.smoothRendering.shortDescription=Permet de lisser le rendu de la minicarte lors d’un zoom arrière. -model.option.disableGrayLayer.name=Désactiver la fin de tour en arrière-plan -model.option.disableGrayLayer.shortDescription=Option pour désactiver la fin de tour grisée en arrière-plan. +model.option.smoothRendering.shortDescription=Permet de lisser le rendu de la mini-carte lors d’un zoom arrière. +model.option.disableGrayLayer.name=Désactiver l’arrière-plan de fin de tour +model.option.disableGrayLayer.shortDescription=Option pour désactiver l’arrière-plan grisé en fin de tour. model.option.miniMapToggleFogOfWar.name=Inverser le brouillard de guerre sur la mini-carte -model.option.miniMapToggleFogOfWar.shortDescription=Si sélectionné : Dessiner le brouillard de guerre sur la mini-carte. +model.option.miniMapToggleFogOfWar.shortDescription=Si sélectionné : Utiliser le brouillard de guerre sur la mini-carte. model.option.miniMapToggleBorders.name=Inverser les frontières sur la mini-carte model.option.miniMapToggleBorders.shortDescription=Si sélectionné : Dessiner les frontières sur la mini-carte model.option.mapControls.name=Contrôles de la carte @@ -880,7 +889,7 @@ clientOptions.gui.mapControls.CornerMapControls.shortDescription=Les contrôles clientOptions.gui.mapControls.ClassicMapControls.name=Classique clientOptions.gui.mapControls.ClassicMapControls.shortDescription=Les contrôles de la carte occupent le bord droit. model.option.color.background.name=Couleur de fond -model.option.color.background.shortDescription=Cette couleur entoure le brouillard de guerre et la minicarte lorsque celle-ci est affichée entièrement à un niveau de zoom reculé. +model.option.color.background.shortDescription=Cette couleur entoure le brouillard de guerre et la mini-carte lorsque celle-ci est affichée entièrement à un niveau de zoom reculé. clientOptions.minimap.color.background.black=Noir clientOptions.minimap.color.background.gray.dark.very=Gris très foncé clientOptions.minimap.color.background.gray.dark=Gris foncé @@ -903,7 +912,7 @@ model.option.displayColonyLabels.shortDescription=Le style des étiquettes de co clientOptions.gui.displayColonyLabels.none.name=Aucun clientOptions.gui.displayColonyLabels.none.shortDescription=Ne pas étiqueter les colonies clientOptions.gui.displayColonyLabels.classic.name=Classique -clientOptions.gui.displayColonyLabels.classic.shortDescription=Séries d'étiquettes avec un nom et une taille +clientOptions.gui.displayColonyLabels.classic.shortDescription=Séries d’étiquettes avec un nom et une taille clientOptions.gui.displayColonyLabels.modern.name=Moderne clientOptions.gui.displayColonyLabels.modern.shortDescription=Légende complexe de la colonie avec le bonus de production et tout bâtiment en construction model.option.colonyComparator.name=Trier les colonies par : @@ -919,7 +928,7 @@ clientOptions.gui.colonyComparator.bySize.shortDescription=Trier du plus grand a clientOptions.gui.colonyComparator.bySoL.name=Cloches de la liberté clientOptions.gui.colonyComparator.bySoL.shortDescription=Trier par liberté décroissante model.option.defaultZoomLevel.name=Niveau de zoom par défaut -model.option.defaultZoomLevel.shortDescription=Indique quel niveau de zoom par défaut la minicarte utilise. +model.option.defaultZoomLevel.shortDescription=Indique quel niveau de zoom par défaut la mini-carte utilise. model.option.moveAnimationSpeed.name=Vitesse d’animation des déplacements amis model.option.moveAnimationSpeed.shortDescription=Change la vitesse d’animation des déplacements d’unités amies. clientOptions.gui.moveAnimationSpeed.off=Sans @@ -957,11 +966,11 @@ model.option.guiShowUnitImproved.shortDescription=Indique s’il faut afficher l model.option.guiShowUnitDemoted.name=Messages de dégradations d’unités model.option.guiShowUnitDemoted.shortDescription=Indique s’il faut afficher les messages concernant les dégradations d’unités au début de chaque tour. model.option.guiShowUnitLost.name=Messages de pertes d’unités -model.option.guiShowUnitLost.shortDescription=Indique s’il faut afficher les messages concernant les pertes d’unités. +model.option.guiShowUnitLost.shortDescription=Indique s’il faut afficher les messages concernant les pertes d’unités au début de chaque tour. model.option.guiShowBuildingCompleted.name=Messages d’achèvement des constructions model.option.guiShowBuildingCompleted.shortDescription=Indique s’il faut afficher les messages concernant les achèvements de constructions au début de chaque tour. model.option.guiShowForeignDiplomacy.name=Messages des Affaires étrangères -model.option.guiShowForeignDiplomacy.shortDescription=Indique s’il faut afficher les messages concernant les nouveaux colons au début de chaque tour. +model.option.guiShowForeignDiplomacy.shortDescription=Indique s’il faut afficher les messages concernant la diplomatie étrangère au début de chaque tour. model.option.guiShowMarketPrices.name=Messages sur les prix du marché model.option.guiShowMarketPrices.shortDescription=Indique s’il faut afficher les messages concernant les évolutions de prix du marché au début de chaque tour. model.option.guiShowMissingGoods.name=Messages de marchandises manquantes @@ -972,20 +981,20 @@ model.option.guiShowGifts.name=Cadeaux des indigènes model.option.guiShowGifts.shortDescription=Indique s’il faut afficher les messages concernant les cadeaux des indigènes au début de chaque tour. model.option.guiShowDemands.name=Demandes indigènes model.option.guiShowDemands.shortDescription=Indique s’il faut afficher les messages concernant les demandes des indigènes au début de chaque tour. -model.option.guiShowGoodsMovement.name=Mouvement de marchandises +model.option.guiShowGoodsMovement.name=Mouvements de marchandises model.option.guiShowGoodsMovement.shortDescription=Indique s’il faut afficher les mouvements de marchandises détaillés. model.option.guiShowColonyWarnings.name=Messages d’avertissement des sites de colonies model.option.guiShowColonyWarnings.shortDescription=Indique s’il faut afficher les avertissements concernant les sites de colonies. model.option.guiShowPreCombat.name=Analyses avant combat model.option.guiShowPreCombat.shortDescription=Indique s’il faut afficher les analyses de probabilité avant les combats. -model.option.guiShowNotBestTile.name=Pas de meilleure case -model.option.guiShowNotBestTile.shortDescription=Détermine s’il faut avertir ou non lorsque des unités ne travaillent pas sur la meilleure case disponible -model.option.colonyReport.name=Rapport Colonie +model.option.guiShowNotBestTile.name=Pas la meilleure case +model.option.guiShowNotBestTile.shortDescription=Détermine s’il faut avertir ou non lorsque des unités ne travaillent pas sur la meilleure case disponible. +model.option.colonyReport.name=Rapport des Colonies model.option.colonyReport.shortDescription=Un résumé de l’activité dans chaque colonie. clientOptions.messages.colonyReport.classic.name=Classique -clientOptions.messages.colonyReport.classic.shortDescription=Un rapport de colonie avec une image pleine d’informations. +clientOptions.messages.colonyReport.classic.shortDescription=Un rapport de colonie détaillé avec beaucoup d’images. clientOptions.messages.colonyReport.compact.name=Compact -clientOptions.messages.colonyReport.compact.shortDescription=Un rapport de colonie compact qui tente de montrer autant que possible dans une seule ligne par colonie. +clientOptions.messages.colonyReport.compact.shortDescription=Un rapport de colonie compact qui montre autant que possible en une seule ligne par colonie. model.option.labourReport.name=Rapport de travail model.option.labourReport.shortDescription=Un résumé de l’activité de chaque unité clientOptions.messages.labourReport.classic.name=Classique @@ -994,7 +1003,7 @@ clientOptions.messages.labourReport.compact.name=Compact clientOptions.messages.labourReport.compact.shortDescription=Une version plus compacte du rapport classique. clientOptions.savegames.name=Sauvegardes clientOptions.savegames.shortDescription=Sauvegardes de jeu -model.option.showSavegameSettings.name=Dialogue avec le serveur lors de la lecture d’une sauvegarde : +model.option.showSavegameSettings.name=Dialogue de lecture de sauvegarde model.option.showSavegameSettings.shortDescription=Affiche un dialogue de sélection d’options du serveur lors de la lecture d’une sauvegarde. clientOptions.savegames.showSavegameSettings.never.name=Jamais clientOptions.savegames.showSavegameSettings.never.shortDescription=Ne jamais afficher la boîte de dialogue des options du serveur @@ -1003,19 +1012,19 @@ clientOptions.savegames.showSavegameSettings.multiplayer.shortDescription=Affich clientOptions.savegames.showSavegameSettings.always.name=Toujours clientOptions.savegames.showSavegameSettings.always.shortDescription=Toujours afficher la boîte de dialogue des options du serveur model.option.autosavePeriod.name=Sauvegarde tous les X tours : -model.option.autosavePeriod.shortDescription=Les moments pour sauvegarder le jeu automatiquement. 0 désactive la fonction. -model.option.autosaveValidity.name=Supprimer les sauvegardes automatique après x jours : +model.option.autosavePeriod.shortDescription=L’intervalle de sauvegarde automatique du jeu. 0 désactive la fonction. +model.option.autosaveValidity.name=Supprimer les sauvegardes automatiques après x jours model.option.autosaveValidity.shortDescription=Durée en jours de validité du fichier de sauvegarde automatique après création. Mettez-le à 0 pour ignorer cette condition. -model.option.autosaveDelete.name=Supprimer les fichiers des sauvegardes automatiques : +model.option.autosaveDelete.name=Supprimer les fichiers des sauvegardes automatiques model.option.autosaveDelete.shortDescription=Supprimer les anciens fichiers de sauvegarde automatique au démarrage d’une nouvelle partie. -model.option.confirmSaveOverwrite.name=Confirmer l’écrasement de l’enregistrement : +model.option.confirmSaveOverwrite.name=Confirmer l’écrasement de l’enregistrement model.option.confirmSaveOverwrite.shortDescription=Option pour confirmer l’écrasement des fichiers existants. model.option.autoSavePrefix.name=Préfixe de sauvegarde automatique model.option.autoSavePrefix.shortDescription=Le préfixe pour les noms de fichiers auto-sauvegardés. model.option.lastTurnName.name=Nom du fichier du dernier tour model.option.lastTurnName.shortDescription=Le corps du nom du fichier d’enregistrement du dernier tour. -model.option.beforeLastTurnName.name=Nom d’avant le dernier tour -model.option.beforeLastTurnName.shortDescription=Le corps du nom du fichier de sauvegarde du tour avant le dernier +model.option.beforeLastTurnName.name=Nom du fichier de l’avant-dernier tour +model.option.beforeLastTurnName.shortDescription=Le corps du nom du fichier de sauvegarde de l’avat-dernier tour. clientOptions.warehouse.name=Options de l’entrepôt clientOptions.warehouse.shortDescription=Modifier le comportement par défaut de l’entrepôt et de la douane. model.option.customStock.name=Réserve des douanes @@ -1029,11 +1038,11 @@ model.option.stockAccountsForProduction.shortDescription=Les routes commerciales clientOptions.audio.name=Audio clientOptions.audio.shortDescription=Configuration audio clientOptions.audio.audioMixer.automatic=Autodétecter la sortie audio. -model.option.audioMixer.name=Sortie Audio +model.option.audioMixer.name=Sortie audio model.option.audioMixer.shortDescription=Le périphérique sélectionné pour jouer de la musique model.option.audioVolume.name=Volume audio model.option.audioVolume.shortDescription=Volume audio -model.option.audioAlerts.name=Alertes Audio +model.option.audioAlerts.name=Alertes audio model.option.audioAlerts.shortDescription=Activer les alertes audio clientOptions.other.name=Autre clientOptions.other.shortDescription=Options qui n’entrent pas dans les autres catégories @@ -1069,32 +1078,32 @@ model.ability.addTaxToBells.name=Ajoute une taxe aux cloches model.ability.addTaxToBells.shortDescription=Le taux de taxation agit comme un bonus à la production de cloches model.ability.alwaysOfferedPeace.name=Toujours offrir la paix model.ability.alwaysOfferedPeace.shortDescrption=Les nations européennes sont toujours préparées à offrir la paix -model.ability.ambushBonus.name=Bonus d’embûche -model.ability.ambushBonus.shortDescription=Bonus d’embûche lors de l’attaque d’unités en terrain ouvert. +model.ability.ambushBonus.name=Bonus d’embuscade +model.ability.ambushBonus.shortDescription=Bonus d’embuscade lors de l’attaque d’unités en terrain ouvert. model.ability.ambushPenalty.name=Pénalité d’embuscade -model.ability.ambushPenalty.shortDescription=Cette nation subit une pénalité liée aux risques d’embuscades -model.ability.ambushTerrain.name=Piéger le terrain +model.ability.ambushPenalty.shortDescription=Cette nation subit une pénalité liée aux risques d’embuscades. +model.ability.ambushTerrain.name=Terrain d’embuscade model.ability.ambushTerrain.shortDescription=Ce terrain est propice aux embuscades model.ability.armed.name=Armé model.ability.armed.shortDescription=Unités qui sont armées model.ability.autoProduction.name=Production automatique -model.ability.autoProduction.shortDescription=Produire les biens même lorsqu'aucune unité n'est présente. +model.ability.autoProduction.shortDescription=Produire les biens même lorsqu’aucune unité n’est présente. model.ability.automaticEquipment.name=Équipement automatique -model.ability.automaticEquipment.shortDescription=Les unités peuvent s’équiper automatiquement pour défendre une colonie +model.ability.automaticEquipment.shortDescription=Les unités peuvent s’équiper automatiquement pour défendre une agglomération model.ability.automaticPromotion.name=Promotion automatique model.ability.automaticPromotion.shortDescription=Les unités sont promues automatiquement si elles gagnent un combat -model.ability.avoidExcessProduction.name=Éviter l'excès de production -model.ability.avoidExcessProduction.shortDescription=Ne jamais produire plus de bien qu'il peut en être stocké. +model.ability.avoidExcessProduction.name=Éviter l’excès de production +model.ability.avoidExcessProduction.shortDescription=Ne jamais produire plus de bien qu’il peut en être stocké. model.ability.betterForeignAffairsReport.name=Rapports des affaires étrangères améliorés model.ability.betterForeignAffairsReport.shortDescription=Le rapport des affaires étrangères inclut des informations supplémentaires model.ability.bombard.name=Bombarder model.ability.bombard.shortDescription=Unités qui peuvent bombarder model.ability.bombardShips.name=Bombarder les navires -model.ability.bombardShips.shortDescription=Bombarder les navires ennemis sur les tuiles d’eau adjacentes. +model.ability.bombardShips.shortDescription=Bombarder les navires ennemis sur les cases d’eau adjacentes. model.ability.bornInColony.name=Né dans la colonie model.ability.bornInColony.shortDescription=Unités nées dans la colonie -model.ability.bornInIndianSettlement.name=Né dans un campement indigène -model.ability.bornInIndianSettlement.shortDescription=Unités nées dans un campement indigène +model.ability.bornInIndianSettlement.name=Né dans une agglomération indigène +model.ability.bornInIndianSettlement.shortDescription=Unités nées dans une agglomération indigène model.ability.build.name=Construire model.ability.build.shortDescription=La capacité à construire des unités, des équipements ou des bâtiments, parfois d’un type particulier. model.ability.buildCustomHouse.name=Construire une douane @@ -1126,19 +1135,19 @@ model.ability.consumeAllOrNothing.shortDescription=Un consommateur qui peut cons model.ability.customHouseTradesWithForeignCountries.name=Commerce avec l’étranger via la douane model.ability.customHouseTradesWithForeignCountries.shortDescription=Vendre aux pays étrangers via la douane model.ability.demandTribute.name=Demander un tribut -model.ability.demandTribute.shortDescription=Cette unité peut demander un tribut à un campement ennemi -model.ability.demoteOnAllEquipLost.name=Rétrogradation sur perte de l’équipement +model.ability.demandTribute.shortDescription=Cette unité peut demander un tribut à une agglomération ennemie +model.ability.demoteOnAllEquipLost.name=Rétrogradation sur perte d’équipement model.ability.demoteOnAllEquipLost.shortDescription=Cette unité est rétrogradée si elle perd tout son équipement model.ability.denounceHeresy.name=Dénoncer l’hérésie model.ability.denounceHeresy.shortDescription=Unités qui peuvent dénoncer l’hérésie d’une mission ennemie -model.ability.disposeOnAllEquipLost.name=Détruire sur perte de l’équipement +model.ability.disposeOnAllEquipLost.name=Détruire sur perte d’équipement model.ability.disposeOnAllEquipLost.shortDescription=Cette unité est détruite si elle perd tout son équipement model.ability.disposeOnCombatLoss.name=Détruire sur défaite model.ability.disposeOnCombatLoss.shortDescription=Cette unité est détruite si elle perd un combat model.ability.dressMissionary.name=Habiller en missionnaire model.ability.dressMissionary.shortDescription=Fait de l’unité un missionnaire (non expert). model.ability.electFoundingFather.name=Élection des pères fondateurs -model.ability.electFoundingFather.shortDescription=Cette nation a la faculté d’élire ses pères fondateurs +model.ability.electFoundingFather.shortDescription=Cette nation a la faculté d’élire des pères fondateurs model.ability.establishMission.name=Établir une mission model.ability.establishMission.shortDescription=Capacité à établir une mission model.ability.evadeAttack.name=Se dérober à l’attaque @@ -1146,18 +1155,18 @@ model.ability.evadeAttack.shortDescription=Cette unité a la capacité de se dé model.ability.expertMissionary.name=Missionnaire expert model.ability.expertMissionary.shortDescription=Cette unité peut agir en tant que missionnaire expert model.ability.expertPioneer.name=Capacité de fonctionner comme pionnier expert -model.ability.expertPioneer.shortDescription=Cette unité peut agir en tant que colon expert +model.ability.expertPioneer.shortDescription=Cette unité peut agir en tant que pionnier expert model.ability.expertScout.name=Capacité de fonctionner comme éclaireur expert model.ability.expertScout.shortDescription=Cette unité peut agir en tant qu’éclaireur expert model.ability.expertSoldier.name=Capacité de fonctionner comme soldat expert model.ability.expertSoldier.shortDescription=Cette unité peut agir en tant que soldat expert model.ability.expertsUseConnections.name=Les experts utilisent des connexions model.ability.expertsUseConnections.shortDescription=Les unités expertes acquièrent des matières premières, même si aucune n’est disponible -model.ability.export.name=Exporter des biens +model.ability.export.name=Exporter des marchandises model.ability.export.shortDescription=Peut exporter des marchandises directement vers l’Europe model.ability.foundColony.name=Fonder une colonie model.ability.foundColony.shortDescription=Cette unité a la capacité de fonder une nouvelle colonie -model.ability.foundInLostCity.name=Trouvé dans les villes perdues +model.ability.foundInLostCity.name=Trouvé dans les cités perdues model.ability.foundInLostCity.shortDescription=Un type d’unité trouvé dans les cités perdues model.ability.foundsColonies.name=Fonde des colonies model.ability.foundsColonies.shortDescription=Cette nation a la capacité de fonder de nouvelles colonies. @@ -1175,7 +1184,7 @@ model.ability.independentNation.name=Nation indépendante model.ability.independentNation.shortDescription=Une nation indépendante model.ability.mercenaryUnit.name=Unité mercenaire model.ability.mercenaryUnit.shortDescription=Cette unité se trouve dans les forces mercenaires -model.ability.mounted.name=Monté +model.ability.mounted.name=Montée model.ability.mounted.shortDescription=Unités montées model.ability.moveToEurope.name=Aller en Europe model.ability.moveToEurope.shortDescription=Cette case permet aux unités d’aller en Europe @@ -1183,7 +1192,7 @@ model.ability.multipleAttacks.name=Attaques multiples model.ability.multipleAttacks.shortDescription=Cette unité peut attaquer plusieurs fois model.ability.native.name=Indien model.ability.native.shortDescription=Amérindien -model.ability.navalUnit.name=unité navale +model.ability.navalUnit.name=Unité navale model.ability.navalUnit.shortDescription=Cette unité est une unité navale model.ability.negotiate.name=Négocier model.ability.negotiate.shortDescription=Unités qui peuvent négocier avec le maire d’une colonie @@ -1194,15 +1203,15 @@ model.ability.pillageUnprotectedColony.shortDescription=Peut piller les colonies model.ability.piracy.name=Piraterie model.ability.piracy.shortDescription=Cette unité est une unité pirate model.ability.plunderNatives.name=Piller les indigènes -model.ability.plunderNatives.shortDescription=Améliore le montant du pillage lors de la destruction de villages indigènes +model.ability.plunderNatives.shortDescription=Améliore le montant du pillage lors de la destruction d’agglomérations indigènes model.ability.produceInWater.name=Produit dans l’eau model.ability.produceInWater.shortDescription=Les unités peuvent utiliser les cases d’eau aussi bien que les cases de terre -model.ability.refUnit.name=Unité de la REF -model.ability.refUnit.shortDescription=Cette unité est une unité de la REF -model.ability.repairUnits.name=Unités de réparation -model.ability.repairUnits.shortDescription=Peuvent réparer certains types d’unités endommagées +model.ability.refUnit.name=Unité du CER +model.ability.refUnit.shortDescription=Cette unité appartient au CER +model.ability.repairUnits.name=Unité de réparation +model.ability.repairUnits.shortDescription=Peut réparer certains types d’unités endommagées model.ability.royalExpeditionaryForce.name=Corps expéditionnaire royal -model.ability.royalExpeditionaryForce.shortDescription=Une nation du Corps expéditionnaire royal. +model.ability.royalExpeditionaryForce.shortDescription=Cette nation peut produire un Corps expéditionnaire royal model.ability.rumoursAlwaysPositive.name=Les rumeurs sont toujours positives model.ability.rumoursAlwaysPositive.shortDescription=Enquêter sur les rumeurs a toujours un résultat positif model.ability.seeAllColonies.name=Voir toutes les colonies @@ -1210,7 +1219,7 @@ model.ability.seeAllColonies.shortDescription=Peut voir toutes les colonies étr model.ability.selectRecruit.name=Sélectionner les recrues model.ability.selectRecruit.shortDescription=Capacité à sélectionner les recrues model.ability.speakWithChief.name=Parler avec le chef -model.ability.speakWithChief.shortDescription=Cette unité peut parler avec le chef d’un campement indigène +model.ability.speakWithChief.shortDescription=Cette unité peut parler avec le chef d’une agglomération indigène model.ability.spyOnColony.name=Espionner la colonie model.ability.spyOnColony.shortDescription=Cette unité peut espionner les colonies étrangères model.ability.supportUnit.name=Unité de soutien @@ -1219,7 +1228,7 @@ model.ability.teach.name=Enseigner les compétences model.ability.teach.shortDescription=Les unités expertes peuvent enseigner aux autres leurs compétences model.ability.tradeWithForeignColonies.name=Commercer avec les colonies étrangères model.ability.tradeWithForeignColonies.shortDescription=Capacité à commercer avec les colonies étrangères -model.ability.undead.name=Mort-vivant +model.ability.undead.name=Morte-vivante model.ability.undead.shortDescription=Une unité d’outre-tombe model.modifier.bombardBonus.name=Bombardement bonifié model.modifier.bombardBonus.shortDescription=Les unités de cette nation bénéficient d’un bombardement bonifié. @@ -1231,7 +1240,7 @@ model.modifier.buildingPriceBonus.name=Bonus de prix de construction model.modifier.cargoPenalty.name=Pénalité de chargement model.modifier.cargoPenalty.shortDescription=Pénalité par chargement à l’efficacité de combat model.modifier.consumeOnlySurplusProduction.name=Quantité de surplus consommée -model.modifier.consumeOnlySurplusProduction.shortDescription=Ne consommer qu'une partie du surplus de production, pas les biens stockés. +model.modifier.consumeOnlySurplusProduction.shortDescription=Ne consomme qu’une partie du surplus de production, sans affecter les biens stockés. model.modifier.conversionAlarmRate.name=Alarme de conversion model.modifier.conversionSkill.name=Compétence de conversion model.modifier.defence.name=Bonus de défense @@ -1248,21 +1257,21 @@ model.modifier.nativeAlarmModifier.shortDescription=Cette nation suscite moins d model.modifier.nativeConvertBonus.name=Conversion des indigènes bonifiée model.modifier.nativeConvertBonus.shortDescription=Cette nation convertit davantage d’indigènes. model.modifier.offence.name=Bonus d’attaque -model.modifier.offenceAgainst.name=Infraction contre -model.modifier.offenceAgainst.shortDescription=Améliore les chances de victoire lors d'attaques. +model.modifier.offenceAgainst.name=Attaque contre +model.modifier.offenceAgainst.shortDescription=Améliore les chances de victoire lors d’attaques. model.modifier.religiousUnrestBonus.name=Troubles religieux bonifiés model.modifier.religiousUnrestBonus.shortDescription=Les troubles religieux au sein de cette nation sont plus importants. model.modifier.sailHighSeas.name=Bonus de navigation en haute mer model.modifier.tileTypeChangeProduction.name=Rendement du bois -model.modifier.tileTypeChangeProduction.shortDescription=Augmente la quantité de bois d'œuvre produite lors du défrichement des forêts. +model.modifier.tileTypeChangeProduction.shortDescription=Augmente la quantité de bois d’œuvre produite lors du défrichement des forêts. model.modifier.tradeBonus.name=Commerce bonifié model.modifier.tradeBonus.shortDescription=Cette nation a un commerce bonifié. model.modifier.tradeVolumePenalty.name=Pénalité de volume de commerce model.modifier.tradeVolumePenalty.shortDescription=Diminue le volume de commerce avec les indigènes. model.modifier.treasureTransportFee.name=Frais de transport d’un trésor -model.modifier.warehouseStorage.description=Entrepôt de stockage -model.modifier.warehouseStorage.name=Stockage en magasin -model.modifier.warehouseStorage.shortDescription=Stockage du magasin +model.modifier.warehouseStorage.description=Entreposage +model.modifier.warehouseStorage.name=Entreposage +model.modifier.warehouseStorage.shortDescription=Entreposage model.source.ambushBonus.name=Bonification d’embuscade model.source.amphibiousAttack.name=Attaque amphibie model.source.artilleryAgainstRaid.name=Artillerie contre raid @@ -1271,93 +1280,93 @@ model.source.attackBonus.name=Bonification d’attaque model.source.baseDefence.name=Défense de base model.source.baseOffence.name=Attaque de base model.source.cargoPenalty.name=Pénalité de cargaison -model.source.colonyGoodsParty.name=Goods Party +model.source.colonyGoodsParty.name=Protestation anti-taxes model.source.fortified.name=Fortifié model.source.movementPenalty.name=Pénalité de mouvement model.source.shipTradePenalty=Pénalité de commerce maritime model.source.solModifier.name=Fils de la Liberté / Conservateurs model.building.armory.name=Armurerie -model.building.armory.description=L’armurerie est utilisée pour produire des mousquets à partir d’outils. Dès que la population atteint 8, l’armurerie peut être améliorée en poudrière et ensuite en arsenal pourvu qu’Adam Smith ait rejoint le congrès continental.\n\nAprès sa construction vous pouvez produire des mousquets et de l’artillerie. +model.building.armory.description=L’armurerie est utilisée pour produire des mousquets à partir d’outils. Dès que la population atteint 8, l’armurerie peut être améliorée en poudrière et ensuite en arsenal pourvu qu’Adam Smith ait rejoint le Congrès continental.\n\nAprès sa construction vous pouvez produire des mousquets et de l’artillerie. model.building.arsenal.name=Arsenal model.building.arsenal.description=L’arsenal sert à produire des mousquets à partir d’outils.\n\nAprès sa construction, la production de mousquets nécessite moitié moins d’outils. model.building.blacksmithHouse.name=Forge -model.building.blacksmithHouse.description=La forge, qui peut être améliorée en aciérie, sert à transformer le minerai en outils. Les outils servent à construire ou à améliorer certains bâtiments. Les outils peuvent également être utilisés pour les travaux extérieurs des pionniers ou pour la production de mousquets. Lorsque la colonie a atteint une population de 8, la forge peut être remplacée par une usine sidérurgique pourvu qu’Adam Smith ait rejoint le congrès continental. +model.building.blacksmithHouse.description=La forge, qui peut être améliorée en aciérie, sert à transformer le minerai en outils. Les outils servent à construire ou à améliorer certains bâtiments. Les outils peuvent également être utilisés pour les travaux extérieurs des pionniers ou pour la production de mousquets. Lorsque la colonie a atteint une population de 8, l’aciérie peut être remplacée par une usine sidérurgique pourvu qu’Adam Smith ait rejoint le Congrès continental. model.building.blacksmithShop.name=Aciérie -model.building.blacksmithShop.description=L’aciérie, qui peut être améliorée en usine sidérurgique, sert à transformer le minerai en outils. Les outils servent à construire ou à améliorer certains bâtiments. Les outils peuvent également être utilisés pour les travaux extérieurs des pionniers ou pour la production de mousquets. Lorsque la colonie a atteint une population de 8, la forge peut être remplacée par une usine sidérurgique pourvu qu’Adam Smith ait rejoint le congrès continental.\n\nUne aciérie améliore la production d’outils. -model.building.carpenterHouse.name=Menuiserie -model.building.carpenterHouse.description=La menuiserie peut être améliorée en Scierie lorsque la population atteint 3 colons. Ce bâtiment permet la conversion de bois en marteaux nécessaires pour construire toutes sortes de bâtiments.\n\nAutomatiquement construit lors de la fondation d’une nouvelle colonie. +model.building.blacksmithShop.description=L’aciérie, qui peut être améliorée en usine sidérurgique, sert à transformer le minerai en outils. Les outils servent à construire ou à améliorer certains bâtiments. Les outils peuvent également être utilisés pour les travaux extérieurs des pionniers ou pour la production de mousquets. Lorsque la colonie a atteint une population de 8, l’aciérie peut être remplacée par une usine sidérurgique pourvu qu’Adam Smith ait rejoint le Congrès continental.\n\nUne aciérie améliore la production d’outils. +model.building.carpenterHouse.name=Charpenterie +model.building.carpenterHouse.description=La charpenterie peut être améliorée en scierie lorsque la population atteint 3 colons. Ce bâtiment permet la conversion de bois en marteaux nécessaires pour construire toutes sortes de bâtiments.\n\nAutomatiquement construit lors de la fondation d’une nouvelle colonie. model.building.cathedral.name=Cathédrale model.building.cathedral.description=Une colonie avec une population de 3 peut construire une église, qui peut être améliorée en cathédrale lorsque la population atteint 8. La liberté religieuse du Nouveau Monde (symbolisée par des croix) cause une émigration croissante depuis l’Europe.\n\nUne cathédrale augmente la production de croix. model.building.chapel.name=Chapelle model.building.chapel.description=La chapelle est un lieu où les colons pratiquent leur religion. Une chapelle produit une petite quantité de croix mais aucun prêtre ne peut y être affecté. Pour cela il faut d’abord construire une église. model.building.church.name=Église model.building.church.description=Une colonie avec une population de 3 peut construire une église, qui peut être améliorée en cathédrale lorsque la population atteint 8. La liberté religieuse du Nouveau Monde (symbolisée par des croix) cause une émigration croissante depuis l’Europe.\n\nConstruire une église augmente la production de croix et vous permet de former des missionnaires. -model.building.cigarFactory.name=Usine de cigares -model.building.cigarFactory.description=L’usine à cigares, qui ne peut être améliorée, sert à produire des cigares à partir de tabac.\n\nUne usine à cigares augmente la production de cigares. +model.building.cigarFactory.name=Cigarerie +model.building.cigarFactory.description=La cigarerie, qui ne peut être améliorée, sert à produire des cigares à partir de tabac.\n\nUne cigarerie augmente la production de cigares. model.building.college.name=Collège model.building.college.description=Une colonie avec une population de 4 peut construire une école, ce qui permet aux maîtres-artisans d’enseigner leur métier à un colon sans compétences particulières. Dès que la population a atteint 8, l’école peut être améliorée en collège dans lequel d’autres métiers peuvent être enseignés (par deux colons). Une fois que la population atteint 10, le collège peut être remplacé par une université dans laquelle toutes les compétences peuvent être enseignées (par trois colons).\n\nUn collège permet d’enseigner les compétences de niveau 2. model.building.country.name=Pâturage model.building.country.description=Les pâturages proches de votre colonie permettent aux chevaux de paître librement. Construire des écuries facilitera la reproduction des chevaux. -model.building.customHouse.name=Poste de douanes -model.building.customHouse.description=Le poste de douanes, qui peut être construit dès que Peter Stuyvesant a rejoint le congrès continental, permet l’exportation directe de biens vers l’Europe sans l’aide de bateaux. Il permet également de commercer avec des puissances étrangères après la déclaration d’indépendance. De plus, on peut contourner les boycotts. +model.building.customHouse.name=Douane +model.building.customHouse.description=La douane, qui peut être construite dès que Peter Stuyvesant a rejoint le Congrès continental, permet l’exportation directe de biens vers l’Europe sans l’aide de bateaux. Elle permet également de commercer avec des puissances étrangères après la déclaration d’indépendance. De plus, on peut contourner les boycotts. model.building.depot.name=Dépôt -model.building.depot.description=Un dépôt conserve toutes sorte de produits. Sa capacité initiale est de 100 unités pour chaque type de produit. Il peut être amélioré en entrepôt ayant une capacité de 200 unités par produit. Construire une extension d’entrepôt augmente la capacité à 300 unités par produit. -model.building.distillerHouse.name=Maison du bouilleur -model.building.distillerHouse.description=La maison du bouilleur, qui peut être améliorée en distillerie, sert à produire du rhum à partir du sucre de canne. Une fois qu’Adam Smith a rejoint le congrès et que la colonie a atteint une population de 8, la distillerie peut être remplacée par une usine de spiritueux. +model.building.depot.description=Un dépôt conserve toutes sorte de marchandises. Sa capacité initiale est de 100 unités pour chaque type de marchandise. Il peut être amélioré en entrepôt ayant une capacité de 200 unités par marchandise. Construire une extension d’entrepôt augmente la capacité à 300 unités par marchandise. +model.building.distillerHouse.name=Bouilleur +model.building.distillerHouse.description=Le bouilleur, qui peut être amélioré en distillerie, sert à produire du rhum à partir du sucre de canne. Une fois qu’Adam Smith a rejoint le Congrès continental et que la colonie a atteint une population de 8, la distillerie peut être remplacée par une rhumerie. model.building.docks.name=Quais model.building.docks.description=Les quais autorisent la pêche sur les cases proches de la colonie. Ils peuvent être améliorés en cales sèches lorsque la population atteint 4. model.building.drydock.name=Cale sèche -model.building.drydock.description=La cale sèche permet la réparation de bateaux. Quand la population atteint 8 elle peut être améliorée en chantier naval. +model.building.drydock.description=La cale sèche permet la réparation de bateaux et la pêche en haute mer. Quand la population atteint 8 elle peut être améliorée en chantier naval qui permet la construction de navires. model.building.fort.name=Fort model.building.fort.description=Le fort, qui peut être construit après une palissade, protège les colons des attaques et bombarde les navires ennemis. Le fort peut être remplacé par une forteresse lorsque la population atteint 8.\n\nConstruire un fort bonifie la défense de 150%. model.building.fortress.name=Forteresse -model.building.fortress.description=La forteresse, qui peut être construite après un fort, protège les colons des attaques et bombarde les navires ennemis.\n\nConstruire une forteresse bonifie la défense de 150%. +model.building.fortress.description=La forteresse, qui peut être construite après un fort, protège les colons des attaques et bombarde les navires ennemis.\n\nConstruire une forteresse bonifie la défense de 200%. model.building.furFactory.name=Usine de fourrures model.building.furFactory.description=L’usine de fourrures, qui ne peut être améliorée, sert à produire des pelisses à partir de fourrures. Une usine de fourrures augmente la production de pelisses. model.building.furTraderHouse.name=Maison du fourreur -model.building.furTraderHouse.description=La maison du fourreur, qui peut être améliorée en atelier de fourrures, sert à produire des pelisses à partir de fourrures. Une fois que la colonie a atteint une population de 6, elle peut être améliorée en usine de fourrures pourvu qu’Adam Smith ait rejoint le congrès continental. +model.building.furTraderHouse.description=La maison du fourreur, qui peut être améliorée en atelier de fourrures, sert à produire des pelisses à partir de fourrures. Une fois que la colonie a atteint une population de 6, elle peut être améliorée en usine de fourrures pourvu qu’Adam Smith ait rejoint le Congrès continental. model.building.furTradingPost.name=Atelier de fourrures -model.building.furTradingPost.description=L’atelier de fourrures sert à produire des pelisses à partir de fourrures. Une fois que la colonie a atteint une population de 6, il peut être amélioré en usine de fourrures pourvu qu’Adam Smith ait rejoint le congrès continental. Un atelier de fourrures augmente la production de pelisses. +model.building.furTradingPost.description=L’atelier de fourrures sert à produire des pelisses à partir de fourrures. Une fois que la colonie a atteint une population de 6, il peut être amélioré en usine de fourrures pourvu qu’Adam Smith ait rejoint le Congrès continental. Un atelier de fourrures augmente la production de pelisses. model.building.ironWorks.name=Usine sidérurgique -model.building.ironWorks.description=L’usine sidérurgique, qui ne peut être améliorée, sert à transformer le minerai en outils. Les outils servent à construire ou à améliorer certains bâtiments. Les outils peuvent également être utilisés pour les travaux extérieurs des pionniers ou pour la production de mousquets. Lorsque la colonie a atteint une population de 8, la forge peut être remplacée par une usine sidérurgique pourvu qu’Adam Smith ait rejoint le congrès continental.\n\nUne usine sidérurgique améliore la production d’outils. +model.building.ironWorks.description=L’usine sidérurgique, qui ne peut être améliorée, sert à transformer le minerai en outils. Les outils servent à construire ou à améliorer certains bâtiments. Les outils peuvent également être utilisés pour les travaux extérieurs des pionniers ou pour la production de mousquets. Lorsque la colonie a atteint une population de 8, l’aciérie peut être remplacée par une usine sidérurgique pourvu qu’Adam Smith ait rejoint le Congrès continental.\n\nUne usine sidérurgique améliore la production d’outils. model.building.lumberMill.name=Scierie -model.building.lumberMill.description=La scierie, qui ne peut être améliorée, augmente la production de marteaux. Les marteaux sont nécessaires pour construire toutes sortes de bâtiments. +model.building.lumberMill.description=La scierie, qui ne peut être améliorée, augmente la production de marteaux à partir de bois. Les marteaux sont nécessaires pour construire toutes sortes de bâtiments. model.building.magazine.name=Poudrière -model.building.magazine.description=La poudrière sert à produire des mousquets à partir d’outils. La poudrière peut être améliorée en arsenal pourvu qu’Adam Smith ait rejoint le congrès continental.\n\nAprès sa construction la production de mousquets augmente de 100%. +model.building.magazine.description=La poudrière sert à produire des mousquets à partir d’outils. La poudrière peut être améliorée en arsenal pourvu qu’Adam Smith ait rejoint le Congrès continental.\n\nAprès sa construction la production de mousquets augmente de 100%. model.building.newspaper.name=Journal model.building.newspaper.description=Le journal, que l’on peut construire après une imprimerie dès que la population atteint 4, augmente la production de cloches de la Liberté. model.building.printingPress.name=Imprimerie model.building.printingPress.description=L’imprimerie, qui peut être améliorée en journal dès que la population atteint 4, augmente la production de cloches de la Liberté. model.building.rumDistillery.name=Distillerie -model.building.rumDistillery.description=La distillerie sert à produire du rhum à partir du sucre de canne. Une fois qu’Adam Smith a rejoint le congrès et que la colonie a atteint une population de 8, la distillerie peut être remplacée par une usine de spiritueux.\n\nUne distillerie augmente la production de rhum. -model.building.rumFactory.name=Usine de spiritueux -model.building.rumFactory.description=L’usine de spiritueux, qui ne peut être améliorée, sert à produire du rhum à partir du sucre de canne.\n\nUne usine de spiritueux augmente la production de rhum. +model.building.rumDistillery.description=La distillerie sert à produire du rhum à partir du sucre de canne. Une fois qu’Adam Smith a rejoint le Congrès continental et que la colonie a atteint une population de 8, la distillerie peut être remplacée par une rhumerie.\n\nUne distillerie augmente la production de rhum. +model.building.rumFactory.name=Rhumerie +model.building.rumFactory.description=La rhumerie, qui ne peut être améliorée, sert à produire du rhum à partir du sucre de canne.\n\nUne rhumerie augmente la production de rhum. model.building.schoolhouse.name=École -model.building.schoolhouse.description=Une colonie avec une population de 4 peut construire une école, ce qui permet aux maîtres-artisans d’enseigner leur métier à un colon sans compétences particulières. Dès que la population a atteint 8, l’école peut être améliorée en collège dans lequel d’autres métiers peuvent être enseignés (par deux colons). Une fois que la population atteint 10, le collège peut être remplacé par une université dans laquelle toutes les compétences peuvent être enseignées (par trois colons).\n\nUne école permet d’enseigner les compétences de niveau 1. +model.building.schoolhouse.description=Une colonie avec une population de 4 peut construire une école, ce qui permet aux maîtres-artisans d’enseigner leur métier aux colons sans compétences particulières. Dès que la population a atteint 8, l’école peut être améliorée en collège dans lequel d’autres métiers peuvent être enseignés (par deux colons). Une fois que la population atteint 10, le collège peut être remplacé par une université dans laquelle toutes les compétences peuvent être enseignées (par trois colons).\n\nUne école permet d’enseigner les compétences de niveau 1. model.building.shipyard.name=Chantier naval -model.building.shipyard.description=Le chantier naval permet de pêcher sur les cases adjacentes de la colonie et permet également la réparation et la construction de bateaux. -model.building.stables.name=Écuries -model.building.stables.description=Les écuries augmentent la production maximale de chevaux en réduisant la taille des troupeaux. +model.building.shipyard.description=Le chantier naval permet de pêcher sur les cases de haute mer adjacentes à la colonie et permet également la réparation et la construction de bateaux. +model.building.stables.name=Écurie +model.building.stables.description=L’écurie augmente la production maximale de chevaux en réduisant la taille des troupeaux. model.building.stockade.name=Palissade -model.building.stockade.description=La palissade, qui peut être construite dès que la population atteint 3 personnes, protège les colons des attaques. La palissade peut être améliorée en fort, qui donne une meilleure protection contre les bombardements des corsaires et unités navales ennemis sur les cases d’océan adjacentes. Le fort peut être remplacé par une forteresse dès que la population atteint 8 personnes.\n\nConstruire une palissade augmente la défense de 100%. +model.building.stockade.description=La palissade, qui peut être construite dès que la population atteint 3, protège les colons des attaques. La palissade peut être améliorée en fort, qui donne une meilleure protection contre les bombardements des corsaires et unités navales ennemis depuis les cases d’océan adjacentes. Le fort peut être remplacé par une forteresse dès que la population atteint 8 personnes.\n\nConstruire une palissade augmente la défense de 100%. model.building.textileMill.name=Usine textile model.building.textileMill.description=L’usine textile améliore la production de tissu à partir de coton. model.building.tobacconistHouse.name=Maison du planteur -model.building.tobacconistHouse.description=La maison du planteur, qui peut être améliorée en atelier de cigares, sert à produire des cigares à partir de tabac. Lorsque la colonie atteint une population de 8, elle peut être améliorée en usine à cigares, pourvu qu’Adam Smith ait rejoint le congrès continental.\n\nAutomatiquement construit lors de la fondation d’une nouvelle colonie. +model.building.tobacconistHouse.description=La maison du planteur, qui peut être améliorée en atelier de cigares, sert à produire des cigares à partir de tabac. Lorsque la colonie atteint une population de 8, elle peut être améliorée en cigarerie, pourvu qu’Adam Smith ait rejoint le Congrès continental.\n\nAutomatiquement construit lors de la fondation d’une nouvelle colonie. model.building.tobacconistShop.name=Atelier de cigares -model.building.tobacconistShop.description=L’atelier de cigares sert à produire des cigares à partir de tabac. Lorsque la colonie atteint une population de 8, il peut être améliorée en usine à cigares, pourvu qu’Adam Smith ait rejoint le congrès continental.\n\nUn atelier de cigares augmente la production de cigares. +model.building.tobacconistShop.description=L’atelier de cigares sert à produire des cigares à partir de tabac. Lorsque la colonie atteint une population de 8, il peut être amélioré en cigarerie, pourvu qu’Adam Smith ait rejoint le Congrès continental.\n\nUn atelier de cigares augmente la production de cigares. model.building.townHall.name=Hôtel de ville -model.building.townHall.description=L’Hôtel de ville, qui ne peut pas être amélioré, peut contenir trois colons pour la production de cloches de la Liberté. Son effet peut-être augmenté par la construction d’une imprimerie et d’un journal. +model.building.townHall.description=L’hôtel de ville, qui ne peut pas être amélioré, peut contenir trois colons pour la production de cloches de la Liberté. Son effet peut être augmenté par la construction d’une imprimerie et d’un journal. model.building.university.name=Université -model.building.university.description=Une colonie avec une population de 4 peut construire une école, ce qui permet aux maîtres-artisans d’enseigner leur métier à un colon sans compétences particulières. Dès que la population a atteint 8, l’école peut être améliorée en collège dans lequel d’autres métiers peuvent être enseignés (par deux colons). Une fois que la population atteint 10, le collège peut être remplacé par une université dans laquelle toutes les compétences peuvent être enseignées (par trois colons).\n\nUne université permet d’enseigner les compétences de niveau 3. +model.building.university.description=Une colonie avec une population de 4 peut construire une école, ce qui permet aux maîtres-artisans d’enseigner leur métier aux colons sans compétences particulières. Dès que la population a atteint 8, l’école peut être améliorée en collège dans lequel d’autres métiers peuvent être enseignés (par deux colons). Une fois que la population atteint 10, le collège peut être remplacé par une université dans laquelle toutes les compétences peuvent être enseignées (par trois colons).\n\nUne université permet d’enseigner les compétences de niveau 3. model.building.warehouse.name=Entrepôt -model.building.warehouse.description=Un entrepôt peut stocker toutes sortes de produits. Il permet de conserver 200 unités de plus pour chaque sorte de produit et peut être amélioré avec une extension pour en stocker encore 100 de plus. +model.building.warehouse.description=Un entrepôt peut stocker toutes sortes de marchandises. Il permet de conserver 200 unités de plus pour chaque marchandise et peut être amélioré avec une extension pour en stocker encore 100 de plus. model.building.warehouseExpansion.name=Extension d’entrepôt -model.building.warehouseExpansion.description=Une extension d’entrepôt peut stocker toutes sortes de produits. Elle permet de conserver 300 unités de chaque sorte de produit. +model.building.warehouseExpansion.description=Une extension d’entrepôt peut stocker toutes sortes de marchandises. Elle permet de conserver 300 unités de chaque marchandise. model.building.weaverHouse.name=Maison du tisserand -model.building.weaverHouse.description=La maison du tisserand, qui peut être améliorée en filature, permet de transformer le coton en tissu. Elle peut être améliorée en filature lorsque la population de la colonie atteint 8 et lorsque Adam Smith a rejoint le congrès continental. +model.building.weaverHouse.description=La maison du tisserand, qui peut être améliorée en filature, permet de transformer le coton en tissu. Elle peut être améliorée en filature lorsque la population de la colonie atteint 8 et lorsque Adam Smith a rejoint le Congrès continental. model.building.weaverShop.name=Filature -model.building.weaverShop.description=La filature, qui peut être améliorée en usine textile, sert à transformer le coton en tissu. Elle peut être améliorée en usine textile lorsque la population de la colonie atteint au moins 8 et lorsque Adam Smith a rejoint le congrès continental. Elle permet d’améliorer la production de tissu. +model.building.weaverShop.description=La filature, qui peut être améliorée en usine textile, sert à transformer le coton en tissu. Elle peut être améliorée en usine textile lorsque la population de la colonie atteint au moins 8 et lorsque Adam Smith a rejoint le Congrès continental. Elle permet d’améliorer la production de tissu. model.disaster.bankruptcy.name=Faillite model.disaster.blizzard.name=Blizzard model.disaster.brushfire.name=Feu de brousse @@ -1371,27 +1380,27 @@ model.disaster.sandstorm.name=Tempête de sable model.disaster.stormsurge.name=Tsunami model.disaster.tornado.name=Tornade model.disaster.effect.damagedUnit.name=Dommages aux unités -model.disaster.effect.damagedUnit=%unit% a été endommagé. +model.disaster.effect.damagedUnit=%unit% a été endommagé(e). model.disaster.effect.lossOfBuilding.name=Perte de bâtiments -model.disaster.effect.lossOfBuilding=%building% a été détruit. +model.disaster.effect.lossOfBuilding=%building% a été détruit(e). model.disaster.effect.lossOfBuildingProduction.name=Perte de production de bâtiments -model.disaster.effect.lossOfBuildingProduction=Des bâtiments ont été endommagés. Les pénalités de production s'appliquent. +model.disaster.effect.lossOfBuildingProduction=Des bâtiments ont été endommagés. Les pénalités de production s’appliquent. model.disaster.effect.lossOfGoods.name=Perte de marchandises -model.disaster.effect.lossOfGoods=%goods% ont été perdus. -model.disaster.effect.lossOfMoney.name=Perte d'argent -model.disaster.effect.lossOfMoney=%amount% d'or ont été perdus. +model.disaster.effect.lossOfGoods=%goods% ont été perdu(e)s. +model.disaster.effect.lossOfMoney.name=Perte d’or +model.disaster.effect.lossOfMoney=%amount% d’or ont été perdus. model.disaster.effect.lossOfTileProduction.name=Perte de production de cases -model.disaster.effect.lossOfTileProduction=Les champs et les forêts ont été endommagés. Les pénalités de production s'appliquent. -model.disaster.effect.lossOfUnit.name=Perte d'unités -model.disaster.effect.lossOfUnit=%unit% a été perdu. +model.disaster.effect.lossOfTileProduction=Les champs et les forêts ont été endommagés. Les pénalités de production s’appliquent. +model.disaster.effect.lossOfUnit.name=Perte d’unités +model.disaster.effect.lossOfUnit=%unit% a été perdu(e). model.event.boycottsLifted.name=Les boycotts sont levés -model.event.declareIndependence.name=Déclarer l'indépendance +model.event.declareIndependence.name=Déclarer l’indépendance model.event.freeBuilding.name=Les bâtiments sont fournis gratuitement model.event.increaseSonsOfLiberty.name=Augmentation du sentiment de rébellion model.event.movementChange.name=Le mouvement est modifié model.event.newRecruits.name=Modification des recrues européennes model.event.resetBannedMissions.name=Les autochtones accepteront vos missionnaires de nouveau -model.event.resetNativeAlarm.name=L’alarme chez les indigènes est supprimée +model.event.resetNativeAlarm.name=L’inquiétude des indigènes est supprimée model.event.seeAllColonies.name=Toutes les colonies deviennent visibles model.event.spanishSuccession.name=Achèvement de la Guerre de Succession espagnole model.foundingFather.adamSmith.description=Active la construction d’usines. @@ -1400,7 +1409,7 @@ model.foundingFather.jacobFugger.description=Tous les boycotts en cours prennent model.foundingFather.jacobFugger.text=Richissime négociant et banquier allemand, Jacob Fugger étendit son entreprise familiale jusqu’à la mer Adriatique. Il prêta même de l’argent aux empereurs Maximilien et Charles V. model.foundingFather.jacobFugger.birthAndDeath=1459-1525 model.foundingFather.peterMinuit.description=Les Indiens ne demandent plus à être payés en échange de leurs terres. -model.foundingFather.peterMinuit.text=Peter Minuit acheta aux indigènes, pour environ soixante florins hollandais seulement, ce qui devint plus tard l’île de Manhattan +model.foundingFather.peterMinuit.text=Peter Minuit acheta aux indigènes, pour environ soixante florins hollandais seulement, ce qui devint plus tard l’île de Manhattan. model.foundingFather.peterStuyvesant.description=La construction de douanes devient possible. model.foundingFather.peterStuyvesant.text=Peter Stuyvesant fut le dernier gouverneur de Nouvelle-Hollande, avant que les anglais ne s’en emparent et rebaptisent la Nouvelle-Amsterdam en Nouvelle-York (New York). model.foundingFather.janDeWitt.name=Johan de Witt @@ -1414,15 +1423,15 @@ model.foundingFather.franciscoDeCoronado.text=Francisco Vásquez de Coronado fut model.foundingFather.hernandoDeSoto.description=L’exploration d’éventuelles cités perdues ne donne jamais de résultat négatif, et toutes vos unités peuvent voir plus loin. model.foundingFather.hernandoDeSoto.text=Conquistador espagnol, Hernando de Soto fut le premier Européen à découvrir la Floride, ainsi que six autres actuels états du sud-est des États-Unis. model.foundingFather.henryHudson.description=Vos trappeurs ramènent deux fois plus de fourrures. -model.foundingFather.henryHudson.text=Navigateur anglais, Henry Hudson explora une grande partie des côtes du nord-est américain. Son premier objectif était de découvrir une route maritime vers l’Asie en passant par le pôle Nord. +model.foundingFather.henryHudson.text=Navigateur anglais, Henry Hudson explora une grande partie des côtes du nord-est américain. Son premier objectif était de découvrir une route maritime vers l’Asie en passant par le passage du Nord-Ouest. model.foundingFather.laSalle.name=Robert La Salle model.foundingFather.laSalle.description=Toutes vos colonies, existantes et futures, acquièrent une palissade dès qu’elles comptent trois habitants. -model.foundingFather.laSalle.text=René Robert Cavalier de La Salle découvrit l’Ohio et descendit le Mississipi jusqu’au golfe du Mexique, pour conquérir et fonder la Louisiane en l’honneur du Roi de France. Durant ses expéditions, il établit de nombreux forts tels que le fort Frontenac sur le lac Ontario, ou encore le fort Saint-Louis dans l’actuel Texas. +model.foundingFather.laSalle.text=René-Robert Cavelier de La Salle découvrit l’Ohio et descendit le Mississippi jusqu’au golfe du Mexique, pour conquérir et fonder la Louisiane en l’honneur du Roi de France. Durant ses expéditions, il établit de nombreux forts tels que le fort Frontenac sur le lac Ontario, ou encore le fort Saint-Louis dans l’actuel Texas. model.foundingFather.hernanCortes.name=Hernán Cortés -model.foundingFather.hernanCortes.description=La conquête des camps indigènes se solde toujours par un trésor abondant que les galions du Roi transporteront gracieusement jusqu’en Europe. -model.foundingFather.hernanCortes.text=Le célèbre conquistador espagnol Hernán Cortés Monroy Pissaro Altamirano vainquit l’empire aztèque et en pilla les richesses et sanctuaires. +model.foundingFather.hernanCortes.description=La conquête des agglomérations indigènes se solde toujours par un trésor abondant que les galions du Roi transporteront gracieusement jusqu’en Europe. +model.foundingFather.hernanCortes.text=Le célèbre conquistador espagnol Fernando Cortés de Monroy Pizarro Altamirano vainquit l’empire aztèque et en pilla les richesses et sanctuaires. model.foundingFather.georgeWashington.description=Les soldats et dragons qui gagnent un combat montent automatiquement en grade quand c’est possible. -model.foundingFather.georgeWashington.text=Le Général George Washington dirigea l’Armée continentale pendant la guerre d’indépendance des États-Unis d’Amérique. Sa victoire contre les britanniques et son charisme le menèrent à être nommé premier président de la nouvelle nation. +model.foundingFather.georgeWashington.text=Le Général George Washington dirigea l’Armée continentale pendant la guerre d’indépendance des États-Unis d’Amérique. Sa victoire contre les Britanniques et son charisme le menèrent à être nommé premier président de la nouvelle nation. model.foundingFather.paulRevere.description=Quand une colonie sans défense est attaquée, un colon prend automatiquement les armes (s’il y en a en réserve) et défend sa patrie avec bravoure. model.foundingFather.paulRevere.text=Paul Revere était un simple artisan américain quand il partit à cheval prévenir les fermiers de Lexington de l’arrivée des soldats britanniques. Il fut capturé et libéré plus tard alors que les Britanniques devaient battre en retraite le plus rapidement possible après leur défaite. model.foundingFather.francisDrake.description=La puissance de feu de tous vos navires corsaires augmente de moitié. @@ -1434,13 +1443,13 @@ model.foundingFather.thomasJefferson.text=Grand homme d’État, Thomas Jefferso model.foundingFather.pocahontas.description=Toutes les tensions avec les indigènes sont apaisées, et ceux-ci s’inquiètent désormais deux fois moins vite. model.foundingFather.pocahontas.text=Médiatrice entre les pionniers de Jamestown et les indigènes amérindiens, Pocahontas est notamment connue pour avoir fait porter des vivres aux colons affamés pendant les périodes difficiles. Elle s’est convertie plus tard au christianisme et épousa un colon anglais. model.foundingFather.thomasPaine.description=Les cloches de la Liberté résonnent de plus en plus dans vos colonies, proportionnellement au taux d’imposition. -model.foundingFather.thomasPaine.text=L’écrivain anglais Thomais Paine émigra aux États-Unis et prit parti pour les insurgés. Son pamphlet « le Sens commun » guida la pensée des patriotes de toutes les colonies. +model.foundingFather.thomasPaine.text=L’écrivain anglais Thomas Paine émigra aux États-Unis et prit parti pour les insurgés. Son pamphlet « le Sens commun » guida la pensée des patriotes de toutes les colonies. model.foundingFather.simonBolivar.name=Simón Bolívar -model.foundingFather.simonBolivar.description=La proportion d’indépendantistes augmente de 20 % dans chacune de vos colonies. +model.foundingFather.simonBolivar.description=La proportion d’indépendantistes (Fils de la Liberté) augmente de 20 % dans chacune de vos colonies. model.foundingFather.simonBolivar.text=Simón José Antonio de la Santísima Trinidad Bolívar y Palacios libéra la Nouvelle-Grenade de l’emprise espagnole. Il libéra également les colonies voisines et devint ainsi le premier président de la Fédération de Grande-Colombie. model.foundingFather.benjaminFranklin.description=Les déclarations de guerre royales n’affectent plus vos relations dans le Nouveau Monde. Les colons européens du Nouveau Monde offrent désormais toujours la paix lors de négociations. model.foundingFather.benjaminFranklin.text=En contribuant à la rédaction de la Déclaration d’indépendance des États-Unis, Benjamin Franklin était une des voix de la Révolution américaine. Il voyagea beaucoup entre l’Europe et les colonies afin de s’assurer le soutien des Français dans la Guerre d’indépendance. -model.foundingFather.williamBrewster.description=Les criminels et serviteurs ne viennent plus sur les docks, et vous pouvez choisir quel émigrant se présentera sur les docks. +model.foundingFather.williamBrewster.description=Les criminels et serviteurs ne viennent plus sur les quais, et vous pouvez choisir quel émigrant se présentera sur les quais. model.foundingFather.williamBrewster.text=William Brewster était un père supérieur puritain qui organisa la colonisation de Plymouth en Nouvelle-Angleterre. model.foundingFather.williamPenn.description=Le nombre de croix dans vos colonies augmente plus vite de moitié. model.foundingFather.williamPenn.text=William Penn fonda et gouverna ce qui devint plus tard la Pennsylvanie, pour pouvoir y pratiquer sa religion en toute liberté. La colonie quaker (protestante) prospéra tant et si bien que Philadelphie devint la première capitale des États-Unis des décennies plus tard. @@ -1448,8 +1457,8 @@ model.foundingFather.fatherJeanDeBrebeuf.name=Jean de Brébeuf model.foundingFather.fatherJeanDeBrebeuf.description=Tous les missionnaires sont des experts. model.foundingFather.fatherJeanDeBrebeuf.text=Ce missionnaire jésuite sympathisa avec les Indiens hurons et en convertit un certain nombre au christianisme. Il fut capturé et tué par les Iroquois dans une bataille qu’ils gagnèrent contre les Hurons. model.foundingFather.juanDeSepulveda.name=Juan de Sepúlveda -model.foundingFather.juanDeSepulveda.description=Augmente de 20 % la chance que la population des camps indigènes « se convertisse » et joigne vos colonies. -model.foundingFather.juanDeSepulveda.text=Juan Ginés de Sepúlveda était un théologien espagnol et fervent défenseur du droit pour l’Espagne à conquérir, coloniser et évangéliser le Nouveau Monde. +model.foundingFather.juanDeSepulveda.description=Augmente de 20 % la chance que la population des agglomérations indigènes « se convertisse » et joigne vos colonies. +model.foundingFather.juanDeSepulveda.text=Juan Ginés de Sepúlveda était un théologien espagnol et fervent défenseur du droit de l’Espagne à conquérir, coloniser et évangéliser le Nouveau Monde. model.foundingFather.bartolomeDeLasCasas.name=Bartolomé de Las Casas model.foundingFather.bartolomeDeLasCasas.description=Tous les Indiens convertis deviennent des colons libres. model.foundingFather.bartolomeDeLasCasas.text=Prêtre dominicain qui voyagea à travers les colonies espagnoles, convertissant les Indiens et châtiant les Espagnols pour leurs mauvais traitements envers les indigènes souvent massacrés ou réduits en esclavage. @@ -1460,83 +1469,83 @@ model.foundingFather.political=Politique model.foundingFather.religious=Religieux model.goods.bells.name={{plural:%amount%|one=cloche|other=cloches|default=cloches}} model.goods.bells.description=Les cloches de la Liberté représentent le désir d’indépendance des colons. -model.goods.bells.workAs=Travailler comme homme d'état %claim%(%amount% Cloches) +model.goods.bells.workAs=Travailler comme homme d’État %claim% (%amount% cloches) model.goods.bells.workingAs=un homme d’État model.goods.cigars.name={{plural:%amount%|one=cigare|other=cigares|default=cigares}} model.goods.cigars.description=Les cigares sont fabriqués à partir du tabac. Ce sont des marchandises de luxe, donc leur prix est très élevé. -model.goods.cigars.workAs=Travailler comme marchand de tabac %claim%(%amount% cigares) +model.goods.cigars.workAs=Travailler comme marchand de tabac %claim% (%amount% cigares) model.goods.cigars.workingAs=un marchand de tabac model.goods.cloth.name={{plural:%amount%|one=tissu|other=tissus|default=tissus}} model.goods.cloth.description=Le tissu est fabriqué à partir du coton. -model.goods.cloth.workAs=Travailler comme tisserand %claim%(%amount% vêtements) +model.goods.cloth.workAs=Travailler comme tisserand %claim% (%amount% tissus) model.goods.cloth.workingAs=un tisserand -model.goods.coats.name={{plural:%amount%|one=manteau|other=manteaux|default=manteaux}} +model.goods.coats.name={{plural:%amount%|one=pelisse|other=pelisses|default=pelisses}} model.goods.coats.description=Les pelisses sont fabriquées à partir des fourrures d’animaux. -model.goods.coats.workAs=Travailler comme marchand de fourrures %claim%(%amount% Vestes) +model.goods.coats.workAs=Travailler comme marchand de fourrures %claim% (%amount% pelisses) model.goods.coats.workingAs=un fourreur model.goods.cotton.name={{plural:%amount%|one=coton|other=coton|default=coton}} model.goods.cotton.description=Le coton peut être utilisé pour produire des tissus, qui sont vendus à prix plus élevés. -model.goods.cotton.workAs=Travailler comme planteur de coton %claim%(%amount% coton) +model.goods.cotton.workAs=Travailler comme planteur de coton %claim% (%amount% coton) model.goods.cotton.workingAs=un planteur de coton model.goods.crosses.name={{plural:%amount%|one=croix|other=croix|default=croix}} model.goods.crosses.description=Les croix représentent les troubles religieux en Europe et la liberté religieuse du Nouveau Monde. -model.goods.crosses.workAs=Travailler comme prédicateur %claim%(%amount% Croix) +model.goods.crosses.workAs=Travailler comme prédicateur %claim% (%amount% Croix) model.goods.crosses.workingAs=un prédicateur -model.goods.fish.name={{plural:%amount%|one=poisson|other=poissons|default=poisson}} +model.goods.fish.name={{plural:%amount%|one=poisson|other=poissons|default=poissons}} model.goods.fish.description=Les poissons sont vidés, salés et transformés en nourriture aussitôt qu’ils sont pêchés. -model.goods.fish.workAs=Travailler comme pêcheur %claim%(%amount% poisson) +model.goods.fish.workAs=Travailler comme pêcheur %claim% (%amount% poissons) model.goods.fish.workingAs=un pêcheur model.goods.food.name={{plural:%amount%|one=nourriture|other=nourriture|default=nourriture}} model.goods.food.description=La nourriture est nécessaire pour nourrir vos colons et vos chevaux. Un nouveau colon naît quand une colonie a 200 unités de nourriture ou plus. -model.goods.food.workAs=Travailler comme fermier %claim%(%amount% nourriture) +model.goods.food.workAs=Travailler comme fermier %claim% (%amount% nourriture) model.goods.food.workingAs=un fermier -model.goods.furs.name={{plural:%amount%|one=fourrure|other=fourrures|default=fourrure}} -model.goods.furs.description=Les fourrures d’animaux sont ramenées de la chasse. Elles peuvent être utilisées pour fabriquer des manteaux. -model.goods.furs.workAs=Travailler comme trappeur %claim%(%amount% fourrures) +model.goods.furs.name={{plural:%amount%|one=fourrure|other=fourrures|default=fourrures}} +model.goods.furs.description=Les fourrures d’animaux sont ramenées de la chasse. Elles peuvent être utilisées pour fabriquer des pelisses. +model.goods.furs.workAs=Travailler comme trappeur %claim% (%amount% fourrures) model.goods.furs.workingAs=un trappeur model.goods.grain.name={{plural:%amount%|one=céréales|other=céréales|default=céréales}} model.goods.grain.description=Les céréales, telles que le blé, le riz et le maïs, sont la source la plus importante de nourriture pour vos colonies. -model.goods.grain.workAs=Travailler comme cultivateur %claim%(%amount% céréales) -model.goods.grain.workingAs=un Fermier +model.goods.grain.workAs=Travailler comme cultivateur %claim% (%amount% céréales) +model.goods.grain.workingAs=un fermier model.goods.hammers.name={{plural:%amount%|one=marteau|other=marteaux|default=marteaux}} model.goods.hammers.description=Les marteaux représentent le travail de construction en cours dans vos colonies. -model.goods.hammers.workAs=Travailler comme charpentier %claim%(%amount% Marteaux) +model.goods.hammers.workAs=Travailler comme charpentier %claim% (%amount% marteaux) model.goods.hammers.workingAs=un charpentier model.goods.lumber.name={{plural:%amount%|one=bois de charpente|other=bois de charpente|default=bois de charpente}} -model.goods.lumber.description=Le bois de charpente est coupé en forêt. Il peut être utilisé pour construire certains bâtiments, ou certaines unités comme les bateaux. -model.goods.lumber.workAs=Travailler comme bûcheron %claim%(%amount% bois) +model.goods.lumber.description=Le bois de charpente est coupé en forêt. Il peut être utilisé pour construire certains bâtiments ou certaines unités comme les bateaux. +model.goods.lumber.workAs=Travailler comme bûcheron %claim% (%amount% bois) model.goods.lumber.workingAs=un bûcheron model.goods.meat.name={{plural:%amount%|one=viande|other=viande|default=viande}} model.goods.meat.description=La viande, telle que le bœuf, le porc et la venaison, est une source importante de protéines. -model.goods.meat.workAs=Travailler comme chasseur %claim%(%amount% viande) +model.goods.meat.workAs=Travailler comme chasseur %claim% (%amount% viande) model.goods.meat.workingAs=un chasseur model.goods.muskets.name={{plural:%amount%|one=mousquet|other=mousquets|default=mousquets}} model.goods.muskets.description=Les mousquets sont fabriqués à partir des outils. Ils peuvent être utilisés pour équiper des unités en infanterie ou cavalerie. -model.goods.muskets.workAs=Travailler comme armurier %claim%(%amount% Mousquets) +model.goods.muskets.workAs=Travailler comme armurier %claim% (%amount% mousquets) model.goods.muskets.workingAs=un armurier model.goods.ore.name={{plural:%amount%|one=minerai|other=minerai|default=minerai}} model.goods.ore.description=Le minerai peut-être utilisé pour fabriquer des outils, qui ont de nombreuses utilisations. -model.goods.ore.workAs=Travailler comme mineur %claim%(%amount% minerai) -model.goods.ore.workingAs=un mineur de minerai +model.goods.ore.workAs=Travailler comme mineur %claim% (%amount% minerai) +model.goods.ore.workingAs=un mineur model.goods.rum.name={{plural:%amount%|one=rhum|other=rhum|default=rhum}} model.goods.rum.description=Le rhum est un spiritueux fabriqué à partir de la canne à sucre. C’est une marchandise de luxe, donc son prix est très élevé. -model.goods.rum.workAs=Travailler comme fabricant d'alcool %claim%(%amount% rhum) +model.goods.rum.workAs=Travailler comme distillateur d’alcool %claim% (%amount% rhum) model.goods.rum.workingAs=un distillateur model.goods.silver.name={{plural:%amount%|one=argent|other=argent|default=argent}} model.goods.silver.description=L’argent est un métal précieux qui se vend au prix fort. -model.goods.silver.workAs=Travailler comme mineur d’argent %claim%(%amount% argent) +model.goods.silver.workAs=Travailler comme mineur d’argent %claim% (%amount% argent) model.goods.silver.workingAs=un mineur d’argent model.goods.sugar.name={{plural:%amount%|one=sucre|other=sucre|default=sucre}} model.goods.sugar.description=La canne à sucre est cultivée. Elle peut être utilisée pour fabriquer du rhum. -model.goods.sugar.workAs=Travailler comme planteur de canne %claim%(%amount% sucre) +model.goods.sugar.workAs=Travailler comme planteur de canne %claim% (%amount% sucre) model.goods.sugar.workingAs=un planteur de canne model.goods.tobacco.name={{plural:%amount%|one=tabac|other=tabac|default=tabac}} model.goods.tobacco.description=Le tabac peut être fumé ou utilisé pour produire des cigares, qui se vendent à prix plus élevés. -model.goods.tobacco.workAs=Travailler comme planteur de tabac %claim%(%amount% tabac) +model.goods.tobacco.workAs=Travailler comme planteur de tabac %claim% (%amount% tabac) model.goods.tobacco.workingAs=un planteur de tabac model.goods.tools.name={{plural:%amount%|one=outil|other=outils|default=outils}} model.goods.tools.description=Les outils sont fabriqués à partir du minerai. Ils peuvent être utilisés pour équiper une unité en pionnier, mais aussi pour construire des bâtiments et certaines unités comme les bateaux. Enfin ils peuvent être utilisés pour fabriquer des mousquets. -model.goods.tools.workAs=Travailler comme forgeron %claim%(%amount% Outils) +model.goods.tools.workAs=Travailler comme forgeron %claim% (%amount% outils) model.goods.tools.workingAs=un forgeron model.goods.horses.name={{plural:%amount%|one=cheval|other=chevaux|default=chevaux}} model.goods.horses.description=Les chevaux sont utilisés pour créer des éclaireurs et des unités de dragons. @@ -1560,88 +1569,90 @@ model.improvement.road.description=Route model.improvement.road.name=Route model.improvement.road.occupationString=R model.limit.independence.coastalColonies.name=Limite de colonies côtières -model.limit.independence.coastalColonies.description=Vous devez disposer d’au moins %limit% colonies côtières pour déclarer votre indépendance. +model.limit.independence.coastalColonies.description=Vous devez disposer d’au moins %limit% {{plural:%limit%|one=colonie côtière|other=colonies côtières}} pour déclarer votre indépendance. model.limit.independence.rebels.name=Limite de rebelles model.limit.independence.rebels.description=Au moins %limit%% de vos colons doivent soutenir l’indépendance. -model.limit.independence.year.name=Année Limite +model.limit.independence.year.name=Année limite model.limit.independence.year.description=Vous devez déclarer l’indépendance avant la fin de %limit%. model.limit.wagonTrains.name=Limite de chariots model.limit.wagonTrains.description=Le nombre de vos chariots ne doit pas dépasser celui de vos colonies. -model.nation.apache.name=Apaches -model.nation.apache.ruler=Geronimo -model.nation.arawak.name=Arawaks +model.nation.apache.name={{tag:|country=les Apaches|people=Apaches|fem=apache|plur=apaches|femplur=apaches|default=apache}} +model.nation.apache.ruler=Géronimo +model.nation.arawak.name={{tag:|country=les Arawaks|people=Arawaks|fem=arawak|plur=arawaks|femplur=arawaks|default=arawak}} model.nation.arawak.ruler=Tamanaco -model.nation.aztec.name=Aztèques -model.nation.aztec.ruler=Moctezuma II -model.nation.cherokee.name=Chérokîs +model.nation.aztec.name={{tag:|country=les Aztèques|people=Aztèques|fem=aztèque|plur=aztèques|femplur=aztèques|default=aztèque}} +model.nation.aztec.ruler=Moctézuma II +model.nation.cherokee.name={{tag:|country=les Chérokîs|people=Chérokîs|fem=chérokîe|plur=chérokîs|femplur=chérokîes|default=chérokî}} model.nation.cherokee.ruler=Moytoy -model.nation.inca.name=Incas +model.nation.inca.name={{tag:|country=les Incas|people=Incas|fem=inca|plur=incas|femplur=incas|default=inca}} model.nation.inca.ruler=Atahualpa -model.nation.iroquois.name=Iroquois -model.nation.iroquois.ruler=Segoyewatha -model.nation.sioux.name=Sioux -model.nation.sioux.ruler=Taoyateduta -model.nation.tupi.name=Tupis -model.nation.tupi.ruler=Guaira -model.nation.unknownEnemy.name=Ennemi +model.nation.iroquois.name={{tag:|country=les Iroquois|people=Iroquois|fem=iroquoise|plur=iroquois|femplur=iroquoises|default=iroquois}} +model.nation.iroquois.ruler=Ségoyéwatha +model.nation.sioux.name={{tag:|country=les Sioux|people=Sioux|fem=sioux|plur=sioux|femplur=sioux|default=sioux}} +model.nation.sioux.ruler=Taoyaté Duta +model.nation.tupi.name={{tag:|country=les Tupis|people=Tupis|fem=tupie|plur=tupis|femplur=tupies|default=tupi}} +model.nation.tupi.ruler=Guaïra +model.nation.unknownEnemy.name={{tag:|country=l’Ennemi|people=Ennemis|fem=ennemie|plur=ennemis|femplur=ennemies|default=ennemi}} +model.nation.unknownEnemy.ruler=Inconnu model.nation.danish.europe=Copenhague -model.nation.danish.name={{tag:|country=Danemark|people=Danois|default=danois}} +model.nation.danish.name={{tag:|country=le Danemark|people=Danois|fem=danoise|plur=danois|femplur=danoises|default=danois}} model.nation.danish.newLandName=Nouveau-Danemark model.nation.danish.ruler=Frédéric II model.nation.danishREF.name=Corps expéditionnaire royal danois model.nation.danishREF.ruler=Frédéric III model.nation.dutch.europe=Amsterdam -model.nation.dutch.name={{tag:|country=Pays-Bas|people=Hollandais|default=hollandais}} +model.nation.dutch.name={{tag:|country=les Pays-Bas|people=Hollandais|fem=hollandaise|plur=hollandais|femplur=hollandaises|default=hollandais}} model.nation.dutch.newLandName=Nouvelle-Hollande model.nation.dutch.ruler=Guillaume Ier model.nation.dutchREF.name=Corps expéditionnaire royal hollandais model.nation.dutchREF.ruler=Guillaume II model.nation.english.europe=Londres -model.nation.english.name={{tag:|country=Angleterre|people=Anglais|default=anglais}} +model.nation.english.name={{tag:|country=l’Angleterre|people=Anglais|fem=anglaise|plur=anglais|femplur=anglaises|default=anglais}} model.nation.english.newLandName=Nouvelle-Angleterre -model.nation.english.ruler=Élizabeth Ier +model.nation.english.ruler=Élizabeth Iere model.nation.englishREF.name=Corps expéditionnaire royal anglais model.nation.englishREF.ruler=George III model.nation.french.europe=La Rochelle -model.nation.french.name={{tag:|country=France|people=Français|default=français}} +model.nation.french.name={{tag:|country=la France|people=Français|fem=française|plur=français|femplur=françaises|default=français}} model.nation.french.newLandName=Nouvelle-France model.nation.french.ruler=Louis XIV model.nation.frenchREF.name=Corps expéditionnaire royal français model.nation.frenchREF.ruler=Louis XV model.nation.portuguese.europe=Lisbonne -model.nation.portuguese.name={{tag:|country=Portugal|people=Portugais|default=portugais}} +model.nation.portuguese.name={{tag:|country=le Portugal|people=Portugais|fem=portugaise|plur=portugais|femplur=portugaises|default=portugais}} model.nation.portuguese.newLandName=Terre de la Sainte-Croix model.nation.portuguese.ruler=Manuel Ier d'Aviz model.nation.portugueseREF.name=Corps expéditionnaire royal portugais model.nation.portugueseREF.ruler=Jean IV model.nation.russian.europe=Mourmansk -model.nation.russian.name={{tag:|country=Russie|people=Russes|default=russe}} +model.nation.russian.name={{tag:|country=la Russie|people=Russes|fem=russe|plur=russes|femplur=russes|default=russe}} model.nation.russian.newLandName=Nouvelle-Russie model.nation.russian.ruler=Pierre Ier model.nation.russianREF.name=Corps expéditionnaire royal russe model.nation.russianREF.ruler=Catherine Ier model.nation.spanish.europe=Cadix -model.nation.spanish.name={{tag:|country=Espagne|people=Espagnols|default=espagnol}} +model.nation.spanish.name={{tag:|country=Espagne|people=Espagnols|fem=espagnole|plur=espagnols|femplur=espagnoles|default=espagnol}} model.nation.spanish.newLandName=Nouvelle-Espagne model.nation.spanish.ruler=Philippe II model.nation.spanishREF.name=Corps expéditionnaire royal espagnol model.nation.spanishREF.ruler=Philippe III model.nation.swedish.europe=Stockholm -model.nation.swedish.name={{tag:|country=Suède|people=Suédois|default=suédois}} +model.nation.swedish.name={{tag:|country=la Suède|people=Suédois|fem=suédoise|plur=suédois|femplur=suédoises|default=suédois}} model.nation.swedish.newLandName=Nouvelle-Suède +model.nation.swedish.ruler=Charles XI model.nation.swedishREF.name=Corps expéditionnaire royal suédois model.nationType.agriculture.name=Agriculture model.nationType.agriculture.shortDescription=Produit plus de nourriture -model.nationType.apache.name=Apache +model.nationType.apache.name=Apaches model.nationType.apache.description=La nation Apache -model.nationType.arawak.name=Arawak +model.nationType.arawak.name=Arawaks model.nationType.arawak.description=La nation Arawak model.nationType.aztec.name=Aztèques model.nationType.aztec.description=La nation Aztèque model.nationType.building.name=Construction model.nationType.building.shortDescription=Produit davantage de matériaux de construction -model.nationType.cherokee.name=Cherokees -model.nationType.cherokee.description=La Nation Cherokee +model.nationType.cherokee.name=Chérokîs +model.nationType.cherokee.description=La nation Chérokîe model.nationType.conquest.name=Conquête model.nationType.conquest.shortDescription=Plus de chances de convertir les indigènes model.nationType.cooperation.name=Coopération @@ -1652,7 +1663,7 @@ model.nationType.furTrapping.name=Piégeage model.nationType.furTrapping.shortDescription=Produit plus de fourrure et de pelisses model.nationType.immigration.name=Immigration model.nationType.immigration.shortDescription=Produit un grand nombre d’immigrants -model.nationType.inca.name=Inca +model.nationType.inca.name=Incas model.nationType.inca.description=La nation Inca model.nationType.iroquois.name=Iroquois model.nationType.iroquois.description=La nation Iroquoise @@ -1665,7 +1676,7 @@ model.nationType.sioux.description=La nation Sioux model.nationType.trade.name=Commerce model.nationType.trade.shortDescription=Les prix sont plus avantageux model.nationType.tupi.name=Tupis -model.nationType.tupi.description=La nation Tupi +model.nationType.tupi.description=La nation Tupie model.resource.cotton.name=Coton model.resource.cotton.description=Le sol de cette prairie est particulièrement adapté à la culture du coton. model.resource.fish.name=Poisson @@ -1677,7 +1688,7 @@ model.resource.game.description=La forêt est le repaire de nombreux animaux sus model.resource.grain.name=Céréales model.resource.grain.description=Les récoltes poussent exceptionnellement bien dans cette plaine fertile. model.resource.lumber.name=Bois -model.resource.lumber.description=Cette forêt a des bons arbres, bien droits, idéaux pour en faire du bois d’œuvre. +model.resource.lumber.description=Cette forêt a de bons arbres, bien droits, idéaux pour le bois d’œuvre. model.resource.minerals.name=Gisement model.resource.minerals.description=Le terrain est riche en minéraux. Les plus patients y trouveront du minerai et même de l’argent. model.resource.oasis.name=Oasis @@ -1713,7 +1724,7 @@ model.role.change.missionary=Engager comme missionnaire model.role.change.pioneer=Équiper avec des outils model.role.change.scout=Équiper comme un éclaireur model.role.change.default.soldier=Armer -model.role.change.dragoon.default=Enlever tout les équipements +model.role.change.dragoon.default=Enlever tout l’équipement model.role.change.dragoon.soldier=Démonter model.role.change.missionary.default=Annuler le statut de missionnaire model.role.change.missionary.soldier=Armer @@ -1727,7 +1738,7 @@ model.settlement.aztec.name=Ville aztèque model.settlement.aztec.plural=villes model.settlement.camp.capital.name=Campement model.settlement.camp.name=Campement -model.settlement.camp.plural=camps +model.settlement.camp.plural=campements model.settlement.colony.capital.name=Colonie model.settlement.colony.name=Colonie model.settlement.colony.plural=colonies @@ -1753,37 +1764,37 @@ model.tile.greatRiver.name=Fleuve model.tile.greatRiver.description=Les fleuves sont navigables, à la différence des simples rivières. model.tile.highSeas.name=Haute mer model.tile.highSeas.description=La haute mer regorge de poisson. Elle permet aussi de rejoindre l’Europe. -model.tile.hills.name=Colline +model.tile.hills.name=Collines model.tile.hills.description=Les collines s’étendent parfois sur des zones continues mais toujours limitées. Les collines produisent généralement beaucoup de minerai, mais aussi un peu de céréales. model.tile.lake.name=Lac model.tile.lake.description=Les lacs sont des étendues d’eau à l’intérieur des terres. Les colonies construites sur leurs rives profitent de leurs ressources naturelles, mais peuvent être inaccessibles par navire. -model.tile.marsh.name=Tourbière -model.tile.marsh.description=Les tourbières sont des terres très humides qui foisonnent d’herbes, de joncs, de roseaux et de nombreuses autres plantes herbacées poussant même dans des eaux peu profondes. Les tourbières produisent des céréales et du tabac, ainsi que du minerai d’argent. Elles se trouvent sous les hautes latitudes. +model.tile.marsh.name=Marécage +model.tile.marsh.description=Les marécages sont des terres très humides qui foisonnent d’herbes, de joncs, de roseaux et de nombreuses autres plantes herbacées poussant même dans des eaux peu profondes. Les marécages produisent des céréales et du tabac, ainsi que du minerai d’argent. Ils se trouvent sous les hautes latitudes. model.tile.mixedForest.name=Forêt mixte model.tile.mixedForest.description=Les forêts mixtes produisent des céréales, du bois, des fourrures et du coton. Elles se trouvent sous les latitudes tempérées et peuvent être rasées pour laisser place à des plaines. -model.tile.mountains.name=Montagne -model.tile.mountains.description=Les montagnes s’étendent souvent sur des zones continues mais toujours limitées. Elles sont plus difficiles à traverser que les collines et ne permettent pas d’y fonder une colonie. Elles fournissent un important bonus défensif mais les fortifications ne l’augmentent pas. Elles font généralement le bonheur des mineurs, même pour le minerai d’argent. -model.tile.ocean.name=Mer côtière -model.tile.ocean.description=Les mers côtières sont de grandes étendues d’eau salée, idéales pour la pêche. La densité des bancs de poissons est plus forte près des côtes, et plus spécialement près de l’embouchure des fleuves. -model.tile.plains.name=Plaine +model.tile.mountains.name=Montagnes +model.tile.mountains.description=Les montagnes s’étendent souvent sur des zones continues mais toujours limitées. Elles sont plus difficiles à traverser que les collines et ne permettent pas d’y fonder une colonie. Elles fournissent un important bonus défensif mais les fortifications ne l’augmentent pas. Elles font généralement le bonheur des mineurs de minerai et d’argent. +model.tile.ocean.name=Océan +model.tile.ocean.description=Les océans sont de grandes étendues d’eau salée, idéales pour la pêche. La densité des bancs de poissons est plus forte près des côtes, et plus spécialement près de l’embouchure des fleuves. +model.tile.plains.name=Plaines model.tile.plains.description=Les plaines sont de grandes étendues de terres avec peu de relief, très adaptées aux cultures. Elles produisent une grande quantité de céréales, un peu moins de coton et un peu de minerai. Elles se trouvent sous les latitudes tempérées. model.tile.prairie.name=Prairie model.tile.prairie.description=Les prairies sont idéales pour la culture des céréales et du coton. Elles se trouvent sous les latitudes tempérées. -model.tile.rainForest.name=Mangrove -model.tile.rainForest.description=Les mangroves produisent des céréales, du bois, des fourrures et un peu de minerai, de sucre et de tabac. Elles se trouvent sous les latitudes tropicales et peuvent être rasées pour laisser place à des marais. +model.tile.rainForest.name=Forêt équatoriale +model.tile.rainForest.description=Les forêts équatoriales produisent des céréales, du bois, des fourrures et un peu de minerai, de sucre et de tabac. Elles se trouvent sous les latitudes tropicales et peuvent être rasées pour laisser place à des marais. model.tile.savannah.name=Savane model.tile.savannah.description=Les savanes sont des terres souvent à l’orée des forêts. Elles produisent des céréales et de la canne à sucre. model.tile.scrubForest.name=Forêt de broussailles model.tile.scrubForest.description=Les forêts de broussailles produisent des céréales, du bois, de la fourrure et un peu de coton et de minerai. Elles se trouvent sous les latitudes tempérées et peuvent être rasées pour laisser place à un désert. model.tile.swamp.name=Marais -model.tile.swamp.description=Les marais sont des terres humides ou des eaux boueuses...Elles sont bien plus profondes que les tourbières. Les marais produisent des céréales et aussi un peu de canne à sucre, de tabac et de minerai. Ils se trouvent sous les latitudes tropicales. +model.tile.swamp.description=Les marais sont des terres humides ou des eaux boueuses...Ils sont bien plus profonds que les marécages. Les marais produisent des céréales et aussi un peu de canne à sucre, de tabac et de minerai. Ils se trouvent sous les latitudes tropicales. model.tile.tropicalForest.name=Forêt tropicale model.tile.tropicalForest.description=Les forêts tropicales produisent des céréales, du bois, des fourrures et un peu de canne à sucre. Elles peuvent être rasées pour laisser placer à la savane. model.tile.tundra.name=Toundra model.tile.tundra.description=La toundra est une terre où la pousse des arbres est rendue difficile par les basses températures. Les toundras produisent des céréales et un peu de minerai. Elles se trouvent sous les hautes latitudes. model.tile.wetlandForest.name=Forêt humide -model.tile.wetlandForest.description=Les forêts humides produisent des céréales, du bois, des fourrures et un peu de minerai. Elles se trouvent sous les hautes latitudes et peuvent être rasées pour laisser place à des tourbières. -model.unit.colonialRegular.name={{plural:%number%|one=Fantassin colonial|other=Fantassins Coloniaux|default=Fantassin colonial}} +model.tile.wetlandForest.description=Les forêts humides produisent des céréales, du bois, des fourrures et un peu de minerai. Elles se trouvent sous les hautes latitudes et peuvent être rasées pour laisser place à des marécages. +model.unit.colonialRegular.name={{plural:%number%|one=Fantassin colonial|other=Fantassins coloniaux|default=Fantassin colonial}} model.unit.colonialRegular.description=Le fantassin colonial est une unité d’élite, seulement disponible après la déclaration d’indépendance. model.unit.elderStatesman.name={{plural:%number%|one=Vieux politicien|other=Vieux politiciens|default=Vieux politicien}} model.unit.elderStatesman.description=Le vieux politicien attise le désir d’indépendance des colons (symbolisé par les cloches de la Liberté), qui augmente le taux d’appartenance aux Fils de la Liberté dans vos colonies. @@ -1795,37 +1806,37 @@ model.unit.expertFurTrapper.name={{plural:%number%|one=Expert trappeur|other=Exp model.unit.expertFurTrapper.description=L’expert trappeur est spécialisé dans le piégeage des animaux à fourrure et leur dépeçage. model.unit.expertLumberJack.name={{plural:%number%|one=Expert bûcheron|other=Experts bûcherons|default=Expert bûcheron}} model.unit.expertLumberJack.description=L’expert bûcheron est spécialisé dans la coupe de bois de charpente. -model.unit.expertOreMiner.name={{plural:%number%|one=Expert mineur d'or|other=Experts mineurs d'or|default=Expert mineur d'or}} +model.unit.expertOreMiner.name={{plural:%number%|one=Expert mineur|other=Experts mineurs|default=Expert mineur}} model.unit.expertOreMiner.description=L’expert mineur est spécialisé dans l’extraction de minerai. model.unit.expertSilverMiner.name={{plural:%number%|one=Expert mineur d'argent|other=Experts mineurs d'argent|default=Expert mineur d'argent}} model.unit.expertSilverMiner.description=L’expert mineur d’argent n’a pas son pareil pour flairer un filon de minerai d’argent. model.unit.firebrandPreacher.name={{plural:%number%|one=Prédicateur fervent|other=Prédicateurs fervents|default=Prédicateur fervent}} model.unit.firebrandPreacher.description=Le prédicateur fanatique augmente les troubles religieux en Europe (symbolisés par des croix), lesquels augmenteront à leur tour le nombre d’émigrants vers le Nouveau Monde. model.unit.freeColonist.name={{plural:%number%|one=Colon libre|other=Colons libres|default=Colon libre}} -model.unit.freeColonist.description=Le colon libre est un blanc-bec sans savoir-faire particulier. Cependant, il peut acquérir un savoir-faire en travaillant dur à proximité d’une colonie, ou en visitant un campement indien. Il peut également être promu soldat vétéran, ou formé à un métier dans une colonie dotée d’une école. -model.unit.hardyPioneer.name={{plural:%number%|one=Valeureux pionnier|other=Valeureux pionniers|default=Valeureux pionnier}} +model.unit.freeColonist.description=Le colon libre est un blanc-bec sans savoir-faire particulier. Cependant, il peut acquérir un savoir-faire en travaillant dur à proximité d’une colonie, ou en visitant une agglomération indigène. Il peut également être promu soldat vétéran, ou formé à un métier dans une colonie dotée d’une école. +model.unit.hardyPioneer.name=Valeureux {{plural:%number%|one=pionnier|other=pionniers|default=pionnier}} model.unit.hardyPioneer.description=Le valeureux pionnier excelle dans l’art de la déforestation, du labour et de la construction de route. model.unit.indenturedServant.name={{plural:%number%|one=Domestique contractuel|other=Domestiques contractuels|default=Domestique contractuel}} model.unit.indenturedServant.description=Le domestique contractuel apprécie de travailler au grand air, mais se morfond dès qu’il s’agit de travailler à l’intérieur. Avec un peu d’éducation, il peut devenir un colon libre. model.unit.indianConvert.name={{plural:%number%|one=Indien converti|other=Indiens convertis|default=Indien converti}} -model.unit.indianConvert.description=L’Indien converti est un Indien d’Amérique qui a rejoint vos colonies. Il est doué pour n’importe quel type de travail, du moment que cela ne se fait pas entre quatre murs. Dès que Bartolome de las Casas rejoint le Congrès continental, tous les Indiens convertis deviennent des colons libres. +model.unit.indianConvert.description=L’Indien converti est un indigène qui a rejoint vos colonies. Il est doué pour n’importe quel type de travail, du moment que cela ne se fasse pas entre quatre murs. Dès que Bartolome de las Casas rejoint le Congrès continental, tous les Indiens convertis deviennent des colons libres. model.unit.jesuitMissionary.name={{plural:%number%|one=Missionnaire jésuite|other=Missionnaires jésuites|default=Missionnaire jésuite}} -model.unit.jesuitMissionary.description=Le missionnaire jésuite est capable d’établir une mission dans un campement indien. Il est très doué pour convertir les Indiens. +model.unit.jesuitMissionary.description=Le missionnaire jésuite est capable d’établir une mission dans une agglomération indigène. Il est très doué pour convertir les Indiens. model.unit.masterBlacksmith.name={{plural:%number%|one=Maître forgeron|other=Maîtres forgerons|default=Maître forgeron}} model.unit.masterBlacksmith.description=Le maître forgeron est spécialisé dans la fabrication d’outils. -model.unit.masterCarpenter.name={{plural:%number%|one=Maître menuisier|other=Maîtres menuisiers|default=Maître menuisier}} -model.unit.masterCarpenter.description=Le maître menuisier est spécialisé dans la construction de bâtiments et de certaines unités comme les bateaux. -model.unit.masterCottonPlanter.name={{plural:%number%|one=Maître planteur de coton|other=Maîtres planteurs de coton|default=Maître planteur de coton}} +model.unit.masterCarpenter.name={{plural:%number%|one=Maître charpentier|other=Maîtres charpentiers|default=Maître charpentier}} +model.unit.masterCarpenter.description=Le maître charpentier est spécialisé dans la construction de bâtiments et de certaines unités comme les bateaux. +model.unit.masterCottonPlanter.name={{plural:%number%|one=Maître planteur|other=Maîtres planteurs|default=Maître planteur}} de coton model.unit.masterCottonPlanter.description=Le maître planteur de coton est spécialisé dans la culture du coton. model.unit.masterDistiller.name={{plural:%number%|one=Maître distillateur|other=Maîtres distillateurs|default=Maître distillateur}} model.unit.masterDistiller.description=Le maître distillateur est spécialisé dans la fabrication de rhum. -model.unit.masterFurTrader.name={{plural:%number%|Maître fourreur|other=Maîtres fourreur|default=Maître fourreur}} -model.unit.masterFurTrader.description=Le maître fourrreur est spécialisé dans la fabrication de pelisses. +model.unit.masterFurTrader.name={{plural:%number%|Maître fourreur|other=Maîtres fourreurs|default=Maître fourreur}} +model.unit.masterFurTrader.description=Le maître fourreur est spécialisé dans la fabrication de pelisses. model.unit.masterGunsmith.name={{plural:%number%|one=Maître armurier|other=Maîtres armuriers|default=Maître armurier}} model.unit.masterGunsmith.description=Le maître armurier est spécialisé dans la fabrication de mousquets. -model.unit.masterSugarPlanter.name={{plural:%number%|one=Maître planteur de canne|other=Maîtres planteurs de canne|default=Maître planteur de canne}} +model.unit.masterSugarPlanter.name={{plural:%number%|one=Maître planteur|other=Maîtres planteurs|default=Maître planteur}} de canne model.unit.masterSugarPlanter.description=Le maître planteur de canne à sucre...Devinez quoi ! -model.unit.masterTobaccoPlanter.name={{plural:%number%|one=Maître planteur de tabac|other=Maîtres planteurs de tabac|default=Maître planteur de tabac}} +model.unit.masterTobaccoPlanter.name={{plural:%number%|one=Maître planteur|other=Maîtres planteurs|default=Maître planteur}} de tabac model.unit.masterTobaccoPlanter.description=Le maître planteur de tabac est spécialisé dans la culture des feuilles de tabac. model.unit.masterTobacconist.name={{plural:%number%|one=Maître cigarier|other=Maîtres cigariers|default=Maître cigarier}} model.unit.masterTobacconist.description=Le maître cigarier est spécialisé dans la fabrication de cigares. @@ -1834,7 +1845,7 @@ model.unit.masterWeaver.description=Le maître tisserand est spécialisé dans l model.unit.pettyCriminal.name={{plural:%number%|one=Petit criminel|other=Petits criminels|default=Petit criminel}} model.unit.pettyCriminal.description=Le petit criminel peut travailler au grand air, mais est particulièrement mauvais à l’intérieur des colonies. Il peut devenir un domestique contractuel avec un peu d’éducation ou d’expérience. model.unit.seasonedScout.name={{plural:%number%|one=Éclaireur aguerri|other=Éclaireurs aguerris|default=Éclaireur aguerri}} -model.unit.seasonedScout.description=L’éclaireur aguerri est le meilleur quand il s’agit d’explorer le Nouveau Monde, en particulier les campements indiens et les rumeurs de cité perdue. +model.unit.seasonedScout.description=L’éclaireur aguerri est le meilleur quand il s’agit d’explorer le Nouveau Monde, en particulier les agglomérations indigènes et les rumeurs de cité perdue. model.unit.veteranSoldier.name={{plural:%number%|one=Soldat vétéran|other=Soldats vétérans|default=Soldat vétéran}} model.unit.veteranSoldier.description=Le soldat vétéran est une unité armée expérimentée. N’importe quel colon libre peut être promu soldat vétéran après avoir gagné une bataille. model.unit.caravel.name={{plural:%number%|one=Caravelle|other=Caravelles|default=Caravelle}} @@ -1843,23 +1854,23 @@ model.unit.frigate.name={{plural:%number%|one=Frégate|other=Frégates|default=F model.unit.frigate.description=La frégate est un petit navire de guerre. model.unit.galleon.name={{plural:%number%|one=Galion|other=Galions|default=Galion}} model.unit.galleon.description=Le galion est un gros navire marchand. C’est le seul bateau pouvant transporter des trésors vers l’Europe. -model.unit.manOWar.name={{plural:%number%|one=Vaisseau de ligne|other=Vaisseaux de ligne|default=Vaisseau de ligne}} -model.unit.manOWar.description=Le navire de ligne est un gros navire de guerre de la Couronne. Vous en verrez quand le Corps expéditionnaire royal arrivera après la déclaration d’indépendance. +model.unit.manOWar.name={{plural:%number%|one=Vaisseau|other=Vaisseaux|default=Vaisseau}} de ligne +model.unit.manOWar.description=Le vaisseau de ligne est un gros navire de guerre de la Couronne. Vous en verrez quand le Corps expéditionnaire royal arrivera après la déclaration d’indépendance. model.unit.merchantman.name={{plural:%number%|one=Navire marchand|other=Navires marchands|default=Navire marchand}} model.unit.merchantman.description=Le navire marchand est un bateau de taille moyenne. model.unit.privateer.name={{plural:%number%|one=Corsaire|other=Corsaires|default=Corsaire}} model.unit.privateer.description=Le corsaire est un petit navire de guerre qui ne porte pas le pavillon du pays dont il vient. C’est la seule unité capable d’attaquer d’autres unités sans déclaration de guerre. -model.unit.artillery.name={{plural:%number%|one=Une pièce d'artillerie|other=Autres pièces d'artillerie|default=Artillerie}} -model.unit.artillery.description=L’artillerie est excellente pour attaquer et défendre des colonies. Par contre, elle est très vulnérable à l’extérieur. +model.unit.artillery.name={{plural:%number%|one=pièce d'artillerie|other=pièces d'artillerie|default=artillerie}} +model.unit.artillery.description=L’artillerie est excellente pour attaquer et défendre des colonies. Par contre, elle est très vulnérable à découvert. model.unit.damagedArtillery.name={{plural:%number%|one=Artillerie endommagée|other=Artilleries endommagées|default=Artillerie endommagée}} model.unit.damagedArtillery.description=L’artillerie endommagée est comme l’artillerie normale, en plus faible seulement. Si elle est endommagée une deuxième fois, elle sera mise définitivement hors d’usage. -model.unit.treasureTrain.name={{plural:%number%|one=Train du trésor|other=Trains du trésor|default=Train du trésor}} -model.unit.treasureTrain.description=On trouve généralement des trésors dans les ruines des cités perdues ou en pillant un campement indien. Ils ne vous sont d’aucune utilité, mais peuvent être revendus à bon prix en Europe. Ils ne peuvent y être transportés à travers l’océan que par galion. Si vous n’en avez pas, la Couronne se fera un plaisir de vous offrir ce transport, moyennant un pourcentage « raisonnable » des bénéfices de leur vente. +model.unit.treasureTrain.name={{plural:%number%|one=Train|other=Trains|default=Train}} du trésor +model.unit.treasureTrain.description=On trouve généralement des trésors dans les ruines des cités perdues ou en pillant une agglomération indigène. Ils ne vous sont d’aucune utilité, mais peuvent être revendus à bon prix en Europe. Ils ne peuvent y être transportés à travers l’océan que par galion. Si vous n’en avez pas, la Couronne se fera un plaisir de vous offrir ce transport, moyennant un pourcentage « raisonnable » des bénéfices de leur vente. model.unit.wagonTrain.name={{plural:%number%|one=Chariot|other=Chariots|default=Chariot}} model.unit.wagonTrain.description=Le chariot est capable de transporter jusqu’à 200 unités de marchandises à travers les terres. Vous pouvez l’utiliser pour commercer avec d’autres joueurs, ou pour déplacer vos marchandises entre vos propres colonies. model.unit.kingsRegular.name={{plural:%number%|one=Fantassin royal|other=Fantassins royaux|default=Fantassin royal}} model.unit.kingsRegular.description=Le fantassin royal est une unité d’élite de la Couronne. Vous en verrez quand le Corps expéditionnaire royal arrivera après la déclaration d’inpépendance. -model.unit.brave.name={{plural:%number%|one=Guerrier|other=Guerriers|default=Guerrier}} +model.unit.brave.name={{plural:%number%|one=Brave|other=Braves|default=Brave}} model.unit.brave.description=Le brave est une unité indienne, capable de transporter quelques marchandises. Il peut être armé et monté à cheval. Les braves visitent souvent vos colonies afin de vous offrir des cadeaux ou faire des demandes. model.unit.flyingDutchman.name=Le Hollandais volant model.unit.flyingDutchman.description=Le Hollandais volant est un bateau fantôme. @@ -1867,18 +1878,18 @@ model.unit.revenger.name=Le Capitaine model.unit.revenger.description=Le Capitaine a vendu son âme au Diable. model.unit.undead.name=Mort-vivant model.unit.undead.description=Des morts-vivants composent l’équipage du Hollandais volant. -model.unit.brave.armedBrave={{plural:%number%|one=Brave armmé|other=Braves armés|default=Braves armés}} +model.unit.brave.armedBrave={{plural:%number%|one=Brave armé|other=Braves armés|default=Brave armé}} model.unit.brave.mountedBrave={{plural:%number%|one=Brave monté|other=Braves montés|default=Brave monté}} -model.unit.brave.nativeDragoon={{plural:%number%|one=Dragon indigère|other=Dragons indigènes|default=Dragons indigènes}} +model.unit.brave.nativeDragoon={{plural:%number%|one=Dragon indigène|other=Dragons indigènes|default=Dragon indigène}} model.unit.colonialRegular.dragoon=Cavalerie coloniale model.unit.colonialRegular.soldier=Infanterie coloniale -model.unit.hardyPioneer.pioneer={{plural:%number%|one=Valeureux pionnier|other=Valeureux pionniers|default=Valeureux pionniers}} -model.unit.jesuitMissionary.missionary={{plural:%number%|one=Missionnaire jésuite|other=Missionnaires jésuites|default=Missionnaires jésuites}} +model.unit.hardyPioneer.pioneer={{plural:%number%|one=Valeureux pionnier|other=Valeureux pionniers|default=Valeureux pionnier}} +model.unit.jesuitMissionary.missionary={{plural:%number%|one=Missionnaire jésuite|other=Missionnaires jésuites|default=Missionnaire jésuite}} model.unit.kingsRegular.cavalry=Cavalerie model.unit.kingsRegular.infantry=Infanterie -model.unit.seasonedScout.scout={{plural:%number%|one=Éclaireur aguerri|other=Éclaireurs aguerris|default=Éclaireurs aguerris}} +model.unit.seasonedScout.scout={{plural:%number%|one=Éclaireur aguerri|other=Éclaireurs aguerris|default=Éclaireur aguerri}} model.unit.veteranSoldier.dragoon={{plural:%number%|one=Dragon vétéran|other=Dragons vétérans|default=Dragons vétérans}} -model.unit.veteranSoldier.soldier={{plural:%number%|one=Soldat vétéran|other=Soldats vétérans|default=Soldats vétérans}} +model.unit.veteranSoldier.soldier={{plural:%number%|one=Soldat vétéran|other=Soldats vétérans|default=Soldat vétéran}} model.unit.colonialRegular.workingAs=Soldat model.unit.elderStatesman.workingAs=Politicien model.unit.expertFarmer.workingAs=Fermier @@ -1891,7 +1902,7 @@ model.unit.firebrandPreacher.workingAs=Prédicateur model.unit.hardyPioneer.workingAs=Pionnier model.unit.jesuitMissionary.workingAs=Missionnaire model.unit.masterBlacksmith.workingAs=Forgeron -model.unit.masterCarpenter.workingAs=Menuisier +model.unit.masterCarpenter.workingAs=Charpentier model.unit.masterCottonPlanter.workingAs=Planteur de coton model.unit.masterDistiller.workingAs=Distillateur model.unit.masterFurTrader.workingAs=Fourreur @@ -1909,30 +1920,30 @@ model.abstractGoods.label=%amount% {{plural:%amount%|%goods%}} model.abstractUnit.label={{plural:%number%|one=one|other=%number%}} %unit% model.building.locationLabel=à %location% model.colony.badGovernment=Le Gouvernement de %colony% est inefficace. Des pénalités sont appliquées à la production. -model.colony.goodGovernment=L’efficacité du gouvernement s’est améliorée! Le sentiment rebelle dans %colony% est égal ou dépasse désormais %number% pour cent. +model.colony.goodGovernment=L’efficacité du gouvernement s’est améliorée ! Le sentiment rebelle dans %colony% est égal ou dépasse désormais %number% pour cent. model.colony.governmentImproved1=Le Gouvernement de %colony% s’est amélioré mais reste inefficace. Des pénalités continuent à s’appliquer à la production. model.colony.governmentImproved2=Le Gouvernement de %colony% s’est amélioré. Les pénalités ne s’appliquent plus à la production. -model.colony.insufficientProduction=%outputAmount% %outputType% de plus auraient pu être produit par la %colony%, si seulement nous avions eu %inputAmount% %inputType% de plus. -model.colony.lostGoodGovernment=L’efficacité du gouvernement a décru! Le sentiment rebelle dans %colony% n'est désormais plus égal ou supérieur à %number% pour cent. La colonie n'a désormais plus de bonus de production.. -model.colony.lostVeryGoodGovernment=L’efficacité du gouvernement a décru! Le sentiment rebelle dans %colony% n’est désormais plus égal ou supérieur à %number% pour cent. Certains bonus de production ont été perdus. +model.colony.insufficientProduction=%outputAmount% %outputType% de plus auraient pu être produit(e)s dans %colony%, si seulement nous avions eu un supplément de %consumptionDeficit%. +model.colony.lostGoodGovernment=L’efficacité du gouvernement a décru ! Le sentiment rebelle dans %colony% n’est désormais plus égal ou supérieur à %number% pour cent. La colonie n’a désormais plus de bonus de production. +model.colony.lostVeryGoodGovernment=L’efficacité du gouvernement a décru ! Le sentiment rebelle dans %colony% n’est désormais plus égal ou supérieur à %number% pour cent. Certains bonus de production ont été perdus. model.colony.minimumColonySize=%object% empêche de réduire la population encore plus. -model.colony.stance.alliance=Les %nation% sont heureux de voir un allié fiable tel que vous. -model.colony.stance.ceaseFire=Les %nation% vous jettent des regards mauvais, et sont clairement en train de préparer leur défense. -model.colony.stance.peace=Les %nation% vous accueillent courtoisement et demandent si vous venez en paix. -model.colony.stance.uncontacted=Les %nation% vous regardent avec méfiance, car vos habits et votre langue ne leur sont pas familiers. -model.colony.stance.war=Les %nation% tirent sur vous à toute occasion. +model.colony.stance.alliance=Les {{tag:people|%nation%}} sont heureux de voir un allié fiable tel que vous. +model.colony.stance.ceaseFire=Les {{tag:people|%nation%}} vous jettent des regards mauvais, et sont clairement en train de préparer leur défense. +model.colony.stance.peace=Les {{tag:people|%nation%}} vous accueillent courtoisement et demandent si vous venez en paix. +model.colony.stance.uncontacted=Les {{tag:people|%nation%}} vous regardent avec méfiance, car vos habits et votre langue ne leur sont pas familiers. +model.colony.stance.war=Les {{tag:people|%nation%}} tirent sur vous à toute occasion. model.colony.unbuildable=%colony% ne peut pas construire %object% actuellement. %object% a été retiré de la file d’attente de construction. model.colony.veryBadGovernment=Le Gouvernement de %colony% est très inefficace. De fortes pénalités sont appliquées à la production. -model.colony.veryGoodGovernment=L’efficacité du gouvernement s’est améliorée! Le sentiment rebelle dans %colony% est égal ou dépasse maintenant %number% pour cent.. -model.colonyTile.claim=(%direction% de la demande) -model.diplomaticTrade.receive.contact=Salutations fraternelles de la part de la glorieuse nation %nation%. -model.diplomaticTrade.receive.diplomatic=Négocions avec les %nation%. -model.diplomaticTrade.receive.trade=Prenons en considération l’offre commerciale des %nation%. -model.diplomaticTrade.receive.tribute=Les %nation% nous demandent un tribut ! -model.diplomaticTrade.send.contact=Nous avons rencontré des membres de la nation %nation%. -model.diplomaticTrade.send.diplomatic=Considérons notre situation diplomatique avec les %nation%. -model.diplomaticTrade.send.trade=Proposons un commerce avec les %nation% à %settlement%. -model.diplomaticTrade.send.tribute=Nous demandons un tribut des %nation% à %settlement%. +model.colony.veryGoodGovernment=L’efficacité du gouvernement s’est améliorée ! Le sentiment rebelle dans %colony% est égal ou dépasse maintenant %number% pour cent. +model.colonyTile.claim=(revendique %direction%) +model.diplomaticTrade.receive.contact=Salutations fraternelles de la part de la glorieuse nation {{tag:fem|%nation%}}. +model.diplomaticTrade.receive.diplomatic=Négocions avec {{tag:country|%nation%}}. +model.diplomaticTrade.receive.trade=Prenons en considération l’offre commerciale des {{tag:people|%nation%}}. +model.diplomaticTrade.receive.tribute={{ucfirst:{{tag:country|%nation%}}}} nous demande un tribut ! +model.diplomaticTrade.send.contact=Nous avons rencontré des membres de la nation {{tag:fem|%nation%}}. +model.diplomaticTrade.send.diplomatic=Considérons notre situation diplomatique avec {{tag:country|%nation%}}. +model.diplomaticTrade.send.trade=Proposons un commerce avec {{tag:country|%nation%}} à %settlement%. +model.diplomaticTrade.send.tribute=Nous demandons un tribut de {{tag:country|%nation%}} à %settlement%. model.direction.N.name=nord model.direction.NE.name=nord-est model.direction.E.name=est @@ -1942,68 +1953,68 @@ model.direction.SW.name=sud-ouest model.direction.W.name=ouest model.direction.NW.name=nord-ouest model.historyEventType.abandonColony.description=Vous abandonnez la colonie de %colony%. -model.historyEventType.ceaseFire.description=Un cessez-le-feu a été signé avec %nation%. -model.historyEventType.cityOfGold.description=La %nation% découvre %city%, l’une des sept cités d’or, et un trésor de %treasure% d’or. -model.historyEventType.colonyConquered.description=Votre colonie %colony% est conquise par les %nation%. -model.historyEventType.colonyDestroyed.description=Votre colonie %colony% est détruite par les %nation%. -model.historyEventType.conquerColony.description=Vous avez conquis la colonie %colony% des %nation%. +model.historyEventType.ceaseFire.description=Un cessez-le-feu a été signé avec {{tag:country|%nation%}}. +model.historyEventType.cityOfGold.description={{ucfirst:{{tag:country|%nation%}}}} découvre %city%, l’une des sept cités d’or, et un trésor de %treasure% pièces d’or. +model.historyEventType.colonyConquered.description=Votre colonie %colony% est conquise par {{tag:country|%nation%}}. +model.historyEventType.colonyDestroyed.description=Votre colonie %colony% est détruite par {{tag:country|%nation%}}. +model.historyEventType.conquerColony.description=Vous avez conquis la colonie %colony% des {{tag:people|%nation%}}. model.historyEventType.declareIndependence.description=Vous déclarez l’indépendance vis-à-vis de la Couronne. -model.historyEventType.declareWar.description=La guerre a été déclarée avec %nation%. -model.historyEventType.destroyNation.description=Le %nation% a détruit les %nativeNation%. -model.historyEventType.destroySettlement.description=Vous détruisez le campement %settlement% de %nation%. +model.historyEventType.declareWar.description=La guerre a été déclarée avec {{tag:country|%nation%}}. +model.historyEventType.destroyNation.description={{ucfirst:{{tag:country|%nation%}}}} détruit les {{tag:people|%nativeNation%}}. +model.historyEventType.destroySettlement.description=Vous détruisez l’agglomération %settlement% des {{tag:people|%nation%}}. model.historyEventType.discoverNewWorld.description=Vous découvrez le Nouveau Monde. -model.historyEventType.discoverRegion.description=La %nation% découvre %region%. -model.historyEventType.formAlliance.description=Un accord d'alliance a été signé avec %nation%. +model.historyEventType.discoverRegion.description={{ucfirst:{{tag:country|%nation%}}}} découvre %region%. +model.historyEventType.formAlliance.description=Un accord d’alliance a été signé avec {{tag:country|%nation%}}. model.historyEventType.foundColony.description=Vous établissez la colonie de %colony%. -model.historyEventType.foundingFather.description=%father% rejoint le Congrès Continental. +model.historyEventType.foundingFather.description=%father% rejoint le Congrès continental. model.historyEventType.independence.description=Vous avez atteint l’indépendance de la Couronne. -model.historyEventType.makePeace.description=Un accord de paix a été signé avec %nation%. -model.historyEventType.meetNation.description=Vous rencontrez les %nation%. -model.historyEventType.nationDestroyed.description=La %nation% n'est plus présente dans le Nouveau Monde. -model.historyEventType.spanishSuccession.description=Les %loserNation% cédent l’ensemble de leurs colonies dans le Nouveau Monde aux %nation%. +model.historyEventType.makePeace.description=Un accord de paix a été signé avec {{tag:country|%nation%}}. +model.historyEventType.meetNation.description=Vous rencontrez {{tag:country|%nation%}}. +model.historyEventType.nationDestroyed.description={{ucfirst:{{tag:country|%nation%}}}} n’est plus présente dans le Nouveau Monde. +model.historyEventType.spanishSuccession.description={{ucfirst:{{tag:country|%loserNation%}}}} cède l’ensemble de ses colonies dans le Nouveau Monde à {{tag:country|%nation%}}. model.indianSettlement.mostHatedNone=Aucun model.indianSettlement.mostHatedUnknown=Inconnu model.indianSettlement.nameUnknown=Inconnu model.indianSettlement.skillNone=Aucun model.indianSettlement.skillUnknown=Inconnu -model.indianSettlement.tension.angry=Les braves de la nation %nation% sont occupés à s'entraîner sur des cibles. Les femmes et les enfants se cachent dans leurs tentes. -model.indianSettlement.tension.content=Les membres de la nation %nation% sont occupés à travailler. Leurs enfants jouent avec insouciance à cache-cache. -model.indianSettlement.tension.displeased=Les membres de la nation %nation% sont occupés à leur travail. Leurs enfants sont invisibles, et leurs anciens sont renfrognés. -model.indianSettlement.tension.happy=Les membres de la nation %nation% dansent joyeusement autour de leur feu de camp en chantant la chanson de leurs ancêtres. -model.indianSettlement.tension.hateful=Les braves de la nation %nation% agitent leurs armes. Ils ont orné leur ceinture des scalps de leurs ennemis, et leurs poteaux de torture montrent des signes d'utilisation intense. +model.indianSettlement.tension.angry=Les braves {{tag:plur|%nation%}} sont occupés à s’entraîner sur des cibles. Les femmes et les enfants se cachent dans leurs tentes. +model.indianSettlement.tension.content=Les {{tag:people|%nation%}} sont occupés à travailler. Leurs enfants jouent avec insouciance à cache-cache. +model.indianSettlement.tension.displeased=Les {{tag:people|%nation%}} sont occupés à leur travail. Leurs enfants sont invisibles, et leurs anciens sont renfrognés. +model.indianSettlement.tension.happy=Les {{tag:people|%nation%}} dansent joyeusement autour de leur feu de camp en chantant les chansons de leurs ancêtres. +model.indianSettlement.tension.hateful=Les braves {{tag:plur|%nation%}} agitent leurs armes. Ils ont orné leur ceinture des scalps de leurs ennemis, et leurs poteaux de torture montrent des signes d’utilisation intense. model.indianSettlement.tension.unknown=Inconnu model.indianSettlement.tension.wary=Méfiant model.indianSettlement.wantedGoodsNone=Aucun model.indianSettlement.wantedGoodsUnknown=Inconnu model.lostCityRumour.name=Rumeur de cité perdue -model.lostCityRumour.burialGround.description=Ce tumulus est celui de nos ancêtres %nation%. Vous avez commis un sacrilège. À présent vous devez mourir. -model.lostCityRumour.cibola.description=Vous avez découvert %city%, l’une des sept cités d’or perdues, et un butin valant %money% ! Déplacez le train de trésors vers l’une de vos colonies pour encaisser l’argent, ou envoyez-le en Europe dans un galion. -model.lostCityRumour.colonist.description=Vous rencontrez un survivant d’une expédition précédente. Il jure allégeance à la Couronne contre un peu de nourriture. +model.lostCityRumour.burialGround.description=Ce tumulus est celui de nos ancêtres {{tag:plur|%nation%}}. Vous avez commis un sacrilège. À présent vous devez mourir. +model.lostCityRumour.cibola.description=Vous avez découvert %city%, l’une des sept cités d’or perdues, et un butin valant %money% ! Déplacez le trésor vers l’une de vos colonies pour l’encaisser, ou envoyez-le en Europe dans un galion. +model.lostCityRumour.colonist.description=Vous rencontrez les survivants d’une colonie perdue. Ils jurent allégeance à la Couronne contre un peu de nourriture. model.lostCityRumour.expeditionVanishes.description=Votre expédition disparaît sans laisser de traces. model.lostCityRumour.fountainOfYouth.description=Vous avez découvert une fontaine de jouvence. Les rumeurs vont bon train en Europe. Les immigrants s’entassent sur les quais pour venir trouver la jeunesse éternelle dans le Nouveau Monde ! model.lostCityRumour.fountainOfYouth.noEurope.description=Vous avez découvert une fontaine de jouvence. model.lostCityRumour.learn.description=Votre %unit% a acquis de l’expérience et est maintenant un(e) %type% ! -model.lostCityRumour.mounds.description=À l'intérieur, vous trouvez des trésors incroyables valant %money% d’or ! +model.lostCityRumour.mounds.description=À l’intérieur, vous trouvez des trésors incroyables valant %money% pièces d’or ! model.lostCityRumour.nothing.0.description=La rumeur de « cité perdue » s’avère n’être qu’une rumeur ! -model.lostCityRumour.nothing.mayans.description=Vous découvrez d'anciennes inscriptions prophétisant la fin du monde! Des rumeurs se propagent et les colons crédules perdent leur temps en soutenant que la catastrophe est imminente ou prévue dans %years% ans. +model.lostCityRumour.nothing.mayans.description=Vous découvrez d’anciennes inscriptions prophétisant la fin du monde ! Des rumeurs se propagent et les colons crédules perdent leur temps en soutenant que la catastrophe est imminente ou prévue dans %years% ans. model.lostCityRumour.nothing.mounds.description=Les monticules sont froids et vides. -model.lostCityRumour.ruins.description=Vous avez découvert les ruines d’une civilisation perdue. Elle renferme de l’or et des trésors valant %money% ! -model.lostCityRumour.tribalChief.description=Le chef d’une petite tribu vous offre pour %money% or de babioles. +model.lostCityRumour.ruins.description=Vous avez découvert les ruines d’une civilisation perdue. Elles renferment de l’or et des trésors valant %money% ! +model.lostCityRumour.tribalChief.description=Le chef d’une petite tribu vous offre pour %money% pièces d’or de babioles. model.lostCityRumour.tribalChief.mounds.description=À l’intérieur, vous trouvez des bibelots valant %money%. -model.market.priceDecrease=A %market%, le prix de %goods% est tombé à %sell%/%buy%. -model.market.priceIncrease=A %market%, les prix de %goods% sont montés à %sell%/%buy%. -model.messageType.buildingCompleted.name=Constructions terminées -model.messageType.combatResult.name=Résultat des combats +model.market.priceDecrease=À %market%, le prix de %goods% est tombé à %sell%/%buy%. +model.market.priceIncrease=À %market%, le prix de %goods% est monté à %sell%/%buy%. +model.messageType.buildingCompleted.name=Bâtiments terminés +model.messageType.combatResult.name=Résultats des combats model.messageType.default.name=Messages model.messageType.demands.name=Demandes indigènes model.messageType.foreignDiplomacy.name=Affaires étrangères model.messageType.giftGoods.name=Cadeaux indiens -model.messageType.goodsMovement.name=Mouvement de marchandises +model.messageType.goodsMovement.name=Mouvements de marchandises model.messageType.governmentEfficiency.name=Efficacité du gouvernement model.messageType.lostCityRumour.name=Rumeurs de cité perdue model.messageType.marketPrices.name=Prix du marché model.messageType.missingGoods.name=Marchandises manquantes -model.messageType.sonsOfLiberty.name=Fils de Liberté +model.messageType.sonsOfLiberty.name=Fils de la Liberté model.messageType.tutorial.name=Didactitiel model.messageType.unitAdded.name=Nouveaux colons model.messageType.unitDemoted.name=Dégradations d’unités @@ -2011,52 +2022,52 @@ model.messageType.unitImproved.name=Promotions d’unités model.messageType.unitLost.name=Pertes d’unités model.messageType.warehouseCapacity.name=Capacité des entrepôts model.messageType.warning.name=Alertes -model.monarch.action.addToRef.text=La Couronne a ajouté %number% {{plural:%number%|%unit%}} à la force expéditionnaire royale. Les chefs coloniaux expriment leur inquiétude. +model.monarch.action.addToRef.text=La Couronne a ajouté %number% {{plural:%number%|%unit%}} au Corps expéditionnaire royal. Les chefs coloniaux expriment leur inquiétude. model.monarch.action.addToRef.no=Fait -model.monarch.action.declarePeace.text=Nous avons gracieusement accepté un traité de paix avec les %nation%. +model.monarch.action.declarePeace.text=Nous avons gracieusement accepté un traité de paix avec {{tag:country|%nation%}}. model.monarch.action.declarePeace.no=Fait -model.monarch.action.declareWar.text=L'insolence des forces de %nation% nous oblige à leur déclarer la guerre! -model.monarch.action.declareWarSupported.text=L’insolence des %nation% Nous force à leur déclarer la guerre ! Pour accélérer cela, nos troupes loyales (%force%) attendent vos ordres, et une somme supplémentaire de %gold% a été ajoutée à votre trésor. +model.monarch.action.declareWar.text=L’insolence des forces de {{tag:country|%nation%}} Nous oblige à leur déclarer la guerre ! +model.monarch.action.declareWarSupported.text=L’insolence de {{tag:country|%nation%}} Nous force à leur déclarer la guerre ! Pour accélérer cela, Nos troupes loyales (%force%) attendent vos ordres, et une somme supplémentaire de %gold% a été ajoutée à votre trésor. model.monarch.action.declareWar.no=Fait model.monarch.action.displeasure.text=Vous osez accepter Nos généreuses conditions et tentez d’éviter leur paiement ? Une telle duplicité récoltera l’amère récompense de Notre déplaisir. model.monarch.action.displeasure.no=Fait -model.monarch.action.forceTax.text=Nous méprisons votre tentative d'échapper à Notre fiscalité. Le taux d'impôt est maintenant %amount%%. +model.monarch.action.forceTax.text=Nous méprisons votre tentative d’échapper à Notre fiscalité. Le taux d’impôt est maintenant %amount%%. model.monarch.action.forceTax.no=Fait -model.monarch.action.hessianMercenaries.text=Moi, %leader%, ait remarqué votre situation militaire et vous offre gracieusement le services de nos loyales troupes (%mercenaries%) pour la somme de %gold%. +model.monarch.action.hessianMercenaries.text=Moi, %leader%, ai remarqué votre situation militaire et vous offre gracieusement les services de Nos loyales troupes (%mercenaries%) pour la somme de %gold%. model.monarch.action.hessianMercenaries.no=Hélas, nous ne pouvons pas nous les permettre. model.monarch.action.hessianMercenaries.yes=Nous acceptons model.monarch.action.hessianMercenaries.header=Correspondance étrangère -model.monarch.action.lowerTax.text=Après un examen attentif, nous avons gracieusement décidé de diminuer votre taux d'imposition de %difference%%. Le taux est maintenant de %newTax%%. +model.monarch.action.lowerTax.text=Après un examen attentif, Nous avons gracieusement décidé de diminuer votre taux d’imposition de %difference%%. Le taux est maintenant de %newTax%%. model.monarch.action.lowerTax.no=Fait -model.monarch.action.lowerTaxOther.text=Afin de célébrer {{tag:%number%|0=notre récent mariage|1=notre récent mariage avec notre seconde femme|2=la naissance d'un prince héritier|3=la naissance d'un fils royal|4=la naissance d'une fille royale}}, nous avons gracieusement décidé de diminuer votre taux d'imposition de %difference%%. Le taux est maintenant de %newTax%%. +model.monarch.action.lowerTaxOther.text=Afin de célébrer {{tag:%number%|0=Notre récent mariage|1=Notre récent mariage avec Notre seconde femme|2=la naissance d’un prince héritier|3=la naissance d’un fils royal|4=la naissance d’une fille royale}}, Nous avons gracieusement décidé de diminuer votre taux d’imposition de %difference%%. Le taux est maintenant de %newTax%%. model.monarch.action.lowerTaxOther.no=Longue vie au Roi ! -model.monarch.action.lowerTaxWar.text=Afin de célébrer notre récente victoire contre les traîtres de {{tag:people|%nation%}}, nous avons gracieusement décidé de baisser votre taux d'imposition de %difference%%. Le taux est maintenant de %newTax%%. +model.monarch.action.lowerTaxWar.text=Afin de célébrer Notre récente victoire contre les traîtres {{tag:people|%nation%}}, Nous avons gracieusement décidé de baisser votre taux d'imposition de %difference%%. Le taux est maintenant de %newTax%%. model.monarch.action.lowerTaxWar.no=Hourrah ! -model.monarch.action.monarchMercenaries.text=Afin de vous soutenir dans vos guerres coloniales, nous avons décidé de vous accorder quelques mercenaires (%mercenaries%) pour un prix de %gold%. +model.monarch.action.monarchMercenaries.text=Afin de vous soutenir dans vos guerres coloniales, Nous avons décidé de vous accorder quelques mercenaires (%mercenaries%) au prix de %gold%. model.monarch.action.monarchMercenaries.no=Hélas, nous ne pouvons pas nous les permettre. model.monarch.action.monarchMercenaries.yes=Nous acceptons -model.monarch.action.raiseTaxAct.text=Les différentes actions de défi effectuées par des colons déloyaux de %newWorld% ne nous laissent pas d'autre choix que d'imposer un nouveau décret sur {{tag:%number%|0=la navigation|1=le thé|2=la laine|3=les chapeaux|4=la mélasse|5=les timbres}}, augmentant votre taxe à %amount%%. Si vous le refusez, nous nous ferons un plaisir de boycotter vos %goods%! +model.monarch.action.raiseTaxAct.text=Les différents gestes de défi posés par des colons déloyaux de %newWorld% ne Nous laissent pas d'autre choix que d'imposer un nouveau décret sur {{tag:%number%|0=la navigation|1=le thé|2=la laine|3=les chapeaux|4=la mélasse|5=les timbres}}, augmentant votre taxe à %amount%%. Si vous le refusez, Nous Nous ferons un plaisir de boycotter vos %goods% ! model.monarch.action.raiseTaxAct.no=La Liberté ou la Mort ! model.monarch.action.raiseTaxAct.yes=Nous acceptons -model.monarch.action.raiseTaxWar.text=Nous sommes au regret de vous informer que les récents reculs dans notre guerre contre {{tag:country|%nation%}} ne nous laissent pas d'autre choix que d'augmenter votre taxe à %amount%%. Si vous le refusez, nous serons forcés de boycotter vos %goods%! -model.monarch.action.raiseTaxWar.no=Aucune taxation sans représentation! +model.monarch.action.raiseTaxWar.text=Nous sommes au regret de vous informer que les récents reculs dans Notre guerre contre {{tag:country|%nation%}} ne Nous laissent pas d’autre choix que d’augmenter votre taxe à %amount%%. Si vous le refusez, Nous serons forcés de boycotter vos %goods% ! +model.monarch.action.raiseTaxWar.no=Aucune taxation sans représentation ! model.monarch.action.raiseTaxWar.yes=Nous acceptons -model.monarch.action.supportLand.text=Afin de vous soutenir dans vos guerres coloniales, la couronne a décidé de vous fournir des troupes de vétérans(%addition%). +model.monarch.action.supportLand.text=Afin de vous soutenir dans vos guerres coloniales, la Couronne a décidé de vous fournir des troupes de vétérans (%addition%). model.monarch.action.supportLand.no=Fait -model.monarch.action.supportSea.text=Afin de protéger les routes maritimes des déprédations des flibustiers, boucaniers et pirates, la Couronne a décidé de vous accorder un support naval (%addition%). +model.monarch.action.supportSea.text=Afin de protéger les routes maritimes des déprédations des corsaires, boucaniers et pirates, la Couronne a décidé de vous accorder un support naval (%addition%). model.monarch.action.supportSea.no=Fait model.monarch.action.waiveTax.text=Dans Notre grande mansuétude, Nous avons décidé de renoncer généreusement à cette augmentation des taxes. model.monarch.action.waiveTax.no=Fait -model.nation.turkish.name={{tag:|country=L'Empire Ottoman|people=Ottoman|default=Ottoman}} -model.nation.german.name={{tag:|country=Le Saint Empire Romain|people=Allemand|default=Allemand}} -model.nation.prussian.name={{tag:|country=Prusse|people=Prussien|default=Prussien}} -model.nation.austrian.name={{tag:|country=Autriche|people=Autrichiens|default=autrichien}} +model.nation.turkish.name={{tag:|country=l’Empire Ottoman|people=Ottomans|fem=ottomane|plur=ottomans|femplur=ottomanes|default=ottoman}} +model.nation.german.name={{tag:|country=le Saint Empire Romain|people=Allemands|fem=allemande|plur=allemands|femplur=allemandes|default=allemand}} +model.nation.prussian.name={{tag:|country=la Prusse|people=Prussiens|fem=prussienne|plur=prussiens|femplur=prussiennes|default=prussien}} +model.nation.austrian.name={{tag:|country=l’Autriche|people=Autrichiens|fem=autrichienne|plur=autrichiens|femplur=autrichiennes|default=autrichien}} model.advantages.none.name=Aucun -model.advantages.none.shortDescription=Aucun avantage pour toutes les nations du jeu. Ceci est surtout prévu pour les parties multi-joueurs. +model.advantages.none.shortDescription=Aucune nation du jeu n’a d’atout. Ceci est surtout prévu pour les parties multi-joueurs. model.advantages.fixed.name=Fixés -model.advantages.fixed.shortDescription=Toutes les nations utilisent leurs avantages par défaut. Ceci est utilisé pour émuler le jeu d’origine. +model.advantages.fixed.shortDescription=Toutes les nations utilisent leurs atouts par défaut. Ceci est utilisé pour émuler le jeu d’origine. model.advantages.selectable.name=Sélectionnable -model.advantages.selectable.shortDescription=Les avantages nationaux sont sélectionnables et n’ont pas à être uniques. +model.advantages.selectable.shortDescription=Les atouts nationaux sont sélectionnables et n’ont pas à être uniques. model.nationState.aiOnly.name=IA seulement model.nationState.aiOnly.shortDescription=Cette nation n’est disponible que pour les joueurs de l’IA model.nationState.available.name=disponible @@ -2066,16 +2077,16 @@ model.nationState.notAvailable.shortDescription=Cette nation n’est pas disponi model.noClaimReason.europeans.description=Ce terrain est revendiqué par une autre nation européenne. model.noClaimReason.natives.description=Ce terrain est revendiqué par une tribu indigène. model.noClaimReason.occupied.description=Ce territoire est occupé par un ennemi dangereux. -model.noClaimReason.rumour.description=Il y a quelque chose d'étrange ici, nous devons l'examiner avant d'y travailler. -model.noClaimReason.settlement.description=Nous ne pouvons pas utiliser un terrain avec un village dessus. -model.noClaimReason.terrain.description=Ce terrain n'est pas approprié pour une colonie. -model.noClaimReason.water.description=Nous ne réclamons pas les eaux. +model.noClaimReason.rumour.description=Il y a quelque chose d’étrange ici, nous devons l’examiner avant d’y travailler. +model.noClaimReason.settlement.description=Nous ne pouvons pas utiliser un terrain habité. +model.noClaimReason.terrain.description=Ce terrain n’est pas approprié pour une colonie. +model.noClaimReason.water.description=Nous ne revendiquons pas les eaux. model.noClaimReason.worked.description=Un autre village utilise déjà ce territoire. model.player.colonialIndependence=Seuls les joueurs coloniaux peuvent déclarer leur indépendance. -model.player.forces=Forces de %nation% +model.player.forces=Forces {{tag:femplur|%nation%}} model.player.independentMarket=Europe -model.player.startGame=Après des mois passés à voguer sur l’océan, vous arrivez enfin au large des côtes d’un continent inconnu. Faites voile vers {{tag:%direction%|west=l'ouest|east=l'est|default=sous le vent}} pour découvrir le Nouveau Monde et le revendiquer au nom de la Couronne. -model.player.waitingFor=Les %nation% terminent leur tour. +model.player.startGame=Après des mois passés à voguer sur l’océan, vous arrivez enfin au large des côtes d’un continent inconnu. Faites voile vers {{tag:%direction%|west=l’ouest|east=l’est|default=sous le vent}} pour découvrir le Nouveau Monde et le revendiquer au nom de la Couronne. +model.player.waitingFor=Attente de : {{tag:country|%nation%}}. model.regionType.coast.name=Côte model.regionType.coast.unknown=Région côtière inconnue model.regionType.desert.name=Désert @@ -2096,7 +2107,7 @@ model.stance.peace.name=Paix model.stance.uncontacted.name=Non contacté model.stance.war.name=Guerre model.tension.happy.name=Heureux -model.tension.content.name=Contenu +model.tension.content.name=Content model.tension.displeased.name=Contrarié model.tension.angry.name=En colère model.tension.hateful.name=Haineux @@ -2104,10 +2115,10 @@ model.tile.nameLocation=%name% (%location%) model.tile.nearLocation=%direction% de %location% model.tile.simpleLabel=Case (%x%, %y%) warning.europeanLand=Une partie des terres de cette nouvelle colonie est déjà détenue par des Européens. -warning.landLocked=Votre nouvelle colonie sera dans les terres. -warning.nativeLand=Une partie des terres de cette nouvelle colonie est déjà réclamée par les indigènes. -warning.noBuildingMaterials=Votre nouvelle colonie produira très peu de %goods%. -warning.noFood=Votre nouvelle colonie produira très peu de nourriture. +warning.landLocked=Votre nouvelle colonie serait sans accès à la mer. +warning.nativeLand=Une partie des terres de cette nouvelle colonie est déjà revendiquée par les indigènes. +warning.noBuildingMaterials=Votre nouvelle colonie produirait très peu de %goods%. +warning.noFood=Votre nouvelle colonie produirait très peu de nourriture. warning.ownLand=Une partie des terres de cette nouvelle colonie est déjà détenue par vous. model.tradeItem.colony.name=Colonie model.tradeItem.colony.description=la colonie de %colony% @@ -2115,19 +2126,19 @@ model.tradeItem.gold.name=Or model.tradeItem.gold.description=la somme de %amount% or model.tradeItem.goods.name=Marchandises model.tradeItem.incite.name=Déclarer la guerre à -model.tradeItem.incite.description=guerre contre les %nation% +model.tradeItem.incite.description=guerre contre {{tag:country|%nation%}} model.tradeItem.stance.name=Relations model.tradeItem.unit.name=Unité model.tradeRoute.allEmpty=Tous les arrêts sont vides. model.tradeRoute.alwaysPresent=%goodsType% est chargé à tous les arrêts. -model.tradeRoute.duplicateName=Cette route commerciale a le même nom qu’une de vos routes commerciales existante : %name%. Veuillez choisir un nom unique. +model.tradeRoute.duplicateName=Cette route commerciale a le même nom qu’une de vos routes commerciales existantes : %name%. Veuillez choisir un nom unique. model.tradeRoute.notEnoughStops=Une route commerciale nécessite au moins 2 arrêts ! model.tradeRoute.nullOwner=Cette route commerciale n’a pas de propriétaire ! model.tradeRoute.invalidStop=L’arrêt %name% n’est pas valide. model.season.autumn.name=Automne model.season.spring.name=Printemps model.unit.attackTileOdds=Attaquer ! (%chance%% de chance de succès) -model.unit.goingTo={{tag:%type%|person=Marcher|ship=Naviguer|other=En route}} vers %location% +model.unit.goingTo={{tag:%type%|person=En marche|ship=Faisant voile|other=En route}} vers %location% model.unit.occupation.goingSomewhere=G model.unit.occupation.inTradeRoute=T model.unit.occupation.underRepair=R @@ -2137,23 +2148,22 @@ model.unit.underRepair=Réparation (%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S -model.unit.unitState.skipped=W +model.unit.unitState.skipped=X model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G model.noAddReason.alreadyPresent.description=Déjà présent à cet endroit. model.noAddReason.anotherColony.description=Cet endroit est utilisé par une autre de vos colonies. -model.noAddReason.capacityExceeded.description=Il n'y a plus assez de place à cet endroit. +model.noAddReason.capacityExceeded.description=Il n’y a plus assez de place à cet endroit. model.noAddReason.claimRequired.description=Cet emplacement appartient à une autre nation, mais peut être revendiqué. model.noAddReason.colonyCenter.description=Rien ne peut être ajouté au centre de la colonie. model.noAddReason.maximumSkill.description=La compétence de l’unité dépasse la compétence maximale supportée par cet emplacement. model.noAddReason.minimumSkill.description=L’unité n’a pas la compétence minimale requise pour travailler à cet endroit. -model.noAddReason.missingAbility.description=Cet endroit ne peut être exploité tant que vous n'avez pas construit des quais. +model.noAddReason.missingAbility.description=Cet endroit ne peut être exploité tant que vous n’avez pas construit de quais. model.noAddReason.missingSkill.description=Une compétence particulière est nécessaire pour travailler à cet endroit. -model.noAddReason.occupiedByEnemy.description=Cet emplacement est occupé une une unité d'une autre nation. -model.noAddReason.ownedByEnemy.description=Cet endroit est la propriété d'une autre nation. +model.noAddReason.occupiedByEnemy.description=Cet emplacement est occupé par une unité d’une autre nation. +model.noAddReason.ownedByEnemy.description=Cet endroit est la propriété d’une autre nation. model.noAddReason.wrongType.description=Type incorrect à cet endroit. model.building.noStudent=Notre %teacher% de %colony% attend un étudiant. model.building.notEnoughInput=Il n’y a plus de %inputGoods% disponible pour le(a) %building% à %colony%. @@ -2164,13 +2174,14 @@ model.colony.buildingReady=%colony% a terminé son chantier (%building%). model.colony.cannotBuild=Vous ne construisez rien à %colony%. model.colony.colonistStarved=Un colon est mort de faim à %colony% ! model.colony.colonyStarved=Le dernier colon de %colony% est mort de faim, laissant la colonie abandonnée. -model.colony.customs.sale=La Chambre des douanes à %colony% a vendu : %data%. +model.colony.customs.sale=La douane à %colony% a vendu : %data%. model.colony.customs.saleData=%amount% %goods% pour %gold% -model.colony.famineFeared=La famine menace à %colony%. %number% tours seulement avant de manquer de nourriture. -model.colony.newColonist=Un colon est né à %colony%. Toutes nos félicitations aux parents. +model.colony.famineFeared=La famine menace %colony%. %number% tours seulement avant de manquer de nourriture. +model.colony.starving=%colony% meurt de faim. +model.colony.newColonist=Un colon est né à %colony%. model.colony.newConvert=Un nouveau converti %nation% est arrivé à %colony%. -model.colony.notBuildingAnything=Rien n'est en cours de construction dans %colony%. -model.colony.soLDecrease=Le sentiment rebelle en %colony% est tombée à %newSoL% % ! +model.colony.notBuildingAnything=Rien n’est en cours de construction dans %colony%. +model.colony.soLDecrease=Le sentiment rebelle en %colony% est tombé à %newSoL% % ! model.colony.soLIncrease=L’appartenance aux Fils de la Liberté à %colony% a atteint %newSoL% % model.colony.unitReady=%colony% a fini de construire %unit%. model.colony.warehouseEmpty=Il y a moins de %level% unités de %goods% dans votre entrepôt de %colony%. @@ -2180,72 +2191,72 @@ model.colony.warehouseSoonFull=Votre entrepôt de %colony% va excéder sa capaci model.colony.warehouseWaste=Votre entrepôt de %colony% a dépassé sa capacité en %goods%. %waste% unités ont été détruites. model.colony.workersEvicted=À %colony%, vos colonisateurs ne peuvent plus travailler sur %location% à cause de la présence de %enemyUnit%. model.colonyTile.resourceExhausted=Ressource %resource% épuisée à %colony% -model.game.spanishSuccession=Votre Excellence, la guerre de succession d’Espagne s’est terminée en Europe. Par le traité d’Utrecht, les %loserNation% ont été obligés de céder toutes leurs colonies dans le Nouveau Monde aux %nation% ! +model.game.spanishSuccession=Votre Excellence, la guerre de succession d’Espagne s’est terminée en Europe. Par le traité d’Utrecht, les {{tag:people|%loserNation%}} ont été obligés de céder toutes leurs colonies dans le Nouveau Monde à {{tag:country|%nation%}} ! model.indianSettlement.mission.denounced=Votre missionnaire à %settlement% a été dénoncé et exécuté ! -model.indianSettlement.mission.destroyed=Votre missionnaire à %settlement% est mort dans la destruction de ce campement. -model.player.alarmIncrease.tension.angry=Le chef %nation% à %settlement% prévient que les braves appellent ouvertement à la guerre avec les %enemy%, pour nous débarrasser de vos colons envahissants et de vos guerriers arrogants sur nos terres. -model.player.alarmIncrease.tension.content=Le chef %nation% à %settlement% salut ses amis de %enemy%. Nous sommes heureux de voir croître la coopération entre nous, mais nous sommes préoccupés par les empiètements de vos colons sur nos terres. +model.indianSettlement.mission.destroyed=Votre missionnaire à %settlement% est mort dans la destruction de cette agglomération. +model.player.alarmIncrease.tension.angry=Le chef %nation% à %settlement% prévient que les braves appellent ouvertement à la guerre avec les {{tag:people|%enemy%}}, pour se débarrasser de vos colons envahissants et de vos guerriers arrogants sur nos terres. +model.player.alarmIncrease.tension.content=Le chef %nation% à %settlement% salue ses amis {{tag:plur|%enemy%}}. Nous sommes heureux de voir croître la coopération entre nous, mais nous sommes préoccupés par les empiètements de vos colons sur nos terres. model.player.autoRecruit=Les troubles religieux en %europe% poussent %unit% à émigrer. model.player.colonyGoodsParty.harbour=Les colons de %colony% ont jeté %amount% unités de %goods% dans le port, en signe de protestation contre les taxes imposées par la Couronne. model.player.colonyGoodsParty.horses=Vos colons à %colony% ont libéré %amount% chevaux en protestation contre les impôts injustes imposés par la Couronne ! model.player.colonyGoodsParty.landLocked=Les colons de %colony% ont brûlé %amount% unités de %goods% sur la place du marché, en signe de protestation contre les taxes imposées par la Couronne. -model.player.dead.european=Votre Excellence, les %nation% ont déclaré un retrait inconditionnel des affaires du Nouveau Monde ! -model.player.dead.native=Votre Excellence, les %nation% ont été détruits. -model.player.disaster.bankruptcy.start=Vous n'avez pas payé pour l'entretien de tous les bâtiments. De gros malus de production s'appliquent. -model.player.disaster.bankruptcy.stop=Une fois de plus, vous êtes en mesure de payer pour l'entretien de tous les bâtiments. Les malus de production ont été supprimés. +model.player.dead.european=Votre Excellence, {{tag:country|%nation%}} a déclaré un retrait inconditionnel des affaires du Nouveau Monde ! +model.player.dead.native=Votre Excellence, les {{tag:people|%nation%}} ont été détruits. +model.player.disaster.bankruptcy.start=Vous n’avez pas payé pour l’entretien de tous les bâtiments. De gros malus de production s’appliquent. +model.player.disaster.bankruptcy.stop=Vous êtes à nouveau en mesure de payer pour l’entretien de tous les bâtiments. Les malus de production ont été supprimés. model.player.disaster.effect.colonyDestroyed=%colony% a été complètement détruite. model.player.disaster.strikes=Votre colonie %colony% a été frappée par un %disaster%. model.player.emigrate=En %europe%, %unit% a décidé d’émigrer. model.player.foundingFatherJoinedCongress=%foundingFather% a rejoint le Congrès !\n\n%description% -model.player.ignoredMercenaries=La couronne a retiré son offre gratuite passée de soutien mercenaire, en l’absence de réponse. +model.player.ignoredMercenaries=La couronne a retiré son offre antérieure de soutien mercenaire, en l’absence de réponse. model.player.ignoredTax=La couronne a augmenté le taux de taxation à %amount%%, comme annoncé précédemment. -model.player.interventionForceArrives=La Force d'intervention promise arrive! +model.player.interventionForceArrives=La Force d’intervention promise arrive ! model.player.soLDecrease=L’appartenance aux Fils de Liberté dans vos colonies a chuté à %newSoL% %. model.player.soLIncrease=L’appartenance aux Fils de Liberté dans vos colonies a atteint %newSoL% %. -model.player.stance.alliance.declared=Votre Excellence, %nation% est alliée avec nous ! -model.player.stance.alliance.others=Votre Excellence, %attacker% est alliée avec %defender%. -model.player.stance.ceaseFire.declared=Votre Excellence, les %nation% ont convenu d’un cessez-le-feu avec nous! -model.player.stance.ceaseFire.others=Votre Excellence, les %attacker% ont convenu d’un cessez-le-feu avec les %defender%. -model.player.stance.peace.declared=Votre Excellence, les %nation% sont en paix avec nous ! -model.player.stance.peace.others=Votre Excellence, les %attacker% sont en paix avec les %defender%. -model.player.stance.war.declared=Mauvaise nouvelle, Excellence, les %nation% nous ont déclaré la guerre ! -model.player.stance.war.others=Excellence, les %attacker% ont déclaré la guerre aux %defender%. +model.player.stance.alliance.declared=Votre Excellence, la nation {{tag:fem|%nation%}} est alliée avec nous ! +model.player.stance.alliance.others=Votre Excellence, {{tag:country|%attacker%}} est alliée avec {{tag:country|%defender%}}. +model.player.stance.ceaseFire.declared=Votre Excellence, {{tag:country|%nation%}} a convenu d’un cessez-le-feu avec nous ! +model.player.stance.ceaseFire.others=Votre Excellence, les {{tag:people|%attacker%}} ont convenu d’un cessez-le-feu avec les {{tag:people|%defender%}}. +model.player.stance.peace.declared=Votre Excellence, {{tag:country|%nation%}} est en paix avec nous ! +model.player.stance.peace.others=Votre Excellence, les {{tag:people|%attacker%}} sont en paix avec les {{tag:people|%defender%}}. +model.player.stance.war.declared=Mauvaise nouvelle, Excellence, {{tag:country|%nation%}} nous a déclaré la guerre ! +model.player.stance.war.others=Excellence, les {{tag:people|%attacker%}} ont déclaré la guerre aux {{tag:people|%defender%}}. combat.automaticDefence=Votre %unit% à %colony% a pris les armes pour défendre la colonie ! -combat.buildingDamaged=%building% de %colony% a été détruit par %enemyNation% %enemyUnit% ! -combat.burnMissions=Toutes les missions de %nation% dans %enemyNation% ont été brûlées ! -combat.colonyBurning=La colonie de %colony% a été rasée par un(e) %unit% des %nation%, %amount% pièces d’or saisies ! -combat.colonyCaptured=Vous avez pris %colony%. %amount% pièces d’or saisies. -combat.colonyCapturedBy=Le %player% a capturé %colony%. %amount% pièces d’or saisies ! -combat.enemyColonyBurning=La colonie %colony% de %nation% a été brûlée par %attackerNation% ! -combat.enemyShipDamaged=%unit% a endommagé un(e) %enemyUnit% des %enemyNation%, qui doit retourner en réparation. -combat.enemyShipDamagedByBombardment=%colony% ouvre le feu sur un(e) %unit% des %nation%, qui est endommagé(e) et doit retourner en réparation. -combat.enemyShipEvaded=Un(e) %enemyUnit% des %enemyNation% a échappé à une attaque de votre %unit%. -combat.enemyShipSunk=Votre %unit% a coulé un(e) %enemyUnit% des %enemyNation% ! -combat.equipmentCaptured=Prenez garde, les braves %nation% ont acquis des %equipment% ! -combat.goodsStolen=Un(e) %enemyUnit% des %enemyNation% vole %amount% %goods% à %colony% ! -combat.indianPlunder=Un(e) %enemyUnit% des %enemyNation% a pillé %amount% de %colony%. -combat.indianRaid=Nos espions nous rapportent que la %nation% a fait un raid sur la colonie %colonyNation% de %colony%. -combat.indianSurprise=La %nation% a fait un raid surprise sur %colony%, jetant l'alarme parmi nos colons. Le chef de %nation% nie toute implication. -combat.indianTreasure=Vous saisissez %amount% dans le campement %settlement%. -combat.nativeCapitalBurned=Vous avez brûlé %name%, la capitale de %nation%. La %nation% se soumet ! -combat.newConvertFromAttack=Un(e) %unit% apeuré(e) des %nation% vous rejoint ! -combat.shipDamaged=Votre %unit% a été endommagé(e) par un(e) %enemyUnit% des %enemyNation% et doit retourner en réparation (lieu : %repairLocation%). Tous les biens et les unités à bord ont été perdus. +combat.buildingDamaged=%building% de %colony% a été détruit par %enemyUnit% {{tag:fem|%enemyNation%}} ! +combat.burnMissions=Toutes les missions {{tag:femplur|%nation%}} dans {{tag:country|%enemyNation%}} ont été brûlées ! +combat.colonyBurning=La colonie de %colony% a été rasée par un(e) %unit% des {{tag:people|%nation%}}, %amount% pièces d’or pillées ! +combat.colonyCaptured=Vous avez pris %colony%. %amount% pièces d’or pillées. +combat.colonyCapturedBy=Le %player% a capturé %colony%. %amount% pièces d’or pillées ! +combat.enemyColonyBurning=La colonie %colony% de %nation% a été brûlée par {{tag:country|%attackerNation%}} ! +combat.enemyShipDamaged=%unit% a endommagé un(e) %enemyUnit% des {{tag:people|%enemyNation%}}, qui doit retourner en réparation. +combat.enemyShipDamagedByBombardment=%colony% ouvre le feu sur un(e) %unit% des {{tag:people|%nation%}}, qui est endommagé(e) et doit retourner en réparation. +combat.enemyShipEvaded=Un(e) %enemyUnit% des {{tag:people|%enemyNation%}} a échappé à une attaque de votre %unit%. +combat.enemyShipSunk=Votre %unit% a coulé un(e) %enemyUnit% des {{tag:people|%enemyNation%}} ! +combat.equipmentCaptured=Prenez garde, les braves {{tag:plur|%nation%}} ont acquis des %equipment% ! +combat.goodsStolen=Un(e) %enemyUnit% des {{tag:people|%enemyNation%}} vole %amount% %goods% à %colony% ! +combat.indianPlunder=%enemyUnit% des {{tag:people|%enemyNation%}} a pillé %amount% pièces d’or de %colony%. +combat.indianRaid=Nos espions nous rapportent que {{tag:country|%nation%}} a fait un raid sur la colonie {{tag:fem|%colonyNation%}} de %colony%. +combat.indianSurprise={{ucfirst:{{tag:country|%nation%}}}} a fait un raid surprise sur %colony%, jetant l’alarme parmi nos colons. Le chef des {{tag:people|%nation%}} nie toute implication. +combat.indianTreasure=Vous pillez %amount% de %settlement%. +combat.nativeCapitalBurned=Vous avez brûlé %name%, la capitale de {{tag:country|%nation%}}. La nation se soumet ! +combat.newConvertFromAttack=Un(e) %unit% apeuré(e) des {{tag:people|%nation%}} vous rejoint ! +combat.shipDamaged=Votre %unit% a été endommagé(e) par un(e) %enemyUnit% des {{tag:people|%enemyNation%}} et doit retourner en réparation (lieu : %repairLocation%). Tous les biens et les unités à bord ont été perdus. combat.shipDamagedByBombardment=%colony% ouvre le feu sur %unit% ! %unit% est endommagé(e) et doit retourner à %repairLocation% pour réparation. Tous les biens et les unités à bord ont été perdus ! -combat.shipEvaded=Le/La %unit% a déjoué une attaque d’un(e) %enemyUnit% des %enemyNation%. -combat.shipEvadedBombardment=%colony% ouvre le feu sur un(e) %unit% des %nation%, mais celle-ci réussit à s’enfuir. -combat.shipSunk=Votre %unit% a été coulé(e) par un(e) %enemyUnit% des %enemyNation% ! -combat.shipSunkByBombardment=%colony% ouvre le feu sur un(e) %unit% de %nation%, et le/la coule ! +combat.shipEvaded=Le/La %unit% a déjoué une attaque d’un(e) %enemyUnit% des {{tag:people|%enemyNation%}}. +combat.shipEvadedBombardment=%colony% ouvre le feu sur un(e) %unit% des {{tag:people|%nation%}}, mais celle-ci réussit à s’enfuir. +combat.shipSunk=Votre %unit% a été coulé(e) par un(e) %enemyUnit% des {{tag:people|%enemyNation%}} ! +combat.shipSunkByBombardment=%colony% ouvre le feu sur un(e) %unit% de {{tag:country|%nation%}}, et le/la coule ! combat.tradeRouteSuspended=Suspension de la route commerciale %route% par suite de la perte de %stop%. -combat.unitCaptured.veteranSoldier=%location% : Un soldat %nation% a été capturé par un(e) %enemyUnit% des %enemyNation% et a perdu son statut de vétéran ! -combat.unitCaptured=%location% : Un(e) %unit% des %nation% a été capturé(e) par un(e) %enemyUnit% %enemyNation%. -combat.unitDemoted.artillery=%location% : l’artillerie des %nation% a été endommagée par les %enemyUnit% des %enemyNation% ! D’autres dommages détruiraient les %unit%. -combat.unitDemoted=%location% : Après avoir perdu une bataille contre l’unité %enemyUnit% %enemyNation%, l’unité %oldName% des %nation% a été rétrogradée en %unit%. -combat.unitDemotedToUnarmed=%location% : Après avoir perdu une bataille contre l’unité %enemyUnit% %enemyNation%, l’unité %oldName% des %nation% a été rétrogradée en %unit%. -combat.unitLoseAutoEquip=%location%: les %unit% des %nation% se sont défendus vaillamment, mais ont perdu au profit des attaquants %enemyUnit% des %enemyNation% les armes fournies par %settlement%. -combat.unitPromoted=%oldName% %nation% a été promu %unit%. -combat.unitSlaughtered.damagedArtillery=%location% : L’artillerie des %nation% a été détruite par un(e) %enemyUnit% des %enemyNation% ! -combat.unitSlaughtered=%location% : Un(e) %unit% des %nation% a été massacrée par un(e) %enemyUnit% %enemyNation% ! -combat.unitWinColony=%location% : les %unit% %nation% ont battu les %enemyUnit% %enemyNation% à %settlement%, mais n’ont pas pu capturer la colonie. +combat.unitCaptured.veteranSoldier=%location% : Un soldat %nation% a été capturé par un(e) %enemyUnit% des {{tag:people|%enemyNation%}} et a perdu son statut de vétéran ! +combat.unitCaptured=%location% : Un(e) %unit% des {{tag:people|%nation%}} a été capturé(e) par un(e) %enemyUnit% {{tag:fem|%enemyNation%}}. +combat.unitDemoted.artillery=%location% : l’artillerie des {{tag:people|%nation%}} a été endommagée par les %enemyUnit% des {{tag:people|%enemyNation%}} ! D’autres dommages détruiraient l’%unit%. +combat.unitDemoted=%location% : Après avoir perdu une bataille contre l’unité %enemyUnit% {{tag:fem|%enemyNation%}}, l’unité %oldName% des {{tag:people|%nation%}} a été rétrogradée en %unit%. +combat.unitDemotedToUnarmed=%location% : Après avoir perdu une bataille contre l’unité %enemyUnit% {{tag:fem|%enemyNation%}}, l’unité %oldName% des {{tag:people|%nation%}} a été rétrogradée en %unit%. +combat.unitLoseAutoEquip=%location%: les %unit% des {{tag:people|%nation%}} se sont défendu(e)s vaillamment, mais ont perdu au profit des attaquants %enemyUnit% des {{tag:people|%enemyNation%}} les armes fournies par %settlement%. +combat.unitPromoted=%oldName% %nation% a été promu(e) %unit%. +combat.unitSlaughtered.damagedArtillery=%location% : L’artillerie des {{tag:people|%nation%}} a été détruite par un(e) %enemyUnit% des {{tag:people|%enemyNation%}} ! +combat.unitSlaughtered=%location% : Un(e) %unit% des {{tag:people|%nation%}} a été massacré(e) par un(e) %enemyUnit% %enemyNation% ! +combat.unitWinColony=%location% : les %unit% {{tag:plur|%nation%}} ont battu les %enemyUnit% %enemyNation% à %settlement%, mais n’ont pas pu capturer la colonie. model.region.north.name=Nord model.region.northEast.name=Nord-Est model.region.east.name=Est @@ -2264,11 +2275,11 @@ model.region.atlantic.name=Océan Atlantique model.region.northAtlantic.name=Océan Atlantique Nord model.region.southAtlantic.name=Océan Atlantique Sud model.unit.arriveInEurope=Notre vaisseau est arrivé à %europe%, Excellence. -model.unit.attrition=Votre %unit% à %location% s’est volatilisée dans les immensités sauvages! +model.unit.attrition=Votre %unit% à %location% s’est volatilisée dans les immensités sauvages ! model.unit.experience=À %colony%, %oldName% est devenu %unit% par expérience. -model.unit.nativeSettlementContact=Vous avez rencontré des éclaireurs %nation% de %settlement%. +model.unit.nativeSettlementContact=Vous avez rencontré des éclaireurs {{tag:plur|%nation%}} de %settlement%. model.unit.noMoreTools=%location% : Votre pionnier a utilisé tous ses outils et est redevenu %unit%. -model.unit.slowed=Un(e) %enemyUnit% des %enemyNation% ralentit le déplacement de notre %unit%. +model.unit.slowed=Un(e) %enemyUnit% des {{tag:people|%enemyNation%}} ralentit le déplacement de notre %unit%. model.unit.unitRepaired=Votre %unit% a été réparé(e) dans votre %repairLocation%. model.unit.hardyPioneer.noMoreTools=%location% : Votre pionnier a usé tous ses outils. error.couldNotLoad=Une erreur est survenue durant le chargement de la partie depuis le fichier %name% ! @@ -2278,42 +2289,42 @@ main.javaVersion=La version %minVersion% de Java ou mieux est recommandée pour main.memory=Vous devez assigner plus de %memory% octets de mémoire à la JVM.\n Redémarrez FreeCol avec: java -Xmx%minMemory%M -jar FreeCol.jar main.userDir.fail=FreeCol ne peut pas trouver de répertoires appropriés pour enregistrer les données utilisateur. Exécution en cours, mais attendez-vous à des problèmes. client.baseData=Impossible de trouver le répertoire des données de base %dir%.\n Les fichiers de données ne peuvent pas être trouvés par FreeCol.\n Veuillez vous assurer qu’ils existent.\n Si FreeCol cherche dans le mauvais répertoire, lancez alors le jeu avec un paramètre en ligne de commande:\n --freecol-data -client.choicePlayer=Veuillez choisir un joueur : +client.choicePlayer=Veuillez choisir une nation : client.classic=Échec au chargement de la cartographie des données depuis le jeu de règles 'classic'. client.debugConnect=Vous ne pouvez pas vous connecter à une partie existante en mode débogage. client.ending=La partie est terminée. -client.headlessDebug=Le mode sans tête nécessite un lancement en débogage. -client.headlessRequires=Le mode sans tête nécessite une partie sauvegardée ou une spécification. +client.headlessDebug=Le mode sans graphisme nécessite un lancement en débogage. +client.headlessRequires=Le mode sans graphisme nécessite une partie sauvegardée ou une spécification. client.laf=Impossible d’installer la présentation de FreeCol. client.noPlayers=Il n’y a pas de joueur disponible dans cette partie. metaServer.couldNotConnect=Désolé. Impossible de se connecter au méta-serveur. Réessayez ultérieurement. metaServer.communicationError=Erreur durant la communication avec le méta-serveur. Réessayez ultérieurement. abandonEducation.action.studying=étudiant -abandonEducation.action.teaching=enseignement -abandonEducation.no=Non, continuer la formation -abandonEducation.text=Si votre %unit% quitte %colony%, il abandonnera %action% dans le %building%; êtes-vous sûr qu'il doive le laisser? -abandonEducation.yes=Oui, quitter la colonie -abandonTeaching.text=Si votre %unit% quitte le %building%, elle cessera d’enseigner; êtes-vous sûr de la faire partir? +abandonEducation.action.teaching=enseignant +abandonEducation.no=Continuer la formation +abandonEducation.text=Si votre %unit% quitte %colony%, il abandonnera %action% dans le %building% ; êtes-vous sûr qu’il doive partir ? +abandonEducation.yes=Abandonner la formation +abandonTeaching.text=Si votre %unit% quitte le %building%, elle cessera d’enseigner ; êtes-vous sûr qu’il doive partir? armedUnitSettlement.attack=Attaquer armedUnitSettlement.tribute=Demander un tribut boycottedGoods.dumpGoods=Jeter la cargaison boycottedGoods.text=Le(a) %goods% est sous le coup d’un boycottage royal et ne peut être vendu à %europe%. Préférez-vous payer les arriérés (%amount% d’or), ou bien voulez-vous jeter la cargaison dans le port ? buy.moreGold=Négocier le prix à la baisse buy.takeOffer=Accepter l’offre -buy.text=Le %nation% propose de vous vendre %goods% pour %gold% : -clearTradeRoute.text=Votre %unit% est assigné à la route d’échanges %route%. Configurer sa destination le fera sortir de cette route. Voulez-vous vraiment faire cela ? +buy.text={{ucfirst:{{tag:country|%nation%}}}} propose de vous vendre %goods% pour %gold% : +clearTradeRoute.text=Votre %unit% est assigné(e) à la route d’échanges %route%. Configurer sa destination le/la fera sortir de cette route. Voulez-vous vraiment faire cela ? client.fullScreen=Le mode plein écran n’est pas supporté pour ce périphérique graphique.\nRetour au mode fenêtré. -confirmHostile.alliance=Vous ne pouvez attaquer une nation alliée ! Voulez-vous briser votre alliance avec les %nation% et déclarer la guerre ? -confirmHostile.ceaseFire=Vous avez signé un cessez-le-feu avec les %nation%. Voulez-vous vraiment les attaquer ? -confirmHostile.peace=Vous êtes en paix avec %nation%. Voulez-vous réellement déclarer la guerre ? +confirmHostile.alliance=Vous ne pouvez pas attaquer une nation alliée ! Voulez-vous rompre votre alliance avec {{tag:country|%nation%}} et déclarer la guerre ? +confirmHostile.ceaseFire=Vous avez signé un cessez-le-feu avec {{tag:country|%nation%}}. Voulez-vous vraiment les attaquer ? +confirmHostile.peace=Vous êtes en paix avec {{tag:country|%nation%}}. Voulez-vous réellement déclarer la guerre ? confirmHostile.yes=Oui, lâchons les chiens de guerre ! -confirmTribute.broke=Nos espions rapportent que les %nation% sont complètement à sec. Ne perdons pas notre temps avec des demandes de tribut. -confirmTribute.european=Les %nation% %danger%, et %finance%. Quel montant de tribut devons-nous exiger d’eux ? -confirmTribute.happy=Les %nation% à %settlement% sont bons amis avec nous, il serait dommage de porter atteinte à notre entente. +confirmTribute.broke=Nos espions rapportent que {{tag:country|%nation%}} est complètement à sec. Ne perdons pas notre temps avec des demandes de tribut. +confirmTribute.european=Les {{tag:people|%nation%}} %danger%, et %finance%. Quel montant de tribut devons-nous exiger d’eux ? +confirmTribute.happy=Les {{tag:people|%nation%}} à %settlement% sont bons amis avec nous, il serait dommage de porter atteinte à notre entente. confirmTribute.no=Nous ferions peut-être mieux de ne pas -confirmTribute.normal=Il est difficile d’en être sûr, mais les %nation% à %settlement% peuvent avoir quelque chose de valeur. Devons-nous leur demander un tribut ? -confirmTribute.unwise=Les %nation% sont forts et nombreux ; il serait sûrement imprudent de les provoquer ! -confirmTribute.warLikely=Attention, une demande de tribut pourrait rallumer la guerre avec les %nation%. +confirmTribute.normal=Il est difficile d’en être sûr, mais les {{tag:people|%nation%}} à %settlement% peuvent avoir quelque chose de valeur. Devons-nous leur demander un tribut ? +confirmTribute.unwise=Les {{tag:people|%nation%}} sont forts et nombreux ; il serait sûrement imprudent de les provoquer ! +confirmTribute.warLikely=Attention, une demande de tribut pourrait rallumer la guerre avec les {{tag:people|%nation%}}. confirmTribute.yes=Procéder à la demande de tribut danger.high=sont bien mieux armés que nous danger.low=ne sont pas une menace pour nous @@ -2326,7 +2337,7 @@ indianLand.cancel=Abandonner le pays indianLand.pay=Offrir %amount% or pour la terre indianLand.take=Prendre ce qui est à vous de droit indianLand.text=Cette terre est détenue par les %player%. Voulez vous : -indianLand.unknown=Des inconnus vivent sur ces terres. Voulez-vous : +indianLand.unknown=Des personnes isolées vivent sur ces terres. Voulez-vous : info.autodetectLanguageSelected=Vous avez choisi l’autodétection de la langue. Vous devez redémarrer le jeu pour que ce changement prenne effet. info.enterSomeText=Entrez un texte S.V.P. info.newLanguageSelected=Vous avez choisi la langue : %language%. Vous devez redémarrer le jeu pour que ce changement prenne effet. @@ -2341,7 +2352,7 @@ scoutColony.negotiate=Négocier avec le maire. scoutColony.spy=Espion dans la colonie scoutColony.text=Que voulez-vous faire de votre %unit% à %colony% ? scoutSettlement.attack=Attaquer -scoutSettlement.greetings=Bienvenue, voyageur. Nous sommes les %nation% de %settlement%, une puissante tribu avec %number% %settlementType%. +scoutSettlement.greetings=Bienvenue, voyageur. Nous sommes les {{tag:people|%nation%}} de %settlement%, une puissante tribu avec %number% %settlementType%. scoutSettlement.skill=Notre village est reconnu pour son savoir-faire : %skill%. scoutSettlement.speak=Demander à parler au chef scoutSettlement.trade.1=Nous aimerions échanger %goods1% avec vous. @@ -2351,7 +2362,7 @@ scoutSettlement.tribute=Demander un tribut sell.gift=Donner les %goods% en cadeau sell.moreGold=Demander plus d’argent sell.takeOffer=Accepter l’offre -sell.text=La %nation% voudrait acheter vos %goods% pour %gold% : +sell.text={{ucfirst:{{tag:country|%nation%}}}} voudrait acheter vos %goods% pour %gold% : stopCurrentGame.no=Annuler stopCurrentGame.text=Une partie est en cours. stopCurrentGame.yes=Arrêter la partie @@ -2371,8 +2382,8 @@ defeated.text=Vous avez été écrasé ! Voulez-vous : defeated.yes=Rester et regarder defeatedSinglePlayer.text=Vous avez été vaincu!\n\nVoici l’heure propice aux sorcelleries nocturnes, où les tombes bâillent, et où l’enfer lui-même souffle la contagion sur le monde. Maintenant, je pourrais boire du sang tout chaud, et faire une de ces actions amères que le jour tremblerait de regarder. defeatedSinglePlayer.yes=Entrer dans le monde de la Vengeance -diplomacy.offerAccepted=Le %nation% a accepté votre offre généreuse. -diplomacy.offerRejected=Le %nation% a refusé votre offre mesquine. +diplomacy.offerAccepted={{ucfirst:{{tag:country|%nation%}}}} a accepté votre offre généreuse. +diplomacy.offerRejected={{ucfirst:{{tag:country|%nation%}}}} a refusé votre offre généreuse. disbandUnit.text=Êtes-vous certain de vouloir dissoudre cette unité ? disbandUnit.yes=supprimer disembark.text=Salutations, marin, voulez-vous débarquer ? @@ -2391,12 +2402,12 @@ highseas.no=Non, demeurons encore dans ces eaux. highseas.text=Nous avons atteint la haute mer, Votre Excellence. Il nous faudra %number% {{plural:%number%|one=tour|other=tours}} pour atteindre l'Europe. Devons-nous mettre les voiles ? highseas.yes=Oui, droit devant. indianDemand.food.no=Hélas, nos greniers sont vides. -indianDemand.food.text=Les %nation% traversent des temps difficiles. Nous implorons les habitants de %colony% de partager avec nous leurs provisions. S’il vous plaît, nous aimerions avoir %amount% de nourriture. +indianDemand.food.text=Les {{tag:people|%nation%}} traversent des temps difficiles. Nous implorons les habitants de %colony% de partager avec nous leurs provisions. S’il vous plaît, nous aimerions avoir %amount% de nourriture. indianDemand.food.yes=Nous partagerons avec plaisir. indianDemand.gold.no=Hors d’ici, voleurs ! -indianDemand.gold.text=Les colons de %colony% ont commis d’innombrables atrocités contre les %nation%. Nous demandons %amount% or en réparation. +indianDemand.gold.text=Les colons de %colony% ont commis d’innombrables atrocités contre les {{tag:people|%nation%}}. Nous demandons %amount% pièces d’or en réparation. indianDemand.other.no=Hors d’ici, voleurs ! -indianDemand.other.text=Les colons de %colony% ont commis d’innombrables atrocités contre les %nation%. Nous demandons %amount% %goods% en réparation. +indianDemand.other.text=Les colons de %colony% ont commis d’innombrables atrocités contre les {{tag:people|%nation%}}. Nous demandons %amount% %goods% en réparation. info.cantLearnSkill=Nous n’allons pas demander à votre %unit% de devenir un %skill% info.moveToDestinationFailed=Le %unit% à %location% est incapable de trouver un chemin vers %destination%! info.noMoreSkill=La compétence a déjà été donnée aux Européens. Nous n’avons rien de plus à enseigner. @@ -2411,15 +2422,15 @@ missionarySettlement.cancel=Vivons tous en paix ! missionarySettlement.inciteConfirm=Voulez-vous que nous attaquions %player% en échange de %amount% or ? missionarySettlement.inciteGoldFail=Pour inciter à une attaque sur %player% vous devez payer %amount% d’or. missionarySettlement.inciteQuestion=Quelle force européenne voudriez-vous que nous attaquions ? -move.noAccessBeached=Un navire échoué des %nation% bloque notre chemin. -move.noAccessContact=Nous devons d’abord entrer en contact avec les %nation%, Votre Excellence. -move.noAccessGoods=La %nation% ne commercera pas avec un %unit% vide. -move.noAccessMissionBan=Les %nation% refusent tout contact avec vos missionnaires. -move.noAccessSettlement=Les %nation% ne permettent pas à nos %unit% d’entrer dans leur colonie. +move.noAccessBeached=Un navire échoué des {{tag:people|%nation%}} bloque notre chemin. +move.noAccessContact=Nous devons d’abord entrer en contact avec les {{tag:people|%nation%}}, Votre Excellence. +move.noAccessGoods={{ucfirst:{{tag:country|%nation%}}}} ne commercera pas avec un(e) %unit% vide. +move.noAccessMissionBan=Les {{tag:people|%nation%}} refusent tout contact avec vos missionnaires. +move.noAccessSettlement=Les {{tag:people|%nation%}} ne permettent pas à nos %unit% d’entrer dans leur agglomération. move.noAccessSkill=Nos %unit% ne peuvent rien apprendre des indigènes. -move.noAccessTrade=Nous n’avons pas l’autorité pour commercer avec d’autres nations européennes comme les %nation%. -move.noAccessWar=Nous ne pouvons pas commercer avec les %nation% lorsque nous sommes en guerre. -move.noAccessWater=Nos %unit% doivent accoster avant d’entrer dans la colonie. +move.noAccessTrade=Nous n’avons pas l’autorisation de commercer avec d’autres nations européennes telles que {{tag:country|%nation%}}. +move.noAccessWar=Nous ne pouvons pas commercer avec la nation {{tag:fem|%nation%}} lorsque nous sommes en guerre. +move.noAccessWater=Nos %unit% doivent accoster avant d’entrer dans l’agglomération. move.noAttackWater=Notre %unit% doit atterrir avant d'attaquer. move.noTile=Notre %unit% n'est pas sur la carte! nameRegion.text=Vous avez découvert un(e) %type% que vous revendiquez au nom de la couronne ! Comme il est habituel, vous pouvez lui donner un nom : @@ -2433,7 +2444,7 @@ renameUnit.text=Donnez un nom à votre unité : scoutSettlement.expertScout=Nous avons beaucoup apprécié les bons rapports de votre éclaireur, et nous vous fournirons donc de l'aide pour vos futures explorations.\nVotre éclaireur est devenu un %unit%. scoutSettlement.speakBeads=Bienvenue, voyageur. Prenez ces inestimables cadeaux (environ %amount% or) et ramenez-les à votre chef en signe de paix. scoutSettlement.speakDie=Vous avez bafoué un rituel sacré de la tribu ! Vous servirez de cible à notre entraînement. -scoutSettlement.speakNothing=Nous sommes toujours heureux d’accueillir des voyageurs %nation%. +scoutSettlement.speakNothing=Nous sommes toujours heureux d’accueillir des voyageurs {{tag:plur|%nation%}}. scoutSettlement.speakTales=Nous avons plaisir à rencontrer des voyageurs lointains. Venez vous asseoir près du feu, nous vous parlerons des contrées alentour. sellProposition.text=Voulez-vous vendre quelques biens ? trade.noTrade=Commerce refusé à %settlement%. @@ -2441,7 +2452,7 @@ trade.noTradeGoods=Désolé, nous n’avons pas besoin de davantage de %goods%! trade.noTradeHaggle=Nous sommes lassés de vos marchandages incessants. trade.noTradeHostile=Nous vous détestons, vous et vos biens. Allez-vous-en! trade.nothingToSell=Désolé, nous n’avons rien à vendre pour le moment ! -tradeProposition.welcome=Commercer avec les %nation% à %settlement% +tradeProposition.welcome=Commercer avec les {{tag:people|%nation%}} à %settlement% tradeRoute.atStop=À %location% : tradeRoute.loadStop=%amount% %goods% chargés. tradeRoute.loadStopBlocked=%goods% inattendus trouvés à bord. @@ -2474,6 +2485,7 @@ server.invalidPlayerNations=Chaque joueur doit choisir une nation avant de comme server.maximumPlayers=Désolé, le nombre maximum de joueurs est atteint. server.missingUserName=Le nom d'utilisateur est absent de la demande de connexion. server.missingVersion=La version de FreeCol est absence de la demande de connexion. +# Fuzzy server.noRouteToServer=Le serveur ne peut pas être rendu publiquement accessible. Vous devez configurer de votre pare-feu de façon à autoriser les connexions entrantes sur le numéro de port que vous avez spécifié. server.noSuchPlayer=La partie ne contient pas de joueur appelé : %player% server.notAllReady=Tous les joueurs ne sont pas prêts. @@ -2483,29 +2495,29 @@ server.timeOut=Temps d’attente dépassé lors de la connexion avec le serveur. server.userNameInUse=Le nom d'utilisateur spécifié est déjà utilisé. server.userNameNotPresent=Le nom d'utilisateur spécifié n'est pas dans ce jeu. server.wrongFreeColVersion=Les versions client et serveur de FreeCol ne concordent pas. -buildColony.others=Les %nation% ont fondé la nouvelle colonie de %colony% dans %region%. -cashInTreasureTrain.colonial=Un trésor d’un montant de %amount% or a été envoyé en Europe. %cashInAmount% pièces d’or vous ont été versées. -cashInTreasureTrain.independent=Un trésor de %amount% a été ajouté au trésor national. -cashInTreasureTrain.otherColonial=Un trésor de %amount% a été débarqué en Europe. Le monarque de %nation% est apparemment heureux. -cashInTreasureTrain.otherIndependent=Un trésor de %amount% a été ajouté au trésor de %nation%. -declareIndependence.announce=Les colonies de %oldNation% ont déclaré leur indépendance de %ruler% et sont maintenant connues sous le nom de %newNation%. -declareIndependence.continentalArmyMuster=À l'appui de votre déclaration d’indépendance, %number% {{plural:%number%|%oldUnit%}}s à %colony% {{plural:%number%|one=a été promue|other=ont été promues}} à {{plural:%number%|%unit%}}s! -declareIndependence.interventionForce={{tag:country|%nation%}} s'engage solennellement à envoyer une Force d'Intervention pour appuyer votre combat légitime pour l'indépendance, pour vu que vous génériez %number% {{PLURAL:%number%|one=cloche|other=cloches}} de la liberté afin de prouver votre détermination. -declareIndependence.nativeSupport=Les %nation% déclarer leur mépris envers %ruler% et la Force Royale Expéditionnaire, et promettent de les attaquer à la moindre occasion. -declareIndependence.nativeHostile=Nos espions signalent que la Force Royale Expéditionnaire a établi des relations amicales avec les %nation%. Méfiez-vous qu’ils pourraient préparer une attaque ! +buildColony.others={{ucfirst:{{tag:country|%nation%}}}} a fondé la nouvelle colonie de %colony% dans %region%. +cashInTreasureTrain.colonial=Un trésor d’un montant de %amount% pièces d’or a été envoyé en Europe. %cashInAmount% pièces d’or vous ont été versées. +cashInTreasureTrain.independent=Un trésor de %amount% pièces d’or a été ajouté au trésor national. +cashInTreasureTrain.otherColonial=Un trésor de %amount% pièces d’or a été débarqué en Europe. Le monarque de {{tag:country|%nation%}} est apparemment heureux. +cashInTreasureTrain.otherIndependent=Un trésor de %amount% pièces d’or a été ajouté au trésor de {{tag:country|%nation%}}. +declareIndependence.announce=Les colonies {{tag:femplur|%oldNation%}} ont déclaré leur indépendance de %ruler% et sont maintenant connues sous le nom de %newNation%. +declareIndependence.continentalArmyMuster=À l’appui de votre déclaration d’indépendance, %number% {{plural:%number%|%oldUnit%}}s à %colony% {{plural:%number%|one=a été promue|other=ont été promues}} à {{plural:%number%|%unit%}}s! +declareIndependence.interventionForce={{ucfirst:{{tag:country|%nation%}}}} s’engage solennellement à envoyer une Force d’intervention pour appuyer votre combat légitime pour l’indépendance, pourvu que vous génériez %number% {{PLURAL:%number%|one=cloche|other=cloches}} de la liberté afin de prouver votre détermination. +declareIndependence.nativeSupport=Les {{tag:people|%nation%}} ont déclaré leur mépris envers %ruler% et le Corps expéditionnaire royal, et promettent de l’attaquer à la moindre occasion. +declareIndependence.nativeHostile=Nos espions signalent que le Corps expéditionnaire royal a établi des relations amicales avec la nation {{tag:fem|%nation%}}. Méfiez-vous, ils pourraient préparer une attaque ! declareIndependence.resolution=Aujourd’hui, le Congrès a approuvé la plus importante Résolution qui n'ait jamais été prise en Amérique.\n\nJe suis bien conscient que cela va Nous demander beaucoup de Labeur, de Sang et d’Or pour pouvoir maintenir cette Déclaration et pour soutenir et défendre ces États. Déjà je peux discerner au travers de toute cette Obscurité les superbes Rayons de la Lumière et de la Gloire. Je peux prédire que la Fin vaudra bien mieux que tous les Moyens. Et que la Postérité triomphera des Tractations de nos Jours, qui nous pousseraient à nous ruer ou à fuir, ce dont je crois que Dieu saura absolument nous préserver.\n\nLe Corps expéditionnaire royal tombera bientôt sur nous. Préparez nos défenses avec soin pendant que nous réunissons des volontaires pour une nouvelle Armée Continentale. declareIndependence.unitsSeized=En réaction à votre déclaration d’indépendance, la Couronne a saisi les unités suivantes en Europe et en mer : %units% deliverGift.goods=Les %player% offrent %amount% %type% en cadeau à %settlement%. -giveIndependence.announce=Vous avez vaincu les %ref% et finalement gagné votre indépendance ! Vos douanes peuvent dès maintenant vendre aux Européens sans devoir payer de taxes ou souffrir d’ingérence royale. -giveIndependence.otherAnnounce=Les %nation% ont battu les %ref% et gagné leur indépendance ! +giveIndependence.announce=Vous avez vaincu le %ref% et finalement gagné votre indépendance ! Vos douanes peuvent dès maintenant vendre aux Européens sans devoir payer de taxes ou souffrir d’ingérence royale. +giveIndependence.otherAnnounce=Les {{tag:people|%nation%}} ont battu le %ref% et gagné leur indépendance ! giveIndependence.unitsAcquired=Les Corps expéditionnaires royaux suivants se sont rendus à vos forces victorieuses : %units% -indianSettlement.mission.enemyDenounce=Un missionnaire %enemy% a accusé notre missionnaire à %settlement% d’hérésie, mais les %nation% ont rejeté la revendication. -indianSettlement.mission.noDenounce=Les %nation% rejettent les affirmations d’hérésie, et exécutent votre missionnaire en tant que faux prophète. -indianSettlement.mission.tension.angry=Missionnaire capturé, les %nation% refusent votre nouvelle religion. -indianSettlement.mission.tension.content=Mission fondée, les %nation% abordent votre nouvelle religion avec curiosité. -indianSettlement.mission.tension.displeased=Mission fondée, les %nation% sont offensés. -indianSettlement.mission.tension.happy=Mission fondée, les %nation% aborde votre nouvelle religion avec joie. -indianSettlement.mission.tension.hateful=Missionnaire sacrifié, les %nation% rient de votre nouvelle religion. +indianSettlement.mission.enemyDenounce=Un missionnaire %enemy% a accusé notre missionnaire à %settlement% d’hérésie, mais les {{tag:people|%nation%}} ont rejeté la revendication. +indianSettlement.mission.noDenounce=Les {{tag:people|%nation%}} rejettent les affirmations d’hérésie, et exécutent votre missionnaire en tant que faux prophète. +indianSettlement.mission.tension.angry=Missionnaire capturé, les {{tag:people|%nation%}} refusent votre nouvelle religion. +indianSettlement.mission.tension.content=Mission fondée, les {{tag:people|%nation%}} abordent votre nouvelle religion avec curiosité. +indianSettlement.mission.tension.displeased=Mission fondée, les {{tag:people|%nation%}} sont offensés. +indianSettlement.mission.tension.happy=Mission fondée, les {{tag:people|%nation%}} abordent votre nouvelle religion avec joie. +indianSettlement.mission.tension.hateful=Missionnaire sacrifié, les {{tag:people|%nation%}} rient de votre nouvelle religion. scoutSettlement.tributeAgree=Nous acceptons de payer %amount% or afin de préserver la paix, mais n’essayez pas de le refaire une seconde fois ! scoutSettlement.tributeDisagree=Nous ne répondrons pas à votre demande. Maintenant quittez nos terres. colopedia.birthAndDeath=Naissance et décès @@ -2527,7 +2539,7 @@ colopedia.buildings.teaches=Enseigne colopedia.buildings.workplaces=Places de travail colopedia.buildings.requiredPopulation=%number% {{plural:%number%|one=colon|other=colons|default=colon}} colopedia.concepts.education.name=Éducation -colopedia.concepts.education.description=

La manière la plus efficace pour éduquer vos colons est de construire une école et d’assigner une unité experte comme enseignant. L’enseignant transformera alors un colon libre en un expert du même type. Les enseignants peuvent aussi améliorer les petits délinquants en serfs, et les serfs en colons libres.

Certaines compétences peuvent aussi être apprises des indigènes, en envoyant un colon libre ou un serf vivre dans un campement indigène pendant un tour. Et certaines compétences peuvent aussi être apprises par l’expérience, en mettant un colon libre au travail sur une case de la colonie. Les colons libres travaillant dans les champs et les forêts autour de vos colonies accumulent jusqu’à 200 points d’expérience, ce qui leur donne quatre pourcent de chances d’être améliorés.

+colopedia.concepts.education.description=

La manière la plus efficace pour éduquer vos colons est de construire une école et d’assigner une unité experte comme enseignant. L’enseignant transformera alors un colon libre en un expert du même type. Les enseignants peuvent aussi améliorer les petits délinquants en serfs, et les serfs en colons libres.

Certaines compétences peuvent aussi être apprises des indigènes, en envoyant un colon libre ou un serf vivre dans une agglomération indigène pendant un tour. Et certaines compétences peuvent aussi être apprises par l’expérience, en mettant un colon libre au travail sur une case de la colonie. Les colons libres travaillant dans les champs et les forêts autour de vos colonies accumulent jusqu’à 200 points d’expérience, ce qui leur donne quatre pourcent de chances d’être améliorés.

colopedia.concepts.efficiency.name=Efficacité colopedia.concepts.efficiency.description=

L'efficacité de vos colonies dépend de leur soutien à l'idée d'indépendance. Si 50 % des colons soutiennent la cause des rebelles, la colonie reçoit un bonus de production de + 1. Dès que 100 % des colons deviennent des rebelles, la prime à la production passe à + 2.

En revanche, si le nombre des royalistes dépasse la limite de mauvais gouvernement, la colonie encourt une peine de production de -1. Si le nombre des royalistes dépasse la limite de très mauvais gouvernement, la pénalité de production passe à -2. Ces deux limites dépendent du niveau de difficulté et peuvent être vérifiées dans le rapport sur le niveau de difficulté.

Afin d'augmenter l'efficacité d'une colonie, vous devez réduire sa population ou produire davantage de cloches de la liberté.

colopedia.concepts.fortification.name=Fortification @@ -2564,10 +2576,10 @@ colopedia.nationType.aggression=Agressivité colopedia.nationType.settlementNumber.average=Moyen colopedia.nationType.settlementNumber.high=Important colopedia.nationType.settlementNumber.low=Faible -colopedia.nationType.settlementNumber=Nombre de lieux habités : +colopedia.nationType.settlementNumber=Nombre d’agglomérations : colopedia.nationType.regions=Régions habitées : colopedia.nationType.skills=Compétences enseignées : -colopedia.nationType.typeOfSettlements=Type de lieux habités : +colopedia.nationType.typeOfSettlements=Type d’agglomération : colopedia.nationType.units=Unités de départ : colopedia.terrain.colonistProduction=Production de colons colopedia.terrain.colonyCenterTile=Case centrale de colonie @@ -2590,7 +2602,7 @@ colopedia.unit.offensivePower=Potentiel offensif : colopedia.unit.price=Prix en Europe : colopedia.unit.productionBonus={{plural:%number%|one=Modificateur|other=Modificateurs}} de production : colopedia.unit.requirements=Exigences : -colopedia.unit.school=Établissement de formation : +colopedia.unit.school=Peut former en : colopedia.unit.skill=Compétence : report.labour.allColonists=Tous les colons report.labour.amateursWorking=amateurs @@ -2615,40 +2627,60 @@ report.labour.unitTotal.tooltip=%unit% ou devenant %unit% report.labour.workingAs=Emploi report.labour.workingAsOther=autre report.colony.arriving.description=%colony%: nouveau %unit% {{plural:%turns%|one=au prochain tour|other=dans %turns% tours}} +report.colony.arriving.summary.description=Le nombre moyen de tours avant qu’un nouveau colon arrive dans les colonies de ce continent report.colony.birth.description=Nombre de tours avant qu'un nouveau colon arrive ou soit affamé report.colony.explore.description=Nombre de carreaux à Découvrir autour de la colonie report.colony.explore.header=E report.colony.exploring.description=%colony% aurait intérêt à explorer {{plural:%amount%|one=une case|other=%amount% cases}} +report.colony.exploring.summary.description=Nombre total de cases de colonie qui bénéficieront de l’exploration pour ce continent. report.colony.grow.description=Nombre d'unités que la colonie peut développer sans nuire à sa production report.colony.grow.header=+ report.colony.growing.description=%colony% peut croître de {{plural:%amount%|one=une unité|other=%amount% unités}} sans nuire à sa production +report.colony.growing.summary.description=Le nombre total de colons qui peuvent rejoindre les colonies de ce continent sans nuire à la production report.colony.improve.description=Unités qui pourraient améliorer la production. report.colony.improve.header=Améliorer -report.colony.improving.description=%colony%: Pour produire %amount% de plus de %goods%, remplacez %oldUnit% par %unit% -report.colony.wanting.description=%colony%: Pour produire %amount% de plus de %goods%, ajoutez %unit% +report.colony.improving.description=%colony% à %location% : Pour produire %amount% de plus de %goods%, remplacez %oldUnit% par %unit% +report.colony.improving.summary.description=Unités (type et nombre) qui peuvent être bénéfiques aux colonies de ce continent report.colony.making.blocking.description=%colony%: %amount% %goods% nécessaires pour %buildable% {{plural:%turns%|one=au prochain tour|other=dans %turns% tours}} report.colony.making.constructing.description=%colony%: %buildable% terminé {{plural:%turns%|one=au prochain tour|other=dans %turns% tours}} report.colony.making.description=Ce que cette colonie fait report.colony.making.educating.description=%colony%: %teacher% diplômé {{plural:%turns%|one=au prochain tour|other=dans %turns% tours}} +report.colony.making.educationVacancy.description=%colony% : {{plural:%number%|one=une place d’étudiant est vacante|other=%number% places d’étudiant sont vacantes}} +report.colony.making.educating.summary.description=Unités (type et nombre) des écoles de ce continent en instance de diplômation report.colony.making.header=Fabrication report.colony.making.noconstruction.description=%colony%: Pas de construction en cours report.colony.making.noteach.description=%colony%: %teacher% n'a pas d'étudiant +report.colony.making.summary.description=Le déficit de %goods% par tour est dû aux exigences de construction non satisfaites sur ce continent report.colony.name.description=La liste des colonies report.colony.name.header=Colonie -report.colony.plow.description=Nombre de cases de colonie qui bénéficieront du Labourage -report.colony.plow.header=P -report.colony.plowing.description=%colony% aurait intérêt à labourer {{plural:%amount%|one=une case|other=%amount% cases}} -report.colony.production.description=%colony%: production nette de %goods% = %amount% -report.colony.production.export.description=%colony%: la production nette de %goods% est de %amount% (exporté au-dessus de %export%) +report.colony.name.summary.description=La région de ce continent contenant le plus de ces colonies +report.colony.production.description=%colony% : %amount% de %goods% sont produits +report.colony.production.export.description=%colony% : %amount% de %goods% sont produits (exporté au-dessus de %export%) report.colony.production.header=Production net de %goods% -report.colony.production.high.description=%colony%: production nette de %goods% = %amount%, totale {{plural:%turns%|one=le prochain tour|other=dans %turns% tours}} -report.colony.production.low.description=%colony%: production nette de %goods% = %amount%, disparue {{plural:%turns%|one=le prochain tour|other=dans %turns% tours}} -report.colony.production.waste.description=%colony%: production nette de %goods% = %amount%, l'entrepôt va déborder, %waste% sera perdu -report.colony.road.description=Nombre de cases de colonie qui bénéficieraient d'une construction de route -report.colony.road.header=R -report.colony.roadBuilding.description=%colony% aurait intérêt à construire {{plural:%amount%|one=une route|other=%amount% routes}} +report.colony.production.high.description=%colony% : %amount% de %goods% sont produits, sera plein {{plural:%turns%|one=le prochain tour|other=dans %turns% tours}} +report.colony.production.low.description=%colony% : %amount% de %goods% consommés, sera vide {{plural:%turns%|one=le prochain tour|other=dans %turns% tours}} +report.colony.production.maxConsumption.description=%colony% : %amount% de %goods% sont consommés (peut en consommer %more% de plus) +report.colony.production.maxProduction.description=%colony% : %amount% de %goods% sont produits (%more% de plus pourraient l’être) +report.colony.production.summary.description=La quantité de marchandises produite ou consommée +report.colony.production.waste.description=%colony% : %amount% de %goods% sont produits, l’entrepôt va déborder, %waste% seront perdus +report.colony.tile.clearForest.description=%colony% aurait intérêt à nettoyer {{plural:%amount%|one=une case|other=%amount% cases}} +report.colony.tile.clearForest.specific.description=%colony% aurait intérêt à nettoyer %location% +report.colony.tile.clearForest.header=C +report.colony.tile.clearForest.header.description=Nombre de cases de colonie qu’il serait intéressant de nettoyer. +report.colony.tile.clearForest.summary.description=Nombre total de cases de colonie qui auraient intérêt à être nettoyées sur ce continent. +report.colony.tile.plow.description=%colony% aurait intérêt à labourer {{plural:%amount%|one=une case|other=%amount% cases}} +report.colony.tile.plow.specific.description=%colony% aurait intérêt à labourer %location% +report.colony.tile.plow.header=P +report.colony.tile.plow.header.description=Nombre de cases de colonie qui auraient intérêt à être labourées. +report.colony.tile.plow.summary.description=Nombre total de cases de colonie qui auraient intérêt à être labourées sur ce continent. +report.colony.tile.road.description=%colony% aurait intérêt à construire {{plural:%amount%|one=une route|other=%amount% routes}} +report.colony.tile.road.specific.description=%colony% aurait intérêt à construire une route à %location% +report.colony.tile.road.header=R +report.colony.tile.road.header.description=Nombre de cases de colonie qui auraient intérêt à construire une route. +report.colony.tile.road.summary.description=Nombre total de cases de colonie qui auraient intérêt à construire une route sur ce continent. report.colony.shrinking.description=%colony% doit être réduite de {{plural:%amount%|one=une unité|other=%amount% unités}} pour améliorer sa production report.colony.starving.description=%colony%: famine {{plural:%turns%|one=au prochain tour|other=dans %turns% tours}} +report.colony.wanting.description=%colony% à %location% : Pour produire %amount% de plus de %goods%, ajoutez %unit% report.continentalCongress.available=Disponible report.continentalCongress.elected=Élu : %turn% report.continentalCongress.none=(aucun) @@ -2670,51 +2702,52 @@ report.foreignAffair.sonsOfLiberty=Fils de la Liberté report.foreignAffair.stance=Relations report.highScores.colonies=Nombre de colonies : report.highScores.difficulty=Difficulté : -report.highScores.governor=Gouverneur %name% de %nation% +report.highScores.governor=Gouverneur %name% de {{tag:country|%nation%}} report.highScores.independence=Indépendance déclarée : report.highScores.nation=Nation : -report.highScores.nationType=Avantage national : -report.highScores.president=Président %name% de %nation% +report.highScores.nationType=Atout national : +report.highScores.president=Président %name% de {{tag:country|%nation%}} report.highScores.retired=Abandon : report.highScores.score=Pointage : report.highScores.turn=Année : report.highScores.units=Nombre d’unités : report.indian.chieftain=Nom du chef : report.indian.mostHated=Le plus détesté -report.indian.noKnownSettlements=Aucun lieu connu. -report.indian.numberOfSettlements=Lieux connus : +report.indian.noKnownSettlements=Aucune agglomération connue. +report.indian.numberOfSettlements=Agglomérations connues : report.indian.tension=Tension report.indian.tradeInterests=Intérêts commerciaux report.indian.tribeTension=Tension Tribale : -report.indian.typeOfSettlements=Type de lieu : +report.indian.typeOfSettlements=Type d’agglomération : report.labour.details.name=Détails du rapport de travail report.production.selectGoods=Sélectionner les biens report.production.update=Mettre à jour report.requirements.badAssignment=%colony% a un %expert% qui travaille actuellement comme %expertWork%, alors qu’un %nonExpert% travaille comme %nonExpertWork%. La production serait plus importante si les colons échangeaient leurs emplois. report.requirements.canTrainExperts={{plural:2|%unit%}} peuvent être formées à -report.requirements.clearTile=%type% vers %direction% de %colony% serait intéressant pour le défrichage. -report.requirements.exploreTile=%type% vers %direction% de %colony% serait intéressant pour l'exploration. +report.requirements.exploreTile=%location% serait intéressant à explorer. report.requirements.met=Toutes les conditions sont réunies. report.requirements.missingGoods=%colony% fabrique des %goods%, mais elle a besoin de plus de %input%. report.requirements.misusedExperts=Il y a des {{plural:2|%unit%}} qui ne travaillent pas comme %work% à report.requirements.noExpert=%colony% fabrique des %goods%, mais elle n’a pas de %unit%. -report.requirements.plowCenter=%colony% aurait intérêt à labourer sa case. -report.requirements.plowTile=%type% vers %direction% de %colony% aurait intérêt à être labouré -report.requirements.roadTile=%type%vers %direction% de %colony% aurait intérêt à construire une route. +report.requirements.tile.clearForest=%location% aurait intérêt à être nettoyé. +report.requirements.tile.plow=%location% aurait intérêt à être labouré. +report.requirements.tile.road=%location% aurait intérêt à construire une route. report.requirements.severalExperts=Plusieurs {{plural:2|%unit%}} sont présentes à report.requirements.surplus=Un surplus de %goods% est produit à report.trade.afterTaxes=Solde après taxes report.trade.beforeTaxes=Solde avant taxes report.trade.cargoUnits=Unités en transit -report.trade.hasCustomHouse=* Cette colonie a une douane ; ces marchandises sont exportées. +report.trade.export=Exporter %goods% au-delà de %amount% +report.trade.hasCustomHouse=* Cette colonie a une douane et peut exporter des marchandises. report.trade.totalDelta=Total de la production report.trade.totalUnits=Total des unités report.trade.unitsSold=Nb acheté/vendu report.turn.filter=Ne pas afficher ce type de message (%type%) report.turn.ignore=Ignorer ce message (Colonie : %colony% ; marchandises : %goods%) -report.turn.playerNation=%nation% de %player% +report.turn.playerNation={{ucfirst:{{tag:country|%nation%}}}} de %player% aboutPanel.copyright=Copyright © 2002-2015 L’équipe FreeCol aboutPanel.legalDisclaimer=FreeCol est un logiciel libre ; vous pouvez le redistribuer et/ou le modifier au titre des clauses de la Licence Publique Générale GNU, telle qu’elle est publiée par la Free Software Foundation dans sa version 2, ou dans une version ultérieure. +aboutPanel.manual=Téléchargement du Manuel de FreeCol aboutPanel.officialSite=Site officiel : aboutPanel.sfProject=Projet SourceForge : aboutPanel.version=Version : @@ -2737,7 +2770,7 @@ colonyPanel.buildQueue=Créer la playlist colonyPanel.colonyUnits=Unités de la colonie colonyPanel.inPort=Au port colonyPanel.outsideColony=Hors de la colonie -colonyPanel.producing=Production en cours : +colonyPanel.producing=production en cours : colonyPanel.reducePopulation=Si vous réduisez la population à une valeur inférieure à %number%, %colony% ne pourra plus construire de %buildable%. colonyPanel.setGoods=Ensemble de biens colonyPanel.traceWork=Trace de travail @@ -2752,8 +2785,8 @@ confirmDeclarationDialog.areYouSure.no=Peut-être plus tard confirmDeclarationDialog.areYouSure.text=Permettez-nous de nous affranchir de la tyrannie injuste de %monarch% et déclarer l’indépendance de nos colonies de la couronne ! confirmDeclarationDialog.areYouSure.yes=Vivre libre ou mourir ! confirmDeclarationDialog.createFlag=et nos ennemis trembleront à la vue de notre bannière rebelle. -confirmDeclarationDialog.defaultCountry=États-Unis de %nation% -confirmDeclarationDialog.defaultNation=%nation% libre +confirmDeclarationDialog.defaultCountry=États-Unis {{tag:plur|%nation%}} +confirmDeclarationDialog.defaultNation={{ucfirst:{{tag:country|%nation%}}}} libre confirmDeclarationDialog.enterCountry=Désormais, notre pays doit être connu comme confirmDeclarationDialog.enterNation=et chaque citoyen de notre glorieuse nation doit être fier d’être connu comme flag.background.FESSES=Coupé @@ -2804,19 +2837,19 @@ negotiationDialog.add=Ajouter negotiationDialog.cancel=Annuler negotiationDialog.clear=Nettoyer negotiationDialog.contact.tutorial=Vous rencontrez d’autres Européens. Ils seront en compétition avec vous pour les terres et les richesses, et peuvent même partir en guerre contre vous. Mais une fois que Jan de Witt a rejoint le Congrès continental, vous pourrez commercer avec eux. -negotiationDialog.demand=Le %nation% exige de %otherNation% +negotiationDialog.demand={{ucfirst:{{tag:country|%nation%}}}} exige de {{tag:country|%otherNation%}} negotiationDialog.exchange=en échange de negotiationDialog.goldAvailable=(%amount% or disponible) -negotiationDialog.offer=Le %nation% offre à %otherNation% +negotiationDialog.offer={{ucfirst:{{tag:country|%nation%}}}} offre à {{tag:country|%otherNation%}} negotiationDialog.send=Envoyer negotiationDialog.title.contact=Rencontre des autres européens negotiationDialog.title.diplomatic=Négociation diplomatique negotiationDialog.title.trade=Négociation commerciale negotiationDialog.title.tribute=Demande de tribut -editSettlementDialog.removeSettlement=Supprimer le lieu habité -editSettlementDialog.removeSettlement.text=Voulez-vous supprimer ce lieu habité ? -emigrationDialog.chooseImmigrant=Choisissez l'unité que vous voulez voir émigrer d’Europe. -endTurnDialog.areYouSure={{plural:%number%|one=L'unité suivante attend|other=Les unités suivantes attentent}} toujours les ordres, ou {{plural:%number%|one=a été commandée|other=ont été commandées}} à attendre. Êtes-vous sûr de vouloir terminer le tour maintenant ? +editSettlementDialog.removeSettlement=Supprimer l’agglomération +editSettlementDialog.removeSettlement.text=Voulez-vous supprimer cette agglomération ? +emigrationDialog.chooseImmigrant=Choisissez l’unité que vous voulez voir émigrer d’Europe. +endTurnDialog.areYouSure={{plural:%number%|one=L’unité suivante attend|other=Les unités suivantes attendent}} toujours les ordres, ou {{plural:%number%|one=a|other=ont}} reçu l’ordre d’attendre. Êtes-vous sûr de vouloir terminer le tour maintenant ? endTurnDialog.name=Fin du tour errorPanel.showLogFile=Afficher le fichier journal europePanel.leaveColonists=Faire voile sur %newWorld% en laissant les colons sur le quai ? @@ -2825,16 +2858,16 @@ europePanel.transaction.price=Prix :\t%gold% europePanel.transaction.purchase=Acheter %amount% %goods% @%gold% europePanel.transaction.sale=Vendre %amount% %goods% @%gold% europePanel.transaction.tax=-%tax% % :\t%gold% -findSettlementPanel.displayAll=Trouver tous les campements -findSettlementPanel.displayOnlyEuropean=Trouver uniquement les campements européens -findSettlementPanel.displayOnlyNatives=Trouver uniquement les campements indigènes -findSettlementPanel.name=Trouver un campement -firstContactDialog.meeting.natives=Rencontre avec les indigènes... -firstContactDialog.meeting.natives.tutorial=Vous avez rencontré des indigènes. Envoyez vos éclaireurs à leurs campements afin d’en savoir plus sur eux, et vos domestiques contractuels et vos colons libres pour apprendre de leur part. Envoyez vos navires et vos convois de charriot à leurs campements si vous voulez commercer avec eux. -firstContactDialog.meeting.AZTEC=La nation aztèque... -firstContactDialog.meeting.INCA=L’empire inca... -firstContactDialog.welcomeOffer.text=Les %nation% vous accueillent. Nous sommes une glorieuse nation de %camps% %settlementType%. Pour célébrer notre amitié, nous vous offrons généreusement en cadeau la terre que vous occupez actuellement. Acceptez-vous notre traité et de demeurer avec nous en paix fraternelle ? -firstContactDialog.welcomeSimple.text=Les %nation% vous accueillent. Nous sommes une glorieuse nation de %camps% %settlementType%. Acceptez-vous notre traité et de demeurer avec nous en paix fraternelle ? +findSettlementPanel.displayAll=Trouver toutes les agglomérations +findSettlementPanel.displayOnlyEuropean=Trouver uniquement les agglomérations européennes +findSettlementPanel.displayOnlyNatives=Trouver uniquement les agglomérations indigènes +findSettlementPanel.name=Trouver une agglomération +firstContactDialog.meeting.natives=Rencontre avec les indigènes +firstContactDialog.meeting.natives.tutorial=Vous avez rencontré des indigènes. Envoyez vos éclaireurs à leurs agglomérations afin d’en savoir plus sur eux, et vos domestiques contractuels et vos colons libres pour apprendre de leur part. Envoyez vos navires et vos convois de chariots à leurs campements si vous voulez commercer avec eux. +firstContactDialog.meeting.aztec=La nation aztèque +firstContactDialog.meeting.inca=L’empire inca +firstContactDialog.welcomeOffer.text=Les {{tag:people|%nation%}} vous accueillent. Nous sommes une glorieuse nation de %camps% %settlementType%. Pour célébrer notre amitié, nous vous offrons généreusement en cadeau la terre que vous occupez actuellement. Acceptez-vous notre traité et de demeurer avec nous en paix fraternelle ? +firstContactDialog.welcomeSimple.text=Les {{tag:people|%nation%}} vous accueillent. Nous sommes une glorieuse nation de %camps% %settlementType%. Acceptez-vous notre traité et de demeurer avec nous en paix fraternelle ? abandonColony.no=Annuler abandonColony.text=Devons-nous vraiment abandonner cette colonie ? abandonColony.yes=Abandonner @@ -2848,12 +2881,12 @@ stopServer.no=Annuler stopServer.text=Un serveur fonctionne déjà sur le port indiqué. stopServer.yes=Arrêter le serveur freeColProgressBar.turnsToComplete=(Tours : %number%) -indianSettlementPanel.indianCapital=Capitale des %nation% -indianSettlementPanel=Campement %nation% -indianSettlementPanel.learnableSkill=La compétence suivante peut être apprise dans ce lieu : -indianSettlementPanel.highlyWanted=Ce lieu est très intéressé par le commerce de : -indianSettlementPanel.otherWanted=Les autres marchandises pouvant êtres vendues dans ce lieu sont : -indianSettlementPanel.mostHated=La nation la plus haïe de cette implantation: +indianSettlementPanel.indianCapital=Capitale des {{tag:people|%nation%}} +indianSettlementPanel=Agglomération {{tag:fem|%nation%}} +indianSettlementPanel.learnableSkill=La compétence suivante peut être apprise dans cette agglomération : +indianSettlementPanel.highlyWanted=Cette agglomération est très intéressée par le commerce de : +indianSettlementPanel.otherWanted=Les autres marchandises pouvant êtres vendues dans cette agglomération sont : +indianSettlementPanel.mostHated=La nation la plus haïe de cette agglomération : infoPanel.defenseBonus=%bonus%% de défense infoPanel.endTurn=Presser [Entrée] pour finir le tour. infoPanel.movementCost=%cost% mouvement @@ -2875,12 +2908,13 @@ freecol.map.Australia=Australie freecol.map.Caribbean_basin=Bassin des Caraïbes mapSizeDialog.mapSize=Sélectionner la taille de la carte modifierFormat.unknown=??? +modifierFormat.scopeMethod.isIndian.name=indigènes monarchDialog.default=Un message de la Couronne newPanel.editDifficulty=Modifier la difficulté newPanel.getServerList=Récupérer la liste des serveurs newPanel.joinMultiPlayerGame=Rejoindre une partie multijoueur newPanel.newGamePanel=Paramétrer une nouvelle partie -newPanel.nationalAdvantages=Avantages nationaux +newPanel.nationalAdvantages=Atouts nationaux newPanel.publicServer=Serveur public newPanel.showDifficulty=Afficher la difficulté newPanel.singlePlayerGame=Jeu solitaire @@ -2925,7 +2959,7 @@ serverListPanel.gameState.1=En fonction serverListPanel.gameState.2=Terminé serverListPanel.players=Joueurs startGamePanel.iAmReady=Prêt -info.noEuropeans=La condition de la victoire de vaincre tous les autres Européens est déjà remplie. Activer une autre nation européenne ou ajouter des conditions de victoire supplémentaires. +info.noEuropeans=La condition de victoire de vaincre tous les autres Européens est déjà remplie. Activez une autre nation européenne ou ajoutez des conditions de victoire supplémentaires. memoryManager.freeMemory=Libre memoryManager.maxMemory=Max memoryManager.totalMemory=Total @@ -2934,7 +2968,7 @@ tilePanel.label=%label% (%x%, %y%) tilePanel.movementCost=Coût de mouvement : tilePanel.owner=Propriétaire : tilePanel.region=Région : -tilePanel.settlement=Campement : +tilePanel.settlement=Agglomération : tradeRouteInputPanel.addStop=Ajouter un nouvel arrêt tradeRouteInputPanel.allColonies=Toutes les colonies tradeRouteInputPanel.destinationLabel=Destination @@ -2963,7 +2997,7 @@ warehouseDialog.lowLevel.shortDescription=M’alerter quand les réserves baisse warehouseDialog.name=Entrepôt workProductionPanel.zeroThreshold=Aucune production négative nameCache.base.colony=Colonie -nameCache.base.settlement=Campement +nameCache.base.settlement=Agglomération nameCache.base.ship=Navire nameCache.base.tradeRoute=Nouvelle route commerciale nameCache.lostCityRumour.cityName.0=Aira @@ -2979,7 +3013,7 @@ nameCache.mercenaries.2=Charles-Alexandre, margrave de Brandebourg-Ansbach nameCache.mercenaries.3=Charles I, duc de Brunswick-Wolfenbüttel nameCache.season.default=Saison %number% nameCache.season.0=Printemps -nameCache.season.1=L'automne +nameCache.season.1=Automne model.nation.english.region.land.1=Virginie model.nation.english.region.land.3=Pennsylvanie model.nation.english.region.land.4=Terre-Neuve @@ -2994,6 +3028,8 @@ model.nation.danish.region.land.1=Indes occidentales danoises model.nation.danish.region.land.2=Groenland model.nation.portuguese.region.land.2=Brésil model.nation.swedish.settlementName.1=Finlande +model.nation.apache.settlementName.0=Mescaléro +model.nation.sioux.settlementName.0=Tétonwan model.nation.tupi.settlementName.46=Tijuca model.nation.tupi.settlementName.47=Tukan model.nation.tupi.settlementName.48=Tupinambá @@ -3016,7 +3052,7 @@ prompt.selectOwner=Sélectionner le propriétaire prompt.selectRole=Sélectionner le rôle prompt.selectTurnsToSkip=Sélectionner les tours à sauter prompt.selectUnitType=Sélectionner le type d’unité -prompt.stepRNG=Étape de Générateur aléatoire de nombre (%value%) +prompt.stepRNG=Pas du générateur de nombres aléatoires (%value%) prompt.selectGold=Sélectionner le montant d’or installer.FreeCol.description=L’application FreeCol et les fichiers de données. installer.FreeColLanguage.autodetect=Détecter automatiquement au lancement du jeu @@ -3034,7 +3070,7 @@ installer.SoundEffects.description=Les effets sonores du jeu. installer.SoundEffects=Effets sonores installer.SourceCode.description=Le code source utilisé pour cette distribution. Ces fichiers sont destinés aux développeurs et n’ajoutent aucune nouvelle fonctionnalité au jeu. installer.SourceCode=Code source -installer.UserFiles.freecol=Le dossier de l’application FreeCol (seulement les installations pour un seul utilisateur) +installer.UserFiles.freecol=Le dossier de l’application FreeCol (pour une installation mono-utilisateur) installer.UserFiles.home=Le dossier de base de l’utilisateur installer.UserFiles.other=Définissez un dossier personnalisé installer.UserFiles=Choisissez l’emplacement des paramètres personnalisés et des parties sauvegardées : diff --git a/data/strings/FreeColMessages_gl.properties b/data/strings/FreeColMessages_gl.properties index 8df03e861..96244c06f 100644 --- a/data/strings/FreeColMessages_gl.properties +++ b/data/strings/FreeColMessages_gl.properties @@ -197,8 +197,9 @@ cli.no-memory-check=saltar a comprobación da memoria cli.no-sound=executar o FreeCol sen son cli.private=iniciar un servidor privado (non publicado no servidor meta) cli.seed=proporcionar un GRAN para o xerador de números pseudo-aleatorios -cli.server-name=especificar un NOME personalizado para o servidor +# Fuzzy cli.server=iniciar un servidor autónomo no porto especificado +cli.server-name=especificar un NOME personalizado para o servidor cli.splash=mostrar unha imaxe de pantalla do FICHEIRO mentres se carga o xogo cli.tc=cargar a conversión total co NOME dado cli.timeout=número de segundos que o servidor agarda por unha resposta á pregunta @@ -262,7 +263,6 @@ colopediaAction.goods.name=Produtos colopediaAction.nations.name=Nacións colopediaAction.nationTypes.name=Vantaxes nacionais colopediaAction.resources.name=Bonificacións por recursos -colopediaAction.skills.name=Habilidades colopediaAction.terrain.name=Tipos de terreo colopediaAction.units.name=Unidades colopediaAction.name=%object% (Colopedia) @@ -1305,6 +1305,7 @@ model.improvement.road.description=Camiño model.improvement.road.name=Camiño model.improvement.road.occupationString=R model.limit.independence.coastalColonies.name=Límite de colonia costeira +# Fuzzy model.limit.independence.coastalColonies.description=Necesitas, polo menos, %limit% colonias costeiras para poder declarar a independencia. model.limit.independence.rebels.name=Límite de rebeldes model.limit.independence.rebels.description=Polo menos, o %limit%% dos teus colonos debe apoiar a independencia. @@ -1640,6 +1641,7 @@ model.colony.badGovernment=O goberno de %colony% é ineficiente. Hai penalizaci model.colony.goodGovernment=A eficiencia do goberno mellorou! O asentamento rebelde en %colony% agora iguala ou supera o %number% por cento. model.colony.governmentImproved1=O goberno de %colony% mellorou, pero aínda é moi ineficiente. Aínda hai penalizacións á produción. model.colony.governmentImproved2=O goberno de %colony% mellorou. Xa non hai penalizacións á produción. +# Fuzzy model.colony.insufficientProduction=%outputAmount% máis de %outputType% poderían ser producidos por %colony%, se só tivésemos %inputAmount% máis de %inputType%. model.colony.lostGoodGovernment=A eficiencia do goberno diminuíu! O asentamento rebelde en %colony% xa non iguala ou supera o %number% por cento. A colonia xa non consigue bonificacións de produción. model.colony.lostVeryGoodGovernment=A eficiencia do goberno diminuíu! O asentamento rebelde en %colony% xa non iguala ou supera o %number% por cento. Perdéronse algunhas bonificacións de produción. @@ -1657,21 +1659,29 @@ model.direction.SW.name=suroeste model.direction.W.name=oeste model.direction.NW.name=noroeste model.historyEventType.abandonColony.description=Abandonaches a colonia de %colony%. +# Fuzzy model.historyEventType.cityOfGold.description=Os %nation% descubriron %city%, unha das sete cidades de ouro, e mais un tesouro de %treasure% de ouro. +# Fuzzy model.historyEventType.colonyConquered.description=A túa colonia %colony% é conquistada polos %nation%. +# Fuzzy model.historyEventType.colonyDestroyed.description=A túa colonia %colony% é destruída polos %nation%. # Fuzzy model.historyEventType.conquerColony.description=Atréveste a aceptar as nosas xenerosas condicións e evitas os pagamentos? Esta duplicidade segará a amarga recompensa do noso descontento. # Fuzzy model.historyEventType.declareIndependence.description=Destruíches o asentamento %settlement% dos %nation%. +# Fuzzy model.historyEventType.destroyNation.description=Os %nation% destrúen os %nativeNation%. model.historyEventType.discoverNewWorld.description=Descubriches o Novo Mundo. +# Fuzzy model.historyEventType.discoverRegion.description=Os %nation% descubriron %region%. model.historyEventType.foundColony.description=Estableciches a colonia de %colony%. model.historyEventType.foundingFather.description=%father% únese ao congreso continental. model.historyEventType.independence.description=Conseguiches a independencia da Coroa. +# Fuzzy model.historyEventType.meetNation.description=Coñeciches os %nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=Os %nation% xa non están presentes no Novo Mundo. +# Fuzzy model.historyEventType.spanishSuccession.description=Os %loserNation% ceden o conxunto de todas as súas colonias que teñen no Novo Mundo aos %nation%. model.indianSettlement.mostHatedNone=Ningún model.indianSettlement.mostHatedUnknown=Descoñecida @@ -1722,8 +1732,10 @@ model.messageType.warehouseCapacity.name=Capacidade do almacén model.messageType.warning.name=Avisos model.monarch.action.addToRef.text=A Coroa engadiu %number% {{plural:%number%|%unit%}} á forza expedicionaria real. Os líderes coloniais expresan preocupación. model.monarch.action.addToRef.no=Feito +# Fuzzy model.monarch.action.declarePeace.text=Aceptamos de boa gana un tratado de paz cos %nation%. model.monarch.action.declarePeace.no=Feito +# Fuzzy model.monarch.action.declareWar.text=A insolencia dos %nation% obríganos a declarar a guerra contra eles! model.monarch.action.declareWar.no=Feito # Fuzzy @@ -1775,6 +1787,7 @@ model.noClaimReason.worked.description=Xa hai outro asentamento usando estas ter model.player.forces=Forzas de %nation% model.player.independentMarket=Europa model.player.startGame=Despois de meses no mar, finalmente chegaches á costa dun continente descoñecido. Navega {{tag:%direction%|west=ao oeste|east=ao leste|default=cara ao vento}} a fin de descubrir o Novo Mundo e reclamar a Coroa. +# Fuzzy model.player.waitingFor=Agardando por: %nation% model.regionType.coast.name=Litoral model.regionType.coast.unknown=Rexión costeira descoñecida @@ -1829,9 +1842,9 @@ model.unit.underRepair=Reparación (%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=V +# Fuzzy model.unit.unitState.skipped=S model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G @@ -1872,6 +1885,7 @@ model.colony.warehouseSoonFull=O teu almacén de %colony% superará a súa capac model.colony.warehouseWaste=O teu almacén de %colony% superou a súa capacidade de %goods%. Desbotáronse %waste% unidades. model.colony.workersEvicted=En %colony%, os teus colonos non poden seguir traballando en %location% debido á presenza de %enemyUnit%. model.colonyTile.resourceExhausted=Recurso %resource% esgotado en %colony% +# Fuzzy model.game.spanishSuccession=Súa Excelencia, a Guerra de Sucesión Española acabou en Europa. No Tratado de Utrecht, os %loserNation% foi forzado a ceder todas as colonias do Novo Mundo aos %nation%! model.indianSettlement.mission.denounced=O teu misioneiro en %settlement% foi denunciado e executado! model.indianSettlement.mission.destroyed=O teu misioneiro en %settlement% morreu na destrución do asentamento. @@ -1881,6 +1895,7 @@ model.player.autoRecruit=Os disturbios relixiosos en %europe% provocan a emigrac model.player.colonyGoodsParty.harbour=Os teus colonos de %colony% desbotaron %amount% unidades de %goods% no porto en protesta polas taxas de impostos da Coroa! model.player.colonyGoodsParty.horses=Os teus colonos de %colony% liberaron %amount% cabalos en protesta contra os impostos inxustos da Coroa! model.player.colonyGoodsParty.landLocked=Os teus colonos de %colony% queimaron %amount% unidades de %goods% no mercado local en protesta polas taxas de impostos da Coroa! +# Fuzzy model.player.dead.european=Súa Excelencia, os %nation% declararon unha retirada incondicional dos asuntos do Novo Mundo! model.player.dead.native=Súa Excelencia, os %nation% foron destruídos. model.player.disaster.bankruptcy.start=Non pagaches polo mantemento de todas as construcións. Hanse aplicar penalizacións de produción. @@ -1892,12 +1907,16 @@ model.player.foundingFatherJoinedCongress=%foundingFather% uniuse ao congreso!\n model.player.interventionForceArrives=Chega a forza de intervención prometida! model.player.soLDecrease=Diminuíron ata o %newSoL% por cento os membros dos Fillos da Liberdade nas túas colonias! model.player.soLIncrease=O número de membros dos Fillos da Liberdade nas túas colonias aumentou un %newSoL% por cento! +# Fuzzy model.player.stance.alliance.declared=Súa Excelencia, os %nation% teñen unha alianza connosco! model.player.stance.alliance.others=Súa Excelencia, o %attacker% ten unha alianza con %defender%. +# Fuzzy model.player.stance.ceaseFire.declared=Súa Excelencia, os %nation% aceptaron un alto o fogo connosco! model.player.stance.ceaseFire.others=Súa Excelencia, o %attacker% aceptou un alto o fogo con %defender%. +# Fuzzy model.player.stance.peace.declared=Súa Excelencia, os %nation% están en paz connosco! model.player.stance.peace.others=Súa Excelencia, o %attacker% está en paz con %defender%. +# Fuzzy model.player.stance.war.declared=Malas novas, súa Excelencia, os %nation% declaráronnos a guerra! model.player.stance.war.others=Súa Excelencia, o %attacker% declarou a guerra con %defender%. combat.automaticDefence=O teu %unit% en %colony% tomou as armas para defender a colonia! @@ -1913,6 +1932,7 @@ combat.enemyShipEvaded=%enemyUnit% %enemyNation% librouse dun ataque de %unit%. combat.enemyShipSunk=%unit% afundiu aos %enemyUnit% %enemyNation%! combat.equipmentCaptured=Coidado, os guerreiros %nation% adquiriron %equipment%! combat.goodsStolen=%enemyUnit% %enemyNation% rouba %amount% de %goods% a %colony%! +# Fuzzy combat.indianPlunder=%enemyUnit% %enemyNation% saquea %amount% de %colony%. combat.indianRaid=Os nosos espías informan de que os %nation% invadiron a colonia %colonyNation% de %colony%. combat.indianSurprise=Os %nation% fixeron un ataque sorpresa en %colony%, que alarmou os nosos colonos. Os xefes dos %nation% rexeitan calquera implicación. @@ -1969,6 +1989,7 @@ main.javaVersion=Recoméndase a versión %minVersion% do Java para executar o Fr main.memory=Debes asignar máis de %memory% bytes de memoria para o JVM.\n Reinicia o FreeCol con: java -Xmx%minMemory%M -jar FreeCol.jar main.userDir.fail=O FreeCol non pode atopar os directorios axeitados para gardar os datos de usuario. O programa pode continuar, pero posiblemente encontrarás algún erro. client.baseData=Non se puido atopar o directorio de datos de base %dir%.\n O FreeCol non puido atopar os ficheiros de datos.\n Asegúrate de que están presentes.\n Se o FreeCol está buscando nun directorio incorrecto, entón\n executa o xogo cun parámetro na liña de comandos:\n --freecol-data +# Fuzzy client.choicePlayer=Por favor, escolle un xogador: client.classic=Erro ao cargar o recurso de cartografía desde o conxunto de regras "classic". client.headlessDebug=O modo sen cabeza necesita unha execución de depuración. @@ -1978,8 +1999,10 @@ metaServer.couldNotConnect=Sentímolo, non se pode conectar co servidor meta. In metaServer.communicationError=Houbo un erro ao comunicarse co servidor meta. Inténtao de novo máis tarde. abandonEducation.action.studying=estudando abandonEducation.action.teaching=ensinando +# Fuzzy abandonEducation.no=Non, continuar a educación abandonEducation.text=Se a túa %unit% deixa %colony%, abandonará %action% no %building%. Estás seguro de querer marchar? +# Fuzzy abandonEducation.yes=Si, deixar a colonia abandonTeaching.text=Se a túa %unit% abandona o %building% deixará de educar. Estás seguro de querer marchar? armedUnitSettlement.attack=Atacar @@ -1990,8 +2013,11 @@ buy.takeOffer=Aceptar a oferta buy.text=Os %nation% queren vender os seus %goods% por %gold%: clearTradeRoute.text=Á túa %unit% asignóuselle a ruta comercial %route%. Ao definir o seu destino retirarase da ruta actual. Estás seguro de querer facelo? client.fullScreen=O modo en pantalla completa non está soportado por este dispositivo gráfico.\nVolvendo ao modo en ventá. +# Fuzzy confirmHostile.alliance=Non podes atacar unha nación aliada! Realmente queres romper as túas alianzas cos %nation% e declarar a guerra? +# Fuzzy confirmHostile.ceaseFire=Asinaches un alto o fogo cos %nation%. Realmente queres atacar? +# Fuzzy confirmHostile.peace=Estás en paz cos %nation%. Realmente queres declarar a guerra? error.noSuchFile=O ficheiro especificado non existe ou non é un ficheiro normal. # Fuzzy @@ -2045,7 +2071,9 @@ defeated.text=Fuches derrotado! Queres: defeated.yes=Quedar e mirar defeatedSinglePlayer.text=Fuches derrotado!\n\nAgora é tempo de noite e tebras, cando os campanarios das igrexas bocexan e o inferno inunda este mundo. Agora podería beber sangue quente e levar a cabo actos que o mesmo día tremería ao ver. defeatedSinglePlayer.yes=Entrar no modo vinganza +# Fuzzy diplomacy.offerAccepted=Os %nation% aceptaron a túa xenerosa oferta. +# Fuzzy diplomacy.offerRejected=Os %nation% rexeitaron a túa xenerosa oferta. disbandUnit.text=Estás seguro de querer disolver esta unidade? disbandUnit.yes=Disolverse @@ -2089,7 +2117,9 @@ move.noAccessContact=Debemos establecer contacto cos %nation% primeiro, súa Exc move.noAccessGoods=Os %nation% non han comerciar cunha %unit% baleira. move.noAccessSettlement=Os %nation% non permiten que a nosa %unit% entre no seu asentamento. move.noAccessSkill=A nosa %unit% non pode aprender dos nativos. +# Fuzzy move.noAccessTrade=Non temos a autoridade necesaria para comerciar con outras nacións europeas como os %nation%. +# Fuzzy move.noAccessWar=Non podemos comerciar cos %nation% durante a guerra. move.noAccessWater=A nosa %unit% debe desembarcar antes de entrar no seu asentamento. move.noAttackWater=A nosa %unit% debe estar en terra antes de atacar. @@ -2143,6 +2173,7 @@ server.invalidPlayerNations=Todos os xogadores deben elixir unha nación distint server.maximumPlayers=Sentímolo, alcanzouse o número máximo de xogadores. server.missingUserName=Falta o nome de usuario na solicitude de inicio de sesión. server.missingVersion=Falta a versión do FreeCol na solicitude de inicio de sesión. +# Fuzzy server.noRouteToServer=Non se pode facer público o servidor. Deberías modificar a configuración do teu firewall para permitir conexións no porto que especifiques. server.notAllReady=Non todos os xogadores están preparados para comezar o xogo! server.onlyAdminCanLaunch=Sentímolo, só o administrador do servidor pode publicar o xogo. @@ -2151,6 +2182,7 @@ server.timeOut=Superouse o tempo límite ao conectar co servidor. server.userNameInUse=O nome de usuario especificado xa está en uso. server.userNameNotPresent=O nome de usuario especificado non está neste xogo. server.wrongFreeColVersion=As versións do cliente e do servidor do FreeCol non coinciden. +# Fuzzy buildColony.others=Os %nation% fundaron a nova colonia de %colony% en %region%. cashInTreasureTrain.colonial=Un tesouro formado por %amount% doblóns de ouro desembarcou en Europa. Están dispoñibles %cashInAmount% doblóns de ouro máis. cashInTreasureTrain.independent=Un tesouro formado por %amount% doblóns de ouro engadiuse ao tesouro nacional. @@ -2254,6 +2286,7 @@ colopedia.unit.offensivePower=Poder de ofensa: colopedia.unit.price=Prezo en Europa: colopedia.unit.productionBonus={{plural:%number%|one=Modificador|other=Modificadores}} de produción: colopedia.unit.requirements=Requirimentos: +# Fuzzy colopedia.unit.school=Centro esixido para adestrar: colopedia.unit.skill=Nivel de habilidade: report.labour.allColonists=Todos os colonos @@ -2289,8 +2322,8 @@ report.colony.growing.description=%colony% pode medrar {{plural:%amount%|one=nun # Fuzzy report.colony.improve.description=Unidades que poderían mellorar a produción con respecto á unidade que fai o traballo arestora report.colony.improve.header=Mellorar +# Fuzzy report.colony.improving.description=%colony%: Para producir %amount% máis de %goods%, substitúe %oldUnit% por %unit% -report.colony.wanting.description=%colony%: Para producir %amount% máis de %goods%, engade %unit% report.colony.making.blocking.description=%colony%: %amount% %goods% necesarios para %buildable% {{plural:%turns%|one=na vindeira quenda|other=en %turns% quendas}} report.colony.making.constructing.description=%colony%: %buildable% remata {{plural:%turns%|one=na vindeira quenda|other=en %turns% quendas}} report.colony.making.description=O que esta colonia está facendo @@ -2300,21 +2333,22 @@ report.colony.making.noconstruction.description=%colony%: Non hai construcións report.colony.making.noteach.description=%colony%: %teacher% bota en falta un estudante report.colony.name.description=A lista de colonias report.colony.name.header=Colonia -report.colony.plow.description=Número de cadrantes de colonia que se beneficiarían de arar -report.colony.plow.header=A -report.colony.plowing.description=%colony% beneficiarase de arar {{plural:%amount%|one=un cadrante|other=%amount% cadrantes}} +# Fuzzy report.colony.production.description=%colony%: produción neta de %goods% = %amount% +# Fuzzy report.colony.production.export.description=%colony%: a produción neta de %goods% é %amount% (exportación superior a %export%) report.colony.production.header=Produción neta de %goods% +# Fuzzy report.colony.production.high.description=%colony%: produción neta de %goods% = %amount%; completa {{plural:%turns%|one=na vindeira quenda|other=en %turns% quendas}} +# Fuzzy report.colony.production.low.description=%colony%: produción neta de %goods% = %amount%; desaparecerá {{plural:%turns%|one=na vindeira quenda|other=en %turns% quendas}} +# Fuzzy report.colony.production.waste.description=%colony%: produción neta de %goods% = %amount%; o almacén vai desbordar, perderanse %waste% -report.colony.road.description=Número de cadrantes de colonia que se beneficiarían de construír estradas -report.colony.road.header=C -report.colony.roadBuilding.description=%colony% beneficiarase da construción {{plural:%amount%|one=dunha estrada|other=de %amount% estradas}} report.colony.shrinking.description=%colony% pode minguar {{plural:%amount%|one=nunha unidade|other=en %amount% unidades}} para mellorar a produción report.colony.starving.description=%colony%: fame {{plural:%turns%|one=na vindeira quenda|other=en %turns% quendas}} # Fuzzy +report.colony.wanting.description=%colony%: Para producir %amount% máis de %goods%, engade %unit% +# Fuzzy report.continentalCongress.elected=Elixidos: report.continentalCongress.none=(ningún) report.continentalCongress.recruiting=Recrutando @@ -2356,26 +2390,25 @@ report.production.selectGoods=Seleccionar as mercadorías report.production.update=Actualizar report.requirements.badAssignment=%colony% ten un %expert% traballando como %expertWork%, mentres que un %nonExpert% traballa como %nonExpertWork%. A produción iría mellor se os colonos trocasen os traballos. report.requirements.canTrainExperts=As {{plural:2|%unit%}} pódense adestrar en -report.requirements.clearTile=%type% cara a %direction% de %colony% beneficiaríase da limpeza. +# Fuzzy report.requirements.exploreTile=%type% cara a %direction% de %colony% beneficiaríase da exploración. report.requirements.met=Cúmprense todas as esixencia. report.requirements.missingGoods=%colony% está producindo %goods%, pero precisa dun maior %input%. report.requirements.misusedExperts=Hai {{plural:2|%unit%}} non traballando como %work% presentes en report.requirements.noExpert=%colony% está producindo %goods%, pero non ten %unit%. -report.requirements.plowCenter=%colony% beneficiaríase de arar o seu cuadrante. -report.requirements.plowTile=%type% cara a %direction% de %colony% beneficiaríase de arar. -report.requirements.roadTile=%type% cara a %direction% de %colony% beneficiaríase da construción de estradas. report.requirements.severalExperts=Varias {{plural:2|%unit%}} están presentes en report.requirements.surplus=Estanse producindo excedentes de %goods% en report.trade.afterTaxes=Beneficios despois dos impostos report.trade.beforeTaxes=Beneficios antes dos impostos report.trade.cargoUnits=Unidades en transporte +# Fuzzy report.trade.hasCustomHouse=* Esta colonia ten unha aduana; as mercadorías son exportadas. report.trade.totalDelta=Produción total report.trade.totalUnits=Total de unidades report.trade.unitsSold=Unidades compradas ou vendidas report.turn.filter=Non mostrar este tipo de mensaxes (%type%) report.turn.ignore=Ignorar esta mensaxe (Colonia: %colony%, Bens: %goods%) +# Fuzzy report.turn.playerNation=%nation% de %player% # Fuzzy aboutPanel.copyright=Copyright © 2002-2013 O equipo do FreeCol @@ -2401,6 +2434,7 @@ chooseFoundingFatherDialog.title=Nomear o pai fundador colonyPanel.colonyUnits=Unidades da colonia colonyPanel.inPort=No porto colonyPanel.outsideColony=Aforas da colonia +# Fuzzy colonyPanel.producing=Producindo: colonyPanel.reducePopulation=Se reduces a poboación a menos de %number%, %colony% xa non será capaz de construír %buildable%. colonyPanel.setGoods=Definir os produtos @@ -2414,7 +2448,9 @@ colonyPanel.notBestTile=%unit% podería producir máis %goods% en %tile%. confirmDeclarationDialog.areYouSure.no=Talvez logo confirmDeclarationDialog.areYouSure.text=Deixádenos renunciar á inxusta tiranía de %monarch% e declarar a independencia das nosas colonias da Coroa! confirmDeclarationDialog.areYouSure.yes=Liberdade ou morte! +# Fuzzy confirmDeclarationDialog.defaultCountry=Estados Unidos de %nation% +# Fuzzy confirmDeclarationDialog.defaultNation=%nation% libre confirmDeclarationDialog.enterCountry=De agora en diante, o noso país deberá ser coñecido como confirmDeclarationDialog.enterNation=e todo cidadán da nosa gloriosa nación deberá estar orgulloso de ser coñecido como diff --git a/data/strings/FreeColMessages_he.properties b/data/strings/FreeColMessages_he.properties index cfc09e916..28b1c4395 100644 --- a/data/strings/FreeColMessages_he.properties +++ b/data/strings/FreeColMessages_he.properties @@ -156,8 +156,9 @@ cli.no-java-check=דלג על בדיקת גרסת ה-Java שברשותך cli.no-memory-check=דלג על בדיקת הזיכרון cli.no-sound=הרץ את FreeCol ללא קול cli.private=התחל שרת פרטי (שאינו מופיע ברשימת השרתים) -cli.server-name=ציין שם מותאם אישית עבור השרת +# Fuzzy cli.server=התחל שרת עצמאי על הפורט שנבחר +cli.server-name=ציין שם מותאם אישית עבור השרת # Fuzzy cli.windowed=הרץ את FreeCol בחלון במקום במסך מלא menuBar.colopedia=ישובופדיה @@ -201,7 +202,6 @@ colopediaAction.goods.name=סחורות colopediaAction.nations.name=אומות colopediaAction.nationTypes.name=יתרונות לאומיים colopediaAction.resources.name=משאבי בונוס -colopediaAction.skills.name=מיומנויות colopediaAction.terrain.name=סוגי שטחים colopediaAction.units.name=יחידות debugAction.name=החלף למצב בדיקת באגים @@ -886,6 +886,7 @@ model.building.locationLabel=נמצא ב-%location% model.colony.badGovernment=הממשל ב%colony% לא יעיל. המושבה סובלת מקנסות ייצור. model.colony.governmentImproved1=הממשל ב%colony% התייעל, אך עדיין אינו יעיל לחלוטין. קנסות ייצור עדיין חלים עליו. model.colony.governmentImproved2=הממשל ב%colony% התייעל. קנסות הייצור לא חלים עליו עוד. +# Fuzzy model.colony.insufficientProduction=%outputAmount% %outputType% יותר היו יכולים להיות מופקים ב%colony%, לו רק היה לנו %inputAmount% %inputType% במאגר. model.colony.minimumColonySize=%object% מונע מהצטמצמות יתרה של האוכלוסיה. model.colony.unbuildable=%colony% לא יכולה לבנות %object% בזמן זה. %object% הוסר מרשימת הבנייה. @@ -918,6 +919,7 @@ model.nationState.available.name=זמין model.nationState.notAvailable.name=לא זמין model.player.independentMarket=אירופה model.player.startGame=לאחר חודשים בים, הגעתם לבסוף לחופה של יבשת בלתי נודעת. הפליגו {{tag:%direction%|west=מערבה|east=מזרחה|default=אל תוך הרוח}} כדי לגלות את העולם החדש ולתת אותו לכתר. +# Fuzzy model.player.waitingFor=בהתמנה ל־: %nation% model.stance.alliance.name=ברית model.stance.ceaseFire.name=הפסקת אש @@ -992,6 +994,7 @@ combat.enemyShipEvaded=ה%enemyUnit% של %enemyNation% חמקה מהתקפה ש combat.enemyShipSunk=%unit% גרמה ל%enemyUnit% של %enemyNation% לשקוע בים! combat.equipmentCaptured=היזהר, לוחמי %nation% השיגו כעת %equipment%! combat.goodsStolen=%enemyUnit% של %enemyNation% גנב %amount% %goods% ב%colony%! +# Fuzzy combat.indianPlunder=%enemyUnit% של %enemyNation% בזז %amount% זהב מ%colony%. combat.indianTreasure=שדדת %amount% מ%settlement%. combat.nativeCapitalBurned=העלית באש את %name%, בירת ה%nation%. ה%nation% נכנעים לעוצמתך. @@ -1032,6 +1035,7 @@ error.couldNotLoad=ארעה שגיאה בעת הנסיון לטעינת המשח # Fuzzy error.couldNotSave=ארעה שגיאה בעת הנסיון לשמירת המשחק! main.defaultPlayerName=שם השחקן +# Fuzzy client.choicePlayer=אנא בחרו בשחקן: metaServer.couldNotConnect=לא ניתן להתחבר אל שרת המטא, עמכם הסליחה. אנא נסו שוב מאוחר יותר. metaServer.communicationError=ארעה שגיאה בעת יצירת הקשר עם שרת המטא. אנא נסו שוב מאוחר יותר. @@ -1089,7 +1093,9 @@ clearSpeciality.areYouSure=האם אתה בטוח שאתה רוצה להוריד clearSpeciality.impossible=היחידה %unit% לא יכולה לרדת בדרגה! defeated.text=הובסת! האם ברצונך: defeated.yes=הישאר וצפה במשחק +# Fuzzy diplomacy.offerAccepted=האומה %nation% קיבלה את הצעתכם הנדיבה. +# Fuzzy diplomacy.offerRejected=האומה %nation% דחתה את הצעתכם הנדיבה. disbandUnit.text=האם אתה בטוח שברצונך לפרק את היחידה? disbandUnit.yes=פרק @@ -1132,7 +1138,9 @@ move.noAccessBeached=הספינה של %nation% חוסמת את הדרך שלנ move.noAccessContact=אנחנו חייבים ליצור קשר עם %nation% לפני כן, הוד מעלתו. move.noAccessSettlement=ה%nation% לא מרשים ל%unit% שלנו להכנס להתיישבות שלהם. move.noAccessSkill=ה%unit% שלנו אינו יכול ללמוד מהילידים. +# Fuzzy move.noAccessTrade=אין לנו רשות לסחור עם מדינות אירופאיות אחרות כמו %nation%. +# Fuzzy move.noAccessWar=איננו יכולים לסחור עם ה%nation% בזמן מלחמה. move.noAccessWater=ה%unit% שלנו חייב לרדת לחוף לפני שהוא יכול להיכנס להתיישבות. nameRegion.text=גילית %type% ורשמת את הבעלות עליו על שם הממלכה! לפי המנהג, אתה רשאי לתת לו שם: @@ -1166,6 +1174,7 @@ server.fileNotFound=לא ניתן למצוא את הקובץ בשם הנתון. server.incompatibleVersions=המשחק השמור אותו אתם מנסים לטעון אינו תואם לגירסה זו של FreeCol. server.invalidPlayerNations=על כל השחקנים לבחור אומה ייחודית על מנת שהמשחק יוכל להתחיל. server.maximumPlayers=סליחה, יש כבר מספר מקסימלי של שחקנים. +# Fuzzy server.noRouteToServer=השרת אינו יכול להיהפך לציבורי. אתה צריך לשנות את הגדרות חומת האש שלך כדי לאפשר חיבור בפורט המבוקש. server.notAllReady=לא כל השחקנים מוכנים להתחיל את המשחק! server.onlyAdminCanLaunch=אני מתנצל, רק מנהל השרת יכול להפעיל את המשחק. @@ -1191,6 +1200,7 @@ report.labour.workingAs=עובד כ- report.foreignAffair.stance=עמדה report.turn.filter=אל תציג הודעה מסוג זה (%type%) report.turn.ignore=התעלם מהודעה זו (מושבה: %colony%, סחורות: %goods%) +# Fuzzy report.turn.playerNation=%nation% של %player% aboutPanel.version=גרסה: buildQueuePanel.buildings=מבנים @@ -1209,6 +1219,7 @@ chooseFoundingFatherDialog.title=למנות האב המייסד colonyPanel.colonyUnits=יחידות המושבה colonyPanel.inPort=בנמל colonyPanel.outsideColony=מחוץ למושבה +# Fuzzy colonyPanel.producing=בהפקת: colonyPanel.reducePopulation=אם כמות התושבים יורדת מתחת ל-%number%, %colony% לא תוכל עוד לבנות %buildable% colonyPanel.unitChange=עם הכניסה למושבה ה%oldType% שלך הפך ל%newType%. @@ -1220,6 +1231,7 @@ colonyPanel.notBestTile=%unit% יכול לייצר יותר %goods% על %tile% confirmDeclarationDialog.areYouSure.no=אולי מאוחר יותר confirmDeclarationDialog.areYouSure.text=בואו נתנער מהעריצות הלא הוגנת של %monarch% ונכריז על עצמאות המושבות שלנו מהמלך! confirmDeclarationDialog.areYouSure.yes=חירות או מוות! +# Fuzzy confirmDeclarationDialog.defaultCountry=ארצות הברית של %nation% confirmDeclarationDialog.enterCountry=מעתה ואילך, ארצנו תיקרא בשם confirmDeclarationDialog.enterNation=וכל אזרח של המדינה המפוארת שלנו יהיה גאה להיקרא diff --git a/data/strings/FreeColMessages_hsb.properties b/data/strings/FreeColMessages_hsb.properties index ea54f64e3..68fd5d9e1 100644 --- a/data/strings/FreeColMessages_hsb.properties +++ b/data/strings/FreeColMessages_hsb.properties @@ -201,7 +201,6 @@ colopediaAction.goods.name=Twory colopediaAction.nations.name=Nacije colopediaAction.nationTypes.name=Narodne lěpšiny colopediaAction.resources.name=Bonusowe resursy -colopediaAction.skills.name=Kmanosće colopediaAction.terrain.name=Terenowe typy colopediaAction.units.name=Jednotki colopediaAction.name=%object% (Colopedia) @@ -1032,16 +1031,22 @@ model.direction.SW.name=juhozapad model.direction.W.name=zapad model.direction.NW.name=sewjerozapad model.historyEventType.abandonColony.description=Wopušćeće koloniju %colony%. +# Fuzzy model.historyEventType.colonyConquered.description=Waša kolonija %colony% so wot %nation% dobywa. +# Fuzzy model.historyEventType.colonyDestroyed.description=Waša kolonija %colony% so wot %nation% niči. # Fuzzy model.historyEventType.declareIndependence.description=Ničiće sydlišćo %settlement% %nation%. +# Fuzzy model.historyEventType.destroyNation.description=%nation% niči %nativeNation%. model.historyEventType.discoverNewWorld.description=Wuslědźujeće Nowy swět. +# Fuzzy model.historyEventType.discoverRegion.description=Narody %nation% wotkrywaja region %region%. model.historyEventType.foundColony.description=Załožujeće koloniju kolonije %colony%. model.historyEventType.independence.description=Docpěwaće njewotwisnosć wot Króny. +# Fuzzy model.historyEventType.meetNation.description=Zetkawaće %nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=%nation% hižo w Nowym swěće přitomne njejsu. model.indianSettlement.mostHatedNone=Žadyn model.indianSettlement.mostHatedUnknown=Njeznaty @@ -1107,6 +1112,7 @@ model.noClaimReason.water.description=Nježadamy wody. model.noClaimReason.worked.description=Tutón kraj so hižo wot druheho sydlišća wužiwa. model.player.forces=Wójska %nation% model.player.independentMarket=Europa +# Fuzzy model.player.waitingFor=Čakanje na: %nation% model.regionType.coast.name=Pobrjóh model.regionType.coast.unknown=Njeznaty pobrjóžny region @@ -1155,9 +1161,9 @@ model.unit.occupation.unknown=? model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S +# Fuzzy model.unit.unitState.skipped=W model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G @@ -1178,6 +1184,7 @@ model.player.disaster.effect.colonyDestroyed=%colony% je so dospołnje zničił. model.player.disaster.strikes=Twoja kolonija %colony% je so přez %disaster% domapytała. model.player.emigrate=W %europe% je so jednotka %unit% rozsudźiła emigrować. model.player.foundingFatherJoinedCongress=%foundingFather% je kongresej přistupił!\n\n%description% +# Fuzzy model.player.stance.war.declared=Špatne nowinki, waša ekscelenca, narod %nation% je nam wójnu připowědźił! model.region.north.name=Sewjer model.region.northEast.name=Sewjerowuchod @@ -1202,12 +1209,15 @@ error.couldNotLoad=Při startowanju hry je zmylk wustupił. # Fuzzy error.couldNotSave=Při pospyće hru składować je zmylk wustupił! main.defaultPlayerName=Mjeno hrajerja +# Fuzzy client.choicePlayer=Wuzwolće prošu hrajerja: metaServer.couldNotConnect=Wodajće zwisk z metaserwerom njeje móžno był. Prošu spytajće pozdźišo hišće raz. metaServer.communicationError=Při komunikaciji z metaserwerom je zmylk wustupił. Prošu spytaj pozdźišo hišće raz. abandonEducation.action.studying=studij abandonEducation.action.teaching=wukubłanje +# Fuzzy abandonEducation.no=Ně, wukubłanje dale wjesć +# Fuzzy abandonEducation.yes=Haj, koloniju wopušćić boycottedGoods.dumpGoods=Twory wotkłasć buy.moreGold=Nišu płaćiznu sej žadać @@ -1252,7 +1262,9 @@ buildColony.yes=Połož fundamenty! buyProposition.text=Chceće twory kupić? defeated.yes=Wostać a přihladować defeatedSinglePlayer.yes=Rewanšowy modus zapodać +# Fuzzy diplomacy.offerAccepted=%nation% su waš šćedriwy poskitk přiwzali. +# Fuzzy diplomacy.offerRejected=%nation% su waš šćedriwy poskitk wotpokazali. disbandUnit.yes=Rozpušćić event.firstLanding=Prěnje přistaće w %name%! @@ -1273,6 +1285,7 @@ learnSkill.no=Ně, dźakuju so, snano pozdźišo learnSkill.yes=Haj, to chcu missionarySettlement.cancel=Wostajće nas w měrje žiwi być! move.noAccessSkill=Naša jednotka %unit% njemóže wot domoródnych wuknyć. +# Fuzzy move.noAccessWar=Za čas wójny njemóžemy z narodom %nation% wikować. move.noTile=Naša %unit% na karće njeje! newLand.text=Prošu pomjenujće nowy kraj: @@ -1360,6 +1373,7 @@ colopedia.unit.offensivePower=Ofensiwna móc: colopedia.unit.price=Płaćizna w Europje: colopedia.unit.productionBonus={{plural:%number%|one=Produkciski modifikator|two=Produkciskej modifikatoraj|few=Produkciske modifikatory|other=Produkciskich modifikatorow|default=Produkciske modifikatory}} colopedia.unit.requirements=Potrěbnosće: +# Fuzzy colopedia.unit.school=Za wukubłanje trěbna šula: colopedia.unit.skill=Stopjeń kmanosće: report.labour.allColonists=Wšitcy kolonisća @@ -1390,12 +1404,9 @@ report.colony.making.noconstruction.description=%colony%: Twarske dźěła njejs report.colony.making.noteach.description=%colony%: %teacher% nima studenta report.colony.name.description=Lisćina kolonijow report.colony.name.header=Kolonija -report.colony.plow.description=Ličba polow kolonije, kotrež bychu so přez woranje polěpšili -report.colony.plow.header=L +# Fuzzy report.colony.production.description=%colony%: produkcija %goods% (netto) = %amount% report.colony.production.header=Produkcija %goods% (netto) -report.colony.road.description=Ličba polow kolonije, kotrež bychu so přez dróhotwar woranje polěpšili -report.colony.road.header=D # Fuzzy report.continentalCongress.elected=Wuzwoleny: report.continentalCongress.none=(žadyn) @@ -1443,12 +1454,14 @@ report.requirements.surplus=Nadbytk %goods% produkuje so w report.trade.afterTaxes=Dochody po dawkach report.trade.beforeTaxes=Dochody před dawkami report.trade.cargoUnits=Wjezwowe jednotki +# Fuzzy report.trade.hasCustomHouse=* Tuta kolonija ma cłownju; tute twory so eksportuja. report.trade.totalDelta=Cyłkowna produkcija report.trade.totalUnits=Jednotki dohromady report.trade.unitsSold=Kupjene abo předate jednotki report.turn.filter=Tutón typ powěsće (%type%) njezwobraznić report.turn.ignore=Tutu powěsć ignorować (kolonija: %colony%, twory: %goods%) +# Fuzzy report.turn.playerNation=%nation% hrajerja %player% # Fuzzy aboutPanel.copyright=Copyright © 2002-2013 Team FreeCol @@ -1471,6 +1484,7 @@ chooseFoundingFatherDialog.title=Załožerskeho wótca nominować colonyPanel.colonyUnits=Kolonijowe jdnotki colonyPanel.inPort=W přistawje colonyPanel.outsideColony=Zwonka kolonije +# Fuzzy colonyPanel.producing=Zhotowjenje: colonyPanel.bonusLabel=Bonus: %number%%extra% colonyPanel.populationLabel=Populacija: %number% @@ -1480,7 +1494,9 @@ colonyPanel.notBestTile=Jednotka %unit% móhła wjace %goods% na polu %tile% pro confirmDeclarationDialog.areYouSure.no=Snano pozdźišo confirmDeclarationDialog.areYouSure.text=Wzdajmy so njesprawneho tyranstwa %monarch% a deklarujmy njewotwisnosć našich kolonijow wot króny! confirmDeclarationDialog.areYouSure.yes=Swoboda abo Smjerć! +# Fuzzy confirmDeclarationDialog.defaultCountry=Zjednoćene staty %nation% +# Fuzzy confirmDeclarationDialog.defaultNation=Swobodny %nation% confirmDeclarationDialog.enterCountry=Wotnětka ma naš kraj znaty być jako confirmDeclarationDialog.enterNation=a kóždy krajan našeho sławneho naroda budź hordy, zo je znaty jako @@ -1490,8 +1506,10 @@ negotiationDialog.accept=Akceptować negotiationDialog.add=Přidać negotiationDialog.cancel=Přetorhnyć negotiationDialog.clear=wuprózdnić +# Fuzzy negotiationDialog.demand=%nation% žadaja sej wot %otherNation% negotiationDialog.exchange=jako wotrunanje za +# Fuzzy negotiationDialog.offer=%nation% poskićeja %otherNation% negotiationDialog.send=Pósłać negotiationDialog.title.tribute=žadanje za tributom diff --git a/data/strings/FreeColMessages_hu.properties b/data/strings/FreeColMessages_hu.properties index 4a3863ef3..78d66c2f6 100644 --- a/data/strings/FreeColMessages_hu.properties +++ b/data/strings/FreeColMessages_hu.properties @@ -54,7 +54,6 @@ load=Betöltés many=sok medium=Közepes more=többet... -# Fuzzy music=Zene name=Név no=Nem @@ -73,7 +72,6 @@ save=Mentés # Fuzzy server=Kiszolgáló neve: small=Kicsi -# Fuzzy test=Teszt true=Igaz unload=Kirakodás @@ -102,7 +100,6 @@ inPort=Kikötőben mission=Küldetés modifiers=Módosítók nation=Nemzet -# Fuzzy newWorld=Új Világ notApplicable=N/A payArrears=Megfizetem a hátralékot @@ -183,8 +180,9 @@ cli.no-memory-check=a memória ellenőrzés átugrása cli.no-sound=a FreeCol futtatása hangok nélkül cli.private=magánkiszolgáló indítása (a metakiszolgálón nem lesz közzétéve) cli.seed=Egy alapszám (SEED) megadása a ál-véletlenszám generátornak. -cli.server-name=NAME név megadása a kiszolgálónak +# Fuzzy cli.server=önálló kiszolgáló indítása a megadott porton +cli.server-name=NAME név megadása a kiszolgálónak cli.splash=a játék betöltése közben kép megjelenítése a FILE állományból cli.tc=a NAME nevű szabályszett (total conversion) betöltése cli.timeout=hány másodpercet vár a kiszolgáló egy válaszra @@ -247,7 +245,6 @@ colopediaAction.goods.name=Termékek colopediaAction.nations.name=Nemzetek colopediaAction.nationTypes.name=Nemzeti erősségek colopediaAction.resources.name=Nyersanyag bónuszok -colopediaAction.skills.name=Mesterségek colopediaAction.terrain.name=Tereptípusok colopediaAction.units.name=Egységek continueAction.name=A játék folytatása @@ -1457,6 +1454,7 @@ model.building.locationLabel=Itt állomásozik: %location% model.colony.badGovernment=A %colony%i önkormányzat nagyon nehézkes, ezért termelési megszorítások sújtják a települést. model.colony.governmentImproved1=A %colony%i önkormányzat bár javult, de még mindig nem hatékony. A termelési levonások továbbra is érvényesek. model.colony.governmentImproved2=A %colony%i önkormányzat fejlődik, a termelés már a megszokott hatékonysággal működik. +# Fuzzy model.colony.insufficientProduction=%outputAmount% egységgel több %outputType% készülhetne %colony% kolóniában, ha %inputAmount% egységgel nagyobb %inputType% készletünk lenne. model.colony.minimumColonySize=A %object% miatt nem tudjuk tovább csökkenteni a népességet. model.colony.unbuildable=%colony% jelenleg nem építhet %object%-t. A(z) %object% kikerült az építési sorból. @@ -1470,21 +1468,29 @@ model.direction.SW.name=délnyugat model.direction.W.name=nyugat model.direction.NW.name=északnyugat model.historyEventType.abandonColony.description=A(z) %colony% gyarmat elhagyása. +# Fuzzy model.historyEventType.cityOfGold.description=Felfedezted %city% városát, az Arany Hét Városa közül az egyiket; és a falak között %treasure% aranyat! +# Fuzzy model.historyEventType.colonyConquered.description=A(z) %colony% kolónit meghódítja a(z) %nation% nép. +# Fuzzy model.historyEventType.colonyDestroyed.description=A(z) %colony% kolóniát elpusztítja a gaz %nation% nép. # Fuzzy model.historyEventType.conquerColony.description=Hogy mered elfogadni nagylelkű ajánlatunkat, majd elkerülni a fizetést? Ez a kétszínűség el fogja nyerni királyi nemtetszésünk keserű jutalmát! # Fuzzy model.historyEventType.declareIndependence.description=A(z) %nation% %settlement% település elpusztítása katonáink által. +# Fuzzy model.historyEventType.destroyNation.description=Elpusztítottad a %nation% népet. model.historyEventType.discoverNewWorld.description=Az Új Világ felfedezése. +# Fuzzy model.historyEventType.discoverRegion.description=A(z) %region%t feledezése. model.historyEventType.foundColony.description=A(z) %colony% gyarmat megalapítása. model.historyEventType.foundingFather.description=%father% csatlakozott a Kontinentális Kongresszushoz. model.historyEventType.independence.description=Elnyerted függetlenségedet a Koronától. +# Fuzzy model.historyEventType.meetNation.description=Első találkozás a(z) %nation% néppel. +# Fuzzy model.historyEventType.nationDestroyed.description=A(z) %nation% nép kipusztult. +# Fuzzy model.historyEventType.spanishSuccession.description=A(z) %loserNation% nemzet minden újvilági gyarmata mától %nation% fennhatóság alá kerül. model.indianSettlement.mostHatedNone=Nincs model.indianSettlement.mostHatedUnknown=Ismeretlen @@ -1524,8 +1530,10 @@ model.messageType.warehouseCapacity.name=Raktár férőhely model.messageType.warning.name=Figyelmeztetések model.monarch.action.addToRef.text=%number% {{plural:%number%|%unit%}} csatlakozott a Királyi Expedíciós Erőkhöz a Király parancsára. A gyarmatok vezetői aggodalmukat fejezik ki. model.monarch.action.addToRef.no=Rendben! +# Fuzzy model.monarch.action.declarePeace.text=Kegyesen elfogadtuk a békeszerződést a(z) %nation% nemzettel. model.monarch.action.declarePeace.no=Rendben! +# Fuzzy model.monarch.action.declareWar.text=A(z) %nation% nemzet pimaszsága arra kényszerít minket, hogy hadat üzenjünk nekik! model.monarch.action.declareWar.no=Rendben! # Fuzzy @@ -1571,6 +1579,7 @@ model.noClaimReason.worked.description=Egy másik település már használja ez model.player.forces=%nation% Erők model.player.independentMarket=Európa model.player.startGame=Több hónapos hajóút után végre megérkeztünk egy ismeretlen földrész partjaihoz. Hajózzunk {{tag:%direction%|west=nyugatra|east=keletre|default=tovább}, hogy felfedezhessük és a Korona nevében a magunkénak nyilvánítsuk ezt az Új Világot! +# Fuzzy model.player.waitingFor=A(z) %nation% játékos lép... model.regionType.coast.name=Part model.regionType.coast.unknown=Ismeretlen partvidék @@ -1625,9 +1634,9 @@ model.unit.underRepair=Javítás (%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=E model.unit.unitState.fortifying=E -model.unit.unitState.improving=# model.unit.unitState.inColony=K model.unit.unitState.sentry=Ő +# Fuzzy model.unit.unitState.skipped=V model.unit.unitState.toAmerica=M model.unit.unitState.toEurope=M @@ -1653,11 +1662,13 @@ model.colony.warehouseOverfull=Uram, a %colony%i raktárban megtelt a(z) %goods% model.colony.warehouseSoonFull=Uram, %colony% raktárának %goods% férőhelyei a következő körben megtelnek, %amount% %goods% kárba fog veszni. model.colony.warehouseWaste=Uram! %colony% raktárában túl sok %goods% van, %waste% egység kárba veszett! model.colonyTile.resourceExhausted=Uram, kimerült az %resource% forrás a %colony%i kolóniában. +# Fuzzy model.game.spanishSuccession=Exellenciás Uram, a Spanyol Örökösödési háború véget ért az Óvilágban! Az Utrechti Egyezmény szerint az összes újvilági %loserNation% gyarmat mától %nation% kézre kerül. model.indianSettlement.mission.denounced=Misszionáriusodat lefogták és kivégezték a(z) %settlement%i faluban! model.player.colonyGoodsParty.harbour=%amount% %goods% vált a halak vacsorájává a %colony%i kikötőben. A lakosság így tiltakozik a Korona által kirótt igazságtalan adók ellen! model.player.colonyGoodsParty.horses=A %colony%i lakosok szélnek eresztettek %amount% lovat, így tiltakozva a Korona által kirótt igazságtalan adók ellen! model.player.colonyGoodsParty.landLocked=A %colony%i piactéren %amount% %goods% vált a lángok martalékává. A lakosság ezzel tiltakozik a Korona által kirótt igazságtalan adók ellen! +# Fuzzy model.player.dead.european=Excellenciás Uram, a(z) %nation% nemzet bejelentette kivonulását az újvilági ügyekből! model.player.dead.native=Excellenicás Uram, a(z) %nation% nép elpusztult. model.player.disaster.effect.colonyDestroyed=%colony% teljesen elpusztult. @@ -1666,12 +1677,16 @@ model.player.foundingFatherJoinedCongress=%foundingFather% csatlakozott a Kongre model.player.interventionForceArrives=Az ígért intervenciós hadsereg megérkezik! model.player.soLDecrease=A Szabaság Fiai mozgalom tagjainak száma a gyarmataidon %newSoL% százalékra csökkent! model.player.soLIncrease=A Szabaság Fiai mozgalom tagjainak száma a gyarmataidon %newSoL% százalékra emelkedett! +# Fuzzy model.player.stance.alliance.declared=Exellenciás uram, a(z) %nation% nép szövetségesünk! model.player.stance.alliance.others=Exellenciás uram, a(z) %attacker% és %defender% népek szövetségben vannak. +# Fuzzy model.player.stance.ceaseFire.declared=Exellenciás uram, a(z) %nation% nép tűzszünetet kötött velünk! model.player.stance.ceaseFire.others=Exellenciás uram, a(z) %attacker% támadók tűszünetet írtak alá a %defender% néppel. +# Fuzzy model.player.stance.peace.declared=Exellenciás uram, a(z) %nation% néppel békében vagyunk! model.player.stance.peace.others=Exellenciás uram, a(z) %attacker% és %defender% népek békét kötöttek egymással. +# Fuzzy model.player.stance.war.declared=Rossz hírem van Exellenciás Uram, a %nation% nemzet hadat üzent nekünk! model.player.stance.war.others=Exellenciás Uram a(z) %attacker% nemzet hadat üzent a %defender% nemzetnek. combat.automaticDefence=A(z) %unit% %colony%i kolóniában fegyvert ragadt otthona védelmében! @@ -1686,6 +1701,7 @@ combat.enemyShipEvaded=A %enemyNation% %enemyUnit% elhárította a(z) %unit% tá combat.enemyShipSunk=A(z) %unit% hajónk elsüllyeszetett egy %enemyNation% %enemyUnit% hajót! combat.equipmentCaptured=Vigyázz, a %nation% indiánok felszerelték magukat ezekkel: %equipment%! combat.goodsStolen=Egy aljas %enemyNation% %enemyUnit% ellopott %amount% egységet a %colony%i %goods% készletből! +# Fuzzy combat.indianPlunder=A(z) %enemyNation% %enemyUnit% %amount% aranypénzt zsákmányolt a %colony%i kolóniától. combat.indianTreasure=%amount% aranyat zsákmányoltál a %settlement% településből. combat.nativeCapitalBurned=Porig égetted a(z) %nation% fővárost, %name%-t. A(z) %nation% nép behódol erődnek! @@ -1738,13 +1754,16 @@ main.defaultPlayerName=Játékos neve main.javaVersion=%minVersion% vagy jobb Java verzió javasolt a FreeCol futtatásához (%version% verziójút találtunk, ennek az ellenőrzésnek a kihagyásához használd a --no-java-check paramétert). main.memory=%memory% bájtnál több memóriát kell hozzárendelned a JVM-hez.\n Indítsd újra a FreeColt ezekkel a paraméterekkel: java -Xmx%minMemory%M -jar FreeCol.jar main.userDir.fail=A FreeCol nem talált megfelelő könyvtárat a felhasználói adatok elmentéséhez. A program folytatódik, de problémákra számíthatsz. +# Fuzzy client.choicePlayer=Válassz ki egy játékost: metaServer.couldNotConnect=Nem tudok csatlakozni a meta-kiszolgálóhoz. Próbáld újra később. metaServer.communicationError=Hibát észleltem a meta-kiszolgálón. Próbáld újra később. abandonEducation.action.studying=tanulással abandonEducation.action.teaching=tanítással +# Fuzzy abandonEducation.no=Nem, folytassa a képzést! abandonEducation.text=Ha a %unit% elhagyja %colony% kolóniáját, felhagy a %action% a(z) %building%ban. Biztos vagy benne, hogy mennie kell? +# Fuzzy abandonEducation.yes=Igen, hagyja el a kolóniát! boycottedGoods.dumpGoods=A tengerbe vele! boycottedGoods.text=Mivel a %goods% kereskedelmét bojkottálta a Korona, ezért nem adható el a(z) %europe%i piacon. Megfizeted a hátralékod (%amount% aranyat) vagy inkább a tengerbe vetteted az árut, ezzel megsemmisítve azt? @@ -1752,8 +1771,11 @@ buy.moreGold=Alacsonyabb árat kérek buy.takeOffer=Elfogadom az ajánlatot buy.text=A %nation% nép szeretne %goods%t eladni neked %gold% aranyért: clearTradeRoute.text=%unit% egysége a(z) %route% útvonalat követi. Az új cél beállítása eltéríti az útvonalról. Biztosan ezt szeretné? +# Fuzzy confirmHostile.alliance=Nem támadhatsz meg egy szövetségest! Valóban felbontod a szövetséget a %nation% nemzettel és hadat üzensz nekik? +# Fuzzy confirmHostile.ceaseFire=A %nation% hadakkal tűzszünetet kötöttél. Biztos hogy támadni akarsz? +# Fuzzy confirmHostile.peace=A %nation% nemzettel jelenleg békében vagyunk. Biztos hogy hadat akarsz üzenni nekik? error.noSuchFile=Ez az állomány nem létezik vagy nem megfelelő az állomány tipusa. # Fuzzy @@ -1804,7 +1826,9 @@ clearSpeciality.areYouSure=Biztosan lefokozod a(z) %oldUnit% egységed %unit% eg clearSpeciality.impossible=%unit% egységedet nem lehet lefokozni! defeated.text=Isten legyen irgalmas, elvesztünk! Mihez kezdjünk most? defeated.yes=Szemlélőként maradok +# Fuzzy diplomacy.offerAccepted=Uram, a %nation% nép elfogadta nagylelkű ajánlatát. +# Fuzzy diplomacy.offerRejected=Uram, a %nation% nép elutasította nagylelkű ajánlatát. disbandUnit.text=Biztosan feloszlatod ezt az egységet? disbandUnit.yes=Oszolj! @@ -1846,7 +1870,9 @@ move.noAccessContact=Excellenciás uram, előbb föl kell vennünk a kapcsolatot move.noAccessGoods=A %nation% nem keresekedik egy üres %unit%-val. move.noAccessSettlement=A(z) %nation% nemzet nem engedi %unit% egységünket a kolóniája területére. move.noAccessSkill=%unit% egységünk nem tanulhat az őslakóktól. +# Fuzzy move.noAccessTrade=Nincs felhatalmazásunk kereskedni más Óvilágiakkal, mint például a %nation% nemzettel. +# Fuzzy move.noAccessWar=Nem kereskedhetünk a %nation% nemzettel háború idején. move.noAccessWater=A(z) %unit% egységnek partra kell szállnia mielőtt beléphet a településre. move.noAttackWater=A(z) %unit% partra kell szálljon, mielőtt támad. @@ -1878,6 +1904,7 @@ server.incompatibleVersions=Sajnos a betöltendő állás nem kompatibilis a Fre server.invalidPlayerNations=Minden játékosnak egyedi nemzetiséget kell választania! server.maximumPlayers=Bocsáss meg de több játékos nem adható a játékhoz. server.missingUserName=A felhasználói név hiányzik a bejelentkezési kérelemből. +# Fuzzy server.noRouteToServer=A kiszolgálót nem lehet nyilvánossá tenni. Állítsd be a tűzfalat, hogy átengedje a csatlakozásokat a megjelölt porthoz. server.notAllReady=Még nem mindenki készült föl a játékra! server.onlyAdminCanLaunch=Bocsáss meg, de csak a kiszolgáló felügyelője indíthatja a játékot. @@ -1949,6 +1976,7 @@ colopedia.unit.offensivePower=Támadó erő: colopedia.unit.price=Óvilági ára: colopedia.unit.productionBonus=Termelési {{plural:%number%|one=módosító|other=módosítók}}: colopedia.unit.requirements=Előfeltételek: +# Fuzzy colopedia.unit.school=Képzéshez szükséges iskola: colopedia.unit.skill=Szakértelem szintje: report.labour.allColonists=Összes telepes @@ -2022,12 +2050,14 @@ report.requirements.surplus=Az alábbi kolóniák termelnek %goods% felesleget: report.trade.afterTaxes=Bevétel adózás után report.trade.beforeTaxes=Bevétel adózás előtt report.trade.cargoUnits=Egységek berakodva +# Fuzzy report.trade.hasCustomHouse=* Ez a kolónia rendelkezik vámházzal; az árukat exportálják. report.trade.totalDelta=Teljes termelés report.trade.totalUnits=Egységek össesen report.trade.unitsSold=Eladott/vett egységek report.turn.filter=Ne mutasd ezt a fajta üzenetet (%type%) report.turn.ignore=Üzenet figyelmen kívül hagyása (Kolónia: %colony%, Javak: %goods%) +# Fuzzy report.turn.playerNation=%player% %nation%(ja)i # Fuzzy aboutPanel.copyright=Copyright © 2002-2014 A FreeCol Csapat @@ -2052,6 +2082,7 @@ chooseFoundingFatherDialog.title=Alapító Atya választása colonyPanel.colonyUnits=Egységek a kolóniában colonyPanel.inPort=A kikötőben colonyPanel.outsideColony=Településen kívül +# Fuzzy colonyPanel.producing=Előállítás alatt: colonyPanel.reducePopulation=Ha %number% alá csökkented a lakosságot, %colony% már nem építhet %buildable%-t. colonyPanel.unitChange=A kolóniádba lépve a(z) %oldType% %newType% lett. @@ -2063,7 +2094,9 @@ colonyPanel.notBestTile=%unit% több %goods% árut termelhetne a %tile% mezőn. confirmDeclarationDialog.areYouSure.no=Inkább később confirmDeclarationDialog.areYouSure.text=Rázzuk le magunkról %monarch% zsarnoki uralmát és kiáltsuk a koronától való függetlenségünket! confirmDeclarationDialog.areYouSure.yes=Szabadság vagy Halál! +# Fuzzy confirmDeclarationDialog.defaultCountry=%nation% Egyesült Államok +# Fuzzy confirmDeclarationDialog.defaultNation=Szabad %nation% confirmDeclarationDialog.enterCountry=Legyen mától fogva államunk neve confirmDeclarationDialog.enterNation=és dicső nemzetségünk minden lakója nevezze magát büszkén diff --git a/data/strings/FreeColMessages_ia.properties b/data/strings/FreeColMessages_ia.properties index 9515f709d..33ea9fb2c 100644 --- a/data/strings/FreeColMessages_ia.properties +++ b/data/strings/FreeColMessages_ia.properties @@ -37,14 +37,13 @@ all=Totes and=e browse=Percurrer cancel=Cancellar +client=Cliente close=Clauder color=Color connect=Connecter -# Fuzzy current=Actual false=False -# Fuzzy -fill=Resultato final +fill=Plenar height=Altitude help=Adjuta high=Alte @@ -55,7 +54,6 @@ low=Basse many=multes medium=Medie more=plus... -# Fuzzy music=Musica name=Nomine no=No @@ -65,21 +63,23 @@ nothing=Nihil ok=OK options=Optiones port=Porta +private=private quit=Quitar reject=Rejectar remove=Remover rename=Renominar reset=Reinitialisar save=Salveguardar -# Fuzzy -server=Nomine del servitor: +select=Seliger +server=Servitor +skip=Saltar small=Parve statistics=Statisticas -# Fuzzy test=Test true=Ver unknown=Incognite unload=Discargar +value=Valor width=Latitude yes=Si abilities=Capacitates @@ -93,21 +93,23 @@ cargoOnCarrier=Cargo in transporto cashInTreasureTrain=Moneta in un traino de tresor clearOrders=Cancellar ordines colonists=Colonos +colonyCenter=centro del colonia difficulty=Difficultate docks=Docks dumpCargo=Discargar cargo +finalResult=Resultato final fortify=Fortificar gold=Auro goldAmount=%amount% {{plural:%amount%|one=auro|other=auro|default=auro}} goods=Benes goToEurope=Ir a Europa goToThisTile=Ir a iste tegula +immigrants=Immigrantes inPort=In porto leaveShip=Quitar nave mission=Mission modifiers=Modificatores nation=Nation -# Fuzzy newWorld=Nove Mundo notApplicable=N/A payArrears=Pagar arretrato @@ -120,6 +122,7 @@ sailingToEurope=Face vela verso Europa sales=Vendita sentry=Sentinella setSail=Prender le vela +settlement=Stabilimento showProductionModifiers=Monstrar modificatores de production skillTaught=Competentia inseniate startGame=Comenciar partita @@ -145,6 +148,7 @@ cli.arg.dimensions=LATITUDExALTITUDE cli.arg.directory=DIRECTORIO cli.arg.europeans=EUROPEOS cli.arg.file=FILE +cli.arg.gui-scale=SCALA cli.arg.locale=REGION cli.arg.loglevel=NIVELLO cli.arg.name=NOMINE @@ -157,6 +161,7 @@ cli.error.clientOptions=Es ignorate le file de optiones de cliente illegibile: % cli.error.debug=Lista de modo de debug (%modes%) expectate. cli.error.difficulties=Nivello de difficultate (%difficulties%) expectate, trovate: %arg% cli.error.europeans=Le numero de nationes europee debe esser al minus %min% +cli.error.gui-scale=Percentage de scala GUI (%scales%) expectate, ma trovate: %arg% cli.error.home.noRead=Non pote leger de %string%. cli.error.home.noWrite=Non pote scriber a %string%. cli.error.home.notDir=%string% non es un directorio. @@ -178,6 +183,8 @@ cli.european-count=definir le numero de nationes active (EUROPEOS colonial) cli.fast=saltar tote le dialogos de configuration cli.font=predefinir le typo de litteras cli.freecol-data=defini le DIRECTORIO de datos de FreeCol (ha un subdirectorio nominate 'base') +cli.full-screen=executar FreeCol in modo plen schermo +cli.gui-scale=scalar elementos GUI, con SCALA optional (%scales%) cli.help=presenta iste texto de adjuta cli.load-savegame=carga un partita salveguardate del FILE cli.log-console=scribe registro in consola e in file @@ -190,8 +197,9 @@ cli.no-memory-check=salta le verification del memoria cli.no-sound=executa FreeCol sin sono cli.private=initia un servitor private (non publicate in le meta-servitor) cli.seed=forni un SEMINE pro le generator de numeros pseudo-aleatori -cli.server-name=specifica un NOMINE personalisate pro le servitor +# Fuzzy cli.server=initia un servitor autonome super le porto specificate +cli.server-name=specifica un NOMINE personalisate pro le servitor cli.splash=monstra le imagine FILE durante le cargamento del partita cli.tc=carga le conversion total con le NOMINE specificate cli.timeout=numero de secundas durante que le servitor attende un responsa a un question @@ -199,8 +207,7 @@ cli.user-cache-directory=definir le DIRECTORY de cache de usator de FreeCol cli.user-config-directory=definir le DIRECTORY de configuration de usator de FreeCol cli.user-data-directory=definir le DIRECTORY de datos de usator de FreeCol cli.version=monstra le numero de version e exi -# Fuzzy -cli.windowed=executa FreeCol in un fenestra in loco del schermo complete +cli.windowed=executa FreeCol in un fenestra, con DIMENSIONES facultative menuBar.colopedia=Colopedia menuBar.game=Joco menuBar.orders=Ordines @@ -244,7 +251,6 @@ changeAction.enterColony.name=Entrar in colonia changeAction.name=Unitate sequente in tegula changeAction.nextUnitOnTile.name=Unitate sequente in tegula changeAction.selectCarrier.name=Selige transportator -# Fuzzy changeWindowedModeAction.name=Modo de schermo complete chatAction.name=Conversar clearForestAction.name=Deforestar @@ -256,7 +262,6 @@ colopediaAction.goods.name=Benes colopediaAction.nations.name=Nationes colopediaAction.nationTypes.name=Avantages national colopediaAction.resources.name=Ressources de bonus -colopediaAction.skills.name=Mestieros colopediaAction.terrain.name=Typos de terreno colopediaAction.units.name=Unitates colopediaAction.name=%object% (Colopedia) @@ -320,8 +325,7 @@ renameAction.name=Renominar reportCargoAction.name=Reporto de cargo reportColonyAction.name=Consiliero colonial reportCongressAction.name=Congresso continental -# Fuzzy -reportEducationAction.name=Education +reportEducationAction.name=Reporto de education reportExplorationAction.name=Reporto de exploration reportForeignAction.name=Consiliero de relationes exterior reportHighScoresAction.name=Scores le plus alte @@ -871,37 +875,28 @@ model.option.unloadOverflowResponse.name=Discargar le surplus model.option.unloadOverflowResponse.shortDescription=Que facer si un deposito es supercargate quando un transportator discarga. clientOptions.mods.name=Modificationes clientOptions.mods.shortDescription=Optiones pro permitter le modification del joco. -# Fuzzy -model.ability.addTaxToBells.name=Adder taxa al production de campanas -# Fuzzy -model.ability.alwaysOfferedPeace.name=Europeos sempre offere pace +model.ability.addTaxToBells.name=Adder taxa sur campanas +model.ability.alwaysOfferedPeace.name=Sempre offerer pace model.ability.ambushBonus.name=Bonus de imboscada model.ability.ambushBonus.shortDescription=Bonus de imboscada quando attaccar unitates in terreno aperte. model.ability.ambushPenalty.name=Penalitate de imboscada model.ability.ambushPenalty.shortDescription=Iste nation suffre un penalitate de imboscada model.ability.autoProduction.name=Production automatic model.ability.autoProduction.shortDescription=Producer benes mesmo si nulle unitates es presente. -# Fuzzy -model.ability.automaticEquipment.name=Unitates se equipa mesme +model.ability.automaticEquipment.name=Autoequipamento model.ability.automaticPromotion.name=Promotion automatic model.ability.avoidExcessProduction.name=Evitar excesso de production model.ability.avoidExcessProduction.shortDescription=Nunquam producer benes in excesso del capacitate de immagazinage. model.ability.betterForeignAffairsReport.name=Reportos de affaires estranier meliorate -# Fuzzy -model.ability.bombard.name=Pote bombardar +model.ability.bombard.name=Bombardar model.ability.bombardShips.name=Bombardar naves model.ability.bombardShips.shortDescription=Bombardar naves inimic super tegulas aquatic adjacente. -# Fuzzy -model.ability.bornInColony.name=Nascite in colonias -# Fuzzy -model.ability.bornInIndianSettlement.name=Nascite in stabilimentos indigena +model.ability.bornInColony.name=Nascite in colonia +model.ability.bornInIndianSettlement.name=Nascite in stabilimento indigena model.ability.build.name=Construction -# Fuzzy -model.ability.build.shortDescription=Le capacitate de construer unitates, equipamento o edificios. -# Fuzzy -model.ability.buildCustomHouse.name=Capacitate de construer doanas -# Fuzzy -model.ability.buildFactory.name=Capacitate de construer fabricas +model.ability.build.shortDescription=Le capacitate de construer unitates, equipamento o edificios, a vices de un typo particular +model.ability.buildCustomHouse.name=Construer doanas +model.ability.buildFactory.name=Construer fabricas model.ability.canBeCaptured.name=Pote esser capturate model.ability.canBeEquipped.name=Pote esser equipate model.ability.canRecruitUnit.name=Recrutar unitates @@ -915,92 +910,62 @@ model.ability.carryGoods.shortDescription=Iste unitate ha le capacitate de trans model.ability.carryTreasure.name=Pote transportar tresor model.ability.carryUnits.name=Transportar unitates model.ability.carryUnits.shortDescription=Iste unitate ha le capacitate de transportar altere unitates. -# Fuzzy -model.ability.customHouseTradesWithForeignCountries.name=Vender a paises estranier via le doana -# Fuzzy -model.ability.demoteOnAllEquipLost.name=Degradate post disfacta -# Fuzzy -model.ability.disposeOnAllEquipLost.name=Non pote esser capturate -# Fuzzy -model.ability.disposeOnCombatLoss.name=Non pote esser capturate +model.ability.customHouseTradesWithForeignCountries.name=Commercio estranier via le doana +model.ability.demoteOnAllEquipLost.name=Degradar post perdita de equipamento +model.ability.disposeOnAllEquipLost.name=Destruer post perdita de equipamento +model.ability.disposeOnCombatLoss.name=Destruer post disfacta in combatto model.ability.dressMissionary.name=Investir missionario model.ability.dressMissionary.shortDescription=Facer un unitate missionario (non experte). model.ability.electFoundingFather.name=Eliger patres fundator model.ability.electFoundingFather.shortDescription=Iste nation ha le possibilitate de eliger su patres fundator model.ability.evadeAttack.name=Evitar attacco model.ability.evadeAttack.shortDescription=Iste unitate ha le capacitate de evitar attaccos. -# Fuzzy -model.ability.expertMissionary.name=Capacitate de functionar qua missionario experte +model.ability.expertMissionary.name=Missionario experte model.ability.expertPioneer.name=Capacitate de functionar qua pionero experte model.ability.expertScout.name=Capacitate de functionar qua explorator experte model.ability.expertSoldier.name=Capacitate de functionar qua soldato experte model.ability.expertsUseConnections.name=Expertos usa connexiones -# Fuzzy -model.ability.expertsUseConnections.shortDescription=Unitates experte acquire materiales crude mesmo si nulle es disponibile. +model.ability.expertsUseConnections.shortDescription=Unitates experte acquire materiales crude mesmo si nulle es disponibile model.ability.export.name=Exportar benes -# Fuzzy -model.ability.export.shortDescription=Pote exportar benes directemente a Europa. +model.ability.export.shortDescription=Pote exportar benes directemente a Europa model.ability.foundColony.name=Fundar colonia -# Fuzzy -model.ability.foundColony.shortDescription=Iste unitate ha le capacitate de fundar un nove colonia. +model.ability.foundColony.shortDescription=Iste unitate ha le capacitate de fundar un nove colonia model.ability.foundInLostCity.name=Trovate in citates perdite model.ability.foundsColonies.name=Fundar colonias model.ability.foundsColonies.shortDescription=Iste nation ha le capacitate de fundar nove colonias. -# Fuzzy model.ability.hasPort.name=Accesso al mar -# Fuzzy model.ability.hasPort.shortDescription=Iste loco ha accesso directe o indirecte al mar model.ability.ignoreEuropeanWars.name=Ignorar guerras europee model.ability.independenceDeclared.name=Declaration de independentia -# Fuzzy model.ability.independenceDeclared.shortDescription=Iste pais ha declarate su independentia -# Fuzzy -model.ability.mercenaryUnit.name=Es un unitate mercenari +model.ability.mercenaryUnit.name=Unitate mercenari model.ability.moveToEurope.name=Viagiar a Europa -# Fuzzy -model.ability.moveToEurope.shortDescription=Iste tegula permitte que unitates viagia a Europa. -# Fuzzy -model.ability.multipleAttacks.name=Ha multiple attaccos +model.ability.moveToEurope.shortDescription=Iste tegula permitte que unitates se displacia a Europa +model.ability.multipleAttacks.name=Multiple attaccos model.ability.native.name=Indigena model.ability.native.shortDescription=Americano native model.ability.navalUnit.name=Unitate naval model.ability.navalUnit.shortDescription=Iste unitate es un unitate naval. -# Fuzzy -model.ability.person.name=Es un persona -# Fuzzy -model.ability.pillageUnprotectedColony.name=Pote piliar colonias non defendite -# Fuzzy -model.ability.piracy.name=Es un unitate pirata -# Fuzzy -model.ability.plunderNatives.name=Bonus de tresor indigena -# Fuzzy -model.ability.plunderNatives.shortDescription=Augmenta le quantitate de butino resultante del destruction de stabilimentos indigena. -# Fuzzy -model.ability.produceInWater.name=Producer super tegulas aquatic -# Fuzzy -model.ability.produceInWater.shortDescription=Unitates pote usar tegulas aquatic assi como tegulas terrestre. -# Fuzzy -model.ability.refUnit.name=Es un unitate del FER +model.ability.person.name=Persona +model.ability.pillageUnprotectedColony.name=Piliage +model.ability.piracy.name=Pirateria +model.ability.plunderNatives.name=Piliar indigenas +model.ability.plunderNatives.shortDescription=Augmenta le quantitate de butino resultante del destruction de stabilimentos indigena +model.ability.produceInWater.name=Producer in aqua +model.ability.produceInWater.shortDescription=Unitates pote usar tegulas aquatic assi como tegulas terrestre +model.ability.refUnit.name=Unitate del FER model.ability.repairUnits.name=Reparar unitates -# Fuzzy -model.ability.repairUnits.shortDescription=Pote reparar certe typos de unitates damnificate. +model.ability.repairUnits.shortDescription=Pote reparar certe typos de unitates damnificate model.ability.royalExpeditionaryForce.name=Fortia expeditionari regal -# Fuzzy -model.ability.royalExpeditionaryForce.shortDescription=Iste nation es un Fortia expeditionari regal +model.ability.royalExpeditionaryForce.shortDescription=Un nation del Fortia Expeditionari Regal model.ability.rumoursAlwaysPositive.name=Rumores es sempre positive -# Fuzzy -model.ability.selectRecruit.name=Capacitate de seliger recrutas -# Fuzzy -model.ability.supportUnit.name=Es un unitate de supporto +model.ability.selectRecruit.name=Seliger recruta +model.ability.supportUnit.name=Unitate de supporto model.ability.teach.name=Inseniar habilitates -# Fuzzy -model.ability.teach.shortDescription=Unitates experte pote inseniar lor habilitates a alteres. -# Fuzzy -model.ability.tradeWithForeignColonies.name=Capacitate de commerciar con colonias estranier -# Fuzzy -model.ability.undead.name=Modo de vindicantia -# Fuzzy -model.ability.undead.shortDescription=In le modo jocator singule, un jocator qui ha perdite pote entrar un modo de vindicantia pro attaccar su inimicos. +model.ability.teach.shortDescription=Unitates experte pote inseniar lor habilitates a alteres +model.ability.tradeWithForeignColonies.name=Commerciar con colonias estranier +model.ability.undead.name=Morto-vivente +model.ability.undead.shortDescription=Un unitate de ultra-tumba model.modifier.bombardBonus.name=Bonus de bombardamento model.modifier.bombardBonus.shortDescription=Le unitates de iste nation se profita de un bonus de bombardamento model.modifier.breedingDivisor.name=Dimension de greges @@ -1327,7 +1292,7 @@ model.improvement.road.description=Cammino/Strata/Via model.improvement.road.name=Cammino model.improvement.road.occupationString=R model.limit.independence.coastalColonies.name=Limite de colonia litoral -model.limit.independence.coastalColonies.description=Tu debe disponer de al minus %limit% colonias litoral pro poter declarar le independentia. +model.limit.independence.coastalColonies.description=Tu debe disponer de al minus %limit% {{plural:%limit%|one=colonia|other=colonias}} litoral pro poter declarar le independentia. model.limit.independence.rebels.name=Limite de rebellos model.limit.independence.rebels.description=Al minus %limit%% de tu colonos debe supportar le independentia. model.limit.independence.year.name=Anno limite @@ -1491,8 +1456,7 @@ model.tile.marsh.description=Turbiera es un typo de terra humide, con graminacea model.tile.mixedForest.name=Foreste mixte model.tile.mixedForest.description=Le forestes mixte, le quales se trova in le latitudes temperate, produce Cereal, Ligno, Pellicia e alcun Coton. Si un foreste mixte es abattite, illo deveni un plana. model.tile.mountains.name=Montanias -# Fuzzy -model.tile.mountains.description=Le montanias se extende supra le terreno circumferente in un area limitate. Le montanias es generalmente plus scarpate que le collinas. Illos es difficile de transversar e colonias non pote esser fundate hic. Nonobstante, le exploitation minerari se prova utile pro le extraction de mineral e argento. +model.tile.mountains.description=Le montanias se extende supra le terreno circumferente in un area limitate. Le montanias es generalmente plus scarpate que le collinas. Illos es difficile de transversar e colonias non pote esser fundate hic. Illos forni un grande bonus defensive ma le fortification non lo augmenta. Le exploitation minerari se prova utile pro le extraction de mineral e argento. model.tile.ocean.name=Oceano model.tile.ocean.description=Le oceanos es vaste extensiones de aqua salate, bon pro le pisca. Le quantitate de pisces es augmentate per le presentia de terra e specialmente per imbuccaturas de fluvios. model.tile.plains.name=Planas @@ -1639,6 +1603,7 @@ model.colony.badGovernment=Le governamento de %colony% es inefficiente. Penalita model.colony.goodGovernment=Le efficientia del governamento se ha meliorate! Le sentimento rebelle in %colony% es ora equal o superior a %number% per cento. model.colony.governmentImproved1=Le governamento de %colony% ha meliorate, ma es ancora inefficiente. Penalitates continua a esser applicate al production. model.colony.governmentImproved2=Le governamento de %colony% ha meliorate. Le penalitates non es plus applicate al production. +# Fuzzy model.colony.insufficientProduction=%outputAmount% plus de %outputType% poterea esser producite in %colony%, si solmente nos habeva %inputAmount% additional %inputType% in surplus. model.colony.lostGoodGovernment=Le efficientia del governamento ha diminuite! Le sentimento rebelle in %colony% non plus es equal o superior a %number% per cento. Le colonia non plus gania un bonus de production. model.colony.lostVeryGoodGovernment=Le efficientia del governamento ha diminuite! Le sentimento rebelle in %colony% non plus es equal o superior a %number% per cento. Alcun bonuses de production ha essite perdite. @@ -1653,12 +1618,17 @@ model.colony.veryBadGovernment=Le governamento de %colony% es multo inefficiente model.colony.veryGoodGovernment=Le efficientia del governamento se ha meliorate! Le sentimento rebelle in %colony% es ora equal o superior a %number% per cento. model.colonyTile.claim=(revindicar %direction%) model.diplomaticTrade.receive.contact=Salutationes fraterne del gloriose nation %nation%. +# Fuzzy model.diplomaticTrade.receive.diplomatic=Que nos negotia con le %nation%. model.diplomaticTrade.receive.trade=Que nos considera le offerta de commercio del %nation%. +# Fuzzy model.diplomaticTrade.receive.tribute=Le %nation% exige un tributo de nos! model.diplomaticTrade.send.contact=Nos ha incontrate membros del nation %nation%. +# Fuzzy model.diplomaticTrade.send.diplomatic=Que nos considera nostre situation diplomatic con le %nation%. +# Fuzzy model.diplomaticTrade.send.trade=Que nos propone un commercio con le %nation% in %settlement%. +# Fuzzy model.diplomaticTrade.send.tribute=Nos exige un tributo del %nation% in %settlement%. model.direction.N.name=nord model.direction.NE.name=nord-est @@ -1669,25 +1639,37 @@ model.direction.SW.name=sud-west model.direction.W.name=west model.direction.NW.name=nord-west model.historyEventType.abandonColony.description=Tu abandona le colonia de %colony%. +# Fuzzy model.historyEventType.ceaseFire.description=Cessa-le-foco signate con %nation%. +# Fuzzy model.historyEventType.cityOfGold.description=Le %nation% discoperi %city%, un del Septe Citates de Auro, e un tresor de %treasure% de auro. +# Fuzzy model.historyEventType.colonyConquered.description=Tu colonia %colony% es conquirite per le %nation%. +# Fuzzy model.historyEventType.colonyDestroyed.description=Tu colonia %colony% es destruite per le %nation%. # Fuzzy model.historyEventType.conquerColony.description=Vos osa acceptar Nostre conditiones generose e totevia evader pagamento? Tal duplicitate recoltara le recompensa amar de Nostre displacer. # Fuzzy model.historyEventType.declareIndependence.description=Tu destrue le stabilimento %settlement% del %nation%. +# Fuzzy model.historyEventType.declareWar.description=Guerra declarate con %nation%. +# Fuzzy model.historyEventType.destroyNation.description=Le %nation% destrue le %nativeNation%. model.historyEventType.discoverNewWorld.description=Tu discoperi le Nove Mundo. +# Fuzzy model.historyEventType.discoverRegion.description=Le %nation% discoperi %region%. +# Fuzzy model.historyEventType.formAlliance.description=Alliantia negotiate con %nation%. model.historyEventType.foundColony.description=Tu funda le colonia de %colony%. model.historyEventType.foundingFather.description=%father% se junge al Congresso Continental. model.historyEventType.independence.description=Tu realisa le independentia del Corona. +# Fuzzy model.historyEventType.makePeace.description=Accordo de pace signate con %nation%. +# Fuzzy model.historyEventType.meetNation.description=Tu incontra le %nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=Le %nation% non plus es presente in le Nove Mundo. +# Fuzzy model.historyEventType.spanishSuccession.description=Le %loserNation% cede tote lor colonias in le Nove Mundo al %nation%. model.indianSettlement.mostHatedNone=Nulle model.indianSettlement.mostHatedUnknown=Incognite @@ -1738,8 +1720,10 @@ model.messageType.warehouseCapacity.name=Capacitate del depositos model.messageType.warning.name=Advertimentos model.monarch.action.addToRef.text=Le Corona ha addite %number% {{plural:%number%|%unit%}} al Fortia Expeditionari Regal. Le governatores colonial exprime lor preoccupation. model.monarch.action.addToRef.no=Finite +# Fuzzy model.monarch.action.declarePeace.text=Nos ha gratiosemente acceptate un tractato de pace con le %nation%. model.monarch.action.declarePeace.no=Facite +# Fuzzy model.monarch.action.declareWar.text=Le insolentia del %nation% Nos constringe a declarar les le guerra! model.monarch.action.declareWar.no=Finite # Fuzzy @@ -1799,6 +1783,7 @@ model.player.colonialIndependence=Solmente jocatores colonial pote declarar inde model.player.forces=Fortias de %nation% model.player.independentMarket=Europa model.player.startGame=Post menses de navigation, tu ha finalmente arrivate al costa de un continente incognite. Naviga {{tag:%direction%|west=verso le west|east=verso le est|default=contra le vento}} pro discoperir le Nove Mundo e reclamar lo pro le Corona. +# Fuzzy model.player.waitingFor=Attendente: %nation% model.regionType.coast.name=Costa model.regionType.coast.unknown=Region costari incognite @@ -1838,6 +1823,7 @@ model.tradeItem.gold.name=Auro model.tradeItem.gold.description=le summa de %amount% de auro model.tradeItem.goods.name=Benes model.tradeItem.incite.name=Declarar le guerra a +# Fuzzy model.tradeItem.incite.description=guerra contra le %nation% model.tradeItem.stance.name=Postura model.tradeItem.unit.name=Unitate @@ -1858,9 +1844,9 @@ model.unit.underRepair=Reparation(%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S +# Fuzzy model.unit.unitState.skipped=W model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G @@ -1901,6 +1887,7 @@ model.colony.warehouseSoonFull=Tu deposito in %colony% excedera tu capacitate pr model.colony.warehouseWaste=Tu deposito in %colony% ha excedite su capacitate de %goods%. %waste% unitates ha essite perdite. model.colony.workersEvicted=A %colony%, vostre colonos non pote plus laborar in %location% a causa del presentia de %enemyUnit%. model.colonyTile.resourceExhausted=Ressource %resource% exhaurite in %colony% +# Fuzzy model.game.spanishSuccession=Vostre Excellentia, le Guerra de Succession Espaniol ha finite in Europa. In le Tractato de Utrecht, le %loserNation% ha essite fortiate a ceder tote le colonias in le Nove Mundo al %nation%! model.indianSettlement.mission.denounced=Tu missionario a %settlement% ha essite denunciate e executate! model.indianSettlement.mission.destroyed=Vostre missionario a %settlement% ha morite in le destruction del stabilimento. @@ -1910,6 +1897,7 @@ model.player.autoRecruit=Tensiones religiose in %europe% incita le %unit% a emig model.player.colonyGoodsParty.harbour=Vostre colonos in %colony% ha jectate %amount% unitates de %goods% in le porto in protesto contra iste injuste taxation per le Corona! model.player.colonyGoodsParty.horses=Tu colonos in %colony% ha liberate %amount% cavallos in protesto contra iste taxation injuste per le Corona! model.player.colonyGoodsParty.landLocked=Vostre colonos in %colony% ha comburite %amount% unitates de %goods% super le placia del mercato in protesto contra iste injuste taxation per le Corona! +# Fuzzy model.player.dead.european=Vostre Excellentia, le %nation% ha declarate un retiro inconditional del affaires del Nove Mundo! model.player.dead.native=Vostre Excellentia, le %nation% ha essite destruite. model.player.disaster.bankruptcy.start=Vos non ha pagate pro le mantenentia de tote le edificios. Sanctiones sever essera imponite al production. @@ -1923,12 +1911,16 @@ model.player.ignoredTax=Le Corona ha augmentate le taxa de imposto a %amount%% c model.player.interventionForceArrives=Le promittite Fortia de Intervention arriva! model.player.soLDecrease=Le adhesion al Filios del Libertate in tu colonias ha diminuite a %newSoL% per cento! model.player.soLIncrease=Le adhesion al Filios del Libertate in tu colonias ha augmentate a %newSoL% per cento! +# Fuzzy model.player.stance.alliance.declared=Vostre Excellentia, le %nation% es in alliantia con nos! model.player.stance.alliance.others=Vostre Excellentia, le %attacker% es in alliantia con le %defender%. +# Fuzzy model.player.stance.ceaseFire.declared=Vostre Excellentia, le %nation% ha acceptate un cessa-le-foco con nos! model.player.stance.ceaseFire.others=Vostre Excellentia, le %attacker% ha acceptate un cessa-le-foco con le %defender%. +# Fuzzy model.player.stance.peace.declared=Vostre Excellentia, le %nation% es in pace con nos! model.player.stance.peace.others=Vostre Excellentia, le %attacker% es in pace con le %defender%. +# Fuzzy model.player.stance.war.declared=Mal novas, Vostre Excellentia, le %nation% nos ha declarate le guerra! model.player.stance.war.others=Vostre Excellentia, le %attacker% ha declarate le guerra al %defender%. combat.automaticDefence=Tu %unit% in %colony% ha prendite le armas pro defender le colonia! @@ -1944,6 +1936,7 @@ combat.enemyShipEvaded=Le %enemyUnit% del %enemyNation% ha evadite un attacco pe combat.enemyShipSunk=%unit% ha affundate un %enemyUnit% del %enemyNation%! combat.equipmentCaptured=Attention, le bravos del %nation% ha acquirite %equipment%! combat.goodsStolen=Un %enemyUnit% del %enemyNation% fura %amount% %goods% in %colony%! +# Fuzzy combat.indianPlunder=Un %enemyUnit% del %enemyNation% rapina %amount% ex %colony%. combat.indianRaid=Nostre spias reporta que le %nation% ha assaltate le colonia %colonyNation% de %colony%. combat.indianSurprise=Le %nation% attacca %colony% per surprisa, alarmante nostre colonos. Le chef del %nation% nega tote responsabilitate. @@ -2000,6 +1993,7 @@ main.javaVersion=Java version %minVersion% o melior es recommendate pro executar main.memory=Es necessari assignar plus de %memory% bytes de memoria pro usar le JVM.\nReinitia FreeCol con: java -Xmx%minMemory%M -jar FreeCol.jar main.userDir.fail=FreeCol non ha trovate directorios apte pro salveguardar le datos de usator. Le programma pote continuar, ma tu debe expectar problemas. client.baseData=Impossibile trovar le directorio de datos %dir%.\n FreeCol non ha potite trovar su files de datos.\n Per favor assecura que illos sia presente.\n Si FreeCol cerca in le mal directorio, alora\n adjunge un parametro al commando de execution:\n --freecol-data +# Fuzzy client.choicePlayer=Selige un jocator: client.classic=Impossibile cargar le mappa de ressources ab le insimul de regulas 'classic'. client.headlessDebug=Le modo sin capite necessita un execution in modo debugging. @@ -2009,8 +2003,10 @@ metaServer.couldNotConnect=Pardono, non poteva connecter al meta-servitor. Per f metaServer.communicationError=Error durante le communication con le meta-servitor. Per favor reproba plus tarde. abandonEducation.action.studying=studio abandonEducation.action.teaching=inseniamento +# Fuzzy abandonEducation.no=No, continua le education abandonEducation.text=Si tu %unit% quita %colony%, le %action% in le %building% essera abandonate. Es tu secur que illo debe quitar? +# Fuzzy abandonEducation.yes=Si, quita le colonia abandonTeaching.text=Si tu %unit% quita le %building% ille cessara de inseniar. Es tu secur que ille debe partir? armedUnitSettlement.attack=Attaccar @@ -2022,9 +2018,13 @@ buy.takeOffer=Acceptar le offerta buy.text=Le %nation% vole vender lor %goods% pro %gold%: clearTradeRoute.text=Tu %unit% es assignate a commerciar in le route %route%. Si tu selige su destination, illo abandonara iste route de commercio. Es tu secur de voler facer isto? client.fullScreen=Le modo de schermo plen non es supportate pro iste dispositivo graphic.\nLe programma retorna al modo de fenestra. +# Fuzzy confirmHostile.alliance=Tu non pote attaccar un nation alliate! Vole tu vermente rumper tu alliantia con le %nation% e declarar le guerra? +# Fuzzy confirmHostile.ceaseFire=Tu ha signate un cessa-le-foco con le %nation%. Vole tu vermente attaccar les? +# Fuzzy confirmHostile.peace=Tu es in pace con le %nation%. Vole tu vermente declarar le guerra? +# Fuzzy confirmTribute.broke=Nostre spias reporta que le %nation% es completemente sin moneta. Que nos non perde nostre tempore con demandas de tributo. confirmTribute.european=Le %nation% %danger% e %finance%. Quante tributo debe nos exiger de illes? confirmTribute.happy=Le %nation% a %settlement% es bon amicos a nos; il esserea regrettabile damnificar nostre cameraderia. @@ -2092,7 +2092,9 @@ defeated.text=Tu ha essite vincite! Vole tu: defeated.yes=Restar e mirar defeatedSinglePlayer.text=Tu ha essite vincite!\n\nNunc es le tempore del nocte obscur, quando le cemeterios oscita e le inferno ipse suffla le contagion super le mundo, ora pote io biber sanguine calide! e facer tal affaires amar, que le die tremerea de vider. defeatedSinglePlayer.yes=Entrar in modo de vindicantia +# Fuzzy diplomacy.offerAccepted=Le %nation% ha acceptate tu offerta generose. +# Fuzzy diplomacy.offerRejected=Le %nation% ha rejectate tu offerta generose. disbandUnit.text=Es tu secur de voler dissolver iste unitate? disbandUnit.yes=Dissolver @@ -2137,7 +2139,9 @@ move.noAccessContact=Nos debe establir contacto con le %nation% primo, Vostre Ex move.noAccessGoods=Le %nation% non commerciara con un %unit% vacue. move.noAccessSettlement=Le %nation% non permitte a nostre %unit% de entrar in lor stabilimento. move.noAccessSkill=Nostre %unit% non pote apprender del indigenas. +# Fuzzy move.noAccessTrade=Nos non ha le autoritate pro commerciar con altere nationes europee como le %nation%. +# Fuzzy move.noAccessWar=Nos non pote commerciar con le %nation% durante le guerra. move.noAccessWater=Nostre %unit% debe abbordar ante de entrar in le stabilimento. move.noAttackWater=Nostre %unit% debe atterrar ante de attaccar. @@ -2191,6 +2195,7 @@ server.invalidPlayerNations=Tote le jocatores debe seliger un nation unic ante q server.maximumPlayers=Pardono, le numero maxime de jocatores ha essite attingite. server.missingUserName=Le nomine de usator manca in le requesta de apertura de session. server.missingVersion=Le version de FreeCol manca in le requesta de apertura de session. +# Fuzzy server.noRouteToServer=Le servitor non pote esser rendite public. Tu debe modificar le configuration de tu firewall pro permitter le connexiones al porto specificate. server.notAllReady=Non tote le jocatores es preste a comenciar le partita! server.onlyAdminCanLaunch=Pardono, solmente le administrator del servitor pote lancear le partita. @@ -2199,6 +2204,7 @@ server.timeOut=Tempore limite excedite pro tentar connecter al servitor. server.userNameInUse=Le nomine de usator specificate es jam in uso. server.userNameNotPresent=Le nomine de usator specificate non es in iste joco. server.wrongFreeColVersion=Le versiones del cliente e del servitor de FreeCol non corresponde. +# Fuzzy buildColony.others=Le %nation% ha fundate le nove colonia %colony% in %region%. cashInTreasureTrain.colonial=Un tresor de %amount% de auro ha arrivate in Europa. %cashInAmount% de auro ha essite incassate. cashInTreasureTrain.independent=Un tresor de %amount% ha essite addite al tresoreria national. @@ -2302,6 +2308,7 @@ colopedia.unit.offensivePower=Poter offensive: colopedia.unit.price=Precio in Europa: colopedia.unit.productionBonus={{plural:%number%|one=Modificator|other=Modificatores}} de production: colopedia.unit.requirements=Requisitos: +# Fuzzy colopedia.unit.school=Schola necessari pro formation: colopedia.unit.skill=Competentia: report.labour.allColonists=Tote le colonos @@ -2337,8 +2344,8 @@ report.colony.growing.description=%colony% pote crescer de {{plural:%amount%|one # Fuzzy report.colony.improve.description=Unitates que poterea meliorar le production respectivemente al unitate que actualmente exeque le carga report.colony.improve.header=Meliorar +# Fuzzy report.colony.improving.description=%colony%: Pro facer %amount% plus %goods%, reimplacia %oldUnit% per %unit% -report.colony.wanting.description=%colony%: Pro facer %amount% plus %goods%, adde %unit% report.colony.making.blocking.description=%colony%: %amount% %goods% necessari pro %buildable% {{plural:%turns%|one=proxime torno|other=in %turns% tornos}} report.colony.making.constructing.description=%colony%: %buildable% se completa {{plural:%turns%|one=le proxime torno|other=in %turns% tornos}} report.colony.making.description=Lo que iste colonia actualmente produce @@ -2348,21 +2355,22 @@ report.colony.making.noconstruction.description=%colony%: Nulle construction in report.colony.making.noteach.description=%colony%: %teacher% non ha studentes report.colony.name.description=Le lista de colonias report.colony.name.header=Colonia -report.colony.plow.description=Numero de tegulas colonial que beneficiarea de Arar -report.colony.plow.header=A -report.colony.plowing.description=%colony% beneficiarea de arar {{plural:%amount%|one=1 tegula|other=%amount% tegulas}} +# Fuzzy report.colony.production.description=%colony%: production nette de %goods% = %amount% +# Fuzzy report.colony.production.export.description=%colony%: production nette de %goods% is %amount% (exportation si plus de %export%) report.colony.production.header=Production nette de %goods% +# Fuzzy report.colony.production.high.description=%colony%: production nette de %goods% = %amount%, plen {{plural:%turns%|one=le proxime torno|other=in %turns% tornos}} +# Fuzzy report.colony.production.low.description=%colony%: production nette de %goods% = %amount%, exhaurite {{plural:%turns%|one=le proxime torno|other=in %turns% tornos}} +# Fuzzy report.colony.production.waste.description=%colony%: production nette de %goods% = %amount%, le magazin disbordara, %waste% essera dissipate -report.colony.road.description=Numero de tegulas colonial que beneficiarea del construction de Camminos -report.colony.road.header=C -report.colony.roadBuilding.description=%colony% beneficiarea de construer {{plural:%amount%|one=1 cammino|other=%amount% camminos}} report.colony.shrinking.description=%colony% debe discrescer de {{plural:%amount%|one=1 unitate|other=%amount% unitates}} pro meliorar le production report.colony.starving.description=%colony%: fame {{plural:%turns%|one=le proxime torno|other=in %turns% tornos}} # Fuzzy +report.colony.wanting.description=%colony%: Pro facer %amount% plus %goods%, adde %unit% +# Fuzzy report.continentalCongress.elected=Eligite: report.continentalCongress.none=(nulle) report.continentalCongress.recruiting=Recrutamento @@ -2404,26 +2412,25 @@ report.production.selectGoods=Selige benes report.production.update=Actualisar report.requirements.badAssignment=%colony% ha un %expert% qui labora actualmente como %expertWork%, durante que un %nonExpert% labora como %nonExpertWork%. Le production augmentarea si le colonos excambiarea lor empleos. report.requirements.canTrainExperts={{plural:2|%unit%}} pote esser trainate a -report.requirements.clearTile=%type% al %direction% de %colony% beneficiarea de vacuation. +# Fuzzy report.requirements.exploreTile=%type% al %direction% de %colony% beneficiarea de exploration. report.requirements.met=Tote le requisitos es satisfacite. report.requirements.missingGoods=%colony% produce %goods%, ma require plus %input%. report.requirements.misusedExperts=Il ha {{plural:2|%unit%}} non laborante como %work% presente a report.requirements.noExpert=%colony% produce %goods%, ma non ha %unit%. -report.requirements.plowCenter=%colony% beneficiarea de arar su tegula. -report.requirements.plowTile=%type% al %direction% de %colony% beneficiarea de arar. -report.requirements.roadTile=%type% al %direction% de %colony% beneficiarea del construction de camminos. report.requirements.severalExperts=Plure {{plural:2|%unit%}} es presente a report.requirements.surplus=Un surplus de %goods% es producite a report.trade.afterTaxes=Receptas post taxas report.trade.beforeTaxes=Receptas ante taxas report.trade.cargoUnits=Unitates in cargo +# Fuzzy report.trade.hasCustomHouse=* Iste colono ha un officio de doana; iste benes es exportate. report.trade.totalDelta=Total de production report.trade.totalUnits=Total de unitates report.trade.unitsSold=Unitates acquirite o vendite report.turn.filter=Non monstrar iste typo de message (%type%) report.turn.ignore=Ignorar iste message (Colonia: %colony%, Benes: %goods%) +# Fuzzy report.turn.playerNation=%nation% de %player% # Fuzzy aboutPanel.copyright=Copyright © 2002-2013 Le equipa de FreeCol @@ -2449,6 +2456,7 @@ chooseFoundingFatherDialog.title=Nominar patre fundator colonyPanel.colonyUnits=Unitates del colonia colonyPanel.inPort=In porto colonyPanel.outsideColony=Foras del colonia +# Fuzzy colonyPanel.producing=Produce: colonyPanel.reducePopulation=Si tu reduce le population a sub %number%, %colony% non potera plus construer %buildable%. colonyPanel.unitChange=Al entrar in tu colonia, tu %oldType% ha devenite un %newType%. @@ -2461,7 +2469,9 @@ confirmDeclarationDialog.areYouSure.no=Forsan plus tarde confirmDeclarationDialog.areYouSure.text=Que nos renuncia al tyrannia injuste de %monarch% e declara le independentia de nostre colonias del corona! confirmDeclarationDialog.areYouSure.yes=Libertate o morte! confirmDeclarationDialog.createFlag=e nostre inimicos tremera al vista de nostre bandiera defiante. +# Fuzzy confirmDeclarationDialog.defaultCountry=Statos Unite de %nation% +# Fuzzy confirmDeclarationDialog.defaultNation=%nation% libere confirmDeclarationDialog.enterCountry=Ab nunc, nostre pais se appellara confirmDeclarationDialog.enterNation=e omne citatano de nostre gloriose nation essera fer de esser cognoscite como @@ -2512,8 +2522,10 @@ negotiationDialog.add=Adder negotiationDialog.cancel=Cancellar negotiationDialog.clear=Vacuar negotiationDialog.contact.tutorial=Tu incontra co-europeos. Illes competera con te pro terra e ricchessas, e pote mesmo facer le guerra contra te. Ma post que Jan de Witt ha devenite membro del Congresso Continental, tu potera commerciar con illes. +# Fuzzy negotiationDialog.demand=Le %nation% exige del %otherNation% negotiationDialog.exchange=in excambio de +# Fuzzy negotiationDialog.offer=Le %nation% offere al %otherNation% negotiationDialog.send=Inviar negotiationDialog.title.contact=Incontra altere europeos @@ -2536,10 +2548,9 @@ findSettlementPanel.displayAll=Cercar tote le stabilimentos findSettlementPanel.displayOnlyEuropean=Cercar solmente stabilimentos europee findSettlementPanel.displayOnlyNatives=Cercar solmente stabilimentos indigena findSettlementPanel.name=Cercar stabilimento +# Fuzzy firstContactDialog.meeting.natives=Incontro con le indigenas... firstContactDialog.meeting.natives.tutorial=Tu incontra indigenas. Invia tu Exploratores a lor stabilimentos pro discoperir plus super illes, e tu Servos a Contracto e Colonos Libere pro apprender de illes. Invia tu naves e caravanas a lor stabilimentos si tu vole commerciar con illes. -firstContactDialog.meeting.AZTEC=Le nation Aztec... -firstContactDialog.meeting.INCA=Le imperio Inca... firstContactDialog.welcomeOffer.text=Le %nation% te saluta. Nos es un gloriose nation de %camps% %settlementType%. Pro celebrar nostre amicitate, nos te offere generosemente in dono le terra que tu ora occupa. Vole tu acceptar nostre tractato e viver con nos in pace como fratres? firstContactDialog.welcomeSimple.text=Le %nation% te saluta. Nos es un gloriose nation de %camps% %settlementType%. Vole tu acceptar nostre tractato e viver con nos in pace como fratres? abandonColony.no=Cancellar diff --git a/data/strings/FreeColMessages_it_IT.properties b/data/strings/FreeColMessages_it_IT.properties index 9ce542837..6aca2a269 100644 --- a/data/strings/FreeColMessages_it_IT.properties +++ b/data/strings/FreeColMessages_it_IT.properties @@ -5,6 +5,7 @@ # Author: Beta16 # Author: BrokenArrow # Author: David Güdel +# Author: F. Cosoleto # Author: Federico Mugnaini # Author: Fringio # Author: Gianfranco @@ -208,8 +209,9 @@ cli.no-memory-check=ignora il controllo della memoria cli.no-sound=esegue FreeCol senza suono cli.private=avvia un server privato (non pubblicato sul metaserver) cli.seed=fornire un SEME per il generatore di numeri pseudo-casuale -cli.server-name=specifica un NOME personalizzato per il server +# Fuzzy cli.server=avvia un server indipendente sulla porta specificata +cli.server-name=specifica un NOME personalizzato per il server cli.splash=mostra l'immagine FILE come splash screen mentre parte il gioco cli.tc=carica la 'conversione totale' identificata da NOME cli.timeout=numero di secondi che il server aspetta per una risposta ad una richiesta @@ -272,7 +274,6 @@ colopediaAction.goods.name=Beni colopediaAction.nations.name=Nazioni colopediaAction.nationTypes.name=Vantaggi Nazionali colopediaAction.resources.name=Risorse Bonus -colopediaAction.skills.name=Abilità colopediaAction.terrain.name=Tipo di terreno colopediaAction.units.name=Unità colopediaAction.name=%object% (Colopedia) @@ -1301,6 +1302,7 @@ model.improvement.road.description=Strada model.improvement.road.name=Strada model.improvement.road.occupationString=R model.limit.independence.coastalColonies.name=Limite della Colonia Costiera +# Fuzzy model.limit.independence.coastalColonies.description=Hai bisogno di almeno %limit% colonie costiere per dichiarare l'indipendenza. model.limit.independence.rebels.name=Limite Ribelli model.limit.independence.rebels.description=Almeno %limit% dei tuoi coloni devono appoggiare l'indipendenza. @@ -1634,6 +1636,7 @@ model.colony.badGovernment=Il governo di %colony% è inefficiente. Verranno appl model.colony.goodGovernment=L'efficienza del Governo è migliorata! Il sentimento di ribellione in %colony% adesso supera il %number% per cento. model.colony.governmentImproved1=Il governo di %colony% è migliorato, ma è ancora inefficiente. Le penalità di produzione rimangono applicate. model.colony.governmentImproved2=Il governo di %colony% è migliorato. Le penalità di produzione cessano di essere applicate. +# Fuzzy model.colony.insufficientProduction=Nella colonia di %colony% potrebbero essere prodotte altre %outputAmount% unità di %outputType%, se disponessimo di %inputAmount% unità di %inputType% in più per turno. model.colony.lostGoodGovernment=L'efficienza del governo è diminuita! Il sentimento di ribellione in %colony% è ora al di sotto del %number% per cento. La colonia non guadagnerà più i bonus di produzione. model.colony.lostVeryGoodGovernment=L'efficienza del governo è diminuita! Il sentimento di ribellione in %colony% non è più pari o superiore al %number% per cento. Alcuni bonus di produzione sono andati perduti. @@ -1651,20 +1654,27 @@ model.direction.SW.name=sud-ovest model.direction.W.name=ovest model.direction.NW.name=nord-ovest model.historyEventType.abandonColony.description=Hai abbandonato la colonia di %colony%. +# Fuzzy model.historyEventType.cityOfGold.description=%nation% ha scoperto %city%, una delle Sette Città dell'Oro, e un tesoro di %treasure% unità d'oro. +# Fuzzy model.historyEventType.colonyConquered.description=La tua colonia di %colony% è stata conquistata dal giocatore %nation%. +# Fuzzy model.historyEventType.colonyDestroyed.description=La tua colonia di %colony% è stata distrutta dal giocatore %nation%. # Fuzzy model.historyEventType.conquerColony.description=Stai conquistando la colonia %nazione% di %colonia%. model.historyEventType.declareIndependence.description=Stai dichiarando l'indipendenza dalla Corona. +# Fuzzy model.historyEventType.destroyNation.description=La %nation% ha distrutto la %nativeNation%. model.historyEventType.discoverNewWorld.description=Hai scoperto il Nuovo Mondo. +# Fuzzy model.historyEventType.discoverRegion.description=%nation% ha scoperto %region%. model.historyEventType.foundColony.description=Hai fondato la colonia di %colony%. model.historyEventType.foundingFather.description=%father% si è unito al Congresso Continentale. model.historyEventType.independence.description=Hai ottenuto l'indipendenza dalla Corona. model.historyEventType.meetNation.description=Hai incontrato il popolo %nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=Il contingente %nation% non è più presente nel Nuovo Mondo. +# Fuzzy model.historyEventType.spanishSuccession.description=Il contingente %loserNation% cede tutte le sue colonie nel Nuovo Mondo al contingente %nation%. model.indianSettlement.mostHatedNone=Nessuno model.indianSettlement.mostHatedUnknown=Sconosciuta @@ -1717,8 +1727,10 @@ model.messageType.warehouseCapacity.name=Capacità Deposito model.messageType.warning.name=Avvisi model.monarch.action.addToRef.text=La Corona ha aggiunto %number% {{plural:%number%|%unit%}} al Corpo di Spedizione Reale. I Governatori delle colonie esprimono preoccupazione. model.monarch.action.addToRef.no=Fatto +# Fuzzy model.monarch.action.declarePeace.text=Abbiamo benignamente acconsentito ad un trattato di pace con %nation%. model.monarch.action.declarePeace.no=Fatto +# Fuzzy model.monarch.action.declareWar.text=L'insolenza del governo %nation% Ci costringe a dichiarargli guerra! # Fuzzy model.monarch.action.declareWarSupported.text=L'insolenza delle forse della %nazione% Ci costringe a dichiarare loro guerra! Per accelerare questa vicenda, le nostre fedeli truppe (%forza%) aspettano i tuoi ordini, e un'ulteriore somma di di %oro% è stata aggiunto al tuo tesoro. @@ -1775,6 +1787,7 @@ model.noClaimReason.worked.description=Un altro insediamento sta già utilizzand model.player.forces=Esercito %nation% model.player.independentMarket=Europa model.player.startGame=Dopo mesi di navigazione, finalmente hai avvistato la costa di un continente sconosciuto. Veleggia {{tag:%direction%|west=verso Ovest|east=verso Est|default=nel vento}} per scoprire il Nuovo Mondo, e reclamarlo in nome della Corona. +# Fuzzy model.player.waitingFor=In attesa del giocatore %nation% model.regionType.coast.name=Costa model.regionType.coast.unknown=Regione Costiera Sconosciuta @@ -1833,10 +1846,9 @@ model.unit.underRepair=Riparazione(%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S -model.unit.unitState.skipped=W +model.unit.unitState.skipped=X model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G model.noAddReason.alreadyPresent.description=Già presente in questa posizione. @@ -1873,6 +1885,7 @@ model.colony.warehouseOverfull=Il nostro deposito di %colony% ha raggiunto la su model.colony.warehouseSoonFull=Il nostro deposito di %colony% supererà la sua quota massima di %goods% durante il prossimo turno. %amount% unità di %goods% andranno sprecate. model.colony.warehouseWaste=Il nostro deposito di %colony% ha superato la sua quota massima di %goods%. Sprecate %waste% unità. model.colonyTile.resourceExhausted=Nella colonia di %colony% la risorsa %resource% è esaurita +# Fuzzy model.game.spanishSuccession=Eccellenza, in Europa la Guerra di Successione Spagnola è terminata. Per il trattato di Utrecht, lo stato %loserNation% è costretto a cedere tutte le sue colonie nel Nuovo Mondo al contingente %nation%! model.indianSettlement.mission.denounced=Il tuo missionario di %settlement% è stato accusato e giustiziato! model.indianSettlement.mission.destroyed=Il missionario a %settlement% è morto nella distruzione dell'insediamento. @@ -1880,6 +1893,7 @@ model.player.autoRecruit=Tensioni religiose in %europe% richiedono a %unit% di e model.player.colonyGoodsParty.harbour=I tuoi coloni di %colony% hanno gettato %amount% unità di %goods% nella baia in segno di protesta contro questa ingiusta tassazione da parte della Corona! model.player.colonyGoodsParty.horses=I coloni di %colony% hanno liberato %amount% cavalli in segno di protesta contro questa ingiusta tassazione da parte della Corona! model.player.colonyGoodsParty.landLocked=I vostri coloni di %colony% hanno bruciato %amount% unità di %goods% sulla piazza del mercato in segno di protesta contro questa ingiusta tassazione da parte della Corona! +# Fuzzy model.player.dead.european=Eccellenza, il governo %nation% ha dichiarato un ritiro incondizionato dal Nuovo Mondo! model.player.dead.native=Eccellenza, il popolo %nation% è stato sterminato. model.player.disaster.bankruptcy.start=Non siete riusciti a pagare per la manutenzione di tutti gli edifici. Saranno applicate sanzioni severe alla produzione. @@ -1891,12 +1905,16 @@ model.player.foundingFatherJoinedCongress=%foundingFather% si è unito al Congre model.player.interventionForceArrives=Le forze d'intervento promesse stanno arrivando! model.player.soLDecrease=Le adesioni ai Patrioti nelle tue colonie sono scese al %newSoL% per cento! model.player.soLIncrease=Le adesioni ai Patrioti nelle tue colonie sono salite al %newSoL% per cento! +# Fuzzy model.player.stance.alliance.declared=Eccellenza, il Governo %nation% è nostro alleato! model.player.stance.alliance.others=Eccellenza, il Governo %attacker% è alleato del Governo %defender%. +# Fuzzy model.player.stance.ceaseFire.declared=Eccellenza, il Governo %nation% ha siglato un "cessate il fuoco" con noi! model.player.stance.ceaseFire.others=Eccellenza, il Governo %attacker% ha siglato un "cessate il fuoco" col Governo %defender%. +# Fuzzy model.player.stance.peace.declared=Eccellenza, il Governo %nation% è in pace con noi! model.player.stance.peace.others=Eccellenza, il Governo %attacker% è in pace col Governo %defender%. +# Fuzzy model.player.stance.war.declared=Cattive notizie, Eccellenza, il Governo %nation% ci ha dichiarato guerra! model.player.stance.war.others=Eccellenza, il Governo %attacker% ha dichiarato guerra al Governo %defender%. combat.automaticDefence=Un tuo %unit% di %colony% ha imbracciato le armi per difendere la colonia! @@ -1912,6 +1930,7 @@ combat.enemyShipEvaded=%enemyUnit% %enemyNation% riesce a sfuggire a un attacco combat.enemyShipSunk=%unit% ha affondato %enemyUnit% %enemyNation%! combat.equipmentCaptured=Attenzione, i guerrieri %nation% ora dispongono di %equipment%! combat.goodsStolen=%enemyUnit% %enemyNation% ruba %amount% unità di %goods% alla colonia di %colony%! +# Fuzzy combat.indianPlunder=%enemyUnit% %enemyNation% rapina %amount% pezzi d'oro dalla colonia di %colony%! combat.indianRaid=Le nostre spie riportano chela nazione %nation% ha assaltato la %colony% della nazione %colonyNation%. combat.indianSurprise=La nazione %nation% ha assaltato a sorpresa la colonia di %colony%, allarmando i coloni. Il capo %nation% nega ogni coinvolgimento. @@ -1963,14 +1982,17 @@ error.couldNotLoad=Si è verificato un errore durante il caricamento della parti error.couldNotSave=Si è verificato un errore durante il salvataggio della partita nel file %name%! main.defaultPlayerName=Nome del Giocatore main.userDir.fail=FreeCol non riesce a trovare una directory idonea per salvarci dentro i dati utente. Si può procedere, ma ci sono da attendersi problemi. +# Fuzzy client.choicePlayer=Scegli un giocatore: client.classic=Impossibile caricare la mappatura delle risorse dal set di regole 'classic'. metaServer.couldNotConnect=Spiacente, impossibile connettersi al meta-server. Riprovare più tardi. metaServer.communicationError=Errore di comunicazione col meta-server. Riprovare più tardi. abandonEducation.action.studying=studiando abandonEducation.action.teaching=insegnando +# Fuzzy abandonEducation.no=No, continua la formazione abandonEducation.text=Se la tua %unit% lascia %colony% cesserà l' %action% nella %building%, sei sicuro di voler abbandonare? +# Fuzzy abandonEducation.yes=Sì, lascia la colonia armedUnitSettlement.attack=Attacca armedUnitSettlement.tribute=Chiedi un tributo @@ -1981,8 +2003,11 @@ buy.takeOffer=Accetta l'offerta buy.text=Il presidio %nation% vorrebbe vendere %goods% per %gold% unità d'oro: clearTradeRoute.text=%unit% percorre la rotta commerciale %route%. Modificare la sua destinazione comporta l'esclusione dalla rotta commerciale. Sei sicuro di voler fare questo? client.fullScreen=La modalità a schermo intero non è supportata per questa scheda grafica.\nRipristino della modalità finestra. +# Fuzzy confirmHostile.alliance=Non puoi attaccare una Nazione alleata! Davvero vuoi rompere la tua alleanza col governo %nation% e dichiarare guerra? +# Fuzzy confirmHostile.ceaseFire=Abbiamo firmato un Cessate il Fuoco con il Governo %nation%. Davvero dobbiamo attaccare? +# Fuzzy confirmHostile.peace=Sei in pace col governo %nation%. Davvero vuoi dichiarare guerra? danger.low=non sono una minaccia per noi error.noSuchFile=Il file specificato non esiste o non è quello corretto. @@ -2037,7 +2062,9 @@ defeated.text=Sei stato sconfitto! Vuoi: defeated.yes=Rimanere e guardare defeatedSinglePlayer.text=Sei stato sconfitto!\n\nQuesta è l'ora più malefica della notte, quando i cimiteri sbadigliano e l'inferno stesso alita il suo contagio nel mondo... Ora potrei bere sangue ancora caldo, e fare cose che il giorno tremerebbe nel vedere. defeatedSinglePlayer.yes=Entra in modalità vendetta +# Fuzzy diplomacy.offerAccepted=Il contingente %nation% ha accettato la tua generosa offerta. +# Fuzzy diplomacy.offerRejected=Il contingente %nation% ha rifiutato la tua generosa offerta. disbandUnit.text=Sei sicuro di voler eliminare/smantellare questa unità? disbandUnit.yes=Elimina @@ -2081,7 +2108,9 @@ move.noAccessContact=Dobbiamo prima stabilire un contatto con il governo %nation move.noAccessGoods=%nation% non commercerà con una %unit% vuota. move.noAccessSettlement=Il governo %nation% non permette al nostro %unit% di accedere al loro insediamento. move.noAccessSkill=Il nostro %unit% non può imparare dai nativi. +# Fuzzy move.noAccessTrade=Non abbiamo l'autorizzazione per commerciare con altre nazioni europee, come il governo %nation%. +# Fuzzy move.noAccessWar=Non possiamo commerciare con il governo %nation% mentre siamo in guerra. move.noAccessWater=Il nostro %unit% deve sbarcare prima di accedere all'insediamento. move.noAttackWater=La nostra %unit% deve sbarcare prima di attaccare. @@ -2126,6 +2155,7 @@ server.invalidPlayerNations=Tutti i giocatori devono scegliere una nazione diffe server.maximumPlayers=Spiacente, è stato raggiunto il numero massimo di giocatori. server.missingUserName=Il nome utente non è presente nella richiesta di accesso. server.missingVersion=La versione FreeCol manca nella richiesta di accesso. +# Fuzzy server.noRouteToServer=Il server non può essere reso pubblico. Dovresti modificare le impostazioni del tuo firewall per consentire connessioni alla porta che hai specificato. server.notAllReady=Non tutti i giocatori sono pronti per iniziare la partita! server.onlyAdminCanLaunch=Spiacente, solo l'amministratore del server può lanciare la partita. @@ -2238,6 +2268,7 @@ colopedia.unit.offensivePower=Potenza offensiva: colopedia.unit.price=Prezzo in Europa: colopedia.unit.productionBonus={{plural:%number%|one=modificatore|other=modificatori}} di produzione: colopedia.unit.requirements=Requisiti: +# Fuzzy colopedia.unit.school=Si addestra in: colopedia.unit.skill=Abilità: report.labour.allColonists=Tutti i Coloni @@ -2272,8 +2303,8 @@ report.colony.grow.header=+ report.colony.growing.description=%colony% può crescere di {{plural:%amount%|one=una unità|other=%amount% unità}} senza nuocere alla produzione report.colony.improve.description=Unità che potrebbero migliorare la produzione. report.colony.improve.header=Miglioramento +# Fuzzy report.colony.improving.description=%colony%: per produrre %amount% %goods% in più, sostituire %oldUnit% con %unit% -report.colony.wanting.description=%colony%: per produrre %amount% %goods% in più, aggiungi %unit% report.colony.making.blocking.description=%colony%: %amount% %goods% necessari per %buildable% {{plural:%turns%|one=il prossimo turno|other=fra %turns% turni}} report.colony.making.constructing.description=%colony%: %buildable% verrà completato {{plural:%turns%|one=il prossimo turno|other=fra %turns% turni}} report.colony.making.description=Cosa sta facendo questa colonia @@ -2283,20 +2314,22 @@ report.colony.making.noconstruction.description=%colony%: Nessuna costruzione in report.colony.making.noteach.description=%colony%: %teacher% non ha allievi report.colony.name.description=Elenco delle colonie report.colony.name.header=Colonia -report.colony.plow.description=Numero di caselle della colonia che avrebbero benefici dall'aratura -report.colony.plow.header=P -report.colony.plowing.description=%colony% avrebbe benefici dall'aratura di {{plural:%amount%|one=una casella|other=%amount% caselle}} +# Fuzzy report.colony.production.description=%colony%: Produzione netta di %goods% = %amount% +# Fuzzy report.colony.production.export.description=%colony%: la produzione netta di %goods% è %amount% (verranno esportati oltre %export%) report.colony.production.header=Produzione netta di %goods% +# Fuzzy report.colony.production.high.description=%colony%: produzione netta di %goods% = %amount%, pieno {{plural:%turns%|one=il prossimo turno|other=fra %turns% turni}} +# Fuzzy report.colony.production.low.description=%colony%: produzione netta di %goods% = %amount%, terminati {{plural:%turns%|one=il prossimo turno|other=fra %turns% turni}} +# Fuzzy report.colony.production.waste.description=%colony%: produzione netta di %goods% = %amount%, il deposito sarà pieno, %waste% verranno sprecati. -report.colony.road.description=Numero di caselle della colonia che avrebbero benefici dalla costruzione di una strada -report.colony.road.header=R -report.colony.roadBuilding.description=%colony% avrebbe benefici dalla costruzione di {{plural:%amount%|one=una strada|other=%amount% strade}} +report.colony.tile.plow.header=P report.colony.shrinking.description=%colony% deve diminuire di {{plural:%amount%|one=una unità|other=%amount% unità}} per migliorare la produzione report.colony.starving.description=%colony%: morte di fame {{plural:%turns%|one=il prossimo turno|other=fra %turns% turni}} +# Fuzzy +report.colony.wanting.description=%colony%: per produrre %amount% %goods% in più, aggiungi %unit% report.continentalCongress.available=Disponibile # Fuzzy report.continentalCongress.elected=Eletto: @@ -2340,26 +2373,25 @@ report.production.selectGoods=Scegli le merci report.production.update=Aggiorna report.requirements.badAssignment=%colony% dispone di un %expert% che attualmente lavora come %expertWork%, mentre un %nonExpert% sta lavorando come %nonExpertWork%. La produzione sarebbe maggiore se i posti di lavoro venissero scambiati. report.requirements.canTrainExperts={{plural:2|%unit%}} possono essere addestrate a -report.requirements.clearTile=%type% in direzione %direction% rispetto alla colonia di %colony% riceverebbe benefici dalla pulitura. +# Fuzzy report.requirements.exploreTile=%type% in direzione %direction% rispetto alla colonia di %colony% riceverebbe benefici dall'esplorazione. report.requirements.met=Tutti i requisiti sono soddisfatti. report.requirements.missingGoods=%colony% sta producendo %goods%, ma ha bisogno di più %input%. report.requirements.misusedExperts=Ci sono {{plural:2|%unit%}} che non lavorano come %work% si trovano a report.requirements.noExpert=%colony% sta producendo %goods%, ma non ha alcun %unit%. -report.requirements.plowCenter=%colony% riceverebbe benefici dall'aratura della propria casella. -report.requirements.plowTile=%type% in direzione %direction% rispetto alla colonia di %colony% riceverebbe benefici dall'aratura. -report.requirements.roadTile=%type% in direzione %direction% rispetto alla colonia di %colony% riceverebbe benefici dalla costruzione di una strada. report.requirements.severalExperts=Diverse {{plural:2|%unit%}} si trovano a report.requirements.surplus=Un eccesso di %goods% viene prodotto a: report.trade.afterTaxes=Ricavi dopo le tasse report.trade.beforeTaxes=Ricavi prima delle tasse report.trade.cargoUnits=Unità Trasportate +# Fuzzy report.trade.hasCustomHouse=* Questa colonia dispone di un Porto Franco; vengono esportati questi beni: report.trade.totalDelta=Produzione Totale report.trade.totalUnits=Unità Totali report.trade.unitsSold=Unità comprate o vendute report.turn.filter=Non mostrare questo tipo di messaggio (%type%) report.turn.ignore=Ignora questo messaggio (Colonia: %colony%, Beni: %goods%) +# Fuzzy report.turn.playerNation=%nation% di %player% aboutPanel.copyright=Copyright © 2002-2015 Il team di FreeCol aboutPanel.legalDisclaimer=FreeCol è un software libero: puoi ridistribuirlo e/o modificarlo nei termini stabiliti dalla GNU General Public License così come pubblicati dalla Free Software Foundation, nella versione 2 della Licenza, o in qualsiasi versione successiva. @@ -2386,6 +2418,7 @@ colonyPanel.buildQueue=Coda di costruzione colonyPanel.colonyUnits=Unità della colonia colonyPanel.inPort=Nel porto colonyPanel.outsideColony=Fuori dalla colonia +# Fuzzy colonyPanel.producing=Produzione di: colonyPanel.reducePopulation=Se si riduce la popolazione al di sotto di %number%, %colony% non sarà più in grado di costruire %buildable%. colonyPanel.unitChange=Entrando nella tua colonia il tuo %oldType% è diventato un %newType%. @@ -2397,7 +2430,7 @@ colonyPanel.notBestTile=%unit% potrebbe produrre più %goods% in %tile%. confirmDeclarationDialog.areYouSure.no=Forse più tardi confirmDeclarationDialog.areYouSure.text=Rinunciamo all'ingiusta tirannide di %monarch% e dichiariamo l'indipendenza delle nostre colonie dalla corona! confirmDeclarationDialog.areYouSure.yes=Libertà o Morte! -confirmDeclarationDialog.defaultCountry=Stati Uniti di %nation% +confirmDeclarationDialog.defaultCountry=Stati Uniti di {{tag:country|%nation%}} confirmDeclarationDialog.defaultNation=Libero Stato %nation% confirmDeclarationDialog.enterCountry=D'ora in poi, la nostra nazione si chiamerà confirmDeclarationDialog.enterNation=e ogni cittadino della nostra gloriosa nazione sarà orgoglioso di definirsi @@ -2406,8 +2439,10 @@ constructionPanel.turnsToComplete=(Turni al termine: %number%) negotiationDialog.accept=Accetta negotiationDialog.add=Aggiungi negotiationDialog.cancel=Annulla +# Fuzzy negotiationDialog.demand=La %nation% richiede %otherNation% negotiationDialog.exchange=in cambio di +# Fuzzy negotiationDialog.offer=La %nation% offre %otherNation% negotiationDialog.send=Invia editSettlementDialog.removeSettlement=Rimuovi insediamento @@ -2426,9 +2461,9 @@ findSettlementPanel.displayAll=Trova tutti gli insediamenti findSettlementPanel.displayOnlyEuropean=Trovare solo insediamenti europei findSettlementPanel.displayOnlyNatives=Trovare solo insediamenti nativi findSettlementPanel.name=Trova insediamento +# Fuzzy firstContactDialog.meeting.natives=Incontro coi Nativi. . . firstContactDialog.meeting.natives.tutorial=Abbiamo incontrato dei Nativi. Invia i tuoi Esploratori nei loro villaggi per saperne di più sul loro conto, e i tuoi Servitori a Contratto e Coloni Liberi affinchè imparino da essi. Invia le tue navi e le tue diligenze nei loro insediamenti, se desideri commerciare. -firstContactDialog.meeting.INCA=L'impero Inca. . . firstContactDialog.welcomeOffer.text=Il popolo %nation% vi porge il benvenuto. Siamo una gloriosa nazione di %camps% %settlementType%. Per celebrare la nostra amicizia, generosamente vi offriamo in dono la terra che state occupando. Accettate il nostro trattato impegnandovi a rimanere in pace con noi come fratelli? firstContactDialog.welcomeSimple.text=Il popolo %nation% vi porge il benvenuto. Siamo una gloriosa nazione di %camps% %settlementType%. Accettate un trattato con noi per rimanere in pace come fratelli? abandonColony.no=Annulla diff --git a/data/strings/FreeColMessages_ja.properties b/data/strings/FreeColMessages_ja.properties index 9c644a028..8218960fd 100644 --- a/data/strings/FreeColMessages_ja.properties +++ b/data/strings/FreeColMessages_ja.properties @@ -1,6 +1,7 @@ # Messages for Japanese (日本語) # Exported from translatewiki.net # Author: Aotake +# Author: Azeha # Author: Dude1717 # Author: Fievarsty # Author: Fryed-peach @@ -36,7 +37,9 @@ dry=乾燥 hot=暑い temperate=温暖 veryDry=非常に乾燥 +veryHigh=とても高い veryLarge=非常に大きい +veryLow=とても低い verySmall=非常に小さい veryWet=超高湿 warm=暖かい @@ -51,20 +54,19 @@ cancel=中止 close=閉じる color=色 connect=接続 -# Fuzzy current=現在 false=無効 -# Fuzzy -fill=最終結果 +fill=フィル height=高さ help=ヘルプ +high=高い host=ホスト large=大 load=読み込み +low=低い many=多くの medium=中 more=もっと... -# Fuzzy music=音楽 name=名前 no=いいえ @@ -80,6 +82,7 @@ remove=削除 rename=改名 reset=リセット save=保存 +select=選択 server=サーバー skip=スキップ small=小 @@ -102,6 +105,7 @@ cargoOnCarrier=運搬中の積荷 cashInTreasureTrain=財宝車が壊れました clearOrders=命令の初期化 colonists=入植者 +colonyCenter=植民地 中心 colopedia=コロペディア difficulty=難易度 docks=埠頭 @@ -113,6 +117,7 @@ goldAmount=%amount% {{plural:%amount%|ゴールド}} goods=商品 goToEurope=ヨーロッパに行く goToThisTile=このタイルに移動 +immigrants=移民 inPort=入港中 mission=布教 modifiers=有利条件 @@ -149,6 +154,7 @@ cli.arg.debug=デバッグ・モード cli.arg.difficulty=難易度 cli.arg.dimensions=横幅x縦幅 cli.arg.directory=ディレクトリ +cli.arg.europeans=ヨーロピアン cli.arg.file=ファイル cli.arg.locale=ロケール cli.arg.loglevel=ログレベル @@ -183,8 +189,9 @@ cli.no-memory-check=メモリーのチェックをスキップ cli.no-sound=音なしでFreeColをプレイ cli.private=プライベートサーバーを起動 (metaserverには公開されない) cli.seed=擬似乱数を生成するための乱数種を与える -cli.server-name=サーバーに独自名 NAME を指定 +# Fuzzy cli.server=指定したポートでスタンドアローンサーバーを起動 +cli.server-name=サーバーに独自名 NAME を指定 cli.splash=ゲームの起動時に FILE 画像をスプラッシュスクリーンとして表示 cli.tc=指定した NAME ですべての変換を読み込む cli.version=バージョンを表示して終了 @@ -244,7 +251,6 @@ colopediaAction.goods.name=商品 colopediaAction.nations.name=国 colopediaAction.nationTypes.name=国の特徴 colopediaAction.resources.name=ボーナス資源 -colopediaAction.skills.name=スキル colopediaAction.terrain.name=地形タイプ colopediaAction.units.name=ユニット colopediaAction.name=%object% (コロペディア) @@ -395,6 +401,7 @@ model.option.priceIncrease.artillery.name=砲兵の価格引き上げ model.option.priceIncrease.artillery.shortDescription=新しい砲兵ごとに価格を上げる。 model.option.expertStartingUnits.name=ベテラン開始ユニット model.option.expertStartingUnits.shortDescription=開始ユニットをすべてベテランにする +model.option.immigrants.name=移民 model.option.landPriceFactor.name=土地価格係数 model.option.landPriceFactor.shortDescription=原住民の土地を購入するコストを増加する。 model.option.nativeConvertProbability.name=原住民改宗者の確率 @@ -421,6 +428,7 @@ model.option.settlementNumber.verySmall.name=非常に小さい model.option.settlementNumber.small.name=小 model.option.settlementNumber.medium.name=中 model.option.settlementNumber.large.name=大 +model.option.settlementNumber.veryLarge.name=とても大きい model.difficulty.monarch.name=君主 model.option.monarchMeddling.name=君主の干渉 model.option.monarchMeddling.shortDescription=君主が干渉する頻度と干渉量が増える。 @@ -524,18 +532,54 @@ model.option.maximumLatitude.shortDescription=最南端の緯度です。正の model.option.riverNumber.name=河川の数 model.option.riverNumber.shortDescription=マップ中の河川の数を設定します。 model.option.riverNumber.verySmall.name=非常に小さい +model.option.riverNumber.small.name=小さい +model.option.riverNumber.medium.name=中 +model.option.riverNumber.large.name=大 +model.option.riverNumber.veryLarge.name=とても大きい model.option.mountainNumber.name=山の数 model.option.mountainNumber.shortDescription=マップ中の山の数を設定します。 +model.option.mountainNumber.verySmall.name=とても小さい +model.option.mountainNumber.small.name=小さい +model.option.mountainNumber.large.name=大きい +model.option.mountainNumber.veryLarge.name=とても大きい model.option.rumourNumber.name=古代都市の噂の数 model.option.rumourNumber.shortDescription=マップ中の古代都市の噂の数を設定します。 +model.option.rumourNumber.verySmall.name=とても小さい +model.option.rumourNumber.small.name=小さい +model.option.rumourNumber.medium.name=中 +model.option.rumourNumber.large.name=大きい model.option.forestNumber.name=森林の割合 model.option.forestNumber.shortDescription=マップ中の森林の割合を設定します。 +model.option.forestNumber.verySmall.name=とても小さい +model.option.forestNumber.small.name=小さい +model.option.forestNumber.medium.name=中 +model.option.forestNumber.large.name=大きい model.option.bonusNumber.name=ボーナスタイルの割合 model.option.bonusNumber.shortDescription=マップ中のボーナスタイルの割合を設定します。 +model.option.bonusNumber.verySmall.name=とても小さい +model.option.bonusNumber.small.name=小さい +model.option.bonusNumber.medium.name=中 +model.option.bonusNumber.large.name=大きい model.option.humidity.name=湿度 model.option.humidity.shortDescription=マップ中の平均的な湿度を設定します。 +model.option.humidity.veryDry.name=とても乾燥 +model.option.humidity.veryDry.shortDescription=湿度がとても低い +model.option.humidity.dry.name=乾燥 +model.option.humidity.dry.shortDescription=低い湿度 +model.option.humidity.normal.name=普通 +model.option.humidity.normal.shortDescription=普通の湿度 +model.option.humidity.wet.name=湿ってる +model.option.humidity.wet.shortDescription=高い湿度 +model.option.humidity.veryWet.name=とても湿ってる +model.option.humidity.veryWet.shortDescription=とても高い湿度 model.option.temperature.name=気温 model.option.temperature.shortDescription=マップ中の平均的な気温を設定します。 +model.option.temperature.cold.name=冷たい +model.option.temperature.cold.shortDescription=温度がとても低い +model.option.temperature.chilly.name=冷涼 +model.option.temperature.chilly.shortDescription=低い温度 +model.option.temperature.hot.name=あつい +model.option.temperature.hot.shortDescription=温度がとても高い mapGeneratorOptions.import.name=インポート mapGeneratorOptions.import.shortDescription=マップやセーブデータのインポートの設定です。 model.option.importFile.name=ファイルのインポート @@ -550,6 +594,7 @@ model.option.importSettlements.name=入植地のインポート model.option.importSettlements.shortDescription=原住民の入植地のインポートを有効にします。 clientOptions.name=設定 clientOptions.shortDescription=優先するクライアント設定 +clientOptions.personal.name=個人 model.option.playerName.name=プレイヤー名: clientOptions.gui.name=ディスプレイ clientOptions.gui.shortDescription=ゲームの外観を調整するための設定です。 @@ -563,8 +608,7 @@ model.option.guiMaxNumberOfGoodsImages.shortDescription=表示する品物画像 model.option.guiMinNumberToDisplayGoods.name=非表示にする倉庫の在庫数 model.option.guiMinNumberToDisplayGoods.shortDescription=植民地にある品物がこの数よりも多ければ表示する model.option.alwaysCenter.name=選択されたタイルを常に中央に表示 -# Fuzzy -model.option.alwaysCenter.shortDescription=この設定を友好にすると、選択したタイルが常に中央になります。 +model.option.alwaysCenter.shortDescription=この設定を有効にすると、選択したタイルが常に中央になります。 model.option.jumpToActiveUnit.name=アクティブなユニットに移動 # Fuzzy model.option.jumpToActiveUnit.shortDescription=アクティブなユニットが画面外の場合、表示を中央に移動します。 @@ -610,6 +654,7 @@ clientOptions.gui.displayColonyLabels.modern.name=モダン model.option.colonyComparator.name=植民地の並び順 model.option.colonyComparator.shortDescription=植民地の並び順をどのようにするか clientOptions.gui.colonyComparator.byName.name=名前 +clientOptions.gui.colonyComparator.byAge.name=年齢 clientOptions.gui.colonyComparator.byPosition.name=位置 clientOptions.gui.colonyComparator.bySize.name=サイズ clientOptions.gui.colonyComparator.bySoL.name=独立推進派 @@ -716,6 +761,7 @@ model.option.indianDemandResponse.name=インディアンの要求に対する model.option.indianDemandResponse.shortDescription=原住民が質問するたびに確認するか、要求を受け入れるか、要求を受け入れないか、の対応をします。 model.option.unloadOverflowResponse.name=過搭載分の積み下ろし model.option.unloadOverflowResponse.shortDescription=届いた積荷を下ろして倉庫から溢れたときにはどうするのか。 +clientOptions.other.unloadOverflowResponse.always.name=常に clientOptions.mods.name=MOD clientOptions.mods.shortDescription=ゲームを拡張するオプション。 model.ability.ambushPenalty.name=待ち伏せペナルティ @@ -729,8 +775,7 @@ model.ability.bombardShips.shortDescription=水域タイルに隣接する敵の model.ability.build.name=建設 # Fuzzy model.ability.build.shortDescription=ユニットや施設や建築物を建設する能力です。 -# Fuzzy -model.ability.buildCustomHouse.name=税関を建設する能力 +model.ability.buildCustomHouse.name=税関を建設する model.ability.buildFactory.name=工場を建設 model.ability.canRecruitUnit.name=ユニットの勧誘 model.ability.canRecruitUnit.shortDescription=この国はユニットを勧誘する能力があります。 @@ -751,33 +796,29 @@ model.ability.export.shortDescription=商品を直接ヨーロッパへ輸出で model.ability.foundColony.name=植民地の発見 model.ability.foundColony.shortDescription=このユニットは新しい植民地を発見する能力を持っています model.ability.hasPort.name=海にアクセス -# Fuzzy -model.ability.hasPort.shortDescription=この地は海に直接、もしくは間接的にアクセスできます +model.ability.hasPort.shortDescription=この地は海に直接もしくは間接的にアクセスできます model.ability.independenceDeclared.name=独立宣言 model.ability.independenceDeclared.shortDescription=この国は独立を宣言しています model.ability.independentNation.shortDescription=独立国家 model.ability.moveToEurope.name=ヨーロッパに移動 -# Fuzzy -model.ability.moveToEurope.shortDescription=このタイルはユニットをヨーロッパへ移動させることができます。 +model.ability.moveToEurope.shortDescription=このタイルはユニットをヨーロッパへ移動させることができます model.ability.native.name=インディアン model.ability.native.shortDescription=アメリカの原住民 model.ability.navalUnit.name=海軍ユニット model.ability.navalUnit.shortDescription=このユニットは海軍ユニットです。 model.ability.negotiate.name=交渉 +model.ability.person.name=人 +model.ability.person.shortDescription=このユニットは人です model.ability.plunderNatives.name=略奪の原住民 -# Fuzzy -model.ability.plunderNatives.shortDescription=原住民の入植地を破壊して得られる略奪品の量が増加します。 +model.ability.plunderNatives.shortDescription=原住民の入植地を破壊して得られる略奪品の量が向上します model.ability.produceInWater.name=水域で生産 -# Fuzzy -model.ability.produceInWater.shortDescription=ユニットは陸地タイルと同じように水域タイルを利用できます +model.ability.produceInWater.shortDescription=ユニットは陸地タイルと同じように水域タイルが利用できます model.ability.repairUnits.name=ユニットの修理 -# Fuzzy -model.ability.repairUnits.shortDescription=特定種の破損したユニットを修理することができます。 +model.ability.repairUnits.shortDescription=特定種の破損したユニットを修理することができます model.ability.royalExpeditionaryForce.name=王立遠征軍 model.ability.royalExpeditionaryForce.shortDescription=王立遠征軍の国。 model.ability.selectRecruit.shortDescription=新兵を選抜する能力 model.ability.teach.name=伝授スキル -# Fuzzy model.ability.teach.shortDescription=ベテランユニットは別の人へスキルを教えることがあります model.ability.undead.name=アンデッド # Fuzzy @@ -897,10 +938,15 @@ model.building.weaverHouse.name=織工の家 model.building.weaverHouse.description=織工の店にアップグレードすることができる織工の家は、綿花から布を生産するために使います。植民地の人口が8に達してから、Adam Smithが大陸会議に参加することで織物工場にアップグレードすることができます。 model.building.weaverShop.name=織工の店 model.building.weaverShop.description=織物工場にアップグレードすることができる織工の店は、綿花から布を生産するために使います。植民地の人口が8に達してから、Adam Smithが大陸会議に参加することで織物工場にアップグレードすることができます。織工の店は布の生産を増やします。 +model.disaster.disease.name=病気 +model.disaster.flood.name=洪水 +model.disaster.hurricane.name=ハリケーン +model.disaster.sandstorm.name=砂嵐 +model.disaster.stormsurge.name=高潮 +model.disaster.tornado.name=竜巻 model.event.declareIndependence.name=独立宣言 model.foundingFather.adamSmith.name=アダム・スミス -# Fuzzy -model.foundingFather.adamSmith.description=工場が原料1つに対して1.5倍の製品を生産する +model.foundingFather.adamSmith.description=工場の建築を有効にする。 model.foundingFather.adamSmith.text=近代経済の父として有名なSmithは、もっとも有名な教科書である国富論をはじめとする経済理論関係の教科書をいくつも執筆した。 model.foundingFather.adamSmith.birthAndDeath=1723年-1790年 model.foundingFather.jacobFugger.description=現在発生しているボイコットがすべて無くなる @@ -915,8 +961,7 @@ model.foundingFather.peterStuyvesant.description=税関の建設が可能にな model.foundingFather.peterStuyvesant.text=後にNew YorkとなるNew Netherlandの総督に任命される。イギリスのNew Netherland侵攻を食い止めることができなかった。 model.foundingFather.peterStuyvesant.birthAndDeath=1592年-1672年 model.foundingFather.janDeWitt.name=ヨハン・デ・ウィット -# Fuzzy -model.foundingFather.janDeWitt.description=外国の植民地と交易が可能になる +model.foundingFather.janDeWitt.description=外国の植民地と交易が可能になり、植民地ライバルのより多くの情報が表示されます。 model.foundingFather.janDeWitt.text=De Wittは偉大なるオランダの政治家。商人を代表して産業と商業を推奨した。また彼はオランダがイギリスとの戦争を終結する際の重要な条約の交渉を行った。 model.foundingFather.janDeWitt.birthAndDeath=1625年-1672年 model.foundingFather.ferdinandMagellan.name=フェルディナンド・マゼラン @@ -1007,8 +1052,7 @@ model.foundingFather.political=政治 model.foundingFather.religious=宗教 model.goods.bells.name={{plural:%amount%|one=自由の鐘|other=自由の鐘|default=自由の鐘}} model.goods.bells.description=自由の鐘は入植者の独立機運を現しています。 -# Fuzzy -model.goods.bells.workAs=政治家 (自由の鐘 %amount%) +model.goods.bells.workAs=政治家%claim%として作業 (自由の鐘 %amount%) model.goods.bells.workingAs=政治家 model.goods.cigars.name={{plural:%amount%|one=葉巻タバコ|other=葉巻タバコ|default=葉巻タバコ}} model.goods.cigars.description=葉巻タバコはタバコから作られます。ぜいたく品として高い価値があります。 @@ -1250,6 +1294,7 @@ model.settlement.aztec.plural=都市 model.settlement.camp.capital.name=野営地 model.settlement.camp.name=野営地 model.settlement.camp.plural=野営地 +model.settlement.colony.capital.name=植民地 model.settlement.colony.name=植民地 model.settlement.colony.plural=植民地 model.settlement.inca.capital.name=インカ都市 @@ -1426,12 +1471,14 @@ filter.savedGames=FreeColのセーブデータ (*.fsg) filter.xml=XML (拡張マークアップ言語) model.abstractGoods.boycotted=%amount% {{plural:%amount%|%goods%}} (ボイコット中) model.abstractGoods.label=%amount% {{plural:%amount%|%goods%}} +model.building.locationLabel=%location%内で model.colony.badGovernment=%colony%の政府は非効率的です。生産ペナルティが課せられます。 model.colony.governmentImproved1=%colony%の政府は改善されていますが、まだ不十分です。生産ペナルティが依然として課せられています。 model.colony.governmentImproved2=%colony%の政府は改善しました。もはや生産ペナルティは課せられていません。 model.colony.minimumColonySize=%object%以上の人口を減らすことを防ぎます。 model.colony.unbuildable=現時点での%colony%ではまだ%object%を建てることができません。%object%を建設待ちリストから削除しました。 model.colony.veryBadGovernment=%colony%の政府はとても非効率的です。高い生産ペナルティが課せられています。 +model.diplomaticTrade.receive.tribute={{tag:country|%nation%}}は私たちの敬意を要求しています! model.direction.N.name=北 model.direction.NE.name=北東 model.direction.E.name=東 @@ -1441,19 +1488,19 @@ model.direction.SW.name=南西 model.direction.W.name=西 model.direction.NW.name=北西 model.historyEventType.abandonColony.description=あなたは植民地 %colony% を放棄しました。 -model.historyEventType.cityOfGold.description=%nation%は黄金の七都市のうちの一つである%city%を発見し、%treasure%ゴールドの財宝を入手しました。 -model.historyEventType.colonyConquered.description=あなたの植民地%colony%は%nation%によって征服されました。 -model.historyEventType.colonyDestroyed.description=あなたの植民地%colony%は%nation%によって破壊されました。 +model.historyEventType.cityOfGold.description={{tag:country|%nation%}}は黄金の七都市のうちの一つである%city%を発見し、%treasure%ゴールドの財宝を入手しました。 +model.historyEventType.colonyConquered.description=あなたの植民地%colony%は{{tag:country|%nation%}}によって征服されました。 +model.historyEventType.colonyDestroyed.description=あなたの植民地%colony%は{{tag:country|%nation%}}によって破壊されました。 model.historyEventType.declareIndependence.description=あなたはクラウンからの独立を宣言する。 -model.historyEventType.destroyNation.description=あなたは%nation%を破壊しました。 +model.historyEventType.destroyNation.description={{tag:country|%nation%}}は%nativeNation%を破壊します。 model.historyEventType.discoverNewWorld.description=あなたは新世界を発見しました。 -model.historyEventType.discoverRegion.description=%nation%は%region%を発見しました。 +model.historyEventType.discoverRegion.description={{tag:country|%nation%}}は%region%を発見しました。 model.historyEventType.foundColony.description=あなたは植民地%colony%を設立しました。 model.historyEventType.foundingFather.description=%father%が大陸会議に参加しました。 model.historyEventType.independence.description=あなたは国王から独立を成し遂げました。 -model.historyEventType.meetNation.description=あなたは%nation%に出会いました。 -model.historyEventType.nationDestroyed.description=%nation%は破壊されました。 -model.historyEventType.spanishSuccession.description=%loserNation%は新世界の植民地すべてを%nation%に譲り渡しました。 +model.historyEventType.meetNation.description=あなたは%nation%ネーションに出会いました。 +model.historyEventType.nationDestroyed.description=%nation%はもはや新世界に存在しません。 +model.historyEventType.spanishSuccession.description={{tag:country|%loserNation%}}は新世界の植民地すべてを{{tag:country|%nation%}}に譲り渡しました。 model.indianSettlement.mostHatedNone=なし model.indianSettlement.mostHatedUnknown=不明 model.indianSettlement.nameUnknown=不明 @@ -1461,6 +1508,7 @@ model.indianSettlement.skillNone=なし model.indianSettlement.skillUnknown=不明 model.indianSettlement.tension.unknown=不明 model.indianSettlement.tension.wary=警戒 +model.indianSettlement.wantedGoodsNone=なし model.indianSettlement.wantedGoodsUnknown=不明 model.lostCityRumour.burialGround.description=よくも%nation%の神聖な埋葬地を汚したな! 死んで償え! model.lostCityRumour.cibola.description=あなたは黄金の七都市のうちの一つの%city%を発見し、価値%money%の財宝を略奪しました! 財宝車を植民地の一つに移動させ、換金するかガレオン船でヨーロッパに運んでください。 @@ -1504,6 +1552,9 @@ model.monarch.action.displeasure.text=あなたは国王からの独立を宣言 model.monarch.action.displeasure.no=完了 model.monarch.action.forceTax.no=完了 model.monarch.action.lowerTax.no=完了 +model.monarch.action.monarchMercenaries.yes=私達は、受け入れる +model.monarch.action.raiseTaxAct.yes=私達は、受け入れる +model.monarch.action.raiseTaxWar.yes=私達は、受け入れる model.monarch.action.supportLand.no=完了 model.monarch.action.supportSea.no=完了 model.monarch.action.waiveTax.no=完了 @@ -1519,7 +1570,7 @@ model.noClaimReason.terrain.description=この地は植民地に適していま model.player.forces=%nation%軍 model.player.independentMarket=ヨーロッパ model.player.startGame=数か月の航海の末、あなたはついに未知の大陸の沖に到達しました。新世界を発見するため{{tag:%direction%|west=西|east=東|default=風が吹く方}}に航路を向け、国王に発見報告をしましょう。 -model.player.waitingFor=%nation%の行動を待っています +model.player.waitingFor={{tag:country|%nation%}}の行動を待っています model.regionType.coast.name=沿岸 model.regionType.coast.unknown=未知の沿岸地方 model.regionType.desert.name=砂漠 @@ -1570,10 +1621,9 @@ model.unit.underRepair=修理(%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S -model.unit.unitState.skipped=W +model.unit.unitState.skipped=X model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G model.noAddReason.claimRequired.description=この地は他の民族に支配されていますが、苦情は入ってきません。 @@ -1589,6 +1639,7 @@ model.colony.colonistStarved=%colony%の入植者が餓死しました! model.colony.colonyStarved=%colony%での最後の入植者が餓死したので、残された植民地は放棄されます。 model.colony.customs.sale=%colony%の税関は売却しました: %data% model.colony.famineFeared=%colony%では飢餓の恐れがあります。食料の残りがあと%number%だけです。 +model.colony.starving=%colony%は飢えています。 model.colony.newColonist=%colony%で新しい入植者が誕生しました。 model.colony.newConvert=新しい%nation%の改宗者が%colony%に到着しました。 model.colony.notBuildingAnything=%colony%には建造するものが何もありません。 @@ -1601,12 +1652,12 @@ model.colony.warehouseOverfull=%colony%にある%goods%の量が倉庫一杯に model.colony.warehouseSoonFull=次のターンで%colony%の%goods%の倉庫容量を超えてしまいます。%amount%単位の%goods%が廃棄されます。 model.colony.warehouseWaste=%colony%にある%goods%が倉庫容量を超えています。%waste%単位が廃棄されました。 model.colonyTile.resourceExhausted=%colony%で資源%resource%が枯渇しました -model.game.spanishSuccession=閣下、ヨーロッパでスペイン継承戦争が終結しました。ユトレヒト条約により、%loserNation%が新世界に持っていたすべての植民地を%nation%へ強制割譲することになりました! +model.game.spanishSuccession=閣下、ヨーロッパでスペイン継承戦争が終結しました。ユトレヒト条約により、{{tag:country|%loserNation%}}が新世界に持っていたすべての植民地を{{tag:country|%nation%}}へ強制割譲することになりました! model.indianSettlement.mission.denounced=あなたの宣教師は%settlement%で非難され、処刑されました! model.player.colonyGoodsParty.harbour=国王の不当な課税に抗議するため、%colony%の入植者は%amount%単位の%goods%を港に投げ捨てました。 model.player.colonyGoodsParty.horses=国王の不当な課税に抗議して、%colony%の入植者は%amount%頭の馬を解放しました! model.player.colonyGoodsParty.landLocked=国王の不当な課税に抗議するため、%colony%の入植者は%amount%単位の%goods%を市場で焼き払いました。 -model.player.dead.european=閣下、%nation%は新世界の場から無条件撤退を宣言しました! +model.player.dead.european=閣下、{{tag:country|%nation%}}は新世界の場から無条件撤退を宣言しました! model.player.dead.native=閣下、%nation%は破壊されました。 model.player.disaster.effect.colonyDestroyed=%colony%は完全に破壊されました。 model.player.disaster.strikes=あなたの植民地 %colony% は打たれています、%disaster%によって @@ -1614,10 +1665,13 @@ model.player.emigrate=%europe%から、%unit%が移住することを決めま model.player.foundingFatherJoinedCongress=%foundingFather%が会議に参加しました!\n\n%description% model.player.soLDecrease=植民地の独立推進派の会員数が%newSoL%パーセントに下降しました。 model.player.soLIncrease=植民地の独立推進派の会員数が%newSoL%パーセントに上昇しました。 +# Fuzzy model.player.stance.alliance.declared=閣下、%nation%は我々と同盟を結びました! model.player.stance.alliance.others=閣下、%attacker%は%defender%と同盟を結びました。 +# Fuzzy model.player.stance.ceaseFire.declared=閣下、%nation%は我々との停戦に合意しました! model.player.stance.ceaseFire.others=閣下、%attacker%は%defender%との停戦に合意しました。 +# Fuzzy model.player.stance.peace.declared=閣下、%nation%は我々と和平を結びました! model.player.stance.peace.others=閣下、%attacker%は%defender%と和平を結びました。 model.player.stance.war.declared=閣下、悪いニュースです。%nation%が我々に宣戦を布告しました! @@ -1633,7 +1687,7 @@ combat.enemyShipEvaded=%enemyNation%の%enemyUnit%は%unit%からの攻撃を回 combat.enemyShipSunk=%unit%は%enemyNation%の%enemyUnit%を撃沈しました! combat.equipmentCaptured=気をつけてください。%nation%の騎兵は%equipment%を手に入れました! combat.goodsStolen=%enemyNation%の%enemyUnit%が%colony%で%goods%%amount%を盗みました! -combat.indianPlunder=%enemyNation%の%enemyUnit%が%colony%から%amount%を略奪しました。 +combat.indianPlunder=%enemyNation%の%enemyUnit%が%colony%から金%amount%を略奪しました。 combat.indianTreasure=%settlement%から%amount%ゴールドを略奪しました。 combat.nativeCapitalBurned=あなたは%nation%の首都、%name%を焼き払いました。%nation%はあなたの実力に対して降伏しました! combat.newConvertFromAttack=恐る恐る%nation%の%unit%があなたに加わりました! @@ -1670,26 +1724,25 @@ model.region.atlantic.name=大西洋 model.region.northAtlantic.name=北大西洋 model.region.southAtlantic.name=南大西洋 model.unit.arriveInEurope=閣下、我々の船が%europe%に到着しました! -# Fuzzy -model.unit.attrition=%unit%は%loation%で大自然の中に飲み込まれました! +model.unit.attrition=%unit%は%location%で大自然の中に飲み込まれました! model.unit.experience=%colony%では、%oldName%が経験を積んで%unit% に変わりました。 model.unit.noMoreTools=%location%: 開拓者が持っていたすべての道具を使い果たし、%unit%に戻りました。 model.unit.slowed=%enemyNation%の%enemyUnit%は%unit%の動きを遅くします。 model.unit.unitRepaired=%unit%は%repairLocation%での修理が終わりました。 model.unit.hardyPioneer.noMoreTools=%location%: ベテラン開拓者は所持していた道具を使い果たしました。 -# Fuzzy -error.couldNotLoad=ゲームロード中にエラーが発生しました! -# Fuzzy -error.couldNotSave=ゲーム保存中にエラーが発生しました! +error.couldNotLoad=ファイル%name%からのゲームロード中にエラーが発生しました! +error.couldNotSave=ファイル%name%のゲーム保存中にエラーが発生しました! main.defaultPlayerName=プレイヤー名 main.javaVersion=FreeCol を動作させるには Java バージョン %minVersion% 以降をお勧めします\n(%version% を検出しました。このチェックをスキップするには --no-java-check を使用してください。) main.memory=JVM に %memory% バイト以上のメモリを割り当てる必要があります。\n FreeCol を以下のように指定して再起動してください: java -Xmx%minMemory%M -jar FreeCol.jar -client.choicePlayer=プレイヤーを選択してください: +client.choicePlayer=ネーションを選択してください: client.ending=そのゲームは終了。 metaServer.couldNotConnect=申し訳ありません。メタ・サーバーに接続できませんでした。後でもう一度試してください。 metaServer.communicationError=メタ・サーバーとの通信中にエラーが発生しました。後でもう一度試してください。 abandonEducation.action.studying=勉強中 abandonEducation.action.teaching=教育中 +abandonEducation.no=教育を続ける +abandonEducation.yes=教育を放棄 armedUnitSettlement.attack=攻撃 boycottedGoods.dumpGoods=品物を投棄する boycottedGoods.text=国王が%goods%のボイコットを行っているため、これを%europe%に売ることはできません。滞納税(%amount%ゴールド)を支払うか、港に品物を投げ捨てるのか、さぁどうする? @@ -1697,9 +1750,9 @@ buy.moreGold=安くならないか交渉する buy.takeOffer=申し出を受け入れる buy.text=%nation%が彼らの所有している%goods%を%gold%で売りたいそうです: clearTradeRoute.text=%unit%には交易路%route%を割り当てます。交易路から目的地の設定がなくなりますが、行ってもよろしいですか? -confirmHostile.alliance=同盟国を攻撃することはできません! 本当に%nation%との同盟を破棄して宣戦布告しますか? -confirmHostile.ceaseFire=あなたは%nation%との停戦に署名しています。本当に攻撃するのですか? -confirmHostile.peace=現在、%nation%とは平和を保っています。宣戦布告しますか? +confirmHostile.alliance=同盟国を攻撃することはできません! 本当に{{tag:country|%nation%}}との同盟を破棄して宣戦布告しますか? +confirmHostile.ceaseFire=あなたは{{tag:country|%nation%}}との停戦に署名しています。本当に攻撃するのですか? +confirmHostile.peace=現在、{{tag:country|%nation%}}とは平和を保っています。宣戦布告しますか? error.noSuchFile=指定したファイルが存在しないか、通常のファイルではありません。 finance.high=財政的に安全であります。 indianLand.cancel=土地を離れる @@ -1749,8 +1802,8 @@ clearSpeciality.impossible=%unit%は降格できません! defeated.text=あなたは敗北しました! どうしますか: defeated.yes=引き続き観察する defeatedSinglePlayer.yes=リベンジモードに入る -diplomacy.offerAccepted=%nation%はあなたの寛大な提案を受け入れました。 -diplomacy.offerRejected=%nation%はあなたの寛大な提案を拒否しました。 +diplomacy.offerAccepted={{tag:country|%nation%}}はあなたの寛大な提案を受け入れました。 +diplomacy.offerRejected={{tag:country|%nation%}}はあなたの寛大な提案を拒否しました。 disbandUnit.text=本当にこのユニットを解散しますか? disbandUnit.yes=解散 disembark.text=やぁ、船乗りの方々。本当に上陸するかい? @@ -1790,8 +1843,8 @@ move.noAccessBeached=接近した%nation%の船がが我々の進路を妨害し move.noAccessContact=閣下、まずは%nation%に接触関係を持つ必要があります。 move.noAccessSettlement=%nation%は%unit%がその入植地に入る許可を与えていません。 move.noAccessSkill=%unit%が原住民から学ぶことはできません。 -move.noAccessTrade=%nation%といった他のヨーロッパ諸国と交易をする権限を持っていません。 -move.noAccessWar=戦争中は%nation%と交易ができません。 +move.noAccessTrade={{tag:country|%nation%}}といった他のヨーロッパ諸国と交易をする権限を持っていません。 +move.noAccessWar=戦争中は%nation%ネーションと交易ができません。 move.noAccessWater=%unit%は入植地に入る前に上陸が必要です。 move.noAttackWater=%unit%は攻撃する前に着陸する必要があります。 nameRegion.text=あなたは%type%を発見し、そのことを国王に報告しました! 慣例として名前をつけてください: @@ -1805,21 +1858,22 @@ renameUnit.text=ユニットにつける新しい名前を入れてください: scoutSettlement.expertScout=あなたの斥候は%unit%になりました。 scoutSettlement.speakBeads=ようこそ旅行者よ。平和の証として、この価値あるビーズの髪飾りを君たちの族長に届けてくれないか。(価値%amount%ゴールド) scoutSettlement.speakDie=あなたは部族の神聖なタブーを犯した!我々は射撃訓練のためあなたと提携しなければならない。 -# Fuzzy -scoutSettlement.speakNothing=我々はいつでも旅行者を歓迎している。 +scoutSettlement.speakNothing=我々はいつでも%nation%の旅行者を歓迎している。 scoutSettlement.speakTales=我々は遠方からの旅行者を招くことができて嬉しいです。火の近くに座ってください、近辺の土地についての物語をあなたにお話しましょう。 sellProposition.text=道具を売りますか? -# Fuzzy -trade.noTrade=貿易を拒否した。 +trade.noTrade=%settlement%で貿易を拒否した。 trade.noTradeGoods=すまない、もうこれ以上の%goods%は結構だ! trade.noTradeHostile=お前とその商品を軽蔑する。立ち去れ! trade.nothingToSell=すまないが、まだ売るものが何もないんだ! tradeProposition.welcome=%nation%の%settlement%と交易 +tradeRoute.atStop=%location%で: tradeRoute.prefix=%route%, %unit%:%data% tradeRoute.skipped=スキップされた +tradeRoute.toStop=%location%に旅行中。 traderoute.warehouseCapacity=%unit%を%colony%に降ろすと植民地の倉庫の容量を超えてしまいます。%goods%%amount%が無駄になるでしょう。それでも品物を降ろしますか? twoTurnsPerYear=%year%年以降は、1年あたり1ターンではなく%amount%ターンになります。 server.badColor=無効な色 +server.badNation=無効なネーション server.couldNotConnect=サーバーへの接続を行うことができませんでした。 server.errorStartingGame=ゲーム開始中にエラーが発生しました。 server.fileNotFound=指定した名前のファイルは見つかりませんでした。 @@ -1827,12 +1881,14 @@ server.incompatibleVersions=読み込もうとしたセーブデータはこの server.initialize=サーバーの初期化中にエラーが発生しました server.invalidPlayerNations=ゲームを開始する前に、すべてのプレーヤーが独自の国を選択する必要があります。 server.maximumPlayers=申し訳ありませんが、プレイヤー数の上限に達しています。 +# Fuzzy server.noRouteToServer=サーバーを公開できません。ファイアウォールの設定を変更して、指定したポートの接続を許可する必要があります。 server.notAllReady=まだ準備を終えていないプレイヤーがいます! server.onlyAdminCanLaunch=申し訳ありませんが、サーバー管理者だけがゲームを起動することができます。 server.reject=サーバーはそれを実行できません。 server.timeOut=サーバーへの接続がタイムアウトしました。 server.wrongFreeColVersion=FreeColのクライアントとサーバーのバージョンが一致しません。 +buildColony.others={{tag:country|%nation%}}が発見した、%region%内の%colony%の新しい植民地を。 cashInTreasureTrain.colonial=%amount%ゴールドの財宝がヨーロッパに到着し、%cashInAmount%ゴールドに換金されました。 cashInTreasureTrain.independent=%amount%の財宝が国庫に追加されました。 declareIndependence.announce=%oldNation%植民地は%ruler%からの独立を決意し、%newNation%になりました。 @@ -1850,6 +1906,8 @@ indianSettlement.mission.tension.displeased=布教によって、%nation%は気 indianSettlement.mission.tension.happy=布教によって、%nation%は喜んで新しい宗教に変わりました。 scoutSettlement.tributeAgree=平和を保つため%amount%ゴールドを支払うことに合意したが、もうこの次はないぞ! scoutSettlement.tributeDisagree=君たちの要求に応えることはできない。我々の土地からすぐに出て行け! +colopedia.description=説明 +colopedia.effects=効果 colopedia.buildings.autoBuilt=新しい植民地を建設すると自動的に建設される。 colopedia.buildings.cost=費用 colopedia.buildings.modifiers={{plural:%number%|one=修正値|other=修正値}} @@ -1890,10 +1948,8 @@ colopedia.nationType.regions=入植地域: colopedia.nationType.skills=習得技能: colopedia.nationType.typeOfSettlements=入植地の種類: colopedia.nationType.units=開始ユニット: -# Fuzzy colopedia.terrain.defenseBonus=防御ボーナス colopedia.terrain.description=説明 -# Fuzzy colopedia.terrain.movementCost=移動コスト colopedia.terrain.resource=資源 colopedia.terrain.terrainImage=地形図 @@ -1909,6 +1965,7 @@ colopedia.unit.offensivePower=攻撃力: colopedia.unit.price=欧州での価格: colopedia.unit.productionBonus=生産物の{{plural:%number%|one=修正|other=修正}}: colopedia.unit.requirements=要件: +# Fuzzy colopedia.unit.school=訓練に必要な学校: colopedia.unit.skill=技能レベル: report.labour.allColonists=全入植者 @@ -1939,8 +1996,9 @@ report.colony.improve.header=改善 report.colony.making.header=メイキング report.colony.name.description=植民地の一覧 report.colony.name.header=植民地 -report.colony.plow.header=P -report.colony.road.header=R +report.colony.production.export.description=%colony%: %amount% %goods% が生産されています (exporting above %export%) +report.colony.tile.clearForest.header=C +report.colony.tile.plow.header=P report.continentalCongress.available=利用可能 report.continentalCongress.none=(なし) report.continentalCongress.recruiting=新規勧誘 @@ -1981,18 +2039,18 @@ report.requirements.met=すべての要件が満たされています。 report.requirements.missingGoods=%colony%は%goods%を生産していますが、%input%が不足しています。 report.requirements.noExpert=%colony%は%goods%を生産していますが、%unit%がいません。 report.requirements.severalExperts=次の植民地には複数の{{plural:2|%unit%}}がいます: -# Fuzzy -report.requirements.surplus=次の植民地は%goods%を余剰生産しています: +report.requirements.surplus=%goods%の余剰が生産されているのは report.trade.afterTaxes=税引き後の収入 report.trade.beforeTaxes=税引き前の収入 report.trade.cargoUnits=運搬中のユニット +# Fuzzy report.trade.hasCustomHouse=* この植民地には税関があります。これらの品物は輸出されます。 report.trade.totalDelta=総生産 report.trade.totalUnits=総ユニット report.trade.unitsSold=売買されたユニット report.turn.filter=この種類のメッセージを表示しない (%type%) report.turn.ignore=このメッセージの無視 (植民地: %colony%, 品物: %goods%) -report.turn.playerNation=%player%の%nation% +report.turn.playerNation=%player%の{{tag:country|%nation%}} aboutPanel.copyright=Copyright © 2002-2015 The FreeCol Team aboutPanel.legalDisclaimer=FreeColはフリーソフトウェアです: あなたはこれを、フリーソフトウェア財団によって発行された GNU 一般公衆利用許諾契約書 (バージョン2もしくはそれ以降のバージョン) の定める条件の下で再頒布または改変することができます。 aboutPanel.officialSite=公式サイト: @@ -2015,6 +2073,7 @@ colonyPanel.inPort=入港中 colonyPanel.outsideColony=植民地の外 colonyPanel.reducePopulation=人口が%number%を下回ると、%colony%ではもう%buildable%を建てることができなくなります。 colonyPanel.unitChange=植民地に入った%oldType%は%newType%になりました。 +colonyPanel.warehouse=倉庫 colonyPanel.bonusLabel=ボーナス: %number%%extra% colonyPanel.populationLabel=人口: %number%人 colonyPanel.rebelLabel=独立派: %number% @@ -2023,14 +2082,15 @@ colonyPanel.notBestTile=%unit%は%tile%よりも多くの%goods%を生産でき confirmDeclarationDialog.areYouSure.no=あとで confirmDeclarationDialog.areYouSure.text=我々は%monarch%の不当な専制政治を放棄し、国王から植民地の独立を宣言した! confirmDeclarationDialog.areYouSure.yes=自由を!さもなくば死を! -confirmDeclarationDialog.defaultCountry=%nation%合衆国 -confirmDeclarationDialog.defaultNation=%nation%自由主義国 +confirmDeclarationDialog.defaultCountry={{tag:country|%nation%}}合衆国 +confirmDeclarationDialog.defaultNation={{tag:country|%nation%}}自由主義国 confirmDeclarationDialog.enterCountry=今後、我々の国は次のようになる: flag.unionPosition.LEFT=左 flag.unionPosition.MIDDLE=中 flag.unionPosition.NONE=なし flag.unionPosition.RIGHT=右 flag.unionPosition.TOP=トップ +flag.unionShape.RECTANGLE=長方形 flag.unionShape.TRIANGLE=三角形 constructionPanel.clickToBuild=建設する建物や作成するユニットをクリックしてください。 constructionPanel.turnsToComplete=(完成までのターン数: %number%) @@ -2039,10 +2099,8 @@ negotiationDialog.accept=受け入れ negotiationDialog.add=追加 negotiationDialog.cancel=中止 negotiationDialog.clear=消去 -# Fuzzy -negotiationDialog.demand=%nation% の要求 -# Fuzzy -negotiationDialog.offer=%nation% の提供 +negotiationDialog.demand={{tag:country|%nation%}} 提供 {{tag:country|%otherNation%}} +negotiationDialog.offer={{tag:country|%nation%}} 提供 {{tag:country|%otherNation%}} negotiationDialog.send=送信 editSettlementDialog.removeSettlement=植民地を削除 editSettlementDialog.removeSettlement.text=この植民地を削除しますか? @@ -2055,6 +2113,9 @@ europePanel.transaction.price=価格:\t%gold% europePanel.transaction.purchase=%goods% %amount%を一つ%gold%で購入 europePanel.transaction.sale=%goods% %amount%を一つあたり%gold%で売却 findSettlementPanel.name=入植地の検索 +firstContactDialog.meeting.natives=先住民と会議 +firstContactDialog.meeting.aztec=アステカ族 +firstContactDialog.meeting.inca=インカ帝国 firstContactDialog.welcomeOffer.text=%nation%にようこそ。我々は%camps%%settlementType%の栄光なる民族だ。我々の友情を祝福して、土地の支配権を寛大にお渡ししよう。条約を受け入れ、兄弟のように平和にならないか? firstContactDialog.welcomeSimple.text=%nation%にようこそ。我々は%camps%%settlementType%の栄光なる民族だ。条約を受け入れ、兄弟のように平和にならないか? abandonColony.no=中止 @@ -2080,6 +2141,7 @@ infoPanel.moves=移動力: loadingSavegameDialog.port=ポート: loadingSavegameDialog.privateMultiplayer=非公開マルチプレイヤー loadingSavegameDialog.publicMultiplayer=公開マルチプレイヤー +loadingSavegameDialog.serverName=サーバー名: loadingSavegameDialog.singlePlayer=シングルプレイヤー loadingSavegameDialog.name=保存されたゲームの読み込み mapEditorTransformPanel.majorRiver=大きな河川 @@ -2090,6 +2152,7 @@ freecol.map.America_large=アメリカ (大) freecol.map.Australia=オーストラリア freecol.map.Caribbean_basin=カリブ海地域 mapSizeDialog.mapSize=マップの大きさを選ぶ +modifierFormat.scopeMethod.isIndian.name=原住民 monarchDialog.default=国王からのメッセージ newPanel.editDifficulty=難易度を編集 newPanel.getServerList=サーバーリストの取得 diff --git a/data/strings/FreeColMessages_ko.properties b/data/strings/FreeColMessages_ko.properties index 2eb7432e9..a20105c4d 100644 --- a/data/strings/FreeColMessages_ko.properties +++ b/data/strings/FreeColMessages_ko.properties @@ -4,6 +4,7 @@ # Author: Clockoon # Author: Cwt96 # Author: Gusdud25 +# Author: Hwangjy9 # Author: Hym411 # Author: Ilovesabbath # Author: Jskang @@ -223,7 +224,6 @@ centerAction.name=중앙 changeAction.enterColony.name=식민지 들어가기 changeAction.nextUnitOnTile.name=타일 내 다음 유닛 changeAction.selectCarrier.name=운송수단 선택 -# Fuzzy changeWindowedModeAction.name=전체 화면 chatAction.name=대화 clearOrdersAction.name=명령 취소 @@ -232,7 +232,6 @@ colopediaAction.fathers.name=건국 아버지 colopediaAction.goods.name=상품 colopediaAction.nations.name=국가 colopediaAction.resources.name=보너스 자원 -colopediaAction.skills.name=기술 colopediaAction.terrain.name=지형 유형 colopediaAction.units.name=유닛 debugAction.name=디버그 모드 전환 @@ -461,6 +460,7 @@ clientOptions.minimap.color.background.gray.light.very=아주 밝은 회색 clientOptions.gui.displayTileText.names.name=제목 이름 clientOptions.gui.displayTileText.regions.name=타일 영역 model.option.displayColonyLabels.shortDescription=식민지 명패 양식. +clientOptions.gui.colonyComparator.byName.name=이름 clientOptions.gui.colonyComparator.byAge.shortDescription=만든 순서대로 정렬 clientOptions.gui.colonyComparator.byPosition.name=위치 clientOptions.gui.colonyComparator.byPosition.shortDescription=지리적 위치별로 정렬 @@ -932,10 +932,12 @@ model.direction.SW.name=남서 model.direction.W.name=서 model.direction.NW.name=북서 model.indianSettlement.mostHatedNone=없음 +model.indianSettlement.mostHatedUnknown=알 수 없음 model.indianSettlement.nameUnknown=알 수 없음 model.indianSettlement.skillUnknown=알 수 없음 model.indianSettlement.tension.unknown=알 수 없음 model.indianSettlement.tension.wary=경계 +model.indianSettlement.wantedGoodsUnknown=알 수 없음 model.lostCityRumour.name=잃어버린 도시의 소문 model.lostCityRumour.nothing.0.description=잃어버린 도시의 소문은 다음으로 증명되었습니다: 소문과 달리 없음! model.lostCityRumour.nothing.mounds.description=고분은 서늘하게 비어 있습니다. @@ -965,6 +967,7 @@ model.nationState.available.name=사용가능한 model.nationState.notAvailable.name=사용가능하지 않은 model.player.independentMarket=유럽 model.player.startGame=몇 개월의 항해 끝에, 마침내 미지의 대륙의 연안 도착했습니다. 신세계를 발견하기 위해 {{tag:%direction%|west=서쪽|east=동쪽|default=바람 부는 쪽}}으로 항해해 국왕에게 발견을 보고합시다. +# Fuzzy model.player.waitingFor=대기중: %nation% model.regionType.ocean.name=대양 model.regionType.river.name=강 @@ -1000,10 +1003,13 @@ model.colony.famineFeared=%colony% 내 기근이 걱정됩니다. %number%턴 model.colony.warehouseWaste=%colony%내 당신의 창고의 %goods% 용량이 초과했습니다. %waste% 유닛이 낭비되었습니다. model.colonyTile.resourceExhausted=%colony% 내 %resource% 자원 고갈 model.indianSettlement.mission.denounced=당신의 선교사가 %settlement%에서 고발당해 처형되었습니다! +# Fuzzy model.player.stance.alliance.declared=각하, %nation%이 우리와 동맹을 맺었습니다! model.player.stance.alliance.others=각하, %attacker%이 %defender%과 동맹을 맺었습니다. +# Fuzzy model.player.stance.ceaseFire.declared=각하, %nation%이 우리와 휴전하는데 동의했습니다! model.player.stance.ceaseFire.others=각하, %attacker%이 %defender%과 휴전하는데 동의했습니다. +# Fuzzy model.player.stance.war.declared=나쁜 소식입니다, 각하, %nation%이 우리에게 전쟁을 선포했습니다! model.player.stance.war.others=각하, %attacker%이 %defender%에 전쟁을 선포했습니다. combat.nativeCapitalBurned=당신은 %nation%의 수도, %name%(을)를 불태웠 버렸습니다. %nation%(은)는 당신의 힘에 항복했습니다. @@ -1031,6 +1037,7 @@ error.couldNotLoad=게임 불러오기를 시도하는 도중 오류가 발생 # Fuzzy error.couldNotSave=게임 저장을 시도하는 동안 오류가 발생했습니다! main.defaultPlayerName=플레이어 이름 +# Fuzzy client.choicePlayer=플레이어를 선택하십시오 : metaServer.couldNotConnect=죄송합니다, 메타 서버에 접속할 수 없습니다. 나중에 다시 시도해주세요. metaServer.communicationError=메타 서버와 통신하는 중 오류가 발생했습니다. 나중에 다시 시도하십시오. @@ -1038,6 +1045,7 @@ boycottedGoods.dumpGoods=상품 폐기 boycottedGoods.text=왕실에 의해 %goods%(이)가 구매거부되어 %europe% 내 에서 그것들을 판매할 수 없습니다. 귀하의 체납금(황금 %amount%)을 지불하길 원하시거나 항구에서 상품을 버려 폐기하길 원하십니까? buy.moreGold=더 낮은 가격을 제시 buy.takeOffer=제안 수락 +# Fuzzy confirmHostile.ceaseFire=%nation%과 휴전조약을 맺은 상태입니다. 정말 공격하시겠습니까? confirmTribute.no=그러지 않는 것이 나을 수 있습니다 error.noSuchFile=지정된 파일이 존재하지 않거나 일반 파일이 아닙니다. @@ -1076,7 +1084,9 @@ buyProposition.text=어떤 상품을 구입하길 원하십니까? cashInTreasureTrain.free=당신의 왕이 (세금 제외) 추가 비용없이 유럽으로 보물을 수송 할겁니다! defeated.text=당신은 패배했습니다! 어떻게 하시겠습니까 : defeated.yes=그대로 지켜본다. +# Fuzzy diplomacy.offerAccepted=%nation%이 당신의 너그러운 호의를 받아들였습니다. +# Fuzzy diplomacy.offerRejected=%nation%이 당신의 너그러운 호의를 거절했습니다. disbandUnit.text=정말로 이 유닛을 해산하길 원하십니까? disbandUnit.yes=해산 @@ -1104,6 +1114,7 @@ scoutSettlement.speakTales=우리는 저 멀리서 온 여행객들을 환영하 sellProposition.text=어떤 상품을 판매하길 원하십니까? server.fileNotFound=제공된 이름을 가진 파일을 찾을 수 없습니다. server.incompatibleVersions=불러오기를 시도한 저장된 게임은 FreeCol의 현재 버전과 호환되지 않습니다. +# Fuzzy server.noRouteToServer=공개 서버를 시작할 수 없습니다. 방화벽 설정을 수정하여 지정한 포트로의 접속을 허가해야 합니다. server.reject=서버는 그렇게 할 수 없습니다. declareIndependence.resolution=오늘 의회는 아메리카에서 한 번도 하지 못했던 가장 중요한 결의안을 통과시켰습니다.\n\n저는 이 선언을 지키고 이 연방을 지원하며 지키기 위해 우리가 흘려할 피와 땀 그리고 소중한 것들에 대해 잘 알고 있습니다. 그러나 그 모든 어둠 속에서 저는 아름다운 빛과 영광이 비춰지는 것을 볼 수 있습니다. 저는 그 끝이 그 어떤 것보다도 더 가치 있음을 알고 있습니다. 저는 신 앞에서 그렇게 되지 않을 것이라 믿으며 비록 우리가 이런 결과를 후회할 지라도 우리의 후손들은 마지막에는 반드시 승리할 것입니다.\n\n왕실 원정군이 곧 쳐들어 올 것입니다. 우리는 신대륙군을 자발적 지원자를 모집하며 우리 방어를 신중하게 대비합시다. @@ -1115,6 +1126,7 @@ colopedia.buildings.notes=노트 colopedia.buildings.specialist=전문가 colopedia.buildings.workplaces=작업장 colopedia.buildings.requiredPopulation={{plural:%number%|one=이주민|other=이주민|default=이주민}} %number%명 +colopedia.goods.description=설명: colopedia.nationType.aggressionLevel.average=평균 colopedia.nationType.aggressionLevel.high=높은 colopedia.nationType.aggressionLevel.low=낮음 @@ -1144,6 +1156,7 @@ colopedia.unit.movement=이동력: colopedia.unit.offensivePower=공격력: colopedia.unit.price=유럽에서의 가격 : colopedia.unit.requirements=필요 조건: +# Fuzzy colopedia.unit.school=훈련에 필요한 학교: colopedia.unit.skill=기술 수준: report.labour.allColonists=모든 식민지 @@ -1167,6 +1180,7 @@ report.indian.tradeInterests=무역 관심사: report.indian.typeOfSettlements=부락 종류: report.turn.filter=이러한 유형의 메시지(%type%) 표시하지 않음 report.turn.ignore=이 메시지 무시 (식민지: %colony%, 상품: %goods%) +# Fuzzy report.turn.playerNation=%player%의 %nation% aboutPanel.officialSite=공식 사이트: aboutPanel.sfProject=SourceForge 프로젝트: @@ -1187,6 +1201,7 @@ chooseFoundingFatherDialog.title=건국의 아버지 지명 colonyPanel.colonyUnits=식민지 유닛 colonyPanel.inPort=항구 안 colonyPanel.outsideColony=식민지 외곽 +# Fuzzy colonyPanel.producing=생산중: colonyPanel.reducePopulation=만약 %number% 아래로 인구를 줄일 경우, %colony%는 더 이상 %buildable%를 건설할 수 없습니다. colonyPanel.bonusLabel=보너스: %number%%extra% @@ -1204,7 +1219,9 @@ negotiationDialog.accept=수락 negotiationDialog.add=추가 negotiationDialog.cancel=취소 negotiationDialog.clear=지우기 +# Fuzzy negotiationDialog.demand=%nation%은(는) %otherNation%이(가) 필요합니다. +# Fuzzy negotiationDialog.offer=%nation%가 %otherNation%을 제공합니다 negotiationDialog.send=전송 negotiationDialog.title.trade=교환 협상 @@ -1216,7 +1233,6 @@ europePanel.transaction.net=넷:\t%gold% europePanel.transaction.price=가격:\t%gold% europePanel.transaction.purchase=%goods% %amount% 개 @%gold%에 구매 europePanel.transaction.sale=%goods% %amount% 개 @%gold%에 판매 -firstContactDialog.meeting.INCA=잉카 제국... abandonColony.no=취소 abandonColony.text=정말로 우리 식민지를 포기합니까? abandonColony.yes=포기 @@ -1279,6 +1295,7 @@ tilePanel.label=%label% (%x%, %y%) tilePanel.owner=소유자: tilePanel.region=지역: tilePanel.settlement=개척지: +tradeRouteInputPanel.nameLabel=이름 trainPanel.clickOn=다음 사람들중 훈련시킬 사람을 하나 클릭하십시오. victory.continue=진행 계속 victory.text=승리하셨습니다! diff --git a/data/strings/FreeColMessages_lt.properties b/data/strings/FreeColMessages_lt.properties index 41a85f263..612c06faf 100644 --- a/data/strings/FreeColMessages_lt.properties +++ b/data/strings/FreeColMessages_lt.properties @@ -6,6 +6,7 @@ # Author: Mantak111 # Author: Sergej.Privalov # Author: Tomasdd +# Author: Zygimantus model.option.recruitable.slot0.name=Pirmasis imigrantas model.option.recruitable.slot0.shortDescription=Pirmojo imigranto padalinio tipas. @@ -15,41 +16,45 @@ model.option.recruitable.slot2.name=Trečiasis imigrantas model.option.recruitable.slot2.shortDescription=Trečiojo imigranto padalinio tipas. model.option.refStrength.name=Karaliaus jėgų (KEP) stiprumas. model.option.refStrength.shortDescription=Padidina Karaliaus Ekspedicinių Pajėgų (KEP) dydį. +type=Tipas +source=Šaltinis chilly=Vėsus cold=Šaltas dry=Sausas hot=Karštas temperate=Vidutinis veryDry=Labai sausas +veryHigh=Labai aukštai veryLarge=Labai didelis +veryLow=Labai žemai verySmall=Labai mažas veryWet=Labai drėgnas warm=Šiltas wet=Drėgnas -freecol.desktopEntry.GenericName=Strateginis Žaidimas +freecol.desktopEntry.GenericName=Strateginis žaidimas freecol.desktopEntry.Comment=Ėjimais pagrįstas strateginis žaidimas grindžiamas "Sid Meier's Colonization". accept=Sutikti all=Visi and=ir browse=Naršyti cancel=Atšaukti +client=Klientas close=Uždaryti color=Spalva connect=Prisijungti -# Fuzzy current=Dabartinis false=Netiesa -# Fuzzy -fill=Vieneto rezultatas +fill=Užpildyti height=Aukštis help=Pagalba +high=Aukštas host=Serveris large=Didelis load=Krauti +low=Žemas many=daug medium=Vidutinis -more=daugiau ... -# Fuzzy +more=daugiau... music=Muzika name=Vardas no=Ne @@ -57,26 +62,31 @@ none=Nėra normal=Normalus nothing=Nieko ok=Gerai -options=Pasirinktys +options=Nustatymai port=Prievadas -quit=Išėiti +private=privatus +quit=Išeiti reject=Atmesti remove=Pašalinti rename=Pervadinti reset=Atstatyti save=Išsaugoti -# Fuzzy -server=Serverio vardas: +select=Pasirinkti +server=Serveris +skip=Praleisti small=Mažas -# Fuzzy -test=Testavimas +statistics=Statistika +test=Testas true=Tiesa +unknown=Nežinomas unload=Iškrauti +value=Reikšmė width=Plotis yes=Taip abilities=Gebėjimai activateAllUnits=Aktyvinti visus padalinius activateUnit=Aktyvinti padalinį +assignTradeRoute=Priskirti prekybos kelią building=Pastatas capital=Sostinė cargo=Krovinys @@ -84,22 +94,26 @@ cargoOnCarrier=Krovinių nešiklyje cashInTreasureTrain=Aukso lobio gurguolėje clearOrders=Atšaukti įsakymus colonists=Kolonistai +colonyCenter=kolonijos centras +colopedia=Kolopedija +countryName={{tag:country|%nation%}} difficulty=Sunkumas docks=Prieplauka dumpCargo=Išmesti krovinį +finalResult=Finalinis rezultatas fortify=Įsitvirtinti gold=Auksas goldAmount=%amount% aukso goods=Prekės goToEurope=Grįžti į Europą goToThisTile=Eiti čia +immigrants=Imigrantai inPort=Uoste leaveShip=Išriti iš laivo mission=Misija modifiers=Modifikavimai nation=Tauta -# Fuzzy -newWorld=Naujas Pasaulis +newWorld=Naujasis pasaulis notApplicable=Nėra payArrears=Išmokėti įsiskolinimą player=Žaidėjas @@ -111,6 +125,7 @@ sailingToEurope=Plaukia į Europą sales=Pardavimai sentry=Sergėti setSail=Išsiųsti į Ameriką +settlement=Gyvenvietė showProductionModifiers=Rodyti gamybos modifikatorius skillTaught=Įgūdį mokė: startGame=Pradėti žaidimą @@ -133,7 +148,9 @@ cli.arg.debugRun=Nusidažys [, SAVENAME] cli.arg.difficulty=SUNKUMAS cli.arg.dimensions=PLOTISxAUKŠTIS cli.arg.directory=KATALOGAS +cli.arg.europeans=EUROPIEČIAI cli.arg.file=FAILAS +cli.arg.gui-scale=MASTAS cli.arg.locale=LOKALĖ cli.arg.loglevel=ŽURNLYGIS cli.arg.name=PAVADINIMAS @@ -161,27 +178,29 @@ cli.load-savegame=įkelti išsaugotą žaidimą iš FAILO cli.log-console=rašyti žurnalą į konsolę, ne tik į failą cli.log-file=nustatyti FreeCol žurnalo failą (pagal nutylėjimą FreeCol.log) cli.log-level=nustatyti "Java" žurnalo lygį į LOGLEVEL -cli.no-intro=nerodyti įžanginio video +cli.no-intro=nerodyti įžanginio filmuko cli.no-java-check=netikrinti Javos versijos cli.no-memory-check=netikrinti atminties cli.no-sound=paleisti FreeCol be garso cli.private=startuoti privatų serverį (neskelbta metaserveryje) cli.seed=teikti sėklos pseudo atsitiktinių skaičių generatorius -cli.server-name=nurodyti pasirinktinį serverio PAVADINIMĄ +# Fuzzy cli.server=startuoti savarankišką serverį nurodytu prievadu +cli.server-name=nurodyti pasirinktinį serverio PAVADINIMĄ cli.splash=rodyti ekrano užsklanda vaizdo failą kraunamas žaidimas cli.tc=apkrova viso konversijos su tokiu pavadinimu cli.version=parodyti versijos numerį ir baigti darbą # Fuzzy cli.windowed=paleisti FreeCol lango režimu užuot visą ekraną -menuBar.colopedia=Kolopėdija +menuBar.colopedia=Kolopedija menuBar.game=Žaidimas -menuBar.orders=Įsakymai +menuBar.orders=Užsakymai menuBar.report=Ataskaita menuBar.tools=Įrankiai menuBar.view=Žiūrėti menuBar.statusLine=Taškai: %score% | Auksas: %gold% | Mokesčiai: %tax%% | Metai: %year% menuBar.debug=Derinti +menuBar.debug.addBuilding=Pridėti pastatą kiekvienai kolonijai menuBar.debug.addFoundingFather=Pridėti Tevą Steigėją menuBar.debug.addGold=Pridėti auksą menuBar.debug.addImmigration=Pridėti imigracija @@ -189,8 +208,10 @@ menuBar.debug.addLiberty=Pridėti laisvės kiekvienai kolonijai menuBar.debug.compareMaps.checkComplete=Patikrinimas baigtas. Desinchronizacijos nerasta. menuBar.debug.compareMaps.problem=Rasta galima problema. Prašome perskaityti informaciją įrašyta į standartinį išvestį. menuBar.debug.compareMaps=Patikrinti žemėlapį desinchronizacijai +menuBar.debug.displayAIMissions=Rodyti AI misijas menuBar.debug.displayErrorMessage=Rodyti klaidos pranešimą menuBar.debug.displayEuropeStatus=Rodyti Europos būseną +menuBar.debug.displayPanels=Rodyti paneles menuBar.debug.hideEntireMap=Paslėpti visą žemėlapį menuBar.debug.memoryManager.gc=Pradėti nebenaudojamos atminties tvarkymą menuBar.debug.memoryManager=Atminties tvarkytuvė @@ -224,7 +245,6 @@ colopediaAction.goods.name=Prekės colopediaAction.nations.name=Tautos colopediaAction.nationTypes.name=Tautų privalumai colopediaAction.resources.name=Bonusiniai resursai -colopediaAction.skills.name=Įgūdžiai colopediaAction.terrain.name=Vietovės tipai colopediaAction.units.name=Padaliniai colopediaAction.name=%object% (Kolopėdija) @@ -250,7 +270,7 @@ gotoAction.name=Eiti į gotoTileAction.name=Eiti į langelį loadAction.name=Įkrauti mapControlsAction.name=Žemėlapio valdymas -mapEditorAction.name=Žemėlapis redaktorius +mapEditorAction.name=Žemėlapio redaktorius mapGeneratorOptionsAction.name=Parodyti žemėlapio generatoriaus funkcijas miniMapZoomInAction.name=Priartinti mini žemėlapį miniMapZoomInAction.secondary.name=Padidinti minimap (antrinius) @@ -266,7 +286,7 @@ moveAction.NW.name=Judėti į šiaurės vakarus moveAction.NW.secondary.name=Judėti į šiaurės vakarus (pakartotinai) moveAction.S.name=Judėti į pietus moveAction.S.secondary.name=Judėti į pietus (pakartotinai) -moveAction.SE.name=Judėti pietryčiais +moveAction.SE.name=Judėti į pietryčius moveAction.SE.secondary.name=Judėti pietryčiais (pakartotinai) moveAction.SW.name=Judėti pietvakarais moveAction.SW.secondary.name=Judėti pietvakarais (pakartotinai) @@ -277,7 +297,7 @@ newEmptyMapAction.name=Nauja tuščias žemėlapis openAction.name=Įkelti plowAction.name=Suarti preferencesAction.name=Nustatymai -quitAction.name=Išėiti +quitAction.name=Išeiti reconnectAction.name=Prisijungti iš naujo renameAction.name=Pervadinti reportCargoAction.name=Gabenimų pranešimas @@ -348,6 +368,7 @@ model.option.nativeDemands.name=Indėnų pretenzijos model.option.nativeDemands.shortDescription=Padidina indėnų pretenzijų kiekį. model.option.rumourDifficulty.name=Gandų sunkumas model.option.rumourDifficulty.shortDescription=Kuo didesnis šis skaičius, tuo mažiau tikėtina kad gandai pasitvirtins. +model.option.destroySettlementScore.name=Sunaikinti gyvenvietės rezultatą model.option.buildOnNativeLand.name=Įsikūrimas indėnų žemėje model.option.buildOnNativeLand.shortDescription=Ar kolonijas gali būti įkurtos indėnų žemėje. model.option.buildOnNativeLand.always.name=Visada @@ -360,6 +381,15 @@ model.option.buildOnNativeLand.never.name=Niekada model.option.buildOnNativeLand.never.shortDescription=Įsikūrimas indėnų žemėje yra neleistinas. model.option.settlementNumber.name=Indėnų gyvenviečių procentas model.option.settlementNumber.shortDescription=Funkcija nustatyti kuriamo žemėlapio Indėnų gyvenviečių skaičių. +model.option.settlementNumber.verySmall.name=Labai mažas +model.option.settlementNumber.verySmall.shortDescription=Labai mažai vietinių gyvenviečių +model.option.settlementNumber.small.name=Mažas +model.option.settlementNumber.small.shortDescription=Mažas vietinių gyvenviečių skaičius +model.option.settlementNumber.medium.name=Vidutinis +model.option.settlementNumber.medium.shortDescription=Vidutinis vietinių gyvenviečių skaičius +model.option.settlementNumber.large.name=Didelis +model.option.settlementNumber.large.shortDescription=Didelis vietinių gyvenviečių skaičius +model.option.settlementNumber.veryLarge.name=Labai didelis model.difficulty.monarch.name=Monarchas model.option.monarchMeddling.name=Monarcho kišimasis model.option.monarchMeddling.shortDescription=Padidina monarcho isikišimo kiekį ir intensyvumą. @@ -398,6 +428,16 @@ model.option.unitsThatUseNoBells.name=Kolonistai kurie nenaudoja varpų model.option.unitsThatUseNoBells.shortDescription=Kolonistų skaičius kolonijoje, kurie nesunaudoja varpų. model.option.tileProduction.name=Langelio produkcija model.option.tileProduction.shortDescription=Produkcija langelių su kintama produkcija. +model.option.tileProduction.veryLow.name=Labai žemas +model.option.tileProduction.veryLow.shortDescription=Labai maža plytelių gamyba +model.option.tileProduction.low.name=Žemas +model.option.tileProduction.low.shortDescription=Maža plytelių gamyba +model.option.tileProduction.medium.name=Vidutinis +model.option.tileProduction.medium.shortDescription=Vidutinė plytelių gamyba +model.option.tileProduction.high.name=Aukštas +model.option.tileProduction.high.shortDescription=Didelė plytelių gamyba +model.option.tileProduction.veryHigh.name=Labai aukštas +model.option.tileProduction.veryHigh.shortDescription=Labai aukšta plytelių gamyba model.option.equipScoutCheat.name=Apginkluoti skautą gameOptions.name=Žaidimo parametrai gameOptions.shortDescription=Žaidimo parametrai @@ -412,6 +452,14 @@ model.option.explorationPoints.shortDescription=Ar priskirti tyrinėjimo taškus model.option.amphibiousMoves.name=Amfibijas juda model.option.amphibiousMoves.shortDescription=Leisti perkelti tiesiai į gyvenvietes nuo karo vienetų. model.option.enhancedMissionaries.name=Patobulinti misionieriai +model.option.giftProbability.name=Dovanos tikimybė +model.option.demandProbability.name=Paklausos tikimybė +model.option.startingPositions.name=Pradinės pozicijos +model.option.startingPositions.classic.name=Klasikinis +model.option.startingPositions.random.name=Atsitiktinis +model.option.startingPositions.historical.name=Istorinis +model.option.peaceProbability.name=Taikos tikimybė +model.option.playerImmigrationBonus.name=Žaidėjo imigracijos bonusas gameOptions.colony.name=Kolonijų parametrai gameOptions.colony.shortDescription=Yra parametrų, susijusių su kolonijų funkcionavimu. model.option.customIgnoreBoycott.name=Muitinė ignoruoja boikotus @@ -422,6 +470,7 @@ model.option.saveProductionOverflow.name=Išsaugoti gamybos perteklius model.option.saveProductionOverflow.shortDescription=Išsaugoti plaktukų, varpų ir kryžių perteklius. model.option.allowStudentSelection.name=Leisti atrankti studentus model.option.allowStudentSelection.shortDescription=Leidžia vartotojo, o ne automatinį studentų atrinkimą. +model.option.onlyNaturalImprovements.name=Tik natūralūs pagerinimai model.option.naturalDisasters.name=Stichinės nelaimės gameOptions.victoryConditions.name=Pergales sąlygos gameOptions.victoryConditions.shortDescription=Parametrai pagal kurios sprendžiama, kaip žaidime gali būti laimėta. @@ -433,12 +482,22 @@ model.option.victoryDefeatHumans.name=Visi kiti žmnės žaidėjai yra nugalėti model.option.victoryDefeatHumans.shortDescription=Bet kuris žaidėjas, kuris nugali visus kitus žmonius žaidėjus laimi žaidimą. gameOptions.years.name=Metų pasirinktys model.option.startingYear.name=Pradžios metai +model.option.startingYear.shortDescription=Metai, kuriais prasideda žaidimas. model.option.seasonYear.name=Sezono metai model.option.lastYear.name=Praeiti žaidimo metai -# Fuzzy -gameOptions.prices.name=Pradinės kainos +model.option.independenceTurn.name=Nepriklausomybės ėjimas +model.option.seasons.name=Metų laikai +gameOptions.prices.name=Kainos nustatymai model.option.food.minimumPrice.name=Minimali pradinė kaina maistui model.option.food.maximumPrice.name=Didžiausias pradinė maisto kaina +model.option.tobacco.minimumPrice.name=Minimali pradinė tabako kaina +model.option.tobacco.maximumPrice.name=Maksimali pradinė tabako kaina +model.option.tobacco.spread.name=Skirtumas tarp tabako pirkimo ir pardavimo kainos +model.option.cotton.minimumPrice.name=Minimali medvilnės kaina +model.option.cotton.maximumPrice.name=Maksimali medvilnės kaina +model.option.cotton.spread.name=Skirtumas tarp medvilnės pardavimo ir pirkimo kainos +model.option.furs.minimumPrice.name=Minimali pradinė kailių kaina +model.option.furs.maximumPrice.name=Maksimali pradinė kailių kaina mapGeneratorOptions.name=Žemėlapio generatoriaus funkcijos mapGeneratorOptions.shortDescription=Funkcijos, skirtos žemėlapio generatoriui. mapGeneratorOptions.landGenerator.name=Reljefo generatorius @@ -451,6 +510,14 @@ model.option.landMass.name=Žemės masė model.option.landMass.shortDescription=Funkcijos nustatyti kuriamo žemėlapio žemės masę. model.option.landGeneratorType.name=Žemės masės tipas (EKSPERIMENTINIS!) model.option.landGeneratorType.shortDescription=Funkcija, pagal kurias nustatoma kokį žemėlapio generatorių naudoti. +model.option.landGeneratorType.classic.name=Klasikinis +model.option.landGeneratorType.classic.shortDescription=Didelis žemynas ir šiek tiek salų. +model.option.landGeneratorType.continent.name=Žemynas +model.option.landGeneratorType.continent.shortDescription=Dauguma žemės yra vienas žemynas. +model.option.landGeneratorType.archipelago.name=Archipelagas +model.option.landGeneratorType.archipelago.shortDescription=Keletas vidutinio dydžio salų. +model.option.landGeneratorType.islands.name=Salos +model.option.landGeneratorType.islands.shortDescription=Daug mažų salų. model.option.preferredDistanceToEdge.name=Pageidaujamas atstumas iki krašto model.option.preferredDistanceToEdge.shortDescription=Pageidaujamas atstumas iki žemėlapio krašto. model.option.maximumDistanceToEdge.name=Didžiausias atstumas iki krašto @@ -465,10 +532,33 @@ model.option.maximumLatitude.name=Maksimali platuma model.option.maximumLatitude.shortDescription=Piečiausia platuma model.option.riverNumber.name=Upių procentas model.option.riverNumber.shortDescription=Funkcija nustatyti kuriamo žemėlapio upių skaičių. +model.option.riverNumber.verySmall.name=Labai mažas +model.option.riverNumber.verySmall.shortDescription=Labai mažai upių +model.option.riverNumber.small.name=Mažas +model.option.riverNumber.small.shortDescription=Mažas upių skaičius +model.option.riverNumber.medium.name=Vidutinis +model.option.riverNumber.medium.shortDescription=Vidutinis upių skačius +model.option.riverNumber.large.name=Didelis +model.option.riverNumber.large.shortDescription=Didelis upių skačius +model.option.riverNumber.veryLarge.name=Labai didelis model.option.mountainNumber.name=Kalnų procentas model.option.mountainNumber.shortDescription=Funkcija nustatyti kuriamo žemėlapio kalnų skaičių. +model.option.mountainNumber.verySmall.name=Labai mažas +model.option.mountainNumber.verySmall.shortDescription=Labai mažai kalnų +model.option.mountainNumber.small.name=Mažas +model.option.mountainNumber.small.shortDescription=Mažas kalnų skaičius +model.option.mountainNumber.medium.name=Vidutinis +model.option.mountainNumber.medium.shortDescription=Vidutinis kalnų skaičius +model.option.mountainNumber.large.name=Didelis +model.option.mountainNumber.large.shortDescription=Didelis kalnų skaičius +model.option.mountainNumber.veryLarge.name=Labai didelis model.option.rumourNumber.name=Prarasto Miesto gandų procenas model.option.rumourNumber.shortDescription=Funkcija nustatyti kuriamo žemėlapio Prarasto Miesto gandų skaičių. +model.option.rumourNumber.verySmall.name=Labai mažas +model.option.rumourNumber.small.name=Mažas +model.option.rumourNumber.medium.name=Vidutinis +model.option.rumourNumber.large.name=Didelis +model.option.rumourNumber.veryLarge.name=Labai didelis model.option.forestNumber.name=Miškų procentas model.option.forestNumber.shortDescription=Funkcija nustatyti kuriamo žemėlapio miškų skaičių. model.option.bonusNumber.name=Bonusinių langelių procentas @@ -1334,6 +1424,7 @@ model.building.locationLabel=Vietovėje: %location% model.colony.badGovernment=Kolonijos %colony% valdymas yra neefektyvus. Taikoma bauda gamybai. model.colony.governmentImproved1=Kolonijos %colony% valdymas pagerėjo, tačiau vis dar yra neefektyvus. Bauda gamybai vis dar taikoma. model.colony.governmentImproved2=Kolonijos %colony% valdymas pagerėjo. Bauda gamybai nebetaikoma. +# Fuzzy model.colony.insufficientProduction=Kolonijoje %colony% galėtų būti papildomai pagaminta: %outputAmount% %outputType%, jei ten būtų papildomai: %inputAmount% %inputType%. model.colony.minimumColonySize=%object% neleidžia sumažinti gyventojų skaičių. model.colony.unbuildable=%colony% negali pastatyti %object% šiuo metu. %object% buvo pašalintas iš statybų eilės. @@ -1347,19 +1438,26 @@ model.direction.SW.name=pietvakariai model.direction.W.name=vakarai model.direction.NW.name=šiaurės vakarai model.historyEventType.abandonColony.description=Jūs pametėte koloniją %colony%. +# Fuzzy model.historyEventType.cityOfGold.description=%nation% atrasti %city% , vienu iš septynių miestų aukso, ir lobis %treasure% aukso. +# Fuzzy model.historyEventType.colonyConquered.description=Jūsų kolonija %colony% yra užkariauta tauta %nation%. +# Fuzzy model.historyEventType.colonyDestroyed.description=Jūsų kolonija %colony% yra sunaikinta tauta %nation%. # Fuzzy model.historyEventType.declareIndependence.description=Jūs sunaikinote tautos %nation% gyvenvietę %settlement%. +# Fuzzy model.historyEventType.destroyNation.description=%nation% sunaikino %nativeNation%. model.historyEventType.discoverNewWorld.description=Jūs atrandate Naująjį Pasaulį. -model.historyEventType.discoverRegion.description=%nation% atrasti %region% . +model.historyEventType.discoverRegion.description={{tag:country|%nation%}} atranda %region%. model.historyEventType.foundColony.description=Jūs įkurėte koloniją %colony%. model.historyEventType.foundingFather.description=%father% prisijungia Kontinentinio kongreso. model.historyEventType.independence.description=Jūs pasiekėt nepriklausomybę nuo Karūnos. +# Fuzzy model.historyEventType.meetNation.description=Jūs susitikote tautą %nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=Tauta %nation% yra sunaikinta. +# Fuzzy model.historyEventType.spanishSuccession.description=%loserNation% atiduoda visas savo kolonijas Naujame Pasaulyje tautai %nation%. model.indianSettlement.mostHatedNone=Nėra model.indianSettlement.mostHatedUnknown=Nežinomas @@ -1426,7 +1524,7 @@ model.nationState.notAvailable.name=nėra prieinamas model.player.forces=%nation% pajėgos model.player.independentMarket=Europa model.player.startGame=Po kelių mėnesių jūroje, jūs pagaliau atvykote prie nežinomo žemyno pakrantės. Plaukit {{tag:%direction%|west=westward|east=eastward|default=į vėją}} siekiant atrasti Naują Pasaulį ir paskelbti jį Karūnos nuosavybę. -model.player.waitingFor=Laukiama: %nation% +model.player.waitingFor=Laukiama: {{tag:country|%nation%}} model.regionType.coast.name=Pakrantė model.regionType.coast.unknown=Nežinoma pakrantė model.regionType.desert.name=Dykuma @@ -1479,7 +1577,7 @@ model.unit.unitState.fortified=F model.unit.unitState.fortifying=F model.unit.unitState.inColony=B model.unit.unitState.sentry=S -model.unit.unitState.skipped=W +model.unit.unitState.skipped=X model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G model.noAddReason.colonyCenter.description=Niekas negali būti pridedėta kolonijos centre. @@ -1506,11 +1604,13 @@ model.colony.warehouseOverfull=Jūsų kolonijos %colony% sandėlis pasiekė jo t model.colony.warehouseSoonFull=Jūsų kolonijos %colony% sandėlis viršijs jo talpą prekei %goods% per sekantį ciklą. %amount% vienetų bus iššvaistyta. model.colony.warehouseWaste=Jūsų kolonijos %colony% sandėlis viršijo jo talpą prekei %goods%. %waste% vienetų buvo iššvaistyta. model.colonyTile.resourceExhausted=Ištekliai %resource% išnaudotos kolonijoje %colony% +# Fuzzy model.game.spanishSuccession=Jūsų Ekscelencija, Europoje baigėsi karas už Ispanijos įpėdinystę. Atsižvelgiant į Utrechto sutartį, %loserNation% buvo priversti perduoti visas Naujojo pasaulio kolonijas tautai %nation%! model.indianSettlement.mission.denounced=Jūsų misionierius gyvenvietėje %settlement% buvo pasmerktas ir nužudytas! model.player.colonyGoodsParty.harbour=Jūsų kolonistai %colony% kolonijoje išmetė į jūrą %amount% vienetus prekės %goods% protestuodami prieš nesąžiningus Karūnos mokesčius! model.player.colonyGoodsParty.horses=Jūsų kolonistai %colony% kolonijoje išleido %amount% arklių protestuodami prieš nesąžiningus Karūnos mokesčius! model.player.colonyGoodsParty.landLocked=Jūsų kolonistai %colony% kolonijoje sudegino %amount% vienetus prekės %goods% protestuodami prieš nesąžiningus Karūnos mokesčius! +# Fuzzy model.player.dead.european=Jūsų Ekscelencija, %nation% pareiškė besąlygišką atitraukimą iš Naujojo pasaulio! model.player.dead.native=Jūsų Ekscelencija, %nation% buvo sunaikinti. model.player.disaster.effect.colonyDestroyed=%colony% buvo visiškai sunaikintas. @@ -1518,12 +1618,16 @@ model.player.emigrate=%unit% nusprendė emigruoti iš Europos uosto %europe%. model.player.foundingFatherJoinedCongress=%foundingFather% prisidėjo prie kongreso!\n\n%description% model.player.soLDecrease=Laisvės Sūnų narystė jūsų kolonijose sumažėjo iki %newSoL% procentų! model.player.soLIncrease=Laisvės Sūnų narystė jūsų kolonijose pakilo iki %newSoL% procentų! +# Fuzzy model.player.stance.alliance.declared=Jūsų Ekscelencija, %nation% yra koalicijoje su mumis! model.player.stance.alliance.others=Jūsų Ekscelencija, %attacker% yra koalicijoje su tauta %defender%. +# Fuzzy model.player.stance.ceaseFire.declared=Jūsų Ekscelencija, %nation% sutiko nutraukti ugnį su mumis! model.player.stance.ceaseFire.others=Jūsų Ekscelencija, %attacker% sutiko nutraukti ugnį su tauta %defender%. +# Fuzzy model.player.stance.peace.declared=Jūsų Ekscelencija, %nation% yra taikoje su mumis! model.player.stance.peace.others=Jūsų Ekscelencija, %attacker% yra taikoje su tauta %defender%. +# Fuzzy model.player.stance.war.declared=Blogos naujienos, Jūsų Ekscelencija, %nation% paskelbė mums karą! model.player.stance.war.others=Jūsų Ekscelencija, %attacker% paskelbė karą tautai %defender%. combat.automaticDefence=Jūsų %unit% kolonijoje %colony% ėmėsi ginklų apginti savo koloniją! @@ -1539,6 +1643,7 @@ combat.enemyShipEvaded=Tautos %enemyNation% %enemyUnit% išvengė laivo %unit% a combat.enemyShipSunk=%unit% nuskandino tautos %enemyNation% laivą %enemyUnit%! combat.equipmentCaptured=Saugokitės, %nation% gavo %equipment%! combat.goodsStolen=%enemyNation% %enemyUnit% pavogė %amount% %goods% iš kolonijos %colony%. +# Fuzzy combat.indianPlunder=%enemyNation% %enemyUnit% prigrobė %amount% aukso iš kolonijos %colony%. combat.indianTreasure=Jūs prigrobėte %amount% aukso gyvenvietėje %settlement%. combat.nativeCapitalBurned=Jūs sudeginot %name%, tautos %nation% sostinę. %nation% pasiduoda jūsų galiai! @@ -1589,12 +1694,15 @@ error.couldNotLoad=Įvyko klaida bandant įkelti į žaidimą! # Fuzzy error.couldNotSave=Įvyko klaida bandant išsaugoti žaidimą! main.defaultPlayerName=Žaidėjo vardas +# Fuzzy client.choicePlayer=Prašome pasirinkti žaidėją: metaServer.couldNotConnect=Deja, nepavyko susisiekti su meta-serveriumi. Bandykite dar kartą vėliau. metaServer.communicationError=Įvyko klaida bendraujant su meta-serveriumi. Bandykite dar kartą vėliau. abandonEducation.action.studying=studijuoja abandonEducation.action.teaching=mokymas +# Fuzzy abandonEducation.no=Ne, tęsti švietimą +# Fuzzy abandonEducation.yes=Taip, palikti koloniją boycottedGoods.dumpGoods=Išmesti prekes boycottedGoods.text=Kadangi %goods% yra boikotojami Karūna, jūs negalite parduoti juos uoste %europe%. Ar norėtumet išmokėti savo įsiskolinimą (%amount% aukso), ar norėsit išmesti prekes į jūrą, juos sunaikinant? @@ -1602,8 +1710,11 @@ buy.moreGold=Prašyti sumažinti kainą buy.takeOffer=Priimti pasiūlymą buy.text=Tauta %nation% norėtų parduoti savo prekė %goods% už %gold%: clearTradeRoute.text=Jūsų padalinys %unit% yra priskirtas prekių maršrutui %route%. Nustatant jo paskirtį nuims jį nuo prekių maršruto. Ar tikrai norite tai padaryti? +# Fuzzy confirmHostile.alliance=Jūs negalite atakuoti koalicinė tauta! Ar jūs tikrai norite nutraukti savo koaliciją su tauta %nation% ir paskelbti karą? +# Fuzzy confirmHostile.ceaseFire=Jūs pasirašėt paliaubas su tauta %nation%. Ar tikrai norite atakuot? +# Fuzzy confirmHostile.peace=Jūs esate taikoje su tauta %nation%. Ar tikrai norite paskelbti karą? error.noSuchFile=Nurodytas failas neegzistuoja arba yra klaidingas. # Fuzzy @@ -1653,7 +1764,9 @@ clearSpeciality.impossible=%unit% negali buti paprastintas! defeated.text=Jūs buvote nugalėtas! Ar norėtumėte: defeated.yes=Pasilikti stebėjimui defeatedSinglePlayer.yes=Įeiti į Keršto režimą +# Fuzzy diplomacy.offerAccepted=%nation% priėmė jūsų dosnų pasiūlymą. +# Fuzzy diplomacy.offerRejected=%nation% atmetė jūsų dosnų pasiūlymą. disbandUnit.text=Ar tikrai norite išformuoti šį padalinį? disbandUnit.yes=Išformuoti @@ -1696,7 +1809,9 @@ move.noAccessContact=Pradžiai mes turime užmegzti ryšius su tautą %nation%, move.noAccessGoods=%nation% nesimainys už tuščią %unit%. move.noAccessSettlement=Tauta %nation% neleidžiame mūsų padaliniui %unit% įeiti į jų gyvenvietę. move.noAccessSkill=Mūsų %unit%, negali mokytis iš indėnų. +# Fuzzy move.noAccessTrade=Mes neturime teisių prekybai su kitomis Europos tautomis, tokiomis kaip %nation%. +# Fuzzy move.noAccessWar=Mes negalime prekiauti su tauta %nation%, kol mes su jais kariaujam. move.noAccessWater=Mūsų %unit% turėtu išsilaipinti prieš įeinant į gyvenvietę. move.noAttackWater=Mūsų %unit% turi žemę iki puola. @@ -1734,6 +1849,7 @@ server.incompatibleVersions=Įrašytas žaidimas, kurį bandote įkelti, yra ne server.initialize=Klaida inicijuojant serverį server.invalidPlayerNations=Visi žaidėjai turėtu pasirinkti unikalią tautą kad žaidimas prasidėtu. server.maximumPlayers=Atsiprašome, maksimalus dalyvių skaičius buvo pasiektas. +# Fuzzy server.noRouteToServer=Serveris negali būti skelbiama viešai. Jums reikia pakeisti savo ugniasienės nustatymus, kad būtų galima jungtis į uosto, kurį nurodėte. server.notAllReady=Ne visi žaidėjai yra pasiruošę pradėti žaidimą! server.onlyAdminCanLaunch=Atsiprašome, tik serverio administratorius gali pradėti žaidimą. @@ -1826,6 +1942,7 @@ colopedia.unit.offensivePower=Puolimo galia: colopedia.unit.price=Kaina Europoje: colopedia.unit.productionBonus=Gamybos {{PLURAL: %number% | vienas = modifikatorius | kitas = modifikatorius}}: colopedia.unit.requirements=Reikalavimai: +# Fuzzy colopedia.unit.school=Mokyklos reikia kad mokyti: colopedia.unit.skill=Įgūdžių lygis: report.labour.allColonists=Visi kolonistai @@ -1855,8 +1972,8 @@ report.colony.grow.header=+ report.colony.improve.header=Pagerinti report.colony.name.description=Kolonijų sąrašas report.colony.name.header=Kolonija -report.colony.plow.header=P -report.colony.road.header=R +report.colony.tile.plow.header=P +report.colony.tile.road.header=R # Fuzzy report.continentalCongress.elected=Išrinkti: report.continentalCongress.none=(jokių) @@ -1907,12 +2024,14 @@ report.requirements.surplus=Yra gaminamas prekės %goods% perteklius: report.trade.afterTaxes=Pelnas atskaičius mokesčius report.trade.beforeTaxes=Pelnas prieš mokesčius report.trade.cargoUnits=Padaliniai transportavimui +# Fuzzy report.trade.hasCustomHouse=* Šioje kolonijoje yra muitinė; šios prekės yra eksportuojamos. report.trade.totalDelta=Gamybos iš viso report.trade.totalUnits=Padalinių iš viso report.trade.unitsSold=Nupirkti ar parduoti padaliniai report.turn.filter=Nerodyti šio tipo pranešimų (%type%) report.turn.ignore=Ignoruoti šį pranešimą (Kolonija:%colony%, Prekės:%goods%) +# Fuzzy report.turn.playerNation=%player%'o %nation% aboutPanel.copyright=Autorinės teisės © 2002-2015 FreeCol komanda aboutPanel.legalDisclaimer=FreeCol yra nemokama kompiuterinė programa: Jūs galite ją platinti ir/arba modifikuoti pagal "GNU General Public License", kaip paskelbia "Free Software Foundation"; taip pat licenzijos versiją 2, arba bet kurią vėlesnę versiją. @@ -1936,7 +2055,7 @@ chooseFoundingFatherDialog.title=Paskirti steigiamąjį tėvą colonyPanel.colonyUnits=Kolonijos Vienetai colonyPanel.inPort=Uoste colonyPanel.outsideColony=Už kolonijos ribų -colonyPanel.producing=Gaminama: +colonyPanel.producing=gaminamas: colonyPanel.reducePopulation=Jei sumažinsit gyventojus žemiau %number% ,%colony% nebegalės statyti %buildable%. colonyPanel.unitChange=Įeinant į kolonija jūsų %oldType% tapo padaliniu %newType%. colonyPanel.bonusLabel=Premija:%number%%extra% @@ -1947,7 +2066,9 @@ colonyPanel.notBestTile=%unit% galėtų gaminti daugiau %goods% ant %tile%. confirmDeclarationDialog.areYouSure.no=Gal vėliau confirmDeclarationDialog.areYouSure.text=Atsisakykime neteisią monarcho %monarch% tironiją ir deklaruokime mūsų kolonijų nepriklausomybę nuo karūnos! confirmDeclarationDialog.areYouSure.yes=Laisvė arba mirtis! +# Fuzzy confirmDeclarationDialog.defaultCountry=Jungtinės Valstijos tautos %nation% +# Fuzzy confirmDeclarationDialog.defaultNation=Laisvi %nation% confirmDeclarationDialog.enterCountry=Nuo šiol mūsų šalis bus žinoma, kaip confirmDeclarationDialog.enterNation=ir kiekvienas mūsų šlovingos tautos pilietis turi didžiuotis, kad yra žinomas kaip @@ -1973,6 +2094,9 @@ europePanel.transaction.net=Pelnas:\t%gold% europePanel.transaction.price=Kaina:\t%gold% europePanel.transaction.purchase=Pirkti %amount% %goods% už %gold% europePanel.transaction.sale=Parduoti %amount% %goods% už %gold% +firstContactDialog.meeting.natives=Vietinių susitikimas +firstContactDialog.meeting.aztec=Actekų tauta +firstContactDialog.meeting.inca=Inkų imperija firstContactDialog.welcomeOffer.text=%nation% pasveikinti Jus. Mes šlovingą tautos %camps% %settlementType% . Norėdami švęsti mūsų draugystė, mes dosniai siūlome jums kraštą, kurį dabar užima kaip dovana. Ar jūs priimate mūsų sutartis ir guli su mumis taikos kaip broliai? firstContactDialog.welcomeSimple.text=%nation% pasveikinti Jus. Mes šlovingą tautos %camps% %settlementType% . Ar jūs priimate mūsų sutartis ir guli su mumis taikos kaip broliai? abandonColony.no=Atšaukti @@ -2011,6 +2135,7 @@ freecol.map.America_large=Amerikos (didelis) freecol.map.Australia=Australija freecol.map.Caribbean_basin=Karibų baseinas mapSizeDialog.mapSize=Pasirinkite žemėlapio dydį +modifierFormat.scopeMethod.isIndian.name=vietiniai newPanel.getServerList=Gauti serverių sąrašą newPanel.joinMultiPlayerGame=Jungtis prie kelių žaidėjų žaidimo newPanel.nationalAdvantages=Tautos privalumai diff --git a/data/strings/FreeColMessages_mk.properties b/data/strings/FreeColMessages_mk.properties index 016a1cf4f..314767b0a 100644 --- a/data/strings/FreeColMessages_mk.properties +++ b/data/strings/FreeColMessages_mk.properties @@ -92,7 +92,9 @@ cargoOnCarrier=Натоварено cashInTreasureTrain=Готовина во караванот со богатство clearOrders=Откажи наредби colonists=Колонисти +colonyCenter=колониски центар colopedia=Колопедија +countryName={{tag:country|%nation%}} difficulty=Тешкотија docks=Пристаништа dumpCargo=Исфрли го товарот @@ -167,6 +169,7 @@ cli.error.home.notDir=%string% не претставува папка. cli.error.home.notExists=Матичната папка %string% не постои. cli.error.save=Не можам да ја прочитам зачуваната игра %string%. cli.error.serverPort=%string% не претставува важечки број на порта. +cli.error.splash=Не ја пронајдов податотеката %name% за најавата. cli.error.timeout=%string% е прекусо (помалку од %minimum%). cli.advantages=задај тип на ПРЕДНОСТИ (%advantages%) cli.check-savegame.failure=Проверката на доследноста на зачувувањето на играта не успеа. Погледајте во дневничката евиденција за повеќе. @@ -195,10 +198,12 @@ cli.no-intro=прескокни го воведното видео cli.no-java-check=прескокни ја проверката на верзија на Java cli.no-memory-check=прескокни ја проверката на памтењето cli.no-sound=пушти го FreeCol без звук +cli.no-splash=изостави ја најавата cli.private=започнете доверлив опслужувач (не се објавува на метаопслужувачот) cli.seed=овозможи SEED за создавачот на псевдослучајни броеви -cli.server-name=назначете НАЗИВ на опслужувачот +# Fuzzy cli.server=започни самостоен опслужувач на назначената порта +cli.server-name=назначете НАЗИВ на опслужувачот cli.splash=прикажи ПОДАТОТЕКА од слика при вчитување на играта cli.tc=вчитај правилник на игра со назначеното ИМЕ cli.timeout=колку секунди опслужувачот чека одговор на прашањето @@ -267,7 +272,6 @@ colopediaAction.goods.name=Стока colopediaAction.nations.name=Нации colopediaAction.nationTypes.name=Национални предности colopediaAction.resources.name=Бонус ресурси -colopediaAction.skills.name=Занаети colopediaAction.terrain.name=Видови терен colopediaAction.units.name=Единици colopediaAction.name=%object% (Колопедија) @@ -498,6 +502,10 @@ model.option.interventionForce.name=Интервенциски сили model.option.interventionForce.shortDescription=Интервенциските сили што ви се испорачуваат за да ве поддржат во Војната за независност. model.option.mercenaryForce.name=Платеничка војска model.option.mercenaryForce.shortDescription=Платеничката војска понудена како помош во вашата Војна за независност +model.option.warSupportForce.name=Сили за воена поддршка +model.option.warSupportForce.shortDescription=Максималниот број на сили што во Владетелот ги нуди во поддршка на вашите војни. +model.option.warSupportGold.name=Злато за воена поддршка +model.option.warSupportGold.shortDescription=Максималното количество на злато што Владетелот го нуди во поддршка на вашите војни. model.difficulty.government.name=Управа model.option.badGovernmentLimit.name=Граница на лоша управа model.option.badGovernmentLimit.shortDescription=Најголем можен број на ројалисти што не предизвикуваат казна за производство. @@ -1605,7 +1613,7 @@ model.improvement.road.description=Пат model.improvement.road.name=Пат model.improvement.road.occupationString=R model.limit.independence.coastalColonies.name=Граница за крајбрежни колонии -model.limit.independence.coastalColonies.description=Ви требаат барем %limit% крајбрежни колонии за да прогласите независност. +model.limit.independence.coastalColonies.description=Ви требаат барем %limit% {{plural:%limit%|one=крајбрежна колонија|other=крајбрежни колонии}} за да прогласите независност. model.limit.independence.rebels.name=Ограничување за бунтовници model.limit.independence.rebels.description=Барем %limit%% ваши доселеници мора да поддржуваат независност. model.limit.independence.year.name=Огран. на година @@ -1960,6 +1968,7 @@ model.colony.badGovernment=Управата на %colony% е неефиканс model.colony.goodGovernment=Ефикасноста на управата е подобрена! Бунтовничкото расположение во %colony% сега изнесува или надминува %number% проценти. model.colony.governmentImproved1=Управата %colony% е подобрена, но сè уште е неефикасна. Следат казни за производството. model.colony.governmentImproved2=Управата на %colony% е подобрена. Веќе нема да следат казни за производството. +# Fuzzy model.colony.insufficientProduction=Може да се произведе уште %outputAmount% %outputType% во %colony%, ако имаме повеќе %inputAmount% %inputType% surplus. model.colony.lostGoodGovernment=Ефикасноста на управата е влошена! Бунтовничкото расположение во %colony% падна под %number% проценти. Колонијата повеќе не добива производствен бонус. model.colony.lostVeryGoodGovernment=Ефикасноста на управата е влошена! Бунтовничкото расположение во %colony% повеќе не изнесува или надминува %number% проценти. Изгубени се и некои бонуси за производство. @@ -1974,12 +1983,17 @@ model.colony.veryBadGovernment=Управата на %colony% е многу не model.colony.veryGoodGovernment=Ефикасноста на управата е подобрена! Бунтовничкото расположение во %colony% сега изнесува над %number% проценти. model.colonyTile.claim=(положи право на %direction%) model.diplomaticTrade.receive.contact=Братски поздрав од величествените %nation%. +# Fuzzy model.diplomaticTrade.receive.diplomatic=Да преговараме со %nation%те. model.diplomaticTrade.receive.trade=Да ја разгледаме понудата на %nation%те. +# Fuzzy model.diplomaticTrade.receive.tribute=%nation%те ни бараат данок! model.diplomaticTrade.send.contact=Наидовме на %nation%. +# Fuzzy model.diplomaticTrade.send.diplomatic=Да ја разгледаме нашата дипломатска ситуација со %nation%. +# Fuzzy model.diplomaticTrade.send.trade=Да им предложиме трговија на %nation% во %settlement%. +# Fuzzy model.diplomaticTrade.send.tribute=Побаруваме данок од %nation% во %settlement%. model.direction.N.name=север model.direction.NE.name=североисток @@ -1990,24 +2004,36 @@ model.direction.SW.name=југозапад model.direction.W.name=запад model.direction.NW.name=северозапад model.historyEventType.abandonColony.description=Ја напуштивте колонијата %colony%. +# Fuzzy model.historyEventType.ceaseFire.description=Примирје со %nation%. +# Fuzzy model.historyEventType.cityOfGold.description=%nation%те го открија градот %city% - еден од Седумте Златни Градови и во него богатство од %treasure% злато. -model.historyEventType.colonyConquered.description=Вашата колонија %colony% ја освоија %nation%те. +model.historyEventType.colonyConquered.description=Вашата колонија %colony% ја освоија {{tag:country|%nation%}}. +# Fuzzy model.historyEventType.colonyDestroyed.description=Вашата колонија %colony% е уништена од %nation%те. model.historyEventType.conquerColony.description=Ја освоивте колонијата %colony% на %nation%те. model.historyEventType.declareIndependence.description=Прогласивте независност од Круната. +# Fuzzy model.historyEventType.declareWar.description=Објавена е војна со %nation%. +# Fuzzy model.historyEventType.destroyNation.description=%nation%те ги уништија %nativeNation%те. +# Fuzzy model.historyEventType.destroySettlement.description=Ја уништивте населбата на %nation%те, %settlement%. model.historyEventType.discoverNewWorld.description=Го откривте Новиот Свет. +# Fuzzy model.historyEventType.discoverRegion.description=%nation%те ја открија областа %region%. +# Fuzzy model.historyEventType.formAlliance.description=Склучен сојуз со %nation%. model.historyEventType.foundColony.description=Ја основавте колонијата %colony%. model.historyEventType.foundingFather.description=%father% му се придружува на Континенталниот конгрес. model.historyEventType.independence.description=Постигнавте независност од Круната. +# Fuzzy model.historyEventType.makePeace.description=Договорен мир со %nation%. +# Fuzzy model.historyEventType.meetNation.description=Се сретнавте со %nation%те. +# Fuzzy model.historyEventType.nationDestroyed.description=%nation%те повеќе не се присутни во Новиот свет. +# Fuzzy model.historyEventType.spanishSuccession.description=%loserNation%те им ги предаваат своите колонии во Новиот Свет на %nation%те. model.indianSettlement.mostHatedNone=Нема model.indianSettlement.mostHatedUnknown=непозната @@ -2061,9 +2087,12 @@ model.messageType.warehouseCapacity.name=Капацитет на магацин model.messageType.warning.name=Предупредувања model.monarch.action.addToRef.text=Круната придодаде %number% {{plural:%number%|%unit%}} кон Кралските експедициони сили. Колонијалните лидери изразуваат загриженост. model.monarch.action.addToRef.no=Готово +# Fuzzy model.monarch.action.declarePeace.text=Милозливо се согласувме да склучиме мировен договор со %nation%те. model.monarch.action.declarePeace.no=Готово +# Fuzzy model.monarch.action.declareWar.text=Дрскоста на %nation%те Не принудува да им објавиме војна! +# Fuzzy model.monarch.action.declareWarSupported.text=Дрскоста на силите на %nation%те Нè принуди да им објавиме војна! За да се забрза оваа работа, Нашите верни единици (%force%) чекаат на вашите заповеди. Во вашата благајна се додадени %gold% злато. model.monarch.action.declareWar.no=Готово model.monarch.action.displeasure.text=Се осмелувате да ја прифатите Нашата великодушна понуда, но да не плаќате? Дебело ќе зажалите за ваквото лицемерие. @@ -2123,6 +2152,7 @@ model.player.colonialIndependence=Само колонијални играчи model.player.forces=Сили на %nation%те model.player.independentMarket=Европа model.player.startGame=По месеци пловидба, конечно пристигнавте на брегот на непознат континент. Запловите на {{tag:%direction%|west=запад|east=исток|default=со ветерот}} за да го откриете Новиот Свет и да го прогласите за посед на Круната. +# Fuzzy model.player.waitingFor=Ги чекаме: %nation%те model.regionType.coast.name=Крајбрежје model.regionType.coast.unknown=Непознато крајбрежје @@ -2163,6 +2193,7 @@ model.tradeItem.gold.name=Злато model.tradeItem.gold.description=во износ од %amount% злато model.tradeItem.goods.name=Стока model.tradeItem.incite.name=Објави војна на +# Fuzzy model.tradeItem.incite.description=војна против %nation% model.tradeItem.stance.name=Став model.tradeItem.unit.name=Единица @@ -2186,9 +2217,9 @@ model.unit.underRepair=Поправка (%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S +# Fuzzy model.unit.unitState.skipped=W model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G @@ -2229,6 +2260,7 @@ model.colony.warehouseSoonFull=Вашиот магацин во %colony% ќе г model.colony.warehouseWaste=Вашиот магацин во %colony% го надмина својот капацитет за %goods%. Мораше да се фрлат %waste% единици. model.colony.workersEvicted=Во %colony%, вашите колонисти повеќе не можат да работат %location% поради присуството на %enemyUnit%. model.colonyTile.resourceExhausted=Ресурсот %resource% се исцрпи во %colony% +# Fuzzy model.game.spanishSuccession=Ваше Превосходство, Војната за Шпанското наследство во Европа заврши. По Договорот од Утрехт, %loserNation%те беа принудени да им ги предадат сите нивни колонии во Новиот Свет на %nation%те! model.indianSettlement.mission.denounced=Вашиот мисионер во %settlement% е осуден и погубен! model.indianSettlement.mission.destroyed=Вашиот мисионер во %settlement% загина во уништувањето на местото. @@ -2238,6 +2270,7 @@ model.player.autoRecruit=Поради верските немири во %europe model.player.colonyGoodsParty.harbour=Вашите колонисти во %colony% фрлија %amount% единици %goods% во пристаништето во знак за протест против неправедните даноци на Круната! model.player.colonyGoodsParty.horses=Вашите колонисти во %colony% пуштија на слобода %amount% коњи во знак на протест против ова неправедно оданочување од Круната! model.player.colonyGoodsParty.landLocked=Вашите колонисти во %colony% изгореа %amount% единици %goods% на пазариштето во знак за протест против неправедните даноци на Круната! +# Fuzzy model.player.dead.european=Ваше Превосходство, %nation%те прогласија безусловно повлекување од Новиот Свет. model.player.dead.native=Ваше Превосходство, %nation%те се уништени. model.player.disaster.bankruptcy.start=Не плативте за одржување на зградите. Следува тешка производствена казна. @@ -2251,12 +2284,16 @@ model.player.ignoredTax=Круната ја накачи даночната ст model.player.interventionForceArrives=Пристигнаа ветените интервенциони сили! model.player.soLDecrease=Членството во Синовите на Слободата во вашите колонии се намали на %newSoL% проценти! model.player.soLIncrease=Членството во Синовите на Слободата во вашите колонии порасна на %newSoL% проценти! +# Fuzzy model.player.stance.alliance.declared=Ваше Превосходство, %nation%те се во сојуз со нас! model.player.stance.alliance.others=Ваше Превосходство, %attacker%те имаат склучено сојуз со %defender%те. +# Fuzzy model.player.stance.ceaseFire.declared=Ваше Превосходство, %nation%те се сложија на примирје со нас. model.player.stance.ceaseFire.others=Ваше Превосходство, %attacker%те се сложија на примирје со %defender%те. +# Fuzzy model.player.stance.peace.declared=Ваше Превосходство, %nation%те се во мир со нас. model.player.stance.peace.others=Ваше Превосходство, %attacker%те се во мир со %defender%те. +# Fuzzy model.player.stance.war.declared=Лоши вести, Ваше Превосходство. %nation%те ни објавија војна! model.player.stance.war.others=Ваше Превосходство, %attacker%те им објавија војна на %defender%те. combat.automaticDefence=Вашиот %unit% во %colony% грабна оружје за да ја одбрани колонијата! @@ -2272,6 +2309,7 @@ combat.enemyShipEvaded=%enemyNation% %enemyUnit% избегна напад од combat.enemyShipSunk=%unit% потопи %enemyNation% %enemyUnit%! combat.equipmentCaptured=Внимавајте, %nation%те набавија %equipment%! combat.goodsStolen=%enemyNation% %enemyUnit% украде %amount% %goods% од %colony%! +# Fuzzy combat.indianPlunder=%enemyNation% %enemyUnit% ограби %amount% од %colony%. combat.indianRaid=Нашите шпиони известуваат дека %nation%те ја нападнале и ограбиле колонијата %colony% на %colonyNation%те. combat.indianSurprise=%nation%те извршија ненадеен напад врз %colony%, и ова ги растревожи нашите колонисти. Поглавицата на %nation%те вели дека тие не се вмешани. @@ -2327,6 +2365,7 @@ main.javaVersion=За FreeCol се препорачува Java-верзија %m main.memory=Треба да зададете повеќе од %memory% бајти склад за JVM.\n Пуштете го FreeCol одново со: java -Xmx%minMemory%M -jar FreeCol.jar main.userDir.fail=FreeCol не може да најде соодветни папки за да ги зачува корисничките податоци. Продолжувам понатаму, но очекувајте проблем. client.baseData=Не можев да ја пронајдам основната папка %dir%.\n FreeCol не можеше да ги најде податоците.\n Проверете дали се присутни таму.\n Ако FreeCol бара во погрешна папка, тогаш\n пуштете ја играта со наредбениот параметар:\n --freecol-data +# Fuzzy client.choicePlayer=Одберете играч: client.classic=Не можев да го вчитам пресликувањето од правилникот „класично“. client.debugConnect=Не можете да се поврзете на постоечка игра во режимот за отстранување гршеки. @@ -2339,8 +2378,10 @@ metaServer.couldNotConnect=Жалам, не можам да се поврзам metaServer.communicationError=Се појави грешка при поврзувањето со метасерверот. Обидете се поодоцна. abandonEducation.action.studying=учи abandonEducation.action.teaching=обучува +# Fuzzy abandonEducation.no=Не, нека продолжи со обуката abandonEducation.text=Доколку вашиот %unit% ја напушти колонијата %colony%, тоа значи дека ќе прстане да %action% во %building%. Дали сте сигурни дека сакате да напушти? +# Fuzzy abandonEducation.yes=Да, нека ја напушти колонијата abandonTeaching.text=Вашиот %unit% ќе престане да предава ако напушти од %building%. Дали сте сигурни дека треба да напушти? armedUnitSettlement.attack=Нападни @@ -2352,10 +2393,14 @@ buy.takeOffer=Прифати ја понудата buy.text=%nation%те сакаат да продадат %goods% за %gold%: clearTradeRoute.text=На вашиот %unit% му е доделен трговскиот пат %route%. Ако му ја зададете оваа одредница, тогаш ќе го оттргнете од таа маршрута. Дали сте сигурни? client.fullScreen=Овој графички уред не поддржува целоекранско играње.\nВраќам на прозорски режим. +# Fuzzy confirmHostile.alliance=Не можете да напаѓате сојузници! Дали навистина сакате да го растурите сојузот со %nation%те и да им објавите војна? +# Fuzzy confirmHostile.ceaseFire=Имате потпишано примирје со %nation%те. Дали навистина сакате да ги нападнете? +# Fuzzy confirmHostile.peace=Сега сте во мирни односи со %nation%те. Дали навистина сакате да ијм објавите војна? confirmHostile.yes=Да, пушти ги пците на војната! +# Fuzzy confirmTribute.broke=Нашите шпиони нè известуваат дека %nation%те се сосема шворц. Да не си го губиме времето барајќи дарови. confirmTribute.european=%nation%те %danger% и %finance%. Колку да им побараме да даруваат? confirmTribute.happy=%nation%те во %settlement% ни се добри побратими и ќе биде неубаво да го расипеме другарството. @@ -2375,6 +2420,7 @@ indianLand.cancel=Напушти ја земјата indianLand.pay=Понуди %amount% злато за земјата indianLand.take=Да го земеме она што со право ни следува indianLand.text=Оваа земја ја поседува %player%. Дали би сакале да: +# Fuzzy indianLand.unknown=Земјава е населена со некој непознат народ. Дали би сакале да: info.autodetectLanguageSelected=Избравте автоматско распознавање на јазикот. Ова ќе биде извршено кога ќе ја превклучите играта одново. info.enterSomeText=Внесете некаков текст. @@ -2420,7 +2466,9 @@ defeated.text=Претрпевте пораз! Дали би сакале да: defeated.yes=Останете и набљудувате defeatedSinglePlayer.text=Претрпевте пораз!\n\nСега настапи едно многу глуво доба, кога црквите спијат и самиот пекол издишува болести во светов, кога можам да пијам топла крв! и да правам такви работи, што денот од нив ќе затрепери од еден поглед на нив. defeatedSinglePlayer.yes=Влези во одмазднички режим +# Fuzzy diplomacy.offerAccepted=%nation%те ја прифатија вашата великодушна понуда. +# Fuzzy diplomacy.offerRejected=%nation%те ја одбија вашата великодушна понуда. disbandUnit.text=Дали сигурно сакате да ја распуштите оваа единица? disbandUnit.yes=Распушти @@ -2466,7 +2514,9 @@ move.noAccessGoods=%nation%те нема да тргуваат со празен move.noAccessMissionBan=%nation%те одбиваат секаков контакт со вашите мисионери. move.noAccessSettlement=%nation%те не му дозволуваат на нашиот %unit% да влезе во нивната населба. move.noAccessSkill=Нашиот %unit% не може да учи од домородците. +# Fuzzy move.noAccessTrade=Не сме овластени да тргуваме со други европски земји како %nation%те. +# Fuzzy move.noAccessWar=Не можеме да тргуваме со %nation%те додка сме во војна. move.noAccessWater=Нашиот %unit% мора да се искрца за да може да влезе во населбата. move.noAttackWater=Нашиот %unit% мора да се истовари на копно пред да нападне. @@ -2523,6 +2573,7 @@ server.invalidPlayerNations=Пред да почне играта, сите иг server.maximumPlayers=Жалиме, веќе е достигнат максималниот број на играчи. server.missingUserName=Во барањето за најава нема наведено корисничко име. server.missingVersion=Во барањето за најава нема наведено верзија на FreeCol. +# Fuzzy server.noRouteToServer=Опслужувачот не може да се направи да биде јавен. Треба да ги измените нагодувања за заштита (firewall) и со тоа да дозволите поврзувања со назначената порта. server.noSuchPlayer=Во играта нема играч наречен: %player% server.notAllReady=Не сите играчи се спремни да ја почнат играта! @@ -2532,6 +2583,7 @@ server.timeOut=Времето за поврзување со северот ис server.userNameInUse=Наведеното корисничко име е зафатено. server.userNameNotPresent=Внесеното корисничко име го нема во играта. server.wrongFreeColVersion=Верзијата на FreeCol кај клиентот не се совпаѓа со верзијата на опслужувачот. +# Fuzzy buildColony.others=%nation% ја основаше новата колонија %colony% во %region%. cashInTreasureTrain.colonial=Во Европа пристигна богатство од %amount% злато. Со ова заработивте %cashInAmount% злато. cashInTreasureTrain.independent=Во државната каса беше придодадено богатство од %amount%. @@ -2541,6 +2593,7 @@ declareIndependence.announce=Колониите на %oldNation%те прогл declareIndependence.continentalArmyMuster=Како поддршка на вашето прогласување на независност, %number% {{plural:%number%|%oldUnit%}} во %colony% {{plural:%number%|one=е унапреден|other=се унапредени}} во {{plural:%number%|%unit%}}! declareIndependence.interventionForce={{tag:country|%nation%}} свечено изјавува дека ќе испрати интервенциони сили во поддршка на вашата праведна борба за независност, доколку создадете %number% {{plural:%number%|one=Ѕвоно на слободата|other=Ѕвона на слободата}}, со што би ја докажале вашата решителност. declareIndependence.nativeSupport=%nation% ја огласи својата омраза кон %ruler% И Кралската експедициска сила. Ветија дека ќе ги напаѓаат во секоја прилика. +# Fuzzy declareIndependence.nativeHostile=Нашите шпиони известуваат дека Кралската експедициска сила воспостави пријателски односи со %nation%. Имајте на ум дека можеби планираат да нападнат! declareIndependence.resolution=На овој ден Конгресот го донесе најважното Решение на сите времиња во Америка.\n\nДобро знам колку Пот, Крв и Богатство ќе нè чини за да ја одржиме оваа Декларација, и да ги поддржиме и одбраниме овие Држави. Сепак, преку сета оваа Темнина ги гледам Зраците на занесната Светлина и Слава. Гледам дека Целта и тоа како ги оправдува Средствата. И дека Потомството ќе ликува во тие Денови, макар и Ние да зажалиме, што верувам во Бога, нема да се случи. \n\nНаскоро ќе надојдат Кралските експедициони сили. Внимателно подгответе се за одбрана додека собереме доброволци за нова Континентална Армија. declareIndependence.unitsSeized=Како реакција на вашето прогласување на независност, Круната ги конфискуваше следниве ваши единици во Европа и на море: %units% @@ -2639,6 +2692,7 @@ colopedia.unit.offensivePower=Нападна моќ: colopedia.unit.price=Цена во Европа: colopedia.unit.productionBonus={{plural:%number%|one=Изменител|other=Изменители}} на производството: colopedia.unit.requirements=Барања: +# Fuzzy colopedia.unit.school=Потребно училиште за обука: colopedia.unit.skill=Вештина: report.labour.allColonists=Сите колонисти @@ -2673,8 +2727,8 @@ report.colony.grow.header=+ report.colony.growing.description=%colony% може да се зголеми за {{plural:%amount%|one=една единица|other=%amount% единици}} без тоа да му наштети на производството report.colony.improve.description=Единици што можат да го подобрат производството. report.colony.improve.header=Подобрување +# Fuzzy report.colony.improving.description=%colony%: За да правите уште %amount% %goods%, заменете го %oldUnit% со %unit% -report.colony.wanting.description=%colony%: За да правите уште %amount% %goods%, додајте %unit% report.colony.making.blocking.description=%colony%: Се бара %amount% %goods% %buildable% {{plural:%turns%|one=за следниот потег|other=во рок од %turns% потези}} report.colony.making.constructing.description=%colony%: %buildable% завршува {{plural:%turns%|one=следниот потег|other=за %turns% потези}} report.colony.making.description=Што изработува колонијата @@ -2684,20 +2738,17 @@ report.colony.making.noconstruction.description=%colony%: Не се одвива report.colony.making.noteach.description=%colony%: %teacher% нема ученик report.colony.name.description=Списокот на колонии report.colony.name.header=Колонија -report.colony.plow.description=Број на полиња во колонијата што ќе имаат корист од Орање -report.colony.plow.header=О -report.colony.plowing.description=%colony% ќе има корист од орање на {{plural:%amount%|one=едно поле|other=%amount% полиња}} -report.colony.production.description=%colony%: нето производство на %goods% = %amount% -report.colony.production.export.description=%colony%: нето производството на %goods% изнесува %amount% (го извезуваме остатокот над %export%) +report.colony.production.description=%colony%: Се произведуваат %amount% %goods% +report.colony.production.export.description=%colony%: Се произведуваат %amount% %goods% (сè над %export% оди за извоз) report.colony.production.header=Нето производство на %goods% -report.colony.production.high.description=%colony%: нето производство на %goods% = %amount%, што ќе се наполни {{plural:%turns%|one=со следниот потег|other=во рок од %turns% потези}} +report.colony.production.high.description=%colony%: Се произведуваат %amount% %goods%, што ќе се наполни {{plural:%turns%|one=со следниот потег|other=во рок од %turns% потези}} +# Fuzzy report.colony.production.low.description=%colony%: нето производство на %goods% = %amount%, што ќе го снема {{plural:%turns%|one=со следниот потег|other=во рок од %turns% потези}} +# Fuzzy report.colony.production.waste.description=%colony%: нето производство на %goods% = %amount% - складиштето ќе се прелее, со загуба од %waste% -report.colony.road.description=Број на полиња во колонијата што ќе имаат корист од изградба на Патишта -report.colony.road.header=П -report.colony.roadBuilding.description=%colony% ќе има корист од изградба на {{plural:%amount%|one=пат|other=%amount% патишта}} report.colony.shrinking.description=%colony% мора да се намали за {{plural:%amount%|one=една единица|other=%amount% единици}} за да го подобри производството report.colony.starving.description=%colony%: прегладнување {{plural:%turns%|one=со следниот потег|other=за %turns% потези}} +report.colony.wanting.description=%colony% %location%: За да правите уште %amount% %goods%, додајте %unit% report.continentalCongress.available=Достапно report.continentalCongress.elected=Избрани: %turn% report.continentalCongress.none=(нема) @@ -2742,29 +2793,28 @@ report.production.selectGoods=Изберете стока report.production.update=Надградби report.requirements.badAssignment=%colony% има %expert% што моментално работи како %expertWork% и %nonExpert% што работи како %nonExpertWork%. Производството ќе се зголеми ако тие си ги сменат занаетите. report.requirements.canTrainExperts={{plural:2|%unit%}} можат да се обучат во -report.requirements.clearTile=Би било корисно да се исчисти %type% на %direction% од %colony%. -report.requirements.exploreTile=Би било корисно да се истражи %type% на %direction% од %colony%. +report.requirements.exploreTile=Би било корисно да се истражи %location%. report.requirements.met=Сите услови се задоволени. report.requirements.missingGoods=%colony% произведува %goods%, но им треба повеќе %input%. report.requirements.misusedExperts={{plural:2|%unit%}} што не работат како %work% се во report.requirements.noExpert=%colony% произведува %goods%, но нема %unit%. -report.requirements.plowCenter=Би било корисно да се изора полето на %colony%. -report.requirements.plowTile=Би било корисно да се изора %type% на %direction% од %colony%. -report.requirements.roadTile=Би било корисно да се направат патишта во %type% на %direction% од %colony%. report.requirements.severalExperts=Неколку {{plural:2|%unit%}} се наоѓаат во report.requirements.surplus=Вишок %goods% се произведува во report.trade.afterTaxes=Приход по оданочување report.trade.beforeTaxes=Приход пред оданочување report.trade.cargoUnits=Единици за превоз +# Fuzzy report.trade.hasCustomHouse=* Оваа колонија има царинарница; овие стоки се извезуваат. report.trade.totalDelta=Вкупно производство report.trade.totalUnits=Вкупно единици report.trade.unitsSold=Единици купени или продадени report.turn.filter=Не прикажувај пораки од овој тип (%type%) report.turn.ignore=Ингорирај ја оваа порака (Колонија: %colony%, Стока: %goods%) +# Fuzzy report.turn.playerNation=%player% - %nation% aboutPanel.copyright=Авторски права © 2002-2015 Екипата на FreeCol aboutPanel.legalDisclaimer=FreeCol е слободен програм: можете да го распространувате и /или менувате во согласност со условите на ГНУ-овата општа јавна лиценца, објавена од Фондацијата за слободна програмска опрема, верзија 2 и сите понови верзии. +aboutPanel.manual=Преземете го Прирачникот за FreeCol aboutPanel.officialSite=Официјална страница: aboutPanel.sfProject=Проект во SourceForge: aboutPanel.version=Верзија: @@ -2787,7 +2837,7 @@ colonyPanel.buildQueue=Ред на чекање за изградба colonyPanel.colonyUnits=Единици на колонијата colonyPanel.inPort=На пристаништето colonyPanel.outsideColony=Вон колонијата -colonyPanel.producing=Произведува: +colonyPanel.producing=произведува: colonyPanel.reducePopulation=Ако го намалите насленението под %number%, %colony% повеќе нема да може да гради %buildable%. colonyPanel.setGoods=Задај стоки colonyPanel.traceWork=Проследи работа @@ -2802,8 +2852,8 @@ confirmDeclarationDialog.areYouSure.no=Можеби подоцна confirmDeclarationDialog.areYouSure.text=Ајде да ја отфрлиме оваа неправедна тиранија на %monarch% и да прогласиме независност на нашите колонии од круната! confirmDeclarationDialog.areYouSure.yes=Слобода или смрт! confirmDeclarationDialog.createFlag=и душманите ќе треперат кога ќе го здогледаат нашиот смел бајрак. -confirmDeclarationDialog.defaultCountry=Соединети Држави на %nation% -confirmDeclarationDialog.defaultNation=Слободни %nation% +confirmDeclarationDialog.defaultCountry=Соединети држави на {{tag:country|%nation%}} +confirmDeclarationDialog.defaultNation=Слободна {{tag:country|%nation%}} confirmDeclarationDialog.enterCountry=Отсега нашата земја ќе се нарекува confirmDeclarationDialog.enterNation=и секој граѓанин на нашата славна нација ќе се гордее со тоа што ќе се нарекува flag.background.FESSES=Превез @@ -2854,10 +2904,10 @@ negotiationDialog.add=Додај negotiationDialog.cancel=Откажи negotiationDialog.clear=Исчисти negotiationDialog.contact.tutorial=Сретнавте Европејци како вас. Тие ќе се натпреваруваат со вас за земја и богатства, а може и против вас да започнат војна. Но откако Јан де Вит ќе стапи во Континенталниот конгрес, вие ќе можете да тргувате со нив. -negotiationDialog.demand=%nation%те од %otherNation%те бараат +negotiationDialog.demand={{tag:country|%nation%}} бара од {{tag:country|%otherNation%}} negotiationDialog.exchange=во замена за negotiationDialog.goldAvailable=(%amount% злато на располагање) -negotiationDialog.offer=%nation%те им нудат на %otherNation%те +negotiationDialog.offer={{tag:country|%nation%}} нуди на {{tag:country|%otherNation%}} negotiationDialog.send=Испрати negotiationDialog.title.contact=Средба со други Европејци. negotiationDialog.title.diplomatic=Дипломатски преговори @@ -2880,10 +2930,10 @@ findSettlementPanel.displayOnlyEuropean=Пронајди само европск findSettlementPanel.displayOnlyNatives=Пронајди само домородни населби findSettlementPanel.name=Пронајди населба findSettlementPanel.settlement=%name%%capital% (%nation%) -firstContactDialog.meeting.natives=Се среќавате со домородците... +firstContactDialog.meeting.natives=Средба со домородците firstContactDialog.meeting.natives.tutorial=Се сретнавте со домородци. Испратете ги вашите извидници за да дознаат повеќе за нив, а наемните слуги и слободните колонисти за да учат од нив. Испратете ги вашите бродови и каравани во нивните населби ако сакате да тргувате со нив. -firstContactDialog.meeting.AZTEC=Ацтеките -firstContactDialog.meeting.INCA=Царството на Инките +firstContactDialog.meeting.aztec=Ацтеките +firstContactDialog.meeting.inca=Царство на Инките firstContactDialog.welcomeOffer.text=%nation%те ви пожелуваат добредојде. Ние сме славен народ со %camps% %settlementType%. Во чест на нашето пријателство великодушно ви ја нудиме земјата на којашто сега престојувате. Дали ќе ја прифатите нашата спогодба, за да живееме мирно и братски? firstContactDialog.welcomeSimple.text=%nation%те ви пожелуваат добредојде. Ние сме славен народ со %camps% %settlementType%. Дали ќе ја прифатите нашата спогодба, за да живееме мирно и братски? abandonColony.no=Откажи @@ -2926,6 +2976,7 @@ freecol.map.Australia=Австралија freecol.map.Caribbean_basin=Карипски Бразил mapSizeDialog.mapSize=Одберете големина на картата modifierFormat.unknown=??? +modifierFormat.scopeMethod.isIndian.name=домородци monarchDialog.default=Порака од Круната newPanel.editDifficulty=Измени тешкотија newPanel.getServerList=Преземи список на опслужувачи @@ -3165,6 +3216,7 @@ model.nation.dutch.ship.47=Ку model.nation.dutch.ship.48=Лифде model.nation.dutch.ship.49=Макрел model.nation.dutch.ship.50=Мехт ван Енкхејзен +# Fuzzy model.nation.dutch.ship.51=Малкејт или Мелкмејт model.nation.dutch.ship.52=Маргрит model.nation.dutch.ship.53=Мевкен @@ -3554,6 +3606,7 @@ model.nation.french.settlementName.classic.62=Авр Сен Пјер model.nation.french.settlementName.classic.63=Порт Мение model.nation.french.settlementName.classic.64=Портаж ла Прери model.nation.french.settlementName.classic.65=Сен Бонифас +# Fuzzy model.nation.french.settlementName.freecol.0=Вил де Кебек model.nation.french.settlementName.freecol.1=Шарлфор model.nation.french.settlementName.freecol.2=Микелон @@ -3977,15 +4030,25 @@ model.nation.portuguese.region.river.21=Потенги model.nation.portuguese.region.river.22=Сао Франсиско model.nation.portuguese.region.river.23=Паранаиба model.nation.portuguese.region.river.24=Тјете +# Fuzzy model.nation.portuguese.region.mountain.1=Сера да Естрела +# Fuzzy model.nation.portuguese.region.mountain.2=Сера до Морио +# Fuzzy model.nation.portuguese.region.mountain.3=Сера де Санта Барбара +# Fuzzy model.nation.portuguese.region.mountain.4=Сера да Рибериња +# Fuzzy model.nation.portuguese.region.mountain.5=Сера да Боа Вијажем +# Fuzzy model.nation.portuguese.region.mountain.6=Сера да Марофа +# Fuzzy model.nation.portuguese.region.mountain.7=Сера до Бусако +# Fuzzy model.nation.portuguese.region.mountain.8=Сера да Короа +# Fuzzy model.nation.portuguese.region.mountain.9=Сера де Синтра +# Fuzzy model.nation.portuguese.region.mountain.10=Монте Паскоал model.nation.portuguese.region.mountain.11=Сера Жерал model.nation.portuguese.region.mountain.12=Сера до Мар diff --git a/data/strings/FreeColMessages_ms.properties b/data/strings/FreeColMessages_ms.properties index d6b67ee71..fe90f6c7c 100644 --- a/data/strings/FreeColMessages_ms.properties +++ b/data/strings/FreeColMessages_ms.properties @@ -191,8 +191,9 @@ cli.no-memory-check=langkau penyemakan ingatan cli.no-sound=jalankan FreeCol tanpa bunyi cli.private=mulakan pelayan persendirian (tidak diterbitkan ke dalam metapelayan) cli.seed=berikan BENIH untuk penjana nombor rawak palsu -cli.server-name=nyatakan NAMA tersuai untuk pelayan ini +# Fuzzy cli.server=mulakan pelayan kendiri pada port yang ditetapkan +cli.server-name=nyatakan NAMA tersuai untuk pelayan ini cli.splash=paparkan FAIL imej skrin splash ketika memuatkan permainan cli.tc=muatkan set peraturan dengan NAMA yang diberikan cli.timeout=bilangan saat untuk pelayan menunggu jawapan kepada soalan @@ -255,7 +256,6 @@ colopediaAction.goods.name=Barangan colopediaAction.nations.name=Bangsa colopediaAction.nationTypes.name=Kelebihan Bangsa colopediaAction.resources.name=Sumber Bonus -colopediaAction.skills.name=Kemahiran colopediaAction.terrain.name=Jenis Rupa Bumi colopediaAction.units.name=Unit colopediaAction.name=%object% (Colopedia) @@ -1362,6 +1362,7 @@ model.improvement.road.description=Jalan model.improvement.road.name=Jalan model.improvement.road.occupationString=J model.limit.independence.coastalColonies.name=Had Koloni Pantai +# Fuzzy model.limit.independence.coastalColonies.description=Anda memerlukan sekurang-kurangnya %limit% koloni pinggir pantai untuk mengisytiharkan kemerdekaan. model.limit.independence.rebels.name=Had Pemberontak model.limit.independence.rebels.description=Sekurang-kurangnya %limit%% kolonis anda mesti menyokong kemerdekaan. @@ -1682,6 +1683,7 @@ model.colony.badGovernment=Pemerintahan %colony% tidak cekap dan berdepan dengan model.colony.goodGovernment=Kecekapan pemerintahan telah bertambah! Sentimen pemberontak di %colony% kini bersamaan atau melebihi %number% peratus. model.colony.governmentImproved1=Kecekapan pemerintahan %colony% bertambah baik tetapi masih tidak memuaskan, oleh itu ia masih berdepan dengan denda pengeluaran. model.colony.governmentImproved2=Kecekapan pemerintahan %colony% telah meningkat dan tidak berdepan dengan denda pengeluaran. +# Fuzzy model.colony.insufficientProduction=%outputAmount% lagi %outputType% boleh dihasilkan di %colony%, kalaulah kita dapat lebihan %inputAmount% lagi %inputType%. model.colony.lostGoodGovernment=Kecekapan pemerintahan telah merosot! Sentimen pemberontak di %colony% tidak lagi bersamaan atau melebihi %number% peratus. Koloni tidak lagi meraih bonus pengeluaran. model.colony.lostVeryGoodGovernment=Kecekapan pemerintahan telah merosot! Sentimen pemberontak di %colony% tidak lagi bersamaan atau melebihi %number% peratus. Bonus pengeluaran pun susut. @@ -1696,12 +1698,17 @@ model.colony.veryBadGovernment=Pemerintahan %colony% tidak cekap sekali dan berd model.colony.veryGoodGovernment=Kecekapan pemerintahan telah bertambah! Sentimen pemberontak di %colony% kini bersamaan atau melebihi %number% peratus. model.colonyTile.claim=(menuntut %direction%) model.diplomaticTrade.receive.contact=Salam persaudaraan dari bangsa %nation% yang luhur. +# Fuzzy model.diplomaticTrade.receive.diplomatic=Mari kita berunding dengan %nation%. model.diplomaticTrade.receive.trade=Mari kita pertimbangkan tawaran perdagangan oleh %nation%. +# Fuzzy model.diplomaticTrade.receive.tribute=%nation% menuntut ufti daripada kita! model.diplomaticTrade.send.contact=Kita telah bertemu dengan suku-sakat bangsa %nation%. +# Fuzzy model.diplomaticTrade.send.diplomatic=Mari kita pertimbangkan situasi diplomatik kami dengan %nation%. +# Fuzzy model.diplomaticTrade.send.trade=Mari kita usulkan perdagangan dengan %nation% di %settlement%. +# Fuzzy model.diplomaticTrade.send.tribute=Kami menuntut ufti daripada %nation% di %settlement%. model.direction.N.name=utara model.direction.NE.name=timur laut @@ -1712,25 +1719,37 @@ model.direction.SW.name=barat daya model.direction.W.name=barat model.direction.NW.name=barat laut model.historyEventType.abandonColony.description=Anda meninggalkan koloni %colony%. +# Fuzzy model.historyEventType.ceaseFire.description=Gencatan senjata dengan %nation%. +# Fuzzy model.historyEventType.cityOfGold.description=%nation% menemui %city%, salah satu daripada Tujuh Kota Emas, dan harta karun %treasure% emas. +# Fuzzy model.historyEventType.colonyConquered.description=Koloni anda, %colony% ditakluki oleh %nation%. +# Fuzzy model.historyEventType.colonyDestroyed.description=Koloni anda, %colony% dimusnahkan oleh %nation%. # Fuzzy model.historyEventType.conquerColony.description=Tergamak kamu menerima syarat-syarat beta yang baik hati dan mengelak daripada pembayaran? Kependuaan sebegini akan menerima padah daripada kemurkaan beta. # Fuzzy model.historyEventType.declareIndependence.description=Anda memusnahkan penempatan %nation%, %settlement%. +# Fuzzy model.historyEventType.declareWar.description=Perang diisytiharkan terhadap %nation%. +# Fuzzy model.historyEventType.destroyNation.description=%nation% menghancurkan %nativeNation%. model.historyEventType.discoverNewWorld.description=Anda menemui Dunia Baru. +# Fuzzy model.historyEventType.discoverRegion.description=%nation% menemui %region%. +# Fuzzy model.historyEventType.formAlliance.description=Perikatan dirundingkan dengan %nation%. model.historyEventType.foundColony.description=Anda menubuhkan koloni %colony%. model.historyEventType.foundingFather.description=%father% menyertai Kongres Kebenuaan. model.historyEventType.independence.description=Anda mencapai kemerdekaan daripada Kerajaan. +# Fuzzy model.historyEventType.makePeace.description=Perdamaian dicapai dengan %nation%. +# Fuzzy model.historyEventType.meetNation.description=Anda bertemu dengan %nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=%nation% tiada lagi wujud di Dunia Baru. +# Fuzzy model.historyEventType.spanishSuccession.description=%loserNation% menyerahkan semua koloninya di Dunia Baru kepada %nation%. model.indianSettlement.mostHatedNone=Tiada model.indianSettlement.mostHatedUnknown=Tidak diketahui @@ -1781,8 +1800,10 @@ model.messageType.warehouseCapacity.name=Muatan Gudang model.messageType.warning.name=Amaran model.monarch.action.addToRef.text=Kerajaan telah menambahkan %number% {{plural:%number%|%unit%}} ke dalam Angkatan Ekspedisi Diraja. Ketua koloni meluahkan kebimbangan. model.monarch.action.addToRef.no=Siap +# Fuzzy model.monarch.action.declarePeace.text=Beta dengan segala baik budi telah bersetuju untuk memeterai perjanjian damai bersama %nation%. model.monarch.action.declarePeace.no=Siap +# Fuzzy model.monarch.action.declareWar.text=Keangkuhan angkatan %nation% memaksa beta untuk mengisytiharkan perang ke atas mereka! model.monarch.action.declareWar.no=Siap # Fuzzy @@ -1842,6 +1863,7 @@ model.player.colonialIndependence=Pemain koloni sahaja boleh mengisytiharkan kem model.player.forces=Angkatan %nation% model.player.independentMarket=Eropah model.player.startGame=Selepas berbulan-bulan di lautan, akhirnya anda tiba di pantai sebuah benua yang tidak dikenali. Berlayar ke {{tag:%direction%|west=arah barat|east=arah timur|default=dalam angin}} untuk menemui Dunia Baru dan menuntutnya bagi pihak Kerajaan. +# Fuzzy model.player.waitingFor=Menunggu: %nation% model.regionType.coast.name=Pantai model.regionType.coast.unknown=Kawasan Pantai yang Tidak Dikenali @@ -1881,6 +1903,7 @@ model.tradeItem.gold.name=Emas model.tradeItem.gold.description=jumlah %amount% emas model.tradeItem.goods.name=Barangan model.tradeItem.incite.name=Isytiharkan perang terhadap +# Fuzzy model.tradeItem.incite.description=perang terhadap %nation% model.tradeItem.stance.name=Pendirian model.tradeItem.unit.name=Unit @@ -1901,6 +1924,7 @@ model.unit.unitState.fortified=K model.unit.unitState.fortifying=K model.unit.unitState.inColony=K model.unit.unitState.sentry=S +# Fuzzy model.unit.unitState.skipped=L model.unit.unitState.toAmerica=P model.unit.unitState.toEurope=P @@ -1941,6 +1965,7 @@ model.colony.warehouseSoonFull=Gudang anda di %colony% akan mencecah muatannya u model.colony.warehouseWaste=Gudang anda di %colony% telah mencecah muatannya untuk %goods%. %waste% unit terbazir. model.colony.workersEvicted=Di %colony%, ahli-ahli koloni anda tidak boleh bekerja di %location% lagi disebabkan kehadiran %enemyUnit%. model.colonyTile.resourceExhausted=Sumber %resource% yang kehabisan di %colony% +# Fuzzy model.game.spanishSuccession=Yang Mulia, Perang Rebut Takhta Sepanyol telah berakhir di Eropah. Mengikut Perjanjian Utrecht, %loserNation% terpaksa menyerahkan semua koloninya di Dunia Baru kepada %nation%! model.indianSettlement.mission.denounced=Mubaligh anda di %settlement% telah dikecam dan dihukum mati! model.indianSettlement.mission.destroyed=Mubaligh anda di %settlement% terkorban dalam kemusnahan petempatan tersebut. @@ -1950,6 +1975,7 @@ model.player.autoRecruit=Ketegangan agama di %europe% mendorong %unit% supaya be model.player.colonyGoodsParty.harbour=Para kolonis anda di %colony% telah mencampak %amount% unit %goods% ke dalam pelabuhan sebagai tanda bantahan terhadap pencukaian yang tidak adil oleh Kerajaan! model.player.colonyGoodsParty.horses=Kolonis-kolonis anda di %colony% telah melepaskan %amount% sebagai tanda membantah pencukaian Kerajaan yang tidak adil! model.player.colonyGoodsParty.landLocked=Para kolonis anda di %colony% telah membakar %amount% unit %goods% di medan pasar sebagai tanda bantahan terhadap pencukaian yang tidak adil oleh Kerajaan! +# Fuzzy model.player.dead.european=Yang Mulia, %nation% telah mengisytiharkan pengunduran diri tanpa syarat daripada hal ehwal Dunia Baru! model.player.dead.native=Yang Mulia, %nation% telah hancur. model.player.disaster.bankruptcy.start=Anda gagal menanggung penyelenggaraan semua bangunan, oleh itu anda akan dikenakan penalti pengeluaran yang berat. @@ -1963,12 +1989,16 @@ model.player.ignoredTax=Kerajaan telah menaikkan kadar cukai kepada %amount%% se model.player.interventionForceArrives=Angkatan Pengantaraan yang dijanjikan sudah tiba! model.player.soLDecrease=Keahlian Putera Kebebasan di koloni-koloni anda telah merosot kepada %newSoL% peratus! model.player.soLIncrease=Keahlian Putera Kebebasan di koloni-koloni anda telah meningkat kepada %newSoL% peratus! +# Fuzzy model.player.stance.alliance.declared=Yang Mulia, %nation% bersekutu dengan kita! model.player.stance.alliance.others=Yang Mulia, %attacker% sedang bersekutu dengan %defender%. +# Fuzzy model.player.stance.ceaseFire.declared=Yang Mulia, %nation% telah bersetuju untuk menggencat senjata dengan kita! model.player.stance.ceaseFire.others=Yang Mulia, %attacker% telah bersetuju untuk menggencat senjata dengan %defender%. +# Fuzzy model.player.stance.peace.declared=Yang Mulia, %nation% berdamai dengan kita! model.player.stance.peace.others=Yang Mulia, %attacker% sedang berdamai dengan %defender%. +# Fuzzy model.player.stance.war.declared=Ada berita buruk, Yang Mulia. %nation% telah mengisytiharkan perang terhadap kita! model.player.stance.war.others=Yang Mulia, %attacker% telah mengisytiharkan perang terhadap %defender%. combat.automaticDefence=%unit% anda di %colony% telah mengangkat senjata untuk mempertahankan koloni! @@ -1984,6 +2014,7 @@ combat.enemyShipEvaded=%enemyUnit% %enemyNation%telah mengelak serangan oleh %un combat.enemyShipSunk=%unit% telah menenggelamkan %enemyUnit% %enemyNation%! combat.equipmentCaptured=Awas, pahlawan %nation% telah memperoleh %equipment%! combat.goodsStolen=%enemyUnit% %enemyNation% merampas %amount% %goods% di %colony%! +# Fuzzy combat.indianPlunder=%enemyUnit% %enemyNation% menjarah %amount% dari %colony%. combat.indianRaid=Perisik kita melaporkan bahawa %nation% telah menceroboh koloni %colonyNation% di %colony%. combat.indianSurprise=%nation% melakukan serangan mengejut di %colony%, menyebabkan kolonis kita cemas. Ketua %nation% menafikan dirinya terlibat. @@ -2040,6 +2071,7 @@ main.javaVersion=Java versi %minVersion% ke atas disyorkan untuk menjalankan Fre main.memory=Anda perlu menggunakan lebih daripada %memory% bait ingatan pada JVM.\n Lancarkan semula FreeCol dengan: java -Xmx%minMemory%M -jar FreeCol.jar main.userDir.fail=FreeCol tidak dapat menjumpai direktori yang sesuai untuk menyimpan data pengguna. Tetap meneruskan, tetapi mungkin ada masalah. client.baseData=Direktori data pangkalan %dir% tidak dapat dijumpai.\n Fail-fail data tidak dapat dijumpai oleh FreeCol.\n Sila pastikan fail-fail itu ada.\n Jika FreeCol tercari dalam direktori yang salah, maka\n jalankan permainan dengan parameter baris perintah:\n --freecol-data +# Fuzzy client.choicePlayer=Sila pilih pemain: client.classic=Pemetaan sumber gagal dimuatkan dari set peraturan 'classic'. client.debugConnect=Anda tidak boleh bersambung dengan permainan sedia ada dalam mod nyahpepijat. @@ -2052,8 +2084,10 @@ metaServer.couldNotConnect=Maaf, tidak dapat bersambung dengan meta-pelayan. Sil metaServer.communicationError=Ralat dialami ketika berhubung dengan meta-pelayan. Sila cuba lagi nanti. abandonEducation.action.studying=belajar abandonEducation.action.teaching=mengajar +# Fuzzy abandonEducation.no=Tidak, teruskan pendidikan abandonEducation.text=Jika %unit% anda meninggalkan %colony%, ia akan berhenti %action% di %building%. Adakah anda benar-benar mahu ia pergi? +# Fuzzy abandonEducation.yes=Ya, tinggalkan koloni abandonTeaching.text=Jika %unit% anda meninggalkan %building%, dia akan berhenti mengajar. Adakah anda benar-benar mahu dia pergi? armedUnitSettlement.attack=Serang @@ -2065,9 +2099,13 @@ buy.takeOffer=Terima tawaran buy.text=%nation% hendak menjual %goods%nya untuk %gold%: clearTradeRoute.text=%unit% anda ditugaskan ke laluan perdagangan %route%. Menetapkan destinasinya akan menggugurkannya daripada laluan perdagangan. Adakah anda pasti ingin berbuat demikian? client.fullScreen=Mod skrin penuh tidak disokong untuk peranti grafik ini.\nKembali ke mod tetingkap. +# Fuzzy confirmHostile.alliance=Anda tidak boleh menyerang negara sekutu! Adakah anda benar-benar ingin memutuskan perikatan anda dengan %nation% dan mengisytiharkan perang? +# Fuzzy confirmHostile.ceaseFire=Anda telah menandatangani gencatan senjata dengan %nation%. Adakah anda benar-benar ingin menyerang? +# Fuzzy confirmHostile.peace=Anda sedang berdamai dengan %nation%. Adakah anda benar-benar ingin mengisytiharkan perang? +# Fuzzy confirmTribute.broke=Pengintip-pengintip kami melaporkan bahawa %nation% kehabisan dana sama sekali. Baik kita jangan buang masa dengan tuntutan ufti. confirmTribute.european=%nation% %danger%, malah %finance%. Berapa banyakkah ufti yang harus kita tuntut daripada mereka? confirmTribute.happy=%nation% di %settlement% bersahabat baik dengan kita, sayanglah jika setiakawan antara kita menjadi tegang. @@ -2091,6 +2129,7 @@ indianLand.pay=Menawarkan %amount% emas untuk membeli tanah. # Fuzzy indianLand.take=Ambillah apa yang sah milik kita. indianLand.text=Tanah ini milik %player%. Adakah anda ingin: +# Fuzzy indianLand.unknown=Ada kaum tidak dikenali yang tinggal di kawasan ini. Adakah anda ingin: info.autodetectLanguageSelected=Anda telah memilih untuk mengesan bahasa secara automatik. Ini akan dilakukan lain kali anda membuka semula permainan ini. info.enterSomeText=Sila isikan teks. @@ -2136,7 +2175,9 @@ defeated.text=Anda telah tewas! Anda hendak: defeated.yes=Berdiam dan Perhatikan defeatedSinglePlayer.text=Anda telah tewas!\n\nSekarang di tengah malam buta ini, apabila laman gereja menguap dan neraka menghembuskan penyakitnya ke dunia ini, barulah daku menggogok darah panas sambil bernestapa kerana siang hari kita akan menggeletar sambil memandang ke depan. defeatedSinglePlayer.yes=Gunakan Mod Balas Dendam +# Fuzzy diplomacy.offerAccepted=%nation% telah menerima tawaran anda. +# Fuzzy diplomacy.offerRejected=%nation% telah menolak tawaran anda. disbandUnit.text=Adakah anda benar-benar ingin membubarkan unit ini? disbandUnit.yes=Bubarkan @@ -2182,7 +2223,9 @@ move.noAccessGoods=%nation% tidak akan berdagang dengan %unit% kosong. move.noAccessMissionBan=%nation% enggan sama sekali bertemu dengan mubaligh anda. move.noAccessSettlement=%nation% tidak membenarkan %unit% kita untuk memasuki petempatan mereka. move.noAccessSkill=%unit% kami tidak dapat belajar apa-apa daripada orang pribumi. +# Fuzzy move.noAccessTrade=Kami tiada kebenaran untuk berdagang dengan bangsa-bangsa Eropah lain seperti %nation%. +# Fuzzy move.noAccessWar=Kita tidak boleh berdagang dengan %nation% ketika berperang. move.noAccessWater=%unit% kita mesti mendarat sebelum memasuki petempatan itu. move.noAttackWater=%unit% kita mesti mendarat sebelum menyerang. @@ -2236,6 +2279,7 @@ server.invalidPlayerNations=Semua pemain perlu memilih bangsa yang unik sebelum server.maximumPlayers=Maaf, bilangan pemain maksimum sudah dicapai. server.missingUserName=Nama pengguna tertinggal pada pemohonan log masuk. server.missingVersion=Versi FreeCol tertinggal pada pemohonan log masuk. +# Fuzzy server.noRouteToServer=Pelayan ini tidak boleh dijadikan umum. Anda mesti mengubah suai tetapan tembok api (firewall) anda untuk membenarkan sambungan kepada port yang anda tetapkan. server.notAllReady=Tidak semua pemain sedia bermain! server.onlyAdminCanLaunch=Maaf, hanya pentadbir pelayan yang boleh melancarkan permainan. @@ -2244,6 +2288,7 @@ server.timeOut=Timeout berlaku apabila bersambung dengan pelayan. server.userNameInUse=Nama pengguna yang dinyatakan sudah dipakai. server.userNameNotPresent=Nama pengguna yang dinyatakan itu tiada dalam permainan. server.wrongFreeColVersion=Versi FreeCol pelanggan dan pelayan tidak sepadan. +# Fuzzy buildColony.others=%nation% telah menubuhkan koloni baru %colony% di %region%. cashInTreasureTrain.colonial=Harta %amount% emas telah sampai di Eropah. %cashInAmount% telah disimpan. cashInTreasureTrain.independent=Harta bernilai %amount% telah diisikan ke dalam perbendaharaan negara. @@ -2348,6 +2393,7 @@ colopedia.unit.offensivePower=Kuasa Serangan: colopedia.unit.price=Harga di Eropah: colopedia.unit.productionBonus={{plural:%number%|one=Pengubah suai|other=Pengubah suai}} pengeluaran: colopedia.unit.requirements=Keperluan: +# Fuzzy colopedia.unit.school=Sekolah yang diperlukan untuk latihan: colopedia.unit.skill=Tahap Kemahiran: report.labour.allColonists=Semua Kolonis @@ -2383,8 +2429,8 @@ report.colony.growing.description=%colony% boleh tumbuh {{plural:%amount%|one=sa # Fuzzy report.colony.improve.description=Unit yang boleh meningkatkan pengeluaran berkenaan dengan unit yang sedang melakukan tugas itu report.colony.improve.header=Peningkatan +# Fuzzy report.colony.improving.description=%colony%: Untuk membuat %amount% lagi %goods%, ganti %oldUnit% dengan %unit% -report.colony.wanting.description=%colony%: Untuk membuat %amount% lagi %goods%, tambahkan %unit% report.colony.making.blocking.description=%colony%: %amount% %goods% diperlukan untuk %buildable% {{plural:%turns%|one=giliran seterusnya|other=dalam %turns% giliran seterusnya}} report.colony.making.constructing.description=%colony%: %buildable% siap dalam {{plural:%turns%|one=giliran seterusnya|other=%turns% giliran seterusnya}} report.colony.making.description=Apakah yang dibuat oleh koloni ini @@ -2394,21 +2440,22 @@ report.colony.making.noconstruction.description=%colony%: Tiada kerja pembinaan report.colony.making.noteach.description=%colony%: %teacher% kekurangan pelajar report.colony.name.description=Senarai koloni report.colony.name.header=Koloni -report.colony.plow.description=Bilangan jubin koloni yang akan mendapat manfaat daripada pemBajakan -report.colony.plow.header=B -report.colony.plowing.description=%colony% akan mendapat manfaat daripada membajak {{plural:%amount%|one=satu jubin|other=%amount% jubin}} +# Fuzzy report.colony.production.description=%colony%: pengeluaran %goods% bersih = %amount% +# Fuzzy report.colony.production.export.description=%colony%: pengeluaran %goods% bersih adalah %amount% (lebih %export% dieksport) report.colony.production.header=Pengeluaran %goods% bersih +# Fuzzy report.colony.production.high.description=%colony%: pengeluaran %goods% bersih = %amount%, penuh dalam {{plural:%turns%|one=giliran seterusnya|other=%turns% giliran seterusnya}} +# Fuzzy report.colony.production.low.description=%colony%: pengeluaran %goods% bersih = %amount%, habis dalam {{plural:%turns%|one=giliran seterusnya|other=%turns% giliran seterusnya}} +# Fuzzy report.colony.production.waste.description=%colony%: pengeluaran %goods% bersih = %amount%, gudang akan penuh padat, %waste% akan terbazir -report.colony.road.description=Bilangan jubin koloni yang akan mendapat manfaat daripada pembinaan Jalan -report.colony.road.header=J -report.colony.roadBuilding.description=%colony% akan mendapat manfaat daripada membina {{plural:%amount%|one=sebatang jalan|other=%amount% batang jalan}} report.colony.shrinking.description=%colony% mesti susut {{plural:%amount%|one=satu unit|other=%amount% unit}} untuk meningkatkan pengeluaran report.colony.starving.description=%colony%: kebuluran dalam {{plural:%turns%|one=giliran seterusnya|other=%turns% giliran seterusnya}} # Fuzzy +report.colony.wanting.description=%colony%: Untuk membuat %amount% lagi %goods%, tambahkan %unit% +# Fuzzy report.continentalCongress.elected=Dipilih: report.continentalCongress.none=(tiada) report.continentalCongress.recruiting=Merekrut @@ -2451,26 +2498,25 @@ report.production.selectGoods=Pilih barangan report.production.update=Kemas kini report.requirements.badAssignment=%colony% ada seorang %expert% yang kini bekerja sebagai %expertWork%, manakala seorang %nonExpert% bekerja sebagai %nonExpertWork%. Pengeluaran ditingkatkan lagi jika kolonis-kolonis itu saling bertukar pekerjaan. report.requirements.canTrainExperts={{plural:2|%unit%}} boleh dilatih di -report.requirements.clearTile=%type% ke %direction% dari %colony% mendapat faedah daripada penebangan. +# Fuzzy report.requirements.exploreTile=%type% ke %direction% dari %colony% mendapat faedah daripada penjelajahan. report.requirements.met=Semua keperluan dipenuhi. report.requirements.missingGoods=%colony% sedang menghasilkan %goods%, tetapi memerlukan lebih %input%. report.requirements.misusedExperts=Terdapat {{plural:2|%unit%}} yang tidak bekerja sebagai %work% yang berada di report.requirements.noExpert=%colony% sedang menghasilkan %goods%, tetapi tiada %unit%. -report.requirements.plowCenter=%colony% akan mendapat manfaat dengan membajak jubinnya. -report.requirements.plowTile=%type% ke %direction% dari %colony% mendapat faedah daripada pembajakan. -report.requirements.roadTile=%type% ke %direction% dari %colony% mendapat faedah daripada pembinaan jalan. report.requirements.severalExperts=Terdapat {{plural:2|%unit%}} yang berada di report.requirements.surplus=Lebihan %goods% sedang dihasilkan di report.trade.afterTaxes=Pendapatan selepas cukai report.trade.beforeTaxes=Pendapatan sebelum cukai report.trade.cargoUnits=Unit dalam Muatan +# Fuzzy report.trade.hasCustomHouse=* Koloni ini telah menjadi pejabat kastam; barang-barangan ini dieksport. report.trade.totalDelta=Jumlah Pengeluaran report.trade.totalUnits=Jumlah Unit report.trade.unitsSold=Unit yang dibeli atau dijual report.turn.filter=Jangan paparkan jenis pesanan ini (%type%) report.turn.ignore=Abaikan pesanan ini (Koloni: %colony%, Barangan: %goods%) +# Fuzzy report.turn.playerNation=%nation% %player% aboutPanel.copyright=Hakcipta © 2002-2015 The FreeCol Team aboutPanel.legalDisclaimer=FreeCol ialah sebuah perisian bebas: anda boleh mengedarkannya semula dan/atau mengubahsuainya berlandaskan syarat-syarat Lesen Awam Am GNU seperti yang diterbitkan oleh Yayasan Perisian Bebas, sama ada versi 2 Lesen atau mana-mana versi selanjutnya. @@ -2496,6 +2542,7 @@ chooseFoundingFatherDialog.title=Lantik Bapa Pengasas colonyPanel.colonyUnits=Unit Koloni colonyPanel.inPort=Di Pelabuhan colonyPanel.outsideColony=Di Luar Koloni +# Fuzzy colonyPanel.producing=Menghasilkan: colonyPanel.reducePopulation=Jika anda mengurangkan jumlah penduduk ke bawah %number%, %colony% tidak dapat lagi membina %buildable%. colonyPanel.unitChange=Apabila memasuki koloni anda, %oldType% anda menjadi %newType%. @@ -2508,7 +2555,9 @@ confirmDeclarationDialog.areYouSure.no=Mungkin Nanti confirmDeclarationDialog.areYouSure.text=Ayuh kita meninggalkan kezaliman %monarch% yang tidak mengenal keadilan, dan mengisytiharkan kemerdekaan koloni-koloni kita daripada cengkaman raja! confirmDeclarationDialog.areYouSure.yes=Kebebasan atau Maut! confirmDeclarationDialog.createFlag=dan musuh-musuh kita akan gentar melihat sepanduk penentangan kita. +# Fuzzy confirmDeclarationDialog.defaultCountry=%nation% Syarikat +# Fuzzy confirmDeclarationDialog.defaultNation=Bebaskan %nation% confirmDeclarationDialog.enterCountry=Mulai sekarang, negara kita akan dikenali sebagai confirmDeclarationDialog.enterNation=dan setiap warga negara yang gemilang ini akan berbangga kerana dikenali sebagai @@ -2559,8 +2608,10 @@ negotiationDialog.add=Tambahkan negotiationDialog.cancel=Batalkan negotiationDialog.clear=Padamkan negotiationDialog.contact.tutorial=Anda bertemu dengan bangsa-bangsa Eropah lain yang akan bersaing dengan anda demi tanah dan kekayaan, dan mungkin akan berperang dengan anda. Tetapi selepas Jan de Witt menyertai Kongres Kebenuaan, anda boleh berdagang dengan mereka. +# Fuzzy negotiationDialog.demand=%nation% menuntut %otherNation% negotiationDialog.exchange=sebagai balasan kepada +# Fuzzy negotiationDialog.offer=%nation% menawarkan kepada %otherNation% negotiationDialog.send=Hantar negotiationDialog.title.contact=Pertemuan dengan Bangsa Eropah Lain @@ -2582,10 +2633,9 @@ findSettlementPanel.displayAll=Cari semua petempatan findSettlementPanel.displayOnlyEuropean=Cari petempatan Eropah sahaja findSettlementPanel.displayOnlyNatives=Cari petempatan pribumi sahaja findSettlementPanel.name=Cari Petempatan +# Fuzzy firstContactDialog.meeting.natives=Bertemu dengan pribumi... firstContactDialog.meeting.natives.tutorial=Anda bertemu dengan kaum pribumi. Hantar Peninjau anda ke petempatan pribumi untuk mempelajari lebih lanjut mengenai pribumi. Utus juga Orang Gaji Kontrak dan Kolonis Bebas anda untuk belajar ilmu pribumi. Hantar kapal dan Deretan Pedati ke petempatan mereka jika anda ingin berdagang dengan mereka. -firstContactDialog.meeting.AZTEC=Bangsa Aztek... -firstContactDialog.meeting.INCA=Empayar Inca... firstContactDialog.welcomeOffer.text=Bangsa %nation% mengalu-alukan tuan-tuan dan puan-puan sekalian. Kami ialah bangsa gemilang %camps% %settlementType%. Untuk meraikan persahabatan kita, kami dengan senang hatinya menawarkan tanah yang kalian duduki sekarang sebagai hadiah. Sudikah kalian menerima perjanjian kami dan hidup berdamai bersama kami sebagai saudara-mara? firstContactDialog.welcomeSimple.text=Bangsa %nation% mengalu-alukan tuan-tuan dan puan-puan sekalian. Kami ialah bangsa gemilang %camps% %settlementType%. Sudikah kalian menerima perjanjian kami dan hidup berdamai bersama kami sebagai saudara-mara? abandonColony.no=Batalkan diff --git a/data/strings/FreeColMessages_nl.properties b/data/strings/FreeColMessages_nl.properties index 199955185..ffc2e379e 100644 --- a/data/strings/FreeColMessages_nl.properties +++ b/data/strings/FreeColMessages_nl.properties @@ -13,6 +13,7 @@ # Author: Rangekill # Author: Rcdeboer # Author: Robin0van0der0vliet +# Author: Rvlieshout # Author: SPQRobin # Author: Saruman # Author: Siebrand @@ -209,8 +210,9 @@ cli.no-memory-check=de geheugencontrole overslaan cli.no-sound=FreeCol uitvoeren zonder geluid cli.private=een beperkt toegankelijke server starten (niet gepubliceerd op de metaserver) cli.seed=geef een ZAAD op voor de pseudo willekeurige nummergenerator -cli.server-name=een aangepaste naam voor de server instellen +# Fuzzy cli.server=een stand-aloneserver starten op de opgegeven poort +cli.server-name=een aangepaste naam voor de server instellen cli.splash=geef het bestand BESTAND weer tijdens het laden van het spel cli.tc=het spel laden met de opgegeven NAAM cli.timeout=aantal seconden dat de server wacht op een antwoord op een vraag @@ -277,7 +279,6 @@ colopediaAction.goods.name=Goederen colopediaAction.nations.name=Naties colopediaAction.nationTypes.name=Nationale voordelen colopediaAction.resources.name=Bonusmiddelen -colopediaAction.skills.name=Beroepen colopediaAction.terrain.name=Terreintypes colopediaAction.units.name=Eenheden colopediaAction.name=%object% (Colopedia) @@ -1527,7 +1528,7 @@ model.improvement.road.description=Weg model.improvement.road.name=Weg model.improvement.road.occupationString=W model.limit.independence.coastalColonies.name=Limiet voor kustkolonies -model.limit.independence.coastalColonies.description=U moet tenminste %limit% kustkolonies hebben voordat u de onafhankelijkheid kunt afkondigen. +model.limit.independence.coastalColonies.description=U moet tenminste %limit% {{plural:%limit%|one=kustkolonie|other=kustkolonies}} hebben voordat u de onafhankelijkheid kunt afkondigen. model.limit.independence.rebels.name=Rebellenlimiet model.limit.independence.rebels.description=Tenminste %limit%% van uw kolonisten moet onafhankelijkheid ondersteunen. model.limit.independence.year.name=Jarenlimiet @@ -1863,7 +1864,7 @@ model.colony.badGovernment=Het bestuur van %colony% is inefficiënt. De producti model.colony.goodGovernment=De efficiëntie van het bestuur is verbeterd! Het rebellensentiment in %colony% is nu gelijk aan of groter dan %number% procent. model.colony.governmentImproved1=Het bestuur van %colony% is verbeterd, maar is nog inefficient. De productiviteit is nog steeds gedaald. model.colony.governmentImproved2=Het bestuur van %colony% is verbeterd. De productiviteit is gestegen. -model.colony.insufficientProduction=In %colony% zou %outputAmount% meer %outputType% geproduceerd kunnen worden als er maar %inputAmount% meer %inputType% beschikbaar was. +model.colony.insufficientProduction=In %colony% kan %outputAmount% meer %outputType% geproduceerd worden als de volgende middelden beschikbaar waren: %consumptionDeficit%. model.colony.lostGoodGovernment=De efficiëntie van het bestuur is afgenomen! Het rebellensentiment in %colony% is niet langer groter of gelijk aan %number% procent. Er is niet langer een productiebonus voor de kolonie. model.colony.lostVeryGoodGovernment=De efficiëntie van het bestuur is afgenomen! Het rebellensentiment in %colony% is niet langer groter of gelijk aan %number% procent. Een aantal productiebonussen zijn verloren gegaan. model.colony.minimumColonySize=%object% maakt het onmogelijk de bevolkingsomvang verder te laten dalen. @@ -1877,13 +1878,13 @@ model.colony.veryBadGovernment=Het bestuur van %colony% is erg inefficient. De p model.colony.veryGoodGovernment=De efficiëntie van het bestuur is verbeterd! Het rebellensentiment in %colony% is nu gelijk aan of groter dan %number% procent. model.colonyTile.claim=(claim %direction%) model.diplomaticTrade.receive.contact=Broederlijke groeten uit van de glorieuze natie der %nation%. -model.diplomaticTrade.receive.diplomatic=Laten we onderhandelen met de %nation%. +model.diplomaticTrade.receive.diplomatic=Laten we onderhandelen met de {{tag:country|%nation%}}. model.diplomaticTrade.receive.trade=Laten we het handelsvoorstel van de %nation% overwegen. -model.diplomaticTrade.receive.tribute=De %nation% eisen eerbetoon van ons! +model.diplomaticTrade.receive.tribute=De {{tag:country|%nation%}} eisen eerbetoon van ons! model.diplomaticTrade.send.contact=We zijn leden van de natie der %nation% tegengekomen. -model.diplomaticTrade.send.diplomatic=Laat ons onze diplomatieke situatie met de %nation% heroverwegen. -model.diplomaticTrade.send.trade=Laat ons handel met de %nation% voorstellen bij %settlement%. -model.diplomaticTrade.send.tribute=Wij eisen eerbetoon van de %nation% bij %settlement%. +model.diplomaticTrade.send.diplomatic=Laat ons onze diplomatieke situatie met de {{tag:country|%nation%}} heroverwegen. +model.diplomaticTrade.send.trade=Laat ons handel met de {{tag:country|%nation%}} voorstellen bij %settlement%. +model.diplomaticTrade.send.tribute=Wij eisen eerbetoon van de {{tag:country|%nation%}} bij %settlement%. model.direction.N.name=noord model.direction.NE.name=noordoost model.direction.E.name=oost @@ -1893,26 +1894,25 @@ model.direction.SW.name=zuidwest model.direction.W.name=west model.direction.NW.name=noordwest model.historyEventType.abandonColony.description=U hebt de kolonie %colony% verlaten. -model.historyEventType.ceaseFire.description=Staakt het vuren met de %nation%. -model.historyEventType.cityOfGold.description=De %nation% hebben %city% ontdekt, een van de zeven Gouden Steden. De schat bedraagt %treasure% goud. -model.historyEventType.colonyConquered.description=Uw kolonie %colony% is veroverd door de %nation%. -model.historyEventType.colonyDestroyed.description=Uw kolonie %colony% is verwoest door de %nation%. +model.historyEventType.ceaseFire.description=Staakt het vuren met de {{tag:country|%nation%}}. +model.historyEventType.cityOfGold.description=De {{tag:country|%nation%}} hebben %city% ontdekt, een van de zeven Gouden Steden. De schat bedraagt %treasure% goud. +model.historyEventType.colonyConquered.description=Uw kolonie %colony% is veroverd door de {{tag:country|%nation%}}. +model.historyEventType.colonyDestroyed.description=Uw kolonie %colony% is verwoest door de {{tag:country|%nation%}}. # Fuzzy model.historyEventType.conquerColony.description=U durft Onze genereuze voorwaarden te aanvaarden en dan nog de betaling te ontwijken? Een dergelijke dubbelhartigheid oogsten van Ons een bittere beloning. -# Fuzzy -model.historyEventType.declareIndependence.description=U hebt de nederzetting %settlement% van de %nation% verwoest. -model.historyEventType.declareWar.description=Oorlog verklaard met de %nation%. -model.historyEventType.destroyNation.description=De %nation% vernietigen de %nativeNation%. +model.historyEventType.declareIndependence.description=U verklaart onafhankelijkheid van de Kroon. +model.historyEventType.declareWar.description=Oorlog verklaard met de {{tag:country|%nation%}}. +model.historyEventType.destroyNation.description=De {{tag:country|%nation%}} vernietigen de %nativeNation%. model.historyEventType.discoverNewWorld.description=U hebt de Nieuwe Wereld ontdekt. -model.historyEventType.discoverRegion.description=De %nation% hebben %region% ontdekt. -model.historyEventType.formAlliance.description=Bondgenootschap onderhandeld met de %nation%. +model.historyEventType.discoverRegion.description=De {{tag:country|%nation%}} hebben %region% ontdekt. +model.historyEventType.formAlliance.description=Bondgenootschap onderhandeld met de {{tag:country|%nation%}}. model.historyEventType.foundColony.description=U hebt de kolonie %colony% gevestigd. model.historyEventType.foundingFather.description=%father% treedt toe tot het Continentale Congres model.historyEventType.independence.description=U bereikt onafhankelijkheid van de Kroon. -model.historyEventType.makePeace.description=Vrede overeengekomen met de %nation%. -model.historyEventType.meetNation.description=U ontmoet de %nation% -model.historyEventType.nationDestroyed.description=De %nation% zijn niet meer aanwezig in de Nieuwe Wereld. -model.historyEventType.spanishSuccession.description=De %loserNation% staan al hun kolonies in de Nieuwe Wereld af aan de %nation%. +model.historyEventType.makePeace.description=Vrede overeengekomen met de {{tag:country|%nation%}}. +model.historyEventType.meetNation.description=U ontmoet de {{tag:country|%nation%}}. +model.historyEventType.nationDestroyed.description=De {{tag:country|%nation%}} zijn niet meer aanwezig in de Nieuwe Wereld. +model.historyEventType.spanishSuccession.description=De {{tag:country|%loserNation%}} staan al hun kolonies in de Nieuwe Wereld af aan de {{tag:country|%nation%}}. model.indianSettlement.mostHatedNone=Geen model.indianSettlement.mostHatedUnknown=Onbekend model.indianSettlement.nameUnknown=Onbekend @@ -1962,9 +1962,9 @@ model.messageType.warehouseCapacity.name=Pakhuiscapaciteit model.messageType.warning.name=Waarschuwingen model.monarch.action.addToRef.text=De Kroon heeft %number% {{plural:%number%|%unit%}} toegevoegd aan de Koninklijke Verkenningsmacht. Koloniale leiders uiten hun bezorgdheid. model.monarch.action.addToRef.no=Afgerond -model.monarch.action.declarePeace.text=We hebben genadig ingestemd met een vredesverdrag met de %nation%. +model.monarch.action.declarePeace.text=We hebben genadig ingestemd met een vredesverdrag met de {{tag:country|%nation%}}. model.monarch.action.declarePeace.no=Afgerond -model.monarch.action.declareWar.text=De brutaliteit van %nation% dwingt ons om de oorlog te verklaren! +model.monarch.action.declareWar.text=De brutaliteit van {{tag:country|%nation%}} dwingt ons om de oorlog te verklaren! model.monarch.action.declareWar.no=Afgerond # Fuzzy model.monarch.action.displeasure.text=U verklaart onafhankelijkheid van de Kroon. @@ -2008,8 +2008,7 @@ model.advantages.selectable.name=Selecteerbaar model.advantages.selectable.shortDescription=Nationale voordelen zijn te selecteren en hoeven niet uniek te zijn. model.nationState.aiOnly.name=Alleen KI model.nationState.available.name=beschikbaar -# Fuzzy -model.nationState.available.shortDescription=U hebt de kolonie %colony% op de %nation% veroverd. +model.nationState.available.shortDescription=U speelt als deze natie model.nationState.notAvailable.name=niet beschikbaar model.noClaimReason.europeans.description=Dit land wordt opgeëist door een andere Europese natie. model.noClaimReason.natives.description=Dit land wordt opgeëist door een inheemse stam. @@ -2023,7 +2022,7 @@ model.player.colonialIndependence=Alleen koloniale spelers kunnen onafhankelijkh model.player.forces=%nation% strijdkrachten model.player.independentMarket=Europa model.player.startGame=Na maanden op zee bent u eindelijk aangekomen bij de kust van een onbekend continent. Zeil naar {{tag:%direction%|west=naar het westen|east=naar het oosten|default=tegen de wind in}} om de Nieuwe Wereld te ontdekken en deze te claimen voor de Kroon. -model.player.waitingFor=Aan het wachten op: %nation% +model.player.waitingFor=Aan het wachten op: {{tag:country|%nation%}} model.regionType.coast.name=Kust model.regionType.coast.unknown=Onbekend kustgebied model.regionType.desert.name=Woestijn @@ -2062,7 +2061,7 @@ model.tradeItem.gold.name=Goud model.tradeItem.gold.description=het totaal van %amount% goud model.tradeItem.goods.name=Goederen model.tradeItem.incite.name=Oorlog verklaren aan -model.tradeItem.incite.description=oorlog tegen de %nation% +model.tradeItem.incite.description=oorlog tegen de {{tag:country|%nation%}} model.tradeItem.stance.name=Houding model.tradeItem.unit.name=Eenheid model.tradeRoute.duplicateName=Deze handelsroute heeft dezelfde naam als een van uw bestaande handelsroutes: %name%. Kies een andere unieke naam. @@ -2082,10 +2081,9 @@ model.unit.underRepair=Repareren(%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=W -model.unit.unitState.skipped=O +model.unit.unitState.skipped=X model.unit.unitState.toAmerica=E model.unit.unitState.toEurope=E model.noAddReason.alreadyPresent.description=Al aanwezig in deze locatie. @@ -2125,7 +2123,7 @@ model.colony.warehouseSoonFull=Het pakhuis in %colony% zit bij de volgende beurt model.colony.warehouseWaste=Het pakhuis in %colony% zit overvol met %goods%. %waste% eenheden zijn weggegooid. model.colony.workersEvicted=Bij %colony% kunnen uw kolonisten niet langer werken bij %location% vanwege de aanwezigheid van %enemyUnit%. model.colonyTile.resourceExhausted=De grondstof %resource% is op in %colony% -model.game.spanishSuccession=Excellentie, de Spaanse Successieoorlog in Europa is beëindigd. In het Verdrag van Utrecht worden de %loserNation% gedwongen om alle kolonies in de Nieuwe Wereld af te staan aan de %nation%! +model.game.spanishSuccession=Excellentie, de Spaanse Successieoorlog in Europa is beëindigd. In het Verdrag van Utrecht worden de {{tag:country|%loserNation%}} gedwongen om alle kolonies in de Nieuwe Wereld af te staan aan de {{tag:country|%nation%}}! model.indianSettlement.mission.denounced=Uw missionaris in %settlement% is uit de gratie gevallen en geëxecuteerd! model.indianSettlement.mission.destroyed=Uw missionaris in de nederzetting %settlement% is overleden tijdens de vernietiging van die nederzetting. model.player.alarmIncrease.tension.angry=et opperhoofd van de %nation% in %settlement% waarschuwt dat de dapperen openlijk vragen om oorlog met de %enemy%, om ons te ontdoen van de ingrepen op ons land van de kolonisten en de arrogante krijgers. @@ -2134,7 +2132,7 @@ model.player.autoRecruit=Religieuze onrust in %europe% zet %unit% aan tot emigra model.player.colonyGoodsParty.harbour=Uw kolonisten in %colony% hebben %amount% eenheden van %goods% in de haven gegooid in protest tegen de oneerlijke belastingen van de koning! model.player.colonyGoodsParty.horses=Uw kolonisten in %colony% hebben %amount% paarden vrijgelaten uit protest tegen deze oneerlijke belasting door de Kroon! model.player.colonyGoodsParty.landLocked=Uw kolonisten in %colony% hebben %amount% eenheden van %goods% verbrand op het marktplein in protest tegen de oneerlijke belastingen van de koning! -model.player.dead.european=Uwe Hoogheid. De %nation% hebben verklaard zich onvoorwaardelijk terug te trekken uit gelegenheden aangaande de Nieuwe Wereld! +model.player.dead.european=Uwe Hoogheid. De {{tag:country|%nation%}} hebben verklaard zich onvoorwaardelijk terug te trekken uit gelegenheden aangaande de Nieuwe Wereld! model.player.dead.native=Uwe Hoogheid. De %nation% zijn vernietigd. model.player.disaster.bankruptcy.start=U heeft niet betaald voor het onderhoud van alle gebouwen. Er worden zware productiesancties opgelegd. model.player.disaster.bankruptcy.stop=U bent weer in staat om te betalen voor het onderhoud van alle gebouwen. De productiesancties zijn opgeheven. @@ -2147,13 +2145,13 @@ model.player.ignoredTax=De Kroon heeft het belastingpercentage verhoogd naar %am model.player.interventionForceArrives=De beloofde interventiemacht is gearriveerd! model.player.soLDecrease=Het patriottisme in uw kolonies is gedaalt naar %newSoL% procent! model.player.soLIncrease=Het patriottisme in uw kolonies is gestegen naar %newSoL% procent! -model.player.stance.alliance.declared=Uwe Hoogheid, de %nation% vormen nu een alliantie met ons! +model.player.stance.alliance.declared=Uwe Hoogheid, de {{tag:country|%nation%}} vormen nu een alliantie met ons! model.player.stance.alliance.others=Uwe Hoogheid, de %attacker% vormen nu een alliantie met de %defender%. -model.player.stance.ceaseFire.declared=Uwe Hoogheid, de %nation% hebben toegestemd in een staakt het vuren met ons! +model.player.stance.ceaseFire.declared=Uwe Hoogheid, de {{tag:country|%nation%}} hebben toegestemd in een staakt het vuren met ons! model.player.stance.ceaseFire.others=Uwe Hoogheid, de %attacker% hebben toegestemd in een staakt het vuren met de %defender%. -model.player.stance.peace.declared=Uwe Hoogheid, de %nation% hebben de vrede met ons getekend! +model.player.stance.peace.declared=Uwe Hoogheid, de {{tag:country|%nation%}} hebben de vrede met ons getekend! model.player.stance.peace.others=Uwe Hoogheid, de %attacker% hebben de vrede met de %defender% getekend. -model.player.stance.war.declared=Slecht nieuws Uwe Hoogheid. De %nation% hebben ons de oorlog verklaard! +model.player.stance.war.declared=Slecht nieuws Uwe Hoogheid. De {{tag:country|%nation%}} hebben ons de oorlog verklaard! model.player.stance.war.others=Uwe Hoogheid, de %attacker% hebben de oorlog verklaard aan %defender%. combat.automaticDefence=Uw %unit% in %colony% heeft de wapens opgenomen on de kolonie te verdedigen! combat.buildingDamaged=%building% in %colony% is vernietigd door %enemyNation% %enemyUnit%! @@ -2168,7 +2166,7 @@ combat.enemyShipEvaded=%enemyNation% %enemyUnit% heeft de aanval door %unit% ont combat.enemyShipSunk=%unit% heeft %enemyNation% %enemyUnit% tot zinken gebracht! combat.equipmentCaptured=Opgepast. De moedige %nation% hebben %equipment% buitgemaakt! combat.goodsStolen=%enemyNation% %enemyUnit% steelt %amount% %goods% in %colony%! -combat.indianPlunder=%enemyNation% %enemyUnit% plundert %amount% van %colony%. +combat.indianPlunder=%enemyNation% %enemyUnit% plundert %amount% goud van %colony%. combat.indianRaid=Onze spionnen melden dat de %nation% een inval hebben in de kolonie %colony% van de %colonyNation%. combat.indianSurprise=De %nation% voeren een verrassingsaanval uit op %colony%, waardoor onze kolonisten gealarmeerd worden. Het hoofd van de %nation% ontkent betrokkenheid. combat.indianTreasure=U hebt %amount% geplunderd uit %settlement%. @@ -2215,16 +2213,14 @@ model.unit.noMoreTools=%location%: Uw pionier heeft al zijn gereedschap opgebrui model.unit.slowed=%enemyNation% %enemyUnit% vertraagt %unit%'s beweging. model.unit.unitRepaired=%unit% is gerepareerd in %repairLocation%. model.unit.hardyPioneer.noMoreTools=%location%: Uw geharde pionier heeft al zijn gereedschap opgebruikt. -# Fuzzy -error.couldNotLoad=Er is iets misgegaan tijdens het laden van het spel! -# Fuzzy -error.couldNotSave=Er is iets misgegaan tijdens het opslaan van het spel! +error.couldNotLoad=Er is iets misgegaan tijdens het laden van het spel uit bestand %name%! +error.couldNotSave=Er is iets misgegaan tijdens het opslaan van het spel in bestand %name%! main.defaultPlayerName=Spelernaam main.javaVersion=Voor FreeCol wordt een Javaversie van %minVersion% of later aanbevolen.\n%version% is gedetecteerd. Gebruik "--no-java-check" om deze controle over te slaan. main.memory=U moet meer dan %memory% bytes geheugen aan de JVM toekennen.\n Herstart FreeCol met: java -Xmx%minMemory%M -jar FreeCol.jar main.userDir.fail=FreeCol kan geen geschikt mappen vinden om gebruikersgegevens in op te slaan. Het programma blijft uitgevoerd worden, maar verwacht problemen. client.baseData=De map %dir% voor de basisgegevens kon niet gevonden worden.\n De gegevensbestanden kunnen niet worden gevonden door FreeCol.\n Zorg ervoor dat ze aanwezig zijn.\n Als FreeCol in de verkeerde map zoekt,\n start het spel dan met de volgende opdrachtregelparameter:\n --freecol-data -client.choicePlayer=Selecteer een speler: +client.choicePlayer=Kies een natie: client.classic=Het laden van de resourcemapping voor regelset "classic" is mislukt. client.debugConnect=U kunt geen verbinding maken met een bestaand spel in de debug modus. client.ending=Het spel is ten einde. @@ -2236,9 +2232,9 @@ metaServer.couldNotConnect=Er kon geen verbinding worden gemaakt met de metaserv metaServer.communicationError=Er is een fout opgetreden in de verbinding met de metaserver. Probeer het later nog eens. abandonEducation.action.studying=aan het studeren abandonEducation.action.teaching=aan het opleiden -abandonEducation.no=Nee, ga door met opleiden +abandonEducation.no=Doorgaan met opleiden abandonEducation.text=Als uw %unit% %colony% verlaat, stopt deze met %action% in het gebouw %building%. Weet u het zeker? -abandonEducation.yes=Ja, deze eenheid kan de kolonie verlaten +abandonEducation.yes=Opleiding afbreken abandonTeaching.text=Als uw %unit% het gebouw %building% verlaat, stopt deze met opleiden. Weet u zeker dat u dit wilt doen? armedUnitSettlement.attack=Aanvallen armedUnitSettlement.tribute=Eerbetoon eisen @@ -2249,10 +2245,10 @@ buy.takeOffer=Het aanbod aanvaarden buy.text=De %nation% wil graag hun %goods% voor %gold% verkopen: clearTradeRoute.text=Uw %unit% is toegewezen aan de handelsroute %route%. Door een bestemming in te stellen haalt u deze van de handelsroute af. Weet u zeker dat u dit wilt doen? client.fullScreen=De modus volledig scherm wordt niet ondersteund voor dit apparaat.\nHet programma wordt uitgevoerd in venstermodus. -confirmHostile.alliance=U kunt geen geallieerde natie aanvallen! Wilt u echt de alliantie met de %nation% verbreken en dan de oorlog verklaren? -confirmHostile.ceaseFire=We hebben een staak het vuren getekend met %nation%. Wilt u echt aanvallen? -confirmHostile.peace=U leeft in vrede met de %nation%. Weet u zeker dat u de oorlog wilt verklaren? -confirmTribute.broke=Onze spionnen melden dat de %nation% volkomen blut zijn. Laten we onze tijd niet verspillen met het eisen van eerbetoon. +confirmHostile.alliance=U kunt geen geallieerde natie aanvallen! Wilt u echt de alliantie met de {{tag:country|%nation%}} verbreken en dan de oorlog verklaren? +confirmHostile.ceaseFire=We hebben een staak het vuren getekend met {{tag:country|%nation%}}. Wilt u echt aanvallen? +confirmHostile.peace=U leeft in vrede met de {{tag:country|%nation%}}. Weet u zeker dat u de oorlog wilt verklaren? +confirmTribute.broke=Onze spionnen melden dat de {{tag:country|%nation%}} volkomen blut zijn. Laten we onze tijd niet verspillen met het eisen van eerbetoon. confirmTribute.european=De %nation% %danger% en %finance%. Hoeveel eerbetoon gaan we van ze eisen? confirmTribute.happy=De %nation% bij %settlement% zijn goede vrienden van ons. Het zou jammer zijn om onze kameraadschap te beschadigen. confirmTribute.no=Misschien hadden we beter niet @@ -2268,14 +2264,11 @@ error.noSuchFile=Het bestand is niet gevonden of de opmaak is niet correct. finance.high=hebben goede reserves finance.low=zijn arm finance.normal=hebben een kleine goudreserve -# Fuzzy -indianLand.cancel=Verlaat het land. -# Fuzzy -indianLand.pay=Bied %amount% goud voor het land. -# Fuzzy -indianLand.take=Neem wat ons rechtens toekomt. +indianLand.cancel=Verlaat het land +indianLand.pay=Bied %amount% goud voor het land +indianLand.take=Neem wat ons toekomt. indianLand.text=Dit land is in bezit van de %player%. Wat wilt u doen: -indianLand.unknown=Een aantal onbekende mensen wonen in dit land. Zou u graag: +indianLand.unknown=Er wonen ongecontacteerde volkeren in dit land. Wilt u: info.autodetectLanguageSelected=U hebt gekozen voor het automatisch detecteren van de taal. Dit gebeurt de eerstvolgende keer dat u het spel start. info.enterSomeText=Vul tekst in. info.newLanguageSelected=De taal is ingesteld op %language%. Het spel moet herstart worden voordat de taal compleet wordt doorgevoerd. @@ -2320,8 +2313,8 @@ defeated.text=U bent verslagen! Wat wilt u doen: defeated.yes=Blijf kijken defeatedSinglePlayer.text=U bent verslagen! defeatedSinglePlayer.yes=Start de wraak -diplomacy.offerAccepted=De natie %nation% heeft uw vrijgevige aanbod geaccepteerd. -diplomacy.offerRejected=The natie %nation% heeft uw vrijgevige aanbod afgewezen. +diplomacy.offerAccepted=De natie {{tag:country|%nation%}} heeft uw vrijgevige aanbod geaccepteerd. +diplomacy.offerRejected=The natie {{tag:country|%nation%}} heeft uw vrijgevige aanbod afgewezen. disbandUnit.text=Weet u zeker dat u deze eenheid wilt opheffen? disbandUnit.yes=Opheffen disembark.text=Gegroet zeeman. Wilt u van boord? @@ -2365,8 +2358,8 @@ move.noAccessContact=We moeten eerst contact maken met de %nation%, Excellentie. move.noAccessGoods=De %nation% zal geen handel drijven met een lege %unit%. move.noAccessSettlement=De %nation% laten onze %unit% hun nederzetting niet binnen. move.noAccessSkill=Onze %unit% kan niets leren van de inheemse bevolking. -move.noAccessTrade=We heben geen volmacht handel te drijven met andere Europeanen zoals de %nation%. -move.noAccessWar=We kunnen geen handel drijven met de %nation% als we in oorlog zijn. +move.noAccessTrade=We heben geen volmacht handel te drijven met andere Europeanen zoals de {{tag:country|%nation%}}. +move.noAccessWar=We kunnen geen handel drijven met de {{tag:country|%nation%}} als we in oorlog zijn. move.noAccessWater=Onze %unit% moet eerst aan land komen voor die de nederzetting binnen kan treden. move.noAttackWater=Onze eenheid %unit% moet landen voordat deze kan aanvallen. move.noTile=Onze %unit% is niet te zien op de kaart! @@ -2418,6 +2411,7 @@ server.invalidPlayerNations=Alle spelers moeten een unieke natie kiezen voordat server.maximumPlayers=Helaas, het maximum aantal spelers is al bereikt. server.missingUserName=De gebruikersnaam ontbreekt in het aanmeldverzoek. server.missingVersion=De FreeCol-versie ontbreekt in het aanmeldverzoek. +# Fuzzy server.noRouteToServer=Deze server kan niet publiek gemaakt worden. U moet uw firewall aanpassen om verbindingen op de opgegeven poort toe te staan. server.notAllReady=Niet alle medespelers zijn klaar om te beginnen! server.onlyAdminCanLaunch=Helaas, alleen de beheerder van de server kan het spel starten. @@ -2426,6 +2420,7 @@ server.timeOut=Verbinden met de server duurde te lang. server.userNameInUse=De opgegeven gebruikersnaam is al in gebruik. server.userNameNotPresent=De opgegeven gebruikersnaam is niet bekend in dit spel. server.wrongFreeColVersion=De client- en serverversies van Freecol verschillen. +# Fuzzy buildColony.others=De %nation% hebben de nieuwe kolonie %colony% gesticht in %region%. cashInTreasureTrain.colonial=Een schat ter waarde van %amount% goud is in Europa aangekomen. Er is %cashInAmount% goud voor ontvangen. cashInTreasureTrain.independent=Er is een schat van %amount% toegevoegd aan de nationale schatkist. @@ -2509,10 +2504,8 @@ colopedia.nationType.skills=Gedoceerde beroepen: colopedia.nationType.typeOfSettlements=Type nederzetting: colopedia.nationType.units=Starteenheden: colopedia.terrain.colonyCenterTile=Centrale tegel van de kolonie -# Fuzzy colopedia.terrain.defenseBonus=Verdedigingsbonus colopedia.terrain.description=Beschrijving -# Fuzzy colopedia.terrain.movementCost=Kosten verplaatsing colopedia.terrain.resource=Mogelijke grondstof colopedia.terrain.terrainImage=Afbeelding terrein @@ -2529,7 +2522,7 @@ colopedia.unit.offensivePower=Aanvalskracht: colopedia.unit.price=Prijs in Europa: colopedia.unit.productionBonus=productie{{plural:%number%|one=modifier|other=modifiers}}: colopedia.unit.requirements=Vereisten: -colopedia.unit.school=School nodig voor training: +colopedia.unit.school=Mag opleiden in: colopedia.unit.skill=Niveau: report.labour.allColonists=Alle kolonisten report.labour.amateursWorking=amateurs @@ -2561,11 +2554,10 @@ report.colony.exploring.description=%colony% heeft baat bijhet verkennen van {{p report.colony.grow.description=Aantal eenheden dat de kolonie kan groeien zonder nadelige gevolgen voor productie report.colony.grow.header=+ report.colony.growing.description=%colony% kan nog groeien met {{plural:%amount%|one=één eenheid|other=%amount% eenheden}} zonder nadelige gevolgen voor de productie -# Fuzzy -report.colony.improve.description=Eenheden die meer kunnen produceren dan de eenheid die op dit moment het werk uitvoert +report.colony.improve.description=Eenheden die de productie kunnen verbeteren. report.colony.improve.header=Verbeteren +# Fuzzy report.colony.improving.description=%colony%: vervang de %oldUnit% door %unit% om %amount% meer %goods% te maken -report.colony.wanting.description=%colony%: voeg een %unit% toe om %amount% meer %goods% te maken report.colony.making.blocking.description=%colony%: er is %amount% %goods% nodig voor %buildable% {{plural:%turns%|one=in de volgende beurt|other=over %turns% beurten}} report.colony.making.constructing.description=%colony%: %buildable% is {{plural:%turns%|one=de volgende beurt|other=over %turns% beurten}} af report.colony.making.description=Wat maakt deze kolonie @@ -2575,20 +2567,21 @@ report.colony.making.noconstruction.description=%colony%: Er vindt geen nieuwbou report.colony.making.noteach.description=%colony%: %teacher% heeft geen leerling report.colony.name.description=De lijst met kolonies report.colony.name.header=Kolonie -report.colony.plow.description=Aantal kolonietegels dat baat zou hebben bij ploegen -report.colony.plow.header=P -report.colony.plowing.description=%colony% heeft baat bij het ploegen van {{plural:%amount%|one=een tegel|other=%amount% tegels}} +# Fuzzy report.colony.production.description=%colony%: netto %goods% productie = %amount% +# Fuzzy report.colony.production.export.description=%colony%: netto %goods% productie is %amount% (er wordt geëxporteerd boven %export%) report.colony.production.header=Netto productie van %goods% +# Fuzzy report.colony.production.high.description=%colony%: netto %goods% productie = %amount%, vol {{plural:%turns%|one=in de volgende beurt|other=over %turns% beurten}} +# Fuzzy report.colony.production.low.description=%colony%: netto %goods% productie = %amount%, op {{plural:%turns%|one=in volgende beurt|other=over %turns% beurten}} +# Fuzzy report.colony.production.waste.description=%colony%: netto %goods% productie = %amount%, het pakhuis knalt uit zijn voegen, er gaat %waste% verloren -report.colony.road.description=Aantal kolonietegels dat baat heeft bij het bouwen van wegen -report.colony.road.header=W -report.colony.roadBuilding.description=%colony% heeft baat bij het verkennen van {{plural:%amount%|one=een tegel|other=%amount% tegels}} report.colony.shrinking.description=%colony% moet krimpen met {{plural:%amount%|one=één eenheid|other=%amount% eenheden}} om de productie te verbeteren report.colony.starving.description=%colony%: {{plural:%turns%|one=volgende beurt|other=over %turns% beurten}} uitgehongerd +# Fuzzy +report.colony.wanting.description=%colony%: voeg een %unit% toe om %amount% meer %goods% te maken report.continentalCongress.elected=Gekozen: %turn% report.continentalCongress.none=(geen) report.continentalCongress.recruiting=Trainen @@ -2630,27 +2623,25 @@ report.production.selectGoods=Goederen selecteren report.production.update=Bijwerken report.requirements.badAssignment=%colony% heeft een %expert% die op het moment werkt als %expertWork%, terwijl een %nonExpert% werkt als %nonExpertWork%. De productie wordt hoger als de kolonisten van baan ruilen. report.requirements.canTrainExperts={{plural:2|%unit%}} kunnen opgeleid worden bij -report.requirements.clearTile=%type% in het %direction% van %colony% heeft baat bij kaalslag. +# Fuzzy report.requirements.exploreTile=%type% in het %direction% van %colony% heeft baat bij verkenning. report.requirements.met=Alle voorwaarden zijn ingevuld. report.requirements.missingGoods=%colony% produceert %goods%, maar kan meer %input% gebruiken. report.requirements.misusedExperts=Er zijn {{plural:2|%unit%}} niet aan het werk als %work% bij report.requirements.noExpert=%colony% produceert %goods%, maar heeft geen %unit%. -report.requirements.plowCenter=%colony% heeft baat bij het omploegen van de tegel. -report.requirements.plowTile=%type% in het %direction% van %colony% heeft baat bij omploegen. -report.requirements.roadTile=%type% in het %direction% van %colony% heeft baat bij het bouwen van een weg. report.requirements.severalExperts=Er zijn meerdere {{plural:2|%unit%}} aanwezig bij report.requirements.surplus=Er wordt een overschot %goods% geproduceerd bij report.trade.afterTaxes=Inkomsten na belasting report.trade.beforeTaxes=Inkomsten voor belasting report.trade.cargoUnits=Eenheden in vracht +# Fuzzy report.trade.hasCustomHouse=* Deze kolonie heeft een handelshuis; deze goederen worden geëxporteerd. report.trade.totalDelta=Totale productie report.trade.totalUnits=Aantal eenheden report.trade.unitsSold=Eenheden gekocht of verkocht report.turn.filter=Laat dit type bericht (%type%) niet meer zien report.turn.ignore=Negeer dit bericht (Kolonie: %colony%, Goederen: %goods%) -report.turn.playerNation=%player%'s %nation% +report.turn.playerNation=%player%'s {{tag:country|%nation%}} aboutPanel.copyright=Copyright (C) 2002-2015 Het FreeCol-team aboutPanel.legalDisclaimer=FreeCol is vrije software: u kunt het herdistribueren en/of aanpassen volgens de voorwaarden van de GNU General Public License zoals gepubliceerd door de Free Software Foundation, versie 2 van de Licentie, of enige latere versie. aboutPanel.officialSite=Website: @@ -2675,7 +2666,7 @@ colonyPanel.buildQueue=Wachtrij bouwen colonyPanel.colonyUnits=Kolonieeenheden colonyPanel.inPort=In de haven colonyPanel.outsideColony=Buiten kolonie -colonyPanel.producing=Produceert: +colonyPanel.producing=produceert: colonyPanel.reducePopulation=Als u de bevolking tot onder %number% laat slinken, dan is %colony% niet langer in staat een %buildable% te bouwen. colonyPanel.unitChange=Bij het betreden van uw kolonie is uw %oldType% een %newType% geworden. colonyPanel.warehouse=Magazijn @@ -2688,8 +2679,8 @@ confirmDeclarationDialog.areYouSure.no=Misschien een andere keer confirmDeclarationDialog.areYouSure.text=Laat ons de onrechtvaardige tirannie van %monarch% afwijzen en laat ons de onafhankelijkheid van onze kolonies van de kroon verklaren! confirmDeclarationDialog.areYouSure.yes=Vrijheid of de dood! confirmDeclarationDialog.createFlag=en onze vijanden zullen sidderen bij de aanblik van onze uitdagende banier. -confirmDeclarationDialog.defaultCountry=Verenigde Staten van %nation% -confirmDeclarationDialog.defaultNation=Vrije %nation% +confirmDeclarationDialog.defaultCountry=Verenigde Staten van {{tag:country|%nation%}} +confirmDeclarationDialog.defaultNation={{tag:country|%nation%}} bevrijden confirmDeclarationDialog.enterCountry=Voortaan staat ons land bekend als confirmDeclarationDialog.enterNation=en elke burger van ons glorierijke land zal trots zijn om bekend te staan als flag.background.FESSES=Fasen @@ -2738,9 +2729,9 @@ negotiationDialog.add=Toevoegen negotiationDialog.cancel=Annuleren negotiationDialog.clear=Wissen negotiationDialog.contact.tutorial=U komt mede-Europeanen tegen. Zij wedijveren met u om land en rijkdommen, en voeren mogelijk zelfs oorlog met u. Maar nadat Jan de Witt is toegetreden tot het Continentale Congres, kunt u handel met ze drijven. -negotiationDialog.demand=De %nation% eisen van de %otherNation% +negotiationDialog.demand=De{{tag:country|%nation%}} eisen van de {{tag:country|%otherNation%}} negotiationDialog.exchange=in ruil voor -negotiationDialog.offer=De %nation% bieden de %otherNation% aan +negotiationDialog.offer=De {{tag:country|%nation%}} bieden de {{tag:country|%otherNation%}} aan negotiationDialog.send=Verzenden negotiationDialog.title.contact=Kennis maken met mede-Europeanen negotiationDialog.title.diplomatic=Diplomatieke onderhandelingen @@ -2762,10 +2753,8 @@ findSettlementPanel.displayAll=Alle nederzettingen vinden findSettlementPanel.displayOnlyEuropean=Alleen Europese nederzettingen vinden findSettlementPanel.displayOnlyNatives=Alleen inheemse nederzettingen vinden findSettlementPanel.name=Nederzetting zoeken -firstContactDialog.meeting.natives=Ontmoetingen met de inheemsen... +firstContactDialog.meeting.natives=Ontmoetingen met de inheemsen firstContactDialog.meeting.natives.tutorial=U ontmoet de inheemse bevolking. Stuur uw verkenners naar hun nederzettingen om meer over ze te leren en stuur ook uw bedienden en vrije kolonisten zodat ze meer over hun kunnen leren. Stuur uw schepen en huifkarren als u handel met ze wil drijven. -firstContactDialog.meeting.AZTEC=De Azteekse natie... -firstContactDialog.meeting.INCA=Het Inca koningkijk... firstContactDialog.welcomeOffer.text=De %nation% verwelkomen u. Wij zijn de glorieuze natie van %camps% %settlementType%. Om onze vriendschap te vieren, bieden wij het land dat u nu bezet aan als gift. Accepteert u ons voorstel en leeft u met ons samen als broeders? firstContactDialog.welcomeSimple.text=De %nation% verwelkomen u. Wij zijn de glorieuze natie van %camps% %settlementType%. Accepteert u ons voorstel en leeft u met ons samen als broeders? abandonColony.no=Annuleren @@ -2787,8 +2776,7 @@ indianSettlementPanel.learnableSkill=De volgende beroepen kunnen getraind worden indianSettlementPanel.highlyWanted=Deze kolonie is zeer geïnteresseerd in de handel van: indianSettlementPanel.otherWanted=Andere goederen die hier verhandeld kunnen worden zijn: indianSettlementPanel.mostHated=De meest gehate natie in deze nederzetting: -# Fuzzy -infoPanel.defenseBonus=Verdedigingsbonus %bonus%% +infoPanel.defenseBonus=Verdediging %bonus%% infoPanel.endTurn=Druk op enter om de beurt te beëindigen. infoPanel.moves=Stappen: loadingSavegameDialog.port=Poort: diff --git a/data/strings/FreeColMessages_nl_BE.properties b/data/strings/FreeColMessages_nl_BE.properties index 24ed6a7cf..868299053 100644 --- a/data/strings/FreeColMessages_nl_BE.properties +++ b/data/strings/FreeColMessages_nl_BE.properties @@ -174,8 +174,9 @@ cli.no-memory-check=de geheugencontrole overslaan cli.no-sound=FreeCol starten zonder geluid cli.private=een private server starten (niet gepubliceerd via de metaserver) cli.seed=Geef een SEED op voor de pseudo-random nummergenerator -cli.server-name=geef een aangepaste NAAM voor de server +# Fuzzy cli.server=een alleenstaande server starten op de opgegeven poort +cli.server-name=geef een aangepaste NAAM voor de server cli.splash=het Splash scherm weer BESTAND weer tonen bij het laden van het spel cli.tc=de totale conversie met de gegeven NAAM laden cli.version=toon het versienummer en sluit af @@ -231,7 +232,6 @@ colopediaAction.goods.name=Goederen colopediaAction.nations.name=Naties colopediaAction.nationTypes.name=Nationale Voordelen colopediaAction.resources.name=Bonusmiddelen -colopediaAction.skills.name=Vaardigheden colopediaAction.terrain.name=Tereintypes colopediaAction.units.name=Eenheden debugAction.name=Debug modus in/uitschakelen @@ -1293,6 +1293,7 @@ model.building.locationLabel=In %location% model.colony.badGovernment=Het beleid in %colony% is inefficiënt. De productie lijdt hieronder. model.colony.governmentImproved1=Het beleid in %colony% is verbeterd, maar nog altijd on-efficiënt. De productie leidt nog steeds. model.colony.governmentImproved2=Het beleid in %colony% is verbeterd. De productie is weer op peil. +# Fuzzy model.colony.insufficientProduction=Er zouden %outputAmount% extra %outputType% geproduceerd kunnen worden in %colony%, als we maar %inputAmount% extra %inputType% hadden. model.colony.minimumColonySize=%object% verhindert dat de populatie nog verkleint. model.colony.unbuildable=%colony% kan nu geen %object% bouwen. %object% is verwijderd uit de bouwplannen. @@ -1306,19 +1307,27 @@ model.direction.SW.name=Zuidwest model.direction.W.name=West model.direction.NW.name=Noordwest model.historyEventType.abandonColony.description=Je verlaat de kolonie %colony%. +# Fuzzy model.historyEventType.cityOfGold.description=Je ontdekt %city%, één van de Zeven Steden van Goud, en een schat ter waarde van %treasure% goudstukken. +# Fuzzy model.historyEventType.colonyConquered.description=Je kolonie %colony% is veroverd door de %nation%. +# Fuzzy model.historyEventType.colonyDestroyed.description=Je kolonie %colony% is vernietigd door de %nation%. # Fuzzy model.historyEventType.declareIndependence.description=Je vernielt %settlement%, een nederzetting van de %nation%. +# Fuzzy model.historyEventType.destroyNation.description=Je vernietigd de %nation%. model.historyEventType.discoverNewWorld.description=Je ontdekt de Nieuwe Wereld. +# Fuzzy model.historyEventType.discoverRegion.description=Je ontdekt %region%. model.historyEventType.foundColony.description=Je legt de basis van de kolonie %colony%. model.historyEventType.foundingFather.description=%father% zetelt vanaf nu in het Continentaal Congres. model.historyEventType.independence.description=Je bereikt onafhankelijkheid van de Kroon. +# Fuzzy model.historyEventType.meetNation.description=Je ontmoet de %nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=De %nation% zijn vernietigd. +# Fuzzy model.historyEventType.spanishSuccession.description=De %loserNation% staan al hun koloniën in de Nieuwe Wereld af aan de %nation%. model.indianSettlement.mostHatedNone=Geen model.indianSettlement.nameUnknown=Onbekend @@ -1369,6 +1378,7 @@ model.nationState.notAvailable.name=niet beschikbaar model.player.forces=%nation% troepen model.player.independentMarket=Europa model.player.startGame=Na maanden op zee heb je eindelijk de kust van een onbekend continent bereikt. Zeil {{tag:%direction%|west=westwaards|east=oostwaards|default=met de wind mee}} om zo de nieuwe wereld te ontdekken en het op te vorderen voor de kroon. +# Fuzzy model.player.waitingFor=Wachten op: %nation% model.regionType.coast.name=Kust model.regionType.coast.unknown=Onbekend Kustgebied @@ -1423,9 +1433,9 @@ model.unit.underRepair=In herstelling (nog %turns% {{plural:%turns%|one=beurt|ot model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S +# Fuzzy model.unit.unitState.skipped=W model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G @@ -1449,23 +1459,29 @@ model.colony.warehouseOverfull=Je magazijn in %colony% heeft zijn capaciteit voo model.colony.warehouseSoonFull=Je magazijn in %colony% zal zijn capaciteit van %goods% overschreiden gedurende de volgende ronde. %amount% eenheden %goods% zullen verspild worden. model.colony.warehouseWaste=Je magazijn in %colony% heeft zijn capaciteit voor %goods% overschreden. %waste% eenheden zijn verspild. model.colonyTile.resourceExhausted=Grondstof %resource% is opgebruikt in %colony% +# Fuzzy model.game.spanishSuccession=Excellentie, de Spaanse Opvolgingsoorlog is beëindigd in Europa. In het Verdrag van Utrecht werden de %loserNation% gedwongen al hun koloniën in de Nieuwe Wereld af te staan aan de %nation%! model.indianSettlement.mission.denounced=Je missionaris in %settlement% is verworpen en geëxecuteerd! model.player.colonyGoodsParty.harbour=Je kolonisten in %colony% hebben %amount% eenheden %goods% in de dokken gegooid uit protest tegen de oneerlijke uitbuiting door de Kroon! model.player.colonyGoodsParty.horses=Je kolonisten in %colony% hebben %amount% paarden vrijgeladen als protest voor deze oneerlijke belasting door de Kroon! model.player.colonyGoodsParty.landLocked=Je kolonisten in %colony% hebben %amount% eenheden %goods% verbrand op het marktplein uit protest tegen de oneerlijke uitbuiting door de Kroon! +# Fuzzy model.player.dead.european=Excellentie, de %nation% hebben een onconditionele aftocht uit de Nieuwe Wereld afgekondigd! model.player.dead.native=Excellentie, de %nation% zijn vernietigd. model.player.emigrate=In %europe% heeft een %unit% beslist te emigreren. model.player.foundingFatherJoinedCongress=%foundingFather% zetelt in het Congres!\n\n%description% model.player.soLDecrease=Lidmaatschap van de Vrijheidsbeweging in je kolonie is gedaald tot %newSoL% percent! model.player.soLIncrease=Lidmaatschap van de Vrijheidsbeweging in je kolonie is gestegen tot %newSoL% percent! +# Fuzzy model.player.stance.alliance.declared=Uwe Excellentie, de %nation% sluiten een bondgenoodschap met ons! model.player.stance.alliance.others=Uwe Excellentie, de %attacker% sluiten een bondgenoodschap met de %defender%. +# Fuzzy model.player.stance.ceaseFire.declared=Excellentie, de %nation% gaan akkoord met een staakt het vuren met ons! model.player.stance.ceaseFire.others=Hoogheid, de %attacker% gaan akkoord met een staakt het vuren met de %defender%. +# Fuzzy model.player.stance.peace.declared=Uwe Hoogheid, de %nation% sluiten vrede met ons! model.player.stance.peace.others=Uwe Hoogheid, de %attacker% sluiten vrede met de %defender%. +# Fuzzy model.player.stance.war.declared=Slecht nieuws, Excellentie, de %nation% hebben ons de oorlog verklaart! model.player.stance.war.others=Excellentie, de %attacker% hebben de oorlog verklaard aan de %defender%. combat.automaticDefence=Je %unit% in %colony% heeft de wapens opgenomen om de kolonie te verdedigen! @@ -1480,6 +1496,7 @@ combat.enemyShipEvaded=%enemyNation% %enemyUnit% heeft een aanval van %unit% ont combat.enemyShipSunk=%unit% heeft %enemyNation% %enemyUnit% gekelderd! combat.equipmentCaptured=Opgepast, de krijgers van de %nation% hebben %equipment% vergaard! combat.goodsStolen=Een %enemyUnit% van %enemyNation% steelt %amount% %goods% in %colony%! +# Fuzzy combat.indianPlunder=Een %enemyUnit% van %enemyNation% plundert %amount% in %colony%. combat.indianTreasure=Je rooft %amount% in %settlement%. combat.nativeCapitalBurned=Je hebt %name%, de hoofdstad van de %nation%, platgebrand. De %nation% geven zich over aan jou genade! @@ -1529,6 +1546,7 @@ main.defaultPlayerName=Spelernaam main.javaVersion=Java versie %minVersion% of better is aangeraden om FreeCol uit te voeren.\n(%version% gedetecteerd, gebruikt --no-java-check om deze controle over te slaan). main.memory=Je moet meer dan %memory% bytes of geheugen voor JVM toe te wijzen.\n Herstart FreeCol met: java -Xmx%minMemory%M -jar FreeCol.jar main.userDir.fail=FreeCol kan geen geschikte directorie vinden om de gebruikers gegevens op te slaan. Wordt uitgevooerd, maar verwacht problemen. +# Fuzzy client.choicePlayer=Kies een speler: metaServer.couldNotConnect=Sorry, kan geen verbinding maken met de meta-server. Probeer later opnieuw. metaServer.communicationError=Er was een communicatie-fout met de meta-server. Probeer later opnieuw. @@ -1538,8 +1556,11 @@ buy.moreGold=Een lagere prijs vragen buy.takeOffer=Het bod aanvaarden buy.text=De %nation% willen hun %goods% verkopen voor %gold%: clearTradeRoute.text=Je %unit% is toegewezen aan handelsroute %route%. Door een nieuwe bestemming te geven zal hij de handelsroute verlaten. Ben je zeker dat je dat wil doen ? +# Fuzzy confirmHostile.alliance=Je kan geen bondgenoot aanvallen! Wens je echt je bondgenootschap met de %nation% te verbreken en hen de oorlog te verklaren? +# Fuzzy confirmHostile.ceaseFire=Je hebt een staakt het vuren ondertekend met %nation%. Wil je echt aanvallen? +# Fuzzy confirmHostile.peace=Je leeft in vrede met de %nation%. Wil je hen echt de oorlog verklaren? error.noSuchFile=Het opgegeven bestand bestaat niet of is geen normaal bestand. # Fuzzy @@ -1589,7 +1610,9 @@ clearSpeciality.areYouSure=Ben je zeker dat je %oldUnit% wil degraderen tot %uni clearSpeciality.impossible=%unit% kan degraderen! defeated.text=Je bent verslagen! Wil je: defeated.yes=Blijven en toekijken +# Fuzzy diplomacy.offerAccepted=De %nation% aanvaarden je vrijgevig bod. +# Fuzzy diplomacy.offerRejected=De %nation% verwerpen je vrijgevig bod. disbandUnit.text=Ben je zeker dat je deze eenheid wil ontslaan ? disbandUnit.yes=Achterlaten @@ -1629,7 +1652,9 @@ move.noAccessBeached=Een gestrand %nation% schip blokkeert ons pad. move.noAccessContact=We moeten eerst contact opnemen met de %nation%, Excellentie. move.noAccessSettlement=De %nation% laten je %unit% niet toe in hun nederzetting. move.noAccessSkill=Onze %unit% kan niets leren van de inboorlingen. +# Fuzzy move.noAccessTrade=We hebben niet de bevoegdheid om te handelen met andere Europese naties zoals de %nation%. +# Fuzzy move.noAccessWar=We kunnen niet handelen met de %nation% terwijl we in oorlog zijn. move.noAccessWater=Onze %unit% moeten landen voor ze de nederzetting kunnen betreden. nameRegion.text=Je hebt een %type% ontdekt en claimt deze voor de Kroon! Zoals gebruikelijk mag je het naam geven: @@ -1661,6 +1686,7 @@ server.fileNotFound=Kan het bestand met de opgegeven naam niet terugvinden. server.incompatibleVersions=Het bewaarde spel is niet compatibel met deze versie van FreeCol. server.invalidPlayerNations=Alle spelers moeten een unieke natie kiezen voor het spel kan starten. server.maximumPlayers=Sorry, het maximum aantal spelers is al bereikt. +# Fuzzy server.noRouteToServer=De server kan niet publiek gesteld worden. Pas je firewall instellingen aan om verbindingen op de ingestelde poort toe te laten. server.notAllReady=Alle spelers zijn niet klaar om te spelen! server.onlyAdminCanLaunch=Sorry, enkel de server beheerder kan het spel starten. @@ -1729,6 +1755,7 @@ colopedia.unit.price=Prijs in Europa: # Fuzzy colopedia.unit.productionBonus=Productie verbetering(en): colopedia.unit.requirements=Vereisten: +# Fuzzy colopedia.unit.school=Een school voor de opleiding van: colopedia.unit.skill=Vaardigheid: report.labour.allColonists=Alle kolonisten @@ -1799,12 +1826,14 @@ report.requirements.surplus=De volgende kolonies produceren een overschot aan %g report.trade.afterTaxes=Neto inkomst report.trade.beforeTaxes=Bruto inkomst report.trade.cargoUnits=Eenheden in het Ruim +# Fuzzy report.trade.hasCustomHouse=* Deze kolonie heeft een exporthuis; deze goederen worden geëxporteerd: report.trade.totalDelta=Totale Productie report.trade.totalUnits=Totaal Aantal report.trade.unitsSold=Eenheden gekocht of verkocht report.turn.filter=Toon dit type boodschap niet meer (%type%) report.turn.ignore=Negeer deze boodschap (Kolonie: %colony%, Goederen: %goods%) +# Fuzzy report.turn.playerNation=%nation% van %player% # Fuzzy aboutPanel.copyright=Auteursrechten (C) 2002-2013 Het FreeCol Team @@ -1829,6 +1858,7 @@ chooseFoundingFatherDialog.title=Benoem Stichter colonyPanel.colonyUnits=Kolonie eenheden colonyPanel.inPort=In de haven colonyPanel.outsideColony=Buiten de kolonie +# Fuzzy colonyPanel.producing=Produceerd colonyPanel.reducePopulation=Als je de bevolking verminderd tot onder %number% zal %colony% niet meer in staat zijn een %buildable% te bouwen. colonyPanel.bonusLabel=Bonus: %number%%extra% @@ -1839,7 +1869,9 @@ colonyPanel.notBestTile=%unit% zou meer %goods% kunnen produceren op %tile%. confirmDeclarationDialog.areYouSure.no=Misschien later confirmDeclarationDialog.areYouSure.text=Laat ons de onrechtmatige tirannie van %monarch% afgooien en de onafhankelijkheid van onze kolonies ten opzichte van de kroon uitroepen! confirmDeclarationDialog.areYouSure.yes=Vrijheid of de Dood! +# Fuzzy confirmDeclarationDialog.defaultCountry=Verenigde Staten van %nation% +# Fuzzy confirmDeclarationDialog.defaultNation=De Vrije %nation% confirmDeclarationDialog.enterCountry=Voortaan zal onze kolonie gekend zijn als confirmDeclarationDialog.enterNation=en elke burger van onze glorieuze natie zal met trots gekend zijn als diff --git a/data/strings/FreeColMessages_oc.properties b/data/strings/FreeColMessages_oc.properties index 56bbcf7d5..9bee4a7af 100644 --- a/data/strings/FreeColMessages_oc.properties +++ b/data/strings/FreeColMessages_oc.properties @@ -197,8 +197,9 @@ cli.no-memory-check=sautar la verificacion de memòria cli.no-sound=Executar FreeCol sens son cli.private=aviar un servidor privat (pas publicat sul servidor meta) cli.seed=provesís una GRANA pel generator de nombres pseudo-aleatòris -cli.server-name=definir un NOM personalizat pel servidor +# Fuzzy cli.server=Aviar un servidor sul pòrt especificat +cli.server-name=definir un NOM personalizat pel servidor cli.splash=afichar un ecran d'aviament amb l'imatge FICHIÈR en fons cli.tc=cargar la conversion totala amb lo NOM balhat cli.timeout=nombre de segondas pendent lo qual lo servidor espèra la responsa a una question @@ -261,7 +262,6 @@ colopediaAction.goods.name=Merças colopediaAction.nations.name=Nacions colopediaAction.nationTypes.name=Atots nacionals colopediaAction.resources.name=Bonus de ressorsas -colopediaAction.skills.name=Mestièrs colopediaAction.terrain.name=Terrenhs colopediaAction.units.name=Unitats colopediaAction.name=%object% (Colopèdia) @@ -988,7 +988,7 @@ model.ability.selectRecruit.name=Seleccionar las recrutas model.ability.supportUnit.name=Unitat de sosten model.ability.teach.name=Ensenhar las competéncias model.ability.teach.shortDescription=Las unitats expèrtas pòdon ensenhar a las autras lors competéncias -model.ability.tradeWithForeignColonies.name=Capacitat amb las colonias estrangièras +model.ability.tradeWithForeignColonies.name=Comerçar amb las colonias estrangièras model.ability.undead.name=Mòrt-vivent model.ability.undead.shortDescription=Una unitat d’otra-tomba model.modifier.bombardBonus.name=Bonus de bombardament @@ -1704,18 +1704,24 @@ model.building.locationLabel=a %location% model.colony.badGovernment=Lo Govèrn de %colony% es ineficaç. De penalitats son aplicadas sus la produccion. model.colony.governmentImproved1=Lo Govèrn de %colony% s'es melhorat mas demòra ineficaç. Las penalitats contunhan de s'aplicar sus la produccion. model.colony.governmentImproved2=Lo Govèrn de %colony% s'es melhorat. Las penalitats sus la produccion s'aplican pas pus. +# Fuzzy model.colony.insufficientProduction=%outputAmount% %outputType% de mai s'aurián pogut produire per la %colony%, se solament aviam agut %inputAmount% %inputType% de mai. model.colony.minimumColonySize=%object% empacha de redusir la populacion encara mai. model.colony.unbuildable=%colony% pòt pas construite %object% actualament. %object% es estat levat de la fila d’espèra de construccion. model.colony.veryBadGovernment=Lo Govèrn de %colony% es fòrça ineficaç. De penalitats fòrtas son aplicadas sus la produccion. model.colonyTile.claim=(%direction% de la demanda) model.diplomaticTrade.receive.contact=Salutacions frairalas de la part de la gloriosa nacion %nation%. +# Fuzzy model.diplomaticTrade.receive.diplomatic=Negociacions amb los %nation%. model.diplomaticTrade.receive.trade=Prenèm en consideracion l’ofèrta comerciala dels %nation%. +# Fuzzy model.diplomaticTrade.receive.tribute=Los %nation% nos demandan un tribut ! model.diplomaticTrade.send.contact=Avèm rencontrat de membres de la nacion %nation%. +# Fuzzy model.diplomaticTrade.send.diplomatic=Consideram nòstra situacion diplomatica amb los %nation%. +# Fuzzy model.diplomaticTrade.send.trade=Prepausam un comèrci amb los %nation% a %settlement%. +# Fuzzy model.diplomaticTrade.send.tribute=Demandam un tribut dels %nation% a %settlement%. model.direction.N.name=nòrd model.direction.NE.name=nòrd-èst @@ -1726,22 +1732,33 @@ model.direction.SW.name=sud-èst model.direction.W.name=oèst model.direction.NW.name=nòrd-oèst model.historyEventType.abandonColony.description=Abandonatz la colonia de %colony%. +# Fuzzy model.historyEventType.cityOfGold.description=La %nation% descobrís %city%, una de las sèt ciutats d’aur, e un tresaur de %treasure% d’aur. +# Fuzzy model.historyEventType.colonyConquered.description=Vòstra colonia %colony% es conquistada pels %nation%. +# Fuzzy model.historyEventType.colonyDestroyed.description=Vòstra colonia %colony% es destrucha pels %nation%. # Fuzzy model.historyEventType.declareIndependence.description=Destruisètz lo campament %settlement% dels %nation%. +# Fuzzy model.historyEventType.declareWar.description=La guèrra es estada declarada amb %nation%. +# Fuzzy model.historyEventType.destroyNation.description=Lo %nation% a destruch los %nativeNation%. model.historyEventType.discoverNewWorld.description=Descobrètz lo Novèl Monde. +# Fuzzy model.historyEventType.discoverRegion.description=La %nation% descobrís %region%. +# Fuzzy model.historyEventType.formAlliance.description=Un acòrd d'aligança es estat signat amb %nation%. model.historyEventType.foundColony.description=Establissètz la colonia de %colony%. model.historyEventType.foundingFather.description=%father% rejonh lo Congrès Continental. model.historyEventType.independence.description=Avètz efectuat l'independéncia a la corona. +# Fuzzy model.historyEventType.makePeace.description=Un acòrd de patz es estat signat amb %nation%. +# Fuzzy model.historyEventType.meetNation.description=Rencontratz los %nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=La %nation% es pas mai presenta dins lo Novèl Mond. +# Fuzzy model.historyEventType.spanishSuccession.description=Los %loserNation% cedisson l’ensemble de lors colonias dins lo Monde Novèl als %nation%. model.indianSettlement.mostHatedNone=Pas cap model.indianSettlement.mostHatedUnknown=Desconegut @@ -1784,8 +1801,10 @@ model.messageType.unitLost.name=Pèrdas d'unitats model.messageType.warehouseCapacity.name=Capacitat dels entrepauses model.messageType.warning.name=Alèrtas model.monarch.action.addToRef.no=Fach +# Fuzzy model.monarch.action.declarePeace.text=Avèm acceptat graciosament un tractat de patz amb los %nation%. model.monarch.action.declarePeace.no=Fach +# Fuzzy model.monarch.action.declareWar.text=L'insoléncia de las fòrças de %nation% nos obliga a lor declarar la guèrra ! model.monarch.action.declareWar.no=Fach # Fuzzy @@ -1832,6 +1851,7 @@ model.noClaimReason.worked.description=Un autre vilatge utiliza ja aqueste terri model.player.forces=Fòrças de %nation% model.player.independentMarket=Euròpa model.player.startGame=Aprèp de meses a vogar sus l'ocean, arribatz enfin al larg de las còstas d'un continent desconegut. Fasètz vela cap a {{tag:%direction%|west=l'oèst|east=l'èst|default=jol vent}} per descobrir lo Mond Novèl e lo reïvindicar al nom de la Corona. +# Fuzzy model.player.waitingFor=Los %nation% acaban lor torn. model.regionType.coast.name=Còsta model.regionType.coast.unknown=Region costièra desconeguda @@ -1871,6 +1891,7 @@ model.tradeItem.gold.name=Aur model.tradeItem.gold.description=la soma de %amount% aur model.tradeItem.goods.name=Merças model.tradeItem.incite.name=Declarar la guèrra a +# Fuzzy model.tradeItem.incite.description=guèrra contra los %nation% model.tradeItem.stance.name=Relacions model.tradeItem.unit.name=Unitat @@ -1890,9 +1911,9 @@ model.unit.underRepair=Reparacion (%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S +# Fuzzy model.unit.unitState.skipped=W model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G @@ -1931,6 +1952,7 @@ model.colony.warehouseOverfull=Vòstre entrepaus de %colony% a atench sa capacit model.colony.warehouseSoonFull=Vòstre entrepaus de %colony% va excedir sa capacitat de %goods% al torn que ven. %amount% unitats de %goods% van èsser degalhadas. model.colony.warehouseWaste=Vòstre entrepaus de %colony% a depassat sa capacitat en %goods%. %waste% unitats son estadas destruchas. model.colonyTile.resourceExhausted=Ressorsa %resource% agotada a %colony% +# Fuzzy model.game.spanishSuccession=Vòtre excelléncia, la guèrra de succession d'Espanha s'es acabada en Euròpa. Dins lo tractat d'Utrecht, los %loserNation% son estats obligats de cedir totas lors colonias dins lo Mond Novèl als %nation% ! model.indianSettlement.mission.denounced=Vòstre missionari a %settlement% es estat denonciat e executat ! model.indianSettlement.mission.destroyed=Vòstre missionari a %settlement% es mòrt dins la destruccion d'aqueste campament. @@ -1938,6 +1960,7 @@ model.player.autoRecruit=Lo trebolum religiós en %europe% butan %unit% a emigra model.player.colonyGoodsParty.harbour=Los colons de %colony% an getat %amount% unitats de %goods% dins lo pòrt, en signe de protestacion contra las taxas impausadas per la Corona. model.player.colonyGoodsParty.horses=Vòstres colons a %colony% an liberat %amount% cavals en protestacion contra los impòstets injustes impausats per la corona! model.player.colonyGoodsParty.landLocked=Los colons de %colony% an brutlat %amount% unitats de %goods% sus la plaça del mercat, en signe de protestacion contra las taxas impausadas per la Corona. +# Fuzzy model.player.dead.european=Vòstra excelléncia, los %nation% an declarat un retirament incondicional dels afars del Novèl Mond ! model.player.dead.native=Vòstra Excelléncia, los %nation% son estats destruches. model.player.disaster.effect.colonyDestroyed=%colony% es estat destruch completament. @@ -1947,12 +1970,16 @@ model.player.foundingFatherJoinedCongress=%foundingFather% a rejunt lo Congrès! model.player.interventionForceArrives=La Fòrça d'intervencion promesa arriba ! model.player.soLDecrease=L'apartenéncia als Filhs de Libertat dins vòstras colonias es tombada a %newSoL% %. model.player.soLIncrease=L'apartenéncia als Filhs de Libertat dins vòstras colonias es montada a %newSoL% %. +# Fuzzy model.player.stance.alliance.declared=Vòstra excelléncia, %nation% es aligada amb nosautres ! model.player.stance.alliance.others=Vòstra excelléncia, %attacker% es aligada amb %defender%. +# Fuzzy model.player.stance.ceaseFire.declared=Vòstra Excellénciz, los %nation% an convengut d'un cessatz-lo-fuòc amb nosautres ! model.player.stance.ceaseFire.others=Vòstra Excelléncia, los %attacker% an convengut d'un cessatz-lo-fuòc amb los %defender%. +# Fuzzy model.player.stance.peace.declared=Vòstra Excelléncia, los %nation% son en patz amb nosautres ! model.player.stance.peace.others=Vòstra Excelléncia, los %attacker% son en patz amb los %defender%. +# Fuzzy model.player.stance.war.declared=Marrida novèla, Excelléncia, los %nation% nos an declarat la guèrra ! model.player.stance.war.others=Excelléncia, los %attacker% an declarat la guèrra als %defender%. combat.automaticDefence=Vòstra %unit% a %colony% a pres las armas per defendre la colonia ! @@ -1967,6 +1994,7 @@ combat.enemyShipEvaded=Un(a) %enemyUnit% dels %enemyNation% a escapat a un atac combat.enemyShipSunk=Vòstra %unit% a colat un(a) %enemyUnit% dels %enemyNation%! combat.equipmentCaptured=Mèfi, los braves %nation% an aqués de %equipment% ! combat.goodsStolen=Un(a) %enemyUnit% dels %enemyNation% pana %amount% %goods% a %colony% ! +# Fuzzy combat.indianPlunder=Un(a) %enemyUnit% del %enemyNation% a pilhat %amount% de %colony%. combat.indianTreasure=Sasissètz %amount% dins lo campament %settlement%. combat.nativeCapitalBurned=Avètz brutlat %name%, la capitala de %nation%. %nation% es remesa a vòstre poder ! @@ -2017,6 +2045,7 @@ main.defaultPlayerName=Nom del jogaire main.javaVersion=La version %minVersion% de Java o melhor es recomandada per far foncionar FreeCol\n(%version% detectat, utilizatz --no-java-check per sautar aquesta verificacion). main.memory=Vos cal assignar mai de %memory% octets de memòria a la JVM.\n Reaviatz FreeCol amb : java -Xmx%minMemory%M -jar FreeCol.jar main.userDir.fail=FreeCol pòt pas trobar cap de repertòris apropriats per enregistrar las donadas d'utilizaire. Execucion en cors, mas benlèu qu'i aurà de problèmas. +# Fuzzy client.choicePlayer=Causissètz un jogaire : client.classic=Fracàs al cargament de la cartografia de las donadas dempuèi lo jòc de règlas 'classic'. client.ending=La partida es acabada. @@ -2027,8 +2056,10 @@ metaServer.couldNotConnect=O planhèm, es impossible de se connectar al metaserv metaServer.communicationError=Error durant la comunicacion amb lo metaservidor. Ensajatz tornamai ulteriorament. abandonEducation.action.studying=estudiant abandonEducation.action.teaching=ensenhament +# Fuzzy abandonEducation.no=Non, contunhar la formacion abandonEducation.text=Se vòstre %unit% quita %colony%, abandonarà %action% dins lo %building%; sètz segur que lo li calga daissar ? +# Fuzzy abandonEducation.yes=Òc, quitar la colonia abandonTeaching.text=Se vòstre %unit% quita lo %building%, daissarà d’ensenhar; sètz segur que la volètz far partir ? armedUnitSettlement.attack=Atacar @@ -2038,8 +2069,11 @@ boycottedGoods.text=Lo(a) %goods% es jol còp d'un boicotatge reial e pòt pas buy.moreGold=Negociar lo prètz a la baissa buy.takeOffer=Acceptar l'ofèrta buy.text=Lo %nation% prepausa de vos vendre %goods% per %gold% : +# Fuzzy confirmHostile.alliance=Podètz pas atacar una nacion aligada ! Volètz rompre vòstra aligança amb los %nation% e declarar la guèrra ? +# Fuzzy confirmHostile.ceaseFire=Avètz signat un cessatz-lo-fuòc amb los %nation%. Los volètz vertadièrament atacar ? +# Fuzzy confirmHostile.peace=Sètz en patz amb %nation%. Sètz segur que volètz declarar la guèrra ? confirmTribute.no=Benlèu que caldriá evitar # Fuzzy @@ -2101,7 +2135,9 @@ clearSpeciality.impossible=%unit% pòt pas èsser abaissada ! defeated.text=Sètz estat espotit ! Volètz : defeated.yes=Demorar e agachar defeatedSinglePlayer.yes=Entrar dins lo mond de la Vengança +# Fuzzy diplomacy.offerAccepted=Lo %nation% a acceptat vòstra ofèrta generosa. +# Fuzzy diplomacy.offerRejected=Lo %nation% a refusat vòstra ofèrta mesquina. disbandUnit.text=Sètz segur que volètz dissòlvre aquesta unitat ? disbandUnit.yes=suprimir @@ -2143,7 +2179,9 @@ move.noAccessContact=Nos cal, d’en primièr, entrar en contacte amb los %natio move.noAccessGoods=La %nation% comerçarà pas amb un %unit% void. move.noAccessSettlement=Los %nation% permeton pas a nòstres %unit% d'entrar dins lor colonia. move.noAccessSkill=Nòstres %unit% pòdon pas aprene res dels indigènas. +# Fuzzy move.noAccessTrade=Avèm pas l'autoritat per comerçar amb d'autras nacions europèas coma los %nation%. +# Fuzzy move.noAccessWar=Podèm pas comerçar amb los %nation% quand sèm en guèrra. move.noAccessWater=Nòstres %unit% devon acostar abans d'entrar dins la colonia. move.noAttackWater=Nòstre %unit% deu aterrir abans d'atacar. @@ -2196,6 +2234,7 @@ server.invalidPlayerNations=Cada jogaire deu causir una nacion abans de comença server.maximumPlayers=O planhèm, lo nombre maximum de jogaires es atench. server.missingUserName=Lo nom d'utilizaire es absent de la demanda de connexion. server.missingVersion=La version de FreeCol es absenta de la demanda de connexion. +# Fuzzy server.noRouteToServer=Lo servidor pòt pas èsser rendut publicament accessible. Vos cal configurar vòstre parafuòc d'un biais qu'autorize las connexions entrantas sul numèro de pòrt qu'avètz especificat. server.notAllReady=Totes los jogaires son pas prèstes ! server.onlyAdminCanLaunch=O planhèm, sol l'administrator del servidor pòt amodar lo jòc. @@ -2204,6 +2243,7 @@ server.timeOut=Temps d'espèra depassat al moment de la connexion amb lo servido server.userNameInUse=Lo nom d'utilizaire especificat es ja utilizat. server.userNameNotPresent=Lo nom d'utilizaire especificat es pas dins aqueste jòc. server.wrongFreeColVersion=Las versions client e servidor de FreeCol concòrdan pas. +# Fuzzy buildColony.others=Los %nation% an fondat la novèla colonia de %colony% dins %region%. cashInTreasureTrain.colonial=Un tresaur d'una soma de %amount% aur es estat mandat en Euròpa. %cashInAmount% pèças d'aur vos son estadas balhadas. cashInTreasureTrain.independent=Un tresaur de %amount% es estat apondut al tresaur nacional. @@ -2297,6 +2337,7 @@ colopedia.unit.offensivePower=Potencial ofensiu : colopedia.unit.price=Prètz en Euròpa : colopedia.unit.productionBonus={{plural:%number%|one=Modificador|other=Modificadors}} de produccion : colopedia.unit.requirements=Exigéncias : +# Fuzzy colopedia.unit.school=Establiment de formacion : colopedia.unit.skill=Competéncia : report.labour.allColonists=Totes los colons @@ -2328,6 +2369,7 @@ report.colony.explore.header=E report.colony.exploring.description=%colony% auriá interès a explorar {{plural:%amount%|one=una casa|other=%amount% casas}} report.colony.grow.header=+ report.colony.improve.header=Melhorar +# Fuzzy report.colony.improving.description=%colony%: Per produsir %amount% de mai de %goods%, remplaçatz %oldUnit% per %unit% report.colony.making.blocking.description=%colony%: %amount% %goods% necessaris per %buildable% {{plural:%turns%|one=al torn que ven|other=dins %turns% torns}} report.colony.making.constructing.description=%colony%: %buildable% acabat {{plural:%turns%|one=al torn que ven|other=dins %turns% torns}} @@ -2338,11 +2380,9 @@ report.colony.making.noconstruction.description=%colony%: Pas de construccion en report.colony.making.noteach.description=%colony%: %teacher% a pas cap d'estudiant report.colony.name.description=La lista de las colonias report.colony.name.header=Colonia -report.colony.plow.description=Nombre de casas de colonia que beneficiaràn de la Laura -report.colony.plow.header=P +# Fuzzy report.colony.production.description=%colony%: produccion neta de %goods% = %amount% report.colony.production.header=Produccion neta de %goods% -report.colony.road.header=R report.colony.starving.description=%colony%: famina {{plural:%turns%|one=al torn que ven|other=dins %turns% torns}} # Fuzzy report.continentalCongress.elected=Elegit : @@ -2388,19 +2428,19 @@ report.requirements.met=Totas las condicions son acampadas. report.requirements.missingGoods=%colony% fabrica %goods%, mas a besonh de mai de %input%. report.requirements.misusedExperts=I a {{plural:2|%unit%}} que trabalhan pas coma %work% son presentas a report.requirements.noExpert=%colony% fabrica %goods%, mas a pas de %unit%. -report.requirements.plowCenter=%colony% auriá interès a laurar sa casa. -report.requirements.plowTile=%type% cap a %direction% de %colony% auriá interès a èsser laurat report.requirements.severalExperts=Maitas {{plural:2|%unit%}} son presentas a report.requirements.surplus=Un susplús de %goods% es produch a report.trade.afterTaxes=Sòld aprèp talhas report.trade.beforeTaxes=Sòld abans talhas report.trade.cargoUnits=Unitats en transit +# Fuzzy report.trade.hasCustomHouse=* Aquesta colonia a una doana ; aquestas merças son exportadas. report.trade.totalDelta=Total de la produccion report.trade.totalUnits=Total de las unitats report.trade.unitsSold=Nb comprat/vendut report.turn.filter=Afichar pas aqueste tipe de messatge (%type%) report.turn.ignore=Ignorar aqueste messatge (Colonia : %colony% ; merças : %goods%) +# Fuzzy report.turn.playerNation=%nation% de %player% aboutPanel.copyright=Copyright © 2002-2015 L’equipa FreeCol aboutPanel.legalDisclaimer=FreeCol es un logicial liure ; o podètz tornar distribuir e/o lo modificar al títol de las clausas de la Licéncia Publica Generala GNU, tala coma es publicada per la Free Software Foundation dins sa version 2, o dins una version ulteriora. @@ -2426,6 +2466,7 @@ chooseFoundingFatherDialog.title=Designatz un paire fondator colonyPanel.colonyUnits=Unitats de la Colonia colonyPanel.inPort=Al pòrt colonyPanel.outsideColony=En defòra de la colonia +# Fuzzy colonyPanel.producing=que produtz colonyPanel.reducePopulation=Se reduisètz la populacion a una valor inferiora a %number%, %colony% poirà pas pus produire de %buildable%. colonyPanel.setGoods=Ensemble de dequés @@ -2440,7 +2481,9 @@ colonyPanel.notBestTile=%unit% poiriá produire mai de %goods% sus %tile%. confirmDeclarationDialog.areYouSure.no=Benlèu mai tard.... confirmDeclarationDialog.areYouSure.text=Permetètz-nos de nos afranquir de la tirania injusta de %monarch% e de declarar l'independéncia de nòstras colonias de la corona ! confirmDeclarationDialog.areYouSure.yes=Viure liure o Morir ! +# Fuzzy confirmDeclarationDialog.defaultCountry=Estats Units de %nation% +# Fuzzy confirmDeclarationDialog.defaultNation=%nation% liura confirmDeclarationDialog.enterCountry=D'ara enlà, nòstre país deu èsser conegut coma confirmDeclarationDialog.enterNation=e cada ciutadan de nòstra nacion gloriosa deu èsser fièr d'èsser conegut coma @@ -2489,8 +2532,10 @@ negotiationDialog.add=Apondre negotiationDialog.cancel=Anullar negotiationDialog.clear=Netejar negotiationDialog.contact.tutorial=Rencontratz d'amics europèus. Seràn en competicion amb vos per las tèrras e las riquesas, e atal, pòdon menar una guèrra contra vos. Mas aprèp que Jan de Witt a rejonch lo Congrès continental, poiretz comerçar amb eles. +# Fuzzy negotiationDialog.demand=Lo %nation% exigís de %otherNation% negotiationDialog.exchange=en escambi de +# Fuzzy negotiationDialog.offer=Lo %nation% ofrís %otherNation% negotiationDialog.send=Mandar negotiationDialog.title.contact=Rencontre d'autres europèus. @@ -2513,9 +2558,8 @@ findSettlementPanel.displayAll=Trobar totes los campaments findSettlementPanel.displayOnlyEuropean=Trobar unicament los campaments europèus findSettlementPanel.displayOnlyNatives=Trobar unicament los campaments indigènas findSettlementPanel.name=Trobar un campament +# Fuzzy firstContactDialog.meeting.natives=Rencontre amb los indigènas. . . -firstContactDialog.meeting.AZTEC=La nacion Astèca... -firstContactDialog.meeting.INCA=L'empèri Inca. . . abandonColony.no=Anullar abandonColony.text=Nos cal vertadièrament abandonar aquesta colonia ? abandonColony.yes=Abandonar diff --git a/data/strings/FreeColMessages_pl_PL.properties b/data/strings/FreeColMessages_pl_PL.properties index 5264fc0fe..e502697af 100644 --- a/data/strings/FreeColMessages_pl_PL.properties +++ b/data/strings/FreeColMessages_pl_PL.properties @@ -9,6 +9,7 @@ # Author: Krzysiek # Author: Luxus # Author: Macofe +# Author: Mateon1 # Author: Mateuszlacki # Author: Misiulo # Author: PiotrAntosz @@ -87,6 +88,7 @@ remove=Usuń rename=Zmień nazwę reset=Reset save=Zapisz +select=Wybierz server=Serwer skip=Pomiń small=Mała @@ -211,8 +213,9 @@ cli.no-memory-check=pomiń test pamięci cli.no-sound=uruchom FreeCol bez dźwięku cli.private=uruchom serwer prywatny (nie będzie ujawniany na meta-serwerze) cli.seed=podaj ZIARNO dla generatora liczb pseudolosowych -cli.server-name=określ wybraną NAZWĘ dla serwera +# Fuzzy cli.server=uruchom samodzielny serwer na określonym porcie +cli.server-name=określ wybraną NAZWĘ dla serwera cli.splash=wyświetl obraz PLIK na ekranie powitalnym podczas ładowania gry cli.tc=załaduj całkowitą konwersję o podanej NAZWIE cli.timeout=liczba sekund przez jaką serwer oczekuje na odpowiedź @@ -273,7 +276,6 @@ colopediaAction.goods.name=Towary colopediaAction.nations.name=Narody colopediaAction.nationTypes.name=Przewagi narodowe colopediaAction.resources.name=Surowce bonusowe -colopediaAction.skills.name=Umiejętności colopediaAction.terrain.name=Rodzaje terenu colopediaAction.units.name=Jednostki colopediaAction.name=%object% (Colopedia) @@ -1389,6 +1391,7 @@ model.improvement.road.description=Droga model.improvement.road.name=Droga model.improvement.road.occupationString=R model.limit.independence.coastalColonies.name=Ograniczenie kolonii nadmorskich +# Fuzzy model.limit.independence.coastalColonies.description=Potrzebujesz co najmniej %limit% kolonii nadmorskich, aby ogłosić niepodległość. model.limit.independence.rebels.name=Limit buntu model.limit.independence.rebels.description=Co najmniej %limit%% kolonistów musi popierać niepodległość. @@ -1720,6 +1723,7 @@ model.colony.badGovernment=Rządy w %colony% są nieefektywne, co oznacza ograni model.colony.goodGovernment=Poprawiła się wydajność rządów! Poparcie dla buntu w %colony% wynosi albo przewyższa teraz %number%%. model.colony.governmentImproved1=Rządy w %colony% poprawiły się, ale nie dość, by znieść ograniczenia w produkcji. model.colony.governmentImproved2=Dzięki poprawie rządów w %colony% produkcja znów ruszyła pełną parą. +# Fuzzy model.colony.insufficientProduction=Ekscelencjo! W %colony% moglibyśmy wytwarzać %outputAmount% więcej %outputType%, gdybyśmy mogli dostarczyć %inputAmount% sztuk więcej %inputType%. model.colony.lostGoodGovernment=Pogorszyła się wydajność rządów! Poparcie dla buntu w %colony% spadło poniżej %number%%. Kolonia traci wszelkie bonusy produkcji. model.colony.lostVeryGoodGovernment=Pogorszyła się jakość rządów! Poparcie dla buntu w %colony% spadło poniżej %number%%. Kolonia traci część bonusu produkcyjnego. @@ -1737,21 +1741,29 @@ model.direction.SW.name=południowy zachód model.direction.W.name=zachód model.direction.NW.name=północny zachód model.historyEventType.abandonColony.description=Opuściłeś osadę: %colony%. +# Fuzzy model.historyEventType.cityOfGold.description=Naród %nation% odkrył %city%, jedno z siedmiu miast ze złota, a w nim skarb (%treasure% sztuk złota). +# Fuzzy model.historyEventType.colonyConquered.description=Twoja osada: %colony% została zdobyta. Teraz należy do %nation%. +# Fuzzy model.historyEventType.colonyDestroyed.description=Twoja osada: %colony% została zniszczona przez %nation%. # Fuzzy model.historyEventType.conquerColony.description=Ośmielasz się akceptować nasze hojne warunki równocześnie unikając opłat? Taka obłuda zbierze gorzką zapłatę naszego niezadowolenia. # Fuzzy model.historyEventType.declareIndependence.description=Zniszczyłeś osadę %settlement% należącą do %nation%. +# Fuzzy model.historyEventType.destroyNation.description=%nation% niszczy %nativeNation%. model.historyEventType.discoverNewWorld.description=Odkryłeś Nowy Świat. +# Fuzzy model.historyEventType.discoverRegion.description=Naród %nation% odkrył %region%. model.historyEventType.foundColony.description=Założyłeś kolonię: %colony%. model.historyEventType.foundingFather.description=%father% dołączył do Kongresu Kontynetalnego. model.historyEventType.independence.description=Uzyskałeś niepodległość!!! +# Fuzzy model.historyEventType.meetNation.description=Spotkałeś inną nację (%nation%). +# Fuzzy model.historyEventType.nationDestroyed.description=Nie ma już %nation% w Nowym Świecie. +# Fuzzy model.historyEventType.spanishSuccession.description={{tag:people|%nation%}} przejmują wszystkie kolonie w nowym świecie, które założyli {{tag:people|%loserNation%}}. model.indianSettlement.mostHatedNone=Żadne model.indianSettlement.mostHatedUnknown=Nieznane @@ -1802,8 +1814,10 @@ model.messageType.warehouseCapacity.name=Pojemność magazynów model.messageType.warning.name=Ostrzeżenia model.monarch.action.addToRef.text=Korona dodała %number% {{plural:%number%|one=jednostkę|few=jednostki|many=jednostek}} %unit% do Królewskiego Korpusu Ekspedycyjnego. Przywódcy kolonialni wyrażają zaniepokojenie. model.monarch.action.addToRef.no=Gotowe +# Fuzzy model.monarch.action.declarePeace.text=Wyrażamy łaskawą zgodę na traktat pokojowy z {{tag:people|%nation%}}. model.monarch.action.declarePeace.no=Gotowe +# Fuzzy model.monarch.action.declareWar.text={{tag:people|%nation%}} ze swoim zuchwalstwem zmuszają nas do wypowiedzenia im wojny! model.monarch.action.declareWar.no=Gotowe # Fuzzy @@ -1853,6 +1867,7 @@ model.noClaimReason.worked.description=Inna osada korzysta już z tej ziemi. model.player.forces=Siły narodu %nation% model.player.independentMarket=Europa model.player.startGame=Po miesiącach żeglugi dotarłeś do wybrzeży nieznanego lądu. Płyń na {{tag:%direction%|west=na zachód|east=na wschód|default=z wiatrem}}, by odkryć Nowy Świat i zdobyć go dla Korony. +# Fuzzy model.player.waitingFor=Czekaj na %nation% model.regionType.coast.name=Wybrzeże model.regionType.coast.unknown=Nieznane wybrzeże @@ -1907,9 +1922,9 @@ model.unit.underRepair=Trwa naprawa ({{plural:%turns%|one=pozostała|other=pozos model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S +# Fuzzy model.unit.unitState.skipped=W model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G @@ -1948,6 +1963,7 @@ model.colony.warehouseSoonFull=Twoje magazyny w %colony% zostaną zapełnione %g model.colony.warehouseWaste=Magazyny %colony% przepełniły się %goods%. %waste% sztuk zostało zniszczonych. model.colony.workersEvicted=W %colony%, twoi osadnicy nie mogą dłużej pracować %location% z powodu obecności %enemyUnit%. model.colonyTile.resourceExhausted=W kolonii %colony% wyczerpały się zasoby %resource% +# Fuzzy model.game.spanishSuccession=Ekscelencjo, wojna o hiszpańską sukcesję w Europie zakończyła się. Zawarto pokój utrechcki, na mocy którego {{tag:people|%loserNation%}} skapitulowali, {{tag:people|%nation%}} przejmują we władanie ich wszystkie kolonie! model.indianSettlement.mission.denounced=Twój misjonarz w osadzie %settlement% został potępiony i stracony! model.indianSettlement.mission.destroyed=Twój misjonarz w osadzie %settlement% zginął. @@ -1957,6 +1973,7 @@ model.player.autoRecruit=Niepokoje religijne w %europe% skłaniają %unit% do em model.player.colonyGoodsParty.harbour=Twoi koloniści w %colony% wyrzucili w proteście przeciwko niesprawiedliwym podatkom nałożonym przez Koronę %amount% sztuk %goods% do zatoki! model.player.colonyGoodsParty.horses=Twoi koloniści w %colony% oburzeni niesprawiedliwymi podatkami wypuścili na wolność %amount% hodowane/ych koni/e! model.player.colonyGoodsParty.landLocked=Mieszkańcy %colony% w proteście przeciwko niesprawiedliwym podatkom spalili %amount% sztuk %goods% na głównym placu kolonii! +# Fuzzy model.player.dead.european=Ekscelencjo, {{tag:people|%nation%}} ogłosili, że bezwarunkowo wycofują się z Nowego Świata! model.player.dead.native={{tag:people|%nation%}} zostali unicestwieni, Ekcelencjo. model.player.disaster.bankruptcy.start=Nie uregulowałeś opłat za utrzymanie wszystkich budynków. Podlegasz poważnym karom. @@ -1968,12 +1985,16 @@ model.player.foundingFatherJoinedCongress=%foundingFather% dołącza do Kongresu model.player.interventionForceArrives=Obiecane siły interwencyjne nadciągają! model.player.soLDecrease=Poparcie dla niepodległości w twoich koloniach spadło do %newSoL%%! model.player.soLIncrease=Poparcie dla niepodległości w twoich koloniach wzrosło do %newSoL%%! +# Fuzzy model.player.stance.alliance.declared=Ekscelencjo, {{tag:people|%nation%}} zawarli z nami sojusz!!! model.player.stance.alliance.others=Ekscelencjo, dwaj nasi przeciwnicy (%attacker% i %defender%) zawarli sojusz!!! +# Fuzzy model.player.stance.ceaseFire.declared=Ekscelencjo, {{tag:people|%nation%}} zgodziła się na zawieszenie broni! model.player.stance.ceaseFire.others=Ekscelencjo, zawieszono działania wojenne pomiędzy %attacker% oraz %defender%. +# Fuzzy model.player.stance.peace.declared=Ekscelencjo, zawarliśmy porozumienie pokojowe z %nation%! model.player.stance.peace.others=Ekscelencjo, zawarto pokój pomiędzy %attacker% i %defender%. +# Fuzzy model.player.stance.war.declared=Ekscelencjo! Jesteśmy w stanie wojny z %nation%! model.player.stance.war.others=Ekscelencjo, %attacker% i %defender% są w stanie wojny. combat.automaticDefence=%unit% chwycił za broń, by bronić %colony%! @@ -1989,6 +2010,7 @@ combat.enemyShipEvaded=Okręt %enemyUnit% (%enemyNation%) uniknął ataku ze str combat.enemyShipSunk=Nasz okręt %unit% zatopił %enemyUnit% (%enemyNation%)! combat.equipmentCaptured=Uważaj, wojownicy narodu {{tag:people|%nation%}} uzyskali dostęp do %equipment%! combat.goodsStolen=%amount% %goods% z %colony% zostało skradzione przez %enemyUnit% ({{tag:country|%enemyNation%}})! +# Fuzzy combat.indianPlunder=%amount% z %colony% zostało zrabowane przez %enemyUnit% ({{tag:country|%enemyNation%}}). combat.indianRaid=Nasi szpiedzy informują, że %nation% najechali %colonyNation% kolonię %colony%. combat.indianSurprise={{tag:people|%nation%}} zrobili niespodziewany nalot w %colony%, alarmując naszych kolonistów. Przywódca {{tag:people|%nation%}} odmawia zaangażowania. @@ -2044,13 +2066,16 @@ main.defaultPlayerName=Nazwa gracza main.javaVersion=Wersja Java %minVersion% lub wyższa jest zalecana, aby uruchomić FreeCol\n( %version% wykryte, użyj --no-java-check aby pominąć sprawdzanie wersji). main.memory=Musisz przydzielić więcej niż %memory% bajtów pamięci dla JVM. Uruchom ponownie FreeCol z parametrem: java -Xmx%minMemory%M -jar FreeCol.jar client.baseData=Nie można odnaleźć bazy danych katalogu %dir% .\n Nie można odnaleźć plików danych przez FreeCol.\n Upewnij się, że są one obecne.\n Jeśli następnie FreeCol szuka w katalogu źle\n Uruchom grę z parametrem wiersza polecenia:\n --freecol-dane +# Fuzzy client.choicePlayer=Wybierz gracza: metaServer.couldNotConnect=Nie można połączyć się z meta-serwerem. Spróbuj jeszcze raz później. metaServer.communicationError=Wystąpił błąd podczas połączenia z meta-serwerem. Spróbuj jeszcze raz później. abandonEducation.action.studying=studiowanie abandonEducation.action.teaching=nauczanie +# Fuzzy abandonEducation.no=Nie, kontynuować edukację abandonEducation.text=Gdy twoja jednostka %unit% opuści %colony% porzuci %action% w %building%, czy na pewno tego chcesz? +# Fuzzy abandonEducation.yes=Tak, opuścić kolonię abandonTeaching.text=Jeśli twój %unit% opuści %building% przestanie nauczać, czy na pewno chcesz to porzucić? boycottedGoods.dumpGoods=Wyrzuć ładunek @@ -2060,8 +2085,11 @@ buy.takeOffer=Przyjmij ofertę buy.text=%nation% chcą sprzedać %goods% za %gold% clearTradeRoute.text=Twój %unit% jest przypisany do szlaku %route%. Jeśli ustawisz mu cel, przestanie on podążać tym szlakiem. Czy na pewno chcesz to zrobić? client.fullScreen=Karta graficzna lub sterownik do niej nie obsługuje trybu pełnoekranowego.\nPowrót do trybu okienkowego. +# Fuzzy confirmHostile.alliance=Nie możesz atakować swych sojuszników! Czy jesteś pewien, że chcesz zerwać sojusz i wypowiedzieć wojnę {{tag:people|%nation%}}? +# Fuzzy confirmHostile.ceaseFire={{tag:people|%nation%}} zawarli z tobą rozejm. Jesteś pewny, że chcesz zaatakować? +# Fuzzy confirmHostile.peace={{tag:people|%nation%}} mają z tobą pokojowe stosunki. Jesteś pewien, że chcesz wypowiedzieć wojnę? error.noSuchFile=Podany plik nie istnieje lub jest niewłaściwy. # Fuzzy @@ -2115,7 +2143,9 @@ defeated.text=Zostałeś pokonany! Co chcesz teraz zrobić: defeated.yes=Zostać i popatrzeć defeatedSinglePlayer.text=Zostałeś pokonany!\n\nTeraz jest właśnie czarodziejska, straszna godzina nocy, w której się podnoszą groby i same piekła wyziewają na świat zarazę. O, teraz bym gotów pić krew i takie rzeczy wykonywać, na których widok dzień by zbladł! defeatedSinglePlayer.yes=Przejdź w tryb odwetu +# Fuzzy diplomacy.offerAccepted=%nation% zaakceptowali twoją wspaniałomyślną propozycję. +# Fuzzy diplomacy.offerRejected=%nation% odrzucili twoją wspaniałomyślną ofertę. disbandUnit.text=Czy naprawdę chcesz rozwiązać tę jednostkę? disbandUnit.yes=Rozwiąż @@ -2158,7 +2188,9 @@ move.noAccessContact=Ekscelencjo, musimy najpierw nawiązać kontakt z {{tag:peo move.noAccessGoods={{tag:people|%nation%}} nie będą handlować %unit% o pustych ładowniach. move.noAccessSettlement=%nation% zabrania naszej jednostce (%unit%) wjazdu do swojej osady. move.noAccessSkill=Nasz %unit% nie może uczyć się od tubylców. +# Fuzzy move.noAccessTrade=Nie mamy prawa do handlu z innymi Europejczykami, jak np. %nation%. +# Fuzzy move.noAccessWar=Nie wolno nam handlować z %nation% w trakcie wojny. move.noAccessWater=Nasz %unit% musi zejść na ląd przed wejściem do osady. move.noAttackWater=Nasza jednostka (%unit%) musi atakować z ziemi. @@ -2206,6 +2238,7 @@ server.invalidPlayerNations=Przed rozpoczęciem gry każdy gracz musi wybrać in server.maximumPlayers=W rozgrywce bierze już udział maksymalna liczba graczy. server.missingUserName=W żądaniu logowania brakuje nazwy użytkownika. server.missingVersion=W żądaniu logowania brakuje wersji FreeCol. +# Fuzzy server.noRouteToServer=Serwer nie może stać się publicznym. Powinieneś wcześniej zmienić ustawienia firewall, tak by umożliwić podłączanie do portu, który wybrałeś. server.notAllReady=Nie wszyscy gracze są gotowi do rozpoczęcia gry! server.onlyAdminCanLaunch=Tylko admin serwera może rozpocząć nową grę. @@ -2214,6 +2247,7 @@ server.timeOut=Przekroczenie czasu podczas łączenia z serwerem. server.userNameInUse=Podana nazwa użytkownika jest już używana. server.userNameNotPresent=Użytkownika o tym imieniu nie ma w tej grze. server.wrongFreeColVersion=Wersja klienta i serwera gry FreeCol nie są ze sobą kompatybilne. +# Fuzzy buildColony.others=%nation% założyła nową kolonię %colony% w %region%. cashInTreasureTrain.colonial=Skrzynie z %amount% sztuk złota dotarły do Europy. Do twojego skarbca wpłynęło %cashInAmount% sztuk złota. cashInTreasureTrain.independent=%amount% złota z łupów oddano do skarbu państwa. @@ -2313,6 +2347,7 @@ colopedia.unit.offensivePower=Siła ataku: colopedia.unit.price=Cena w Europie: colopedia.unit.productionBonus={{plural:%number%|one=Modyfikator|few=Modyfikatory|many=Modyfikatorów}} produkcji: colopedia.unit.requirements=Wymagania: +# Fuzzy colopedia.unit.school=Kształci się w: colopedia.unit.skill=Umiejętność: report.labour.allColonists=Wszyscy koloniści @@ -2347,8 +2382,8 @@ report.colony.grow.header=+ report.colony.growing.description=%colony% może powiększać się o {{plural:%amount%|one=jedną jednostkę|other=%amount% jednostek}} bez szkody dla produkcji report.colony.improve.description=Jednostki, które mogłyby poprawić produkcję. report.colony.improve.header=Popraw +# Fuzzy report.colony.improving.description=%colony%: Aby produkować o %amount% więcej %goods%,
zastąp %oldUnit% tą jednostką: %unit% -report.colony.wanting.description=%colony%: Aby produkować o %amount% więcej %goods%,
dodaj %unit% report.colony.making.blocking.description=%colony% potrzebuje %amount% %goods% aby dokończyć budowę %buildable% {{plural:%turns%|one=w kolejnej turze|few=za %turns% tury|many=za %turns% tur}} report.colony.making.constructing.description=%colony% dokończy budowę %buildable% {{plural:%turns%|one=w kolejnej turze|few=za %turns% tury|many=za %turns% tur}} report.colony.making.description=Co ta kolonia produkuje @@ -2358,21 +2393,22 @@ report.colony.making.noconstruction.description=%colony%: Nic się nie buduje report.colony.making.noteach.description=%colony%: %teacher% nie ma ucznia report.colony.name.description=Lista kolonii report.colony.name.header=Kolonia -report.colony.plow.description=Liczba płytek kolonii, które mogłyby skorzystać z zaorania -report.colony.plow.header=P -report.colony.plowing.description=Kolonia %colony% skorzystałaby z orki {{plural:%amount%|one=jednej płytki|other=%amount% płytek}} +# Fuzzy report.colony.production.description=%colony%: produkcja netto %goods% wynosi %amount% +# Fuzzy report.colony.production.export.description=%colony%: produkcja netto %goods% wynosi %amount% (eksport na poziomie %export%) report.colony.production.header=%goods% - produkcja netto +# Fuzzy report.colony.production.high.description=%colony%: produkcja netto %goods% wynosi %amount%, pełna {{plural:%turns%|one=w następnej turze|few=za %turns% tury|many=za %turns% tur}} +# Fuzzy report.colony.production.low.description=%colony%: produkcja netto %goods% wynosi %amount%, minie {{plural:%turns%|one=w następnej turze|few=za %turns% tury|many=za %turns% tur}} +# Fuzzy report.colony.production.waste.description=%colony%: produkcja netto %goods% wynosi %amount%, magazyn się przepełni, %waste% się {{plural:%waste%|few=zmarnują|other=zmarnuje}} -report.colony.road.description=Liczba płytek kolonii, które mogłyby skorzystać z budowy dróg -report.colony.road.header=R -report.colony.roadBuilding.description=Kolonia %colony% skorzystałaby z budowy dróg {{plural:%amount%|one=jednej płytki|other=%amount% płytek}} report.colony.shrinking.description=%colony% musi pomniejszyć się o {{plural:%amount%|one=jedną jednostkę|few=%amount% jednostki|many=%amount% jednostek}}, aby zwiększyć produkcję report.colony.starving.description=%colony%: śmierć głodowa {{plural:%turns%|one=w następnej turze|few=za %turns% tury|many=za %turns% tur}} # Fuzzy +report.colony.wanting.description=%colony%: Aby produkować o %amount% więcej %goods%,
dodaj %unit% +# Fuzzy report.continentalCongress.elected=Wybrany: report.continentalCongress.none=(brak) report.continentalCongress.recruiting=Pozyskiwanie @@ -2414,26 +2450,25 @@ report.production.selectGoods=Wybierz towary report.production.update=Uaktualnij report.requirements.badAssignment=%colony% ma %expert%, który obecnie pracuje jako %expertWork%, podczas gdy %nonExpert% pracuje jako %nonExpertWork%. Produkcja byłaby wyższa, gdyby się zamienili miejscami. report.requirements.canTrainExperts=Możesz szkolić {{plural:2|%unit%}} w -report.requirements.clearTile=%type% na %direction% od %colony% skorzystał(a)by na wycince. +# Fuzzy report.requirements.exploreTile=%type% na %direction% od %colony% skorzystał(a)by na eksploracji. report.requirements.met=Spełniono wszystkie wymagania. report.requirements.missingGoods=%colony% produkuje %goods%, ale potrzebuje więcej %input%. report.requirements.misusedExperts=Są {{plural:2|%unit%}}, którzy nie pracują jako %work% w report.requirements.noExpert=%colony% produkuje %goods%, ale nie ma %unit%. -report.requirements.plowCenter=Kolonia %colony% skorzystałaby z orki na swojej płytce. -report.requirements.plowTile=%type% na %direction% od %colony% skorzystał(a)by na orki. -report.requirements.roadTile=%type% na %direction% od %colony% skorzystał(a)by na budowie drogi. report.requirements.severalExperts=Kliku {{plural:2|%unit%}} jest w report.requirements.surplus=Nadmierne ilości %goods% są produkowane w report.trade.afterTaxes=Zysk netto report.trade.beforeTaxes=Zysk brutto report.trade.cargoUnits=Liczba jednostek w ładunku +# Fuzzy report.trade.hasCustomHouse=* Ta kolonia ma skład celny; te towary są eksportowane. report.trade.totalDelta=Cała produkcja report.trade.totalUnits=Wszystkie jednostki report.trade.unitsSold=Sztuki kupione lub sprzedane report.turn.filter=Nie pokazuj tego typu wiadomości (%type%) report.turn.ignore=Zignoruj tę wiadomość. (Kolonia: %colony%, Towary: %goods%) +# Fuzzy report.turn.playerNation=%player% (%nation%) aboutPanel.copyright=Wszelkie prawa zastrzeżone © 2002-2015 Zespół FreeCol aboutPanel.legalDisclaimer=FreeCol jest oprogramowaniem darmowym: możesz je rozdawać i/lub modyfikować zgodnie z warunkami GNU General Public License opublikowanej przez Free Software Foundation w wersji 2 lub dowolnej późniejszej. @@ -2457,7 +2492,7 @@ chooseFoundingFatherDialog.title=Nominuj Ojca Założyciela colonyPanel.colonyUnits=Jednostki kolonii colonyPanel.inPort=W porcie colonyPanel.outsideColony=Poza osadą -colonyPanel.producing=Produkcja: +colonyPanel.producing=produkcja: colonyPanel.reducePopulation=Jeśli ludności będzie mniej niż %number%, w %colony% nie uda się zbudować %buildable%. colonyPanel.unitChange=Podczas wejścia do kolonii twoja jednostka %oldType% została %newType%. colonyPanel.bonusLabel=Bonus: %number%%extra% @@ -2468,7 +2503,9 @@ colonyPanel.notBestTile=%unit% może produkować więcej %goods% na polu %tile%. confirmDeclarationDialog.areYouSure.no=Może później confirmDeclarationDialog.areYouSure.text=Odrzućmy tyranię w której kajdany zakuł nas %monarch% i ogłośmy naszą niepodległość! confirmDeclarationDialog.areYouSure.yes=Wolność albo Śmierć! +# Fuzzy confirmDeclarationDialog.defaultCountry=Stany Zjednoczone Narodu %nation% +# Fuzzy confirmDeclarationDialog.defaultNation=Wolny naród %nation% confirmDeclarationDialog.enterCountry=Od tej pory, nasz kraj będzie się nazywał confirmDeclarationDialog.enterNation=a każdy obywatel naszego wielkiego narodu będzie rozpoznawany jako diff --git a/data/strings/FreeColMessages_pt_BR.properties b/data/strings/FreeColMessages_pt_BR.properties index ba817c743..87facaa9d 100644 --- a/data/strings/FreeColMessages_pt_BR.properties +++ b/data/strings/FreeColMessages_pt_BR.properties @@ -30,6 +30,7 @@ # Author: Thi.henrike # Author: Tiago Aquino # Author: Tuliouel +# Author: Walesson # Author: 555 model.option.recruitable.slot0.name=Primeiro imigrante @@ -69,11 +70,9 @@ client=Cliente close=Fechar color=Cor connect=Conectar -# Fuzzy current=Atual false=Falso -# Fuzzy -fill=Resultado Final +fill=Preencher height=Altura help=Ajuda high=Alto @@ -84,7 +83,6 @@ low=Baixo many=muitos medium=Médio more=mais... -# Fuzzy music=Música name=Nome no=Não @@ -102,12 +100,10 @@ rename=Renomear reset=Reiniciar save=Salvar select=Selecionar -# Fuzzy -server=Nome do Servidor: +server=Servidor skip=Pular small=Pequeno statistics=Estatísticas -# Fuzzy test=Teste true=Verdadeiro unknown=Desconhecido @@ -126,6 +122,7 @@ cargoOnCarrier=Carga a Bordo cashInTreasureTrain=Dinheiro no vagão de tesouro clearOrders=Apagar ordens colonists=Colonos +colopedia=Colonizopedia difficulty=Dificuldade docks=Docas dumpCargo=Jogar a carga fora @@ -180,6 +177,7 @@ cli.arg.dimensions=LARGURAxALTURA cli.arg.directory=DIRETÓRIO cli.arg.europeans=EUROPEUS cli.arg.file=ARQUIVO +cli.arg.gui-scale=ESCALA cli.arg.locale=LOCALIDADE cli.arg.loglevel=NIVELDOREGISTRO cli.arg.name=NOME @@ -192,6 +190,7 @@ cli.error.clientOptions=Ignorando o arquivo ilegível de opções do cliente: %s cli.error.debug=Modo da lista de conserto de erros (%modes%) esperados. cli.error.difficulties=Níveis de dificuldade (%difficulties%) achados, esperados: %arg% cli.error.europeans=Número de nações europeias deve ser no mínimo %min% +cli.error.gui-scale=Era esperado a porcentagem da escala da GUI (%scales%), encontrou-se: %arg% cli.error.home.noRead=Impossível ler de %string%. cli.error.home.noWrite=Impossível gravar em %string%. cli.error.home.notDir=%string% não é um diretório. @@ -213,6 +212,9 @@ cli.european-count=Escolha o número de nações habilitadas (colônias Européi cli.fast=pular todos os diálogos de configurações cli.font=definir a fonte padrão cli.freecol-data=define o DIRETÓRIO de dados do FreeCol (tem um subdiretório chamado 'base') +cli.full-screen=executar FreeCol em modo de tela cheia +cli.gui-scale=elementos da escala da GUI, com a ESCALA opcional (%scales%) +cli.headless=executar no modo sem cabeça cli.help=exibe esta tela de ajuda cli.load-savegame=carrega o ARQUIVO de jogo salvo dado cli.log-console=registra também no terminal além de em arquivo @@ -225,8 +227,9 @@ cli.no-memory-check=pula a checagem de memória cli.no-sound=executa o FreeCol sem som cli.private=inicia um servidor privado (não publicado no metaservidor) cli.seed=fornece uma SEMENTE para o gerador de números pseudo-aleatórios -cli.server-name=especifica um NOME personalizado para o servidor +# Fuzzy cli.server=inicia um servidor stand-alone na porta especificada +cli.server-name=especifica um NOME personalizado para o servidor cli.splash=exibe um ARQUIVO de imagem como tela inical enquanto carrega o jogo cli.tc=carrega a "conversão total" com o NOME dado cli.timeout=número de segundos que o servidor espera por uma resposta à pergunta @@ -234,8 +237,7 @@ cli.user-cache-directory=Defina o diretório poara o cache de usuário do Freeco cli.user-config-directory=definir o DIRETÓRIO para configurações do usuário do FreeCol cli.user-data-directory=definir o DIRETÓRIO para dados do usuário do FreeCol cli.version=exibe o número de versão e encerra -# Fuzzy -cli.windowed=executa o FreeCol em modo janela, em vez de modo tela cheia +cli.windowed=executar FreeCol no modo de janela, com DIMENSÕES opcionais menuBar.colopedia=Colonizopedia menuBar.game=Jogo menuBar.orders=Ordens @@ -252,6 +254,8 @@ menuBar.debug.addLiberty=Adicionar liberdade para cada colônia menuBar.debug.compareMaps.checkComplete=Busca completa. Dessincronização não encontrada. menuBar.debug.compareMaps.problem=Provável problema descoberto. Por favor leia as informações para entender o erro. menuBar.debug.compareMaps=Procurar dessincronização no mapa. +menuBar.debug.displayAIMissions=Mostrar missões IA +menuBar.debug.displayAdditionalAIMissionInfo=Exibir informações adicionais da missão IA menuBar.debug.displayErrorMessage=Mostrar mensagem de erro menuBar.debug.displayEuropeStatus=Mostrar a situação da Europa menuBar.debug.displayMonarchPanel=Mostrar o painel do Monarca @@ -290,7 +294,6 @@ colopediaAction.goods.name=Produtos colopediaAction.nations.name=Nações colopediaAction.nationTypes.name=Vantagens das Nações colopediaAction.resources.name=Recursos Bônus -colopediaAction.skills.name=Habilidades colopediaAction.terrain.name=Tipo de terreno colopediaAction.units.name=Unidades colopediaAction.name=%object% (Colonizopedia) @@ -353,8 +356,7 @@ renameAction.name=Renomear reportCargoAction.name=Relatório de Carga reportColonyAction.name=Relatório de Colônias reportCongressAction.name=Congresso Continental -# Fuzzy -reportEducationAction.name=Educação +reportEducationAction.name=Relatório Educação reportExplorationAction.name=Relatório de Exploração reportForeignAction.name=Relatório das Relações Exteriores reportHighScoresAction.name=Melhores Pontuações @@ -436,8 +438,15 @@ model.option.buildOnNativeLand.never.shortDescription=Não é permitida a constr model.option.settlementNumber.name=Número de acampamentos dos nativos model.option.settlementNumber.shortDescription=Defina o número de acampamentos dos nativos nos mapas gerados. model.option.settlementNumber.verySmall.name=Muito pequeno +model.option.settlementNumber.verySmall.shortDescription=Muito poucos assentamentos nativos model.option.settlementNumber.small.name=Pequeno +model.option.settlementNumber.small.shortDescription=Pequeno número de assentamentos nativos model.option.settlementNumber.medium.name=Médio +model.option.settlementNumber.medium.shortDescription=Número médio de assentamentos nativos +model.option.settlementNumber.large.name=Grande +model.option.settlementNumber.large.shortDescription=Número grande de assentamentos nativos +model.option.settlementNumber.veryLarge.name=Muito grande +model.option.settlementNumber.veryLarge.shortDescription=Abundantes assentamentos nativos model.difficulty.monarch.name=Monarca model.option.monarchMeddling.name=Interferência do Monarca model.option.monarchMeddling.shortDescription=Aumenta o número e gravidade das interferências do Monarca. @@ -469,6 +478,8 @@ model.option.interventionForce.name=Força de intervenção model.option.interventionForce.shortDescription=A Força de Intervenção enviada para apoiar a sua Guerra de Independência. model.option.mercenaryForce.name=Força de mercenários model.option.mercenaryForce.shortDescription=A Força Mercenária se ofereceu para apoiar a sua Guerra de Independência. +model.option.warSupportForce.name=Força de Apoio guerra +model.option.warSupportForce.shortDescription=A Força máxima oferecida pelo monarca para apoiar as suas guerras. model.difficulty.government.name=Governo model.option.badGovernmentLimit.name=Limite de governo ineficiente model.option.badGovernmentLimit.shortDescription=O número máximo de monarquistas para começar a penalidade na produção @@ -490,10 +501,15 @@ model.option.unitsThatUseNoBells.shortDescription=O número de colonos em uma co model.option.tileProduction.name=Produção dos terrenos model.option.tileProduction.shortDescription=A variação da quantidade da produção model.option.tileProduction.veryLow.name=Muito baixo +model.option.tileProduction.veryLow.shortDescription=Produção muito baixa de telhas model.option.tileProduction.low.name=Baixo +model.option.tileProduction.low.shortDescription=Baixa produção de telhas model.option.tileProduction.medium.name=Médio +model.option.tileProduction.medium.shortDescription=Produção média de telhas model.option.tileProduction.high.name=Alto +model.option.tileProduction.high.shortDescription=Alta produção de telhas model.option.tileProduction.veryHigh.name=Muito alto +model.option.tileProduction.veryHigh.shortDescription=Produção muito elevada de telhas model.option.badRumour.name=Chance de rumor ruim model.option.badRumour.decription=Porcentagem de chance de um rumor ter resultado ruim. model.option.goodRumour.name=Chance de bons rumores @@ -532,6 +548,8 @@ model.option.settlementActionsContactChief.name=Contacto com o chefe model.option.settlementActionsContactChief.shortDescription=Todas as interações com um acampamento nativo contactam o chefe e consomem o bônus de reconhecimento. model.option.enhancedMissionaries.name=Missionários melhorados model.option.enhancedMissionaries.shortDescription=Missões missionárias melhoram o comércio, habilidades ensinadas e dar visibilidade ao redor. +model.option.missionInfluence.name=Missão Influência +model.option.missionInfluence.shortDescription=A força da influência de uma missão no nível de alarme dos nativos em um assentamento. model.option.giftProbability.name=Probabilidade de receber presente model.option.giftProbability.shortDescription=Porcentagem por turno de chance que uma assentamento nativo pacífico oferecer os excedentes de produção como um presente para um assentamento europeu amigável nas proximidades. model.option.demandProbability.name=Probabilidade de demanda @@ -560,14 +578,26 @@ model.option.equipEuropeanRecruits.name=Equipar recrutas Europeus model.option.equipEuropeanRecruits.shortDescription=Treinados recentemente ou recrutas na Europa estão equipados de acordocom a configuração padrão gameOptions.colony.name=Opcões da Colônia gameOptions.colony.shortDescription=Contém opções relacionadas ao comportamento das colônias. +model.option.bellAccumulationCapped.name=Acumulação de sinos interrompida +model.option.bellAccumulationCapped.shortDescription=Colônias não podem acumular mais sinos depois que é atingido 100% rebeldes +model.option.captureUnitsUnderRepair.name=Capturar unidades em reparos +model.option.captureUnitsUnderRepair.shortDescription=Capturar unidades em reparos quando uma colônia é conquistada. model.option.customIgnoreBoycott.name=Casa de Comércio ignora boicote model.option.customIgnoreBoycott.shortDescription=A Casa de Comércio venderá produtos sob boicote. +model.option.customsOnCoast.name=Casas de comércio na costa +model.option.customsOnCoast.shortDescription=Casas de comércio só podem ser construídas em colônias costeiras. +model.option.disembarkInColony.name=Desembarque na Colônia +model.option.disembarkInColony.shortDescription=Todas as unidades desembarcam quando um veículo chega a uma colônia. model.option.expertsHaveConnections.name=Experts possuem contatos model.option.expertsHaveConnections.shortDescription=Profissionais podem usar seus contatos para prover quantidades mínimas para manter a produção nas fábricas. model.option.foundColonyDuringRebellion.name=Colonias fundadas durante a rebelião model.option.foundColonyDuringRebellion.shortDescription=O jogador pode continuar fundadndo colonias durante a guerra da independencia. +model.option.payForBuilding.name=Pagar para a construção +model.option.payForBuilding.shortDescription=Construções podem ser concluídas rapidamente pagando pelas mercadorias que faltam. model.option.saveProductionOverflow.name=Guardar o excedenta da produção model.option.saveProductionOverflow.shortDescription=Guardar o excedente de martelos, sinos e cruzes. +model.option.clearHammersOnConstructionSwitch.name=Remove martelos ao alterar a construção +model.option.clearHammersOnConstructionSwitch.shortDescription=Remove os martelos acumulados se a construção for alterada. model.option.allowStudentSelection.name=Permitir seleção de estudantes model.option.allowStudentSelection.shortDescription=Permite a atribuição de estudantes manual, em vez de automática model.option.enableUpkeep.name=Edifícios precisam de manutenção (EXPERIMENTAL) @@ -596,6 +626,7 @@ model.option.lastYear.name=Último ano do jogo model.option.lastYear.shortDescription=O último ano do jogo. model.option.lastColonialYear.name=Último ano colonial do jogo model.option.lastColonialYear.shortDescription=O último ano do jogo para um jogador colonial. +model.option.independenceTurn.name=Turno Independência model.option.seasons.name=Sessões gameOptions.prices.name=Opções de Preços gameOptions.prices.shortDescription=Contem opições geradas no jogo que controlam o preço inicial dos itens. @@ -1459,6 +1490,7 @@ model.improvement.road.description=Estrada model.improvement.road.name=Estrada model.improvement.road.occupationString=R model.limit.independence.coastalColonies.name=Limite de Colônias Costeiras +# Fuzzy model.limit.independence.coastalColonies.description=Você precisa de pelo menos %limit% colônias costeiras para declarar a independência. model.limit.independence.rebels.name=Limite de Filhos da Liberdade model.limit.independence.rebels.description=Pelo menos %limit%% do seus colonos devem apoiar a independência. @@ -1804,6 +1836,7 @@ model.colony.badGovernment=O governo de %colony% é ineficiente. Foram aplicadas model.colony.goodGovernment=Eficiência governamental foi melhorada! A comunidade de Filhos da Liberdade em %colony% é igual ou superior a %number%% da população. model.colony.governmentImproved1=O governo de %colony% melhorou, mas ainda é ineficiente. As penas à produção ainda vigoram. model.colony.governmentImproved2=O governo de %colony% melhorou. As penas à produção cessaram. +# Fuzzy model.colony.insufficientProduction=Mais %outputAmount% de %outputType% poderia ser produzidos em %colony% se tivéssemos mais %inputAmount% %inputType%. model.colony.lostGoodGovernment=A eficiência do governo diminuiu! A comunidade dos Filhos da Liberdade em %colony% é inferior a %number%%. Alguns bônus de produção foram perdidos. model.colony.lostVeryGoodGovernment=A eficiência do governo diminuiu! A comunidade dos Filhos da Liberdade em %colony% já não é de %number%%. Alguns bônus de produção foram perdidos. @@ -1818,12 +1851,17 @@ model.colony.veryBadGovernment=O governo de %colony% é muito ineficiente. Foram model.colony.veryGoodGovernment=Eficiência governamental foi melhorada! A comunidade de Filhos da Liberdade em %colony% já ultrapassa os %number%% da população. model.colonyTile.claim=(reivindicar %direction%) model.diplomaticTrade.receive.contact=Comprimentos fraternais da gloriosa nação %nation%. +# Fuzzy model.diplomaticTrade.receive.diplomatic=Negociemos com a nação %nation%. model.diplomaticTrade.receive.trade=Consideremos a oferta de comércio de %nation%. +# Fuzzy model.diplomaticTrade.receive.tribute=A %nation% está exigindo tributos de nós! model.diplomaticTrade.send.contact=Nós encontramos menbros da nação %nation%. +# Fuzzy model.diplomaticTrade.send.diplomatic=Consideremos a nossa situação diplomatica com %nation%. +# Fuzzy model.diplomaticTrade.send.trade=Vamos propor uma troca com %nation% em %settlement%. +# Fuzzy model.diplomaticTrade.send.tribute=Exigimos tributo de %nation% em %settlement%. model.direction.N.name=norte model.direction.NE.name=nordeste @@ -1834,25 +1872,37 @@ model.direction.SW.name=sudoeste model.direction.W.name=oeste model.direction.NW.name=noroeste model.historyEventType.abandonColony.description=Você abandonou a colônia de %colony% +# Fuzzy model.historyEventType.ceaseFire.description=Cessar-fogo com %nation%. +# Fuzzy model.historyEventType.cityOfGold.description=Os %nation% descobriram a %city%, uma das Setes Eldorado, e um tesouro de %treasure% moedas de ouro. +# Fuzzy model.historyEventType.colonyConquered.description=A sua colônia %colony% foi conquistada pelos %nation%. +# Fuzzy model.historyEventType.colonyDestroyed.description=A sua colônia %colony% foi destruída pelos %nation%. # Fuzzy model.historyEventType.conquerColony.description=Você ousa aceitar os nossos Termos generosos e ainda fugir do pagamento? Essa duplicidade deve colher a recompensa amarga de nosso desagrado. # Fuzzy model.historyEventType.declareIndependence.description=Você destruiu o acampamento %settlement% dos %nation%. +# Fuzzy model.historyEventType.declareWar.description=Guerra declarada com %nation%. +# Fuzzy model.historyEventType.destroyNation.description=Os %nation% destruíram os %nativeNation%. model.historyEventType.discoverNewWorld.description=Você descobriu o Novo Mundo. +# Fuzzy model.historyEventType.discoverRegion.description=Os %nation% descobriram %region%. +# Fuzzy model.historyEventType.formAlliance.description=Aliança negociada com %nation%. model.historyEventType.foundColony.description=Você fundou a colônia de %colony%. model.historyEventType.foundingFather.description=%father% entrou no Congresso Continental. model.historyEventType.independence.description=Você conquistou a independência da Coroa! +# Fuzzy model.historyEventType.makePeace.description=Acordo de paz com %nation%. +# Fuzzy model.historyEventType.meetNation.description=Você encontrou os %nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=Os %nation% já não estão mais presentes no Novo Mundo. +# Fuzzy model.historyEventType.spanishSuccession.description=%loserNation% cedeu todas as suas colônias do Novo Mundo para %nation%. model.indianSettlement.mostHatedNone=Nenhum model.indianSettlement.mostHatedUnknown=Desconhecido @@ -1905,8 +1955,10 @@ model.messageType.warehouseCapacity.name=Capacidade do Armazém model.messageType.warning.name=Avisos model.monarch.action.addToRef.text=A coroa adicionou %number% {{plural:%number%|%unit%}} para a Força Real Expedicionária. Líderes coloniais manifestam preocupação. model.monarch.action.addToRef.no=Feito +# Fuzzy model.monarch.action.declarePeace.text=Fizemos graciosamente um acordo de tratado de paz com %nation%. model.monarch.action.declarePeace.no=Feito +# Fuzzy model.monarch.action.declareWar.text=A insolência da %nation% nos obriga a declarar guerra a eles! model.monarch.action.declareWar.no=Feito # Fuzzy @@ -1966,6 +2018,7 @@ model.player.colonialIndependence=Somente jogadores coloniais podem declarar ind model.player.forces=Forças %nation% model.player.independentMarket=Europa model.player.startGame=Depois de meses nos mares, você finalmente avistou a costa de um continente desconhecido. Navegue {{tag:%direction%|west=para oeste|east=para leste|default=contra o vento}} para descobrir o Novo Mundo e conquistá-lo para sua Coroa. +# Fuzzy model.player.waitingFor=Esperando por: %nation% model.regionType.coast.name=Costa model.regionType.coast.unknown=Região Costeira desconhecida @@ -2005,6 +2058,7 @@ model.tradeItem.gold.name=Ouro model.tradeItem.gold.description=a soma de %amount% moedas de ouro model.tradeItem.goods.name=Produtos model.tradeItem.incite.name=Declarar guerra contra +# Fuzzy model.tradeItem.incite.description=Guerra contra a nação de %nation% model.tradeItem.stance.name=Estado model.tradeItem.unit.name=Unidade @@ -2026,9 +2080,9 @@ model.unit.underRepair=Em reparação (%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S +# Fuzzy model.unit.unitState.skipped=W model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G @@ -2069,6 +2123,7 @@ model.colony.warehouseSoonFull=O seu armazém em %colony% excederá a capacidade model.colony.warehouseWaste=Seu armazém em %colony% excedeu sua capacidade para %goods%. %waste% unidades se perderam. model.colony.workersEvicted=Na %colony%, os colonos não podem mais trabalhar %location% devido à presença de %enemyUnit%. model.colonyTile.resourceExhausted=Estamos sem %resource% em %colony% +# Fuzzy model.game.spanishSuccession=Vossa Excelência, a Guerra de Sucessão Espanhola acabou na Europa. No Tratado de Utrecht, os %loserNation% foram forçados a ceder todas as colônias no Novo Mundo aos %nation%! model.indianSettlement.mission.denounced=O seu missionário em %settlement% foi acusado e executado! model.indianSettlement.mission.destroyed=O seu missionário em %settlement% morreu na destruição do povoado. @@ -2078,6 +2133,7 @@ model.player.autoRecruit=A agitação religiosa em %europe% forçam a emigraçã model.player.colonyGoodsParty.harbour=Seus colonos em %colony% jogaram %amount% unidades de %goods% ao mar, em protesto à taxação injusta pretendida pela Coroa! model.player.colonyGoodsParty.horses=Os seus colonos de %colony% libertaram %amount% cavalos em protesto contra estes impostos injustos da Coroa! model.player.colonyGoodsParty.landLocked=Seus colonos em %colony% queimaram %amount% unidades de %goods% no mercado em protesto a esta taxação injusta da Coroa! +# Fuzzy model.player.dead.european=Vossa Excelência, os %nation% declararam a sua retirada incondicional dos assuntos do Novo Mundo! model.player.dead.native=Vossa Excelência, os %nation% foram destruídos. model.player.disaster.bankruptcy.start=Você deixou de pagar a manutenção de todos os edifícios. Severas penalidades serão aplicadas na produção. @@ -2091,12 +2147,16 @@ model.player.ignoredTax=A coroa aumentou a taxa para %amount%% como foi previame model.player.interventionForceArrives=Chega a prometida Força de Intervenção! model.player.soLDecrease=Os Filhos da Liberdade em suas colônias caíram para %newSoL% por cento! model.player.soLIncrease=Os Filhos da Liberdade em suas colônias já aumentaram para %newSoL% por cento! +# Fuzzy model.player.stance.alliance.declared=Vossa Excelência, %nation% formaram uma aliança connosco! model.player.stance.alliance.others=Vossa Excelência, os %attacker% estão em aliança com os %defender%. +# Fuzzy model.player.stance.ceaseFire.declared=Vossa Excelência, os %nation% aceitaram um acordo de cessar-fogo connosco! model.player.stance.ceaseFire.others=Vossa Excelência, o exército %attacker% acordaram um cessar-fogo com o exército %defender%. +# Fuzzy model.player.stance.peace.declared=Vossa Excelência, os %nation% estão em paz connosco! model.player.stance.peace.others=Vossa Excelência, o exército %attacker% está em paz com o exército %defender%. +# Fuzzy model.player.stance.war.declared=Más notícias, Vossa Excelência. A Nação %nation% declarou guerra contra nós! model.player.stance.war.others=Vossa Excelência, os %attacker% declararam guerra contra os %defender%. combat.automaticDefence=O(A) %unit% em %colony% pegou em armas para defender a colônia! @@ -2112,6 +2172,7 @@ combat.enemyShipEvaded=%enemyUnit% de %enemyNation% escapou de um ataque por %un combat.enemyShipSunk=%unit% afundou %enemyUnit% de %enemyNation%! combat.equipmentCaptured=Atenção, os bravos de %nation% adquiriram %equipment%! combat.goodsStolen=O %enemyUnit% %enemyNation% roubou %amount% %goods% em %colony%! +# Fuzzy combat.indianPlunder=O %enemyUnit% %enemyNation% saqueou %amount% em %colony%. combat.indianRaid=Nossos espiões relataram que os %nation% invadiram a %colony% dos %colonyNation%. combat.indianSurprise=Os %nation% fazem um ataque surpresa à colónia %colony%, alarmando nossos colonos. O chefe dos %nation% nega qualquer envolvimento. @@ -2168,6 +2229,7 @@ main.javaVersion=É recomendada a versão do Java %minVersion% ou mais recente p main.memory=É necessário atribuir mais de %memory% bytes de memória para a JVM.\n Reinicie o FreeCol com: java - Xmx %minMemory% M-jar FreeCol.jar main.userDir.fail=FreeCol não pode encontrar os diretórios adequados para salvar dentro dos dados do usuário.Prosseguindo, mas espera problemas. client.baseData=Não foi possível encontrar o diretório de base de dados %dir%.\nOs arquivos de dados não foram encontrados pelo FreeCol.\nPor favor, certifique-se de que eles estão presentes.\nSe o FreeCol está procurando no diretório errado, então rode o jogo com um parâmetro de linha de comando:\n--freecol-data +# Fuzzy client.choicePlayer=Por favor, escolha um jogador: client.classic=Falha ao carregar o mapeamento de recursos do conjunto de regras `clássico '. client.debugConnect=Você não pode se conectar a um jogo existente no modo de debug. @@ -2180,8 +2242,10 @@ metaServer.couldNotConnect=Desculpe, não foi possível conectar-se ao meta-serv metaServer.communicationError=Houve um erro enquanto comunicava-se com o meta-servidor. Por favor, tente novamente mais tarde. abandonEducation.action.studying=estudar abandonEducation.action.teaching=ensinar +# Fuzzy abandonEducation.no=Não, continuar na educação abandonEducation.text=Se sua %unit% sair da %colony% irá deixar de %action% na %building%, tem certeza que ele deve abandonar? +# Fuzzy abandonEducation.yes=Sim, deixar a colônia abandonTeaching.text=Se sua %unit% deixar a %building%, ele parará de ensinar, você tem certeza de que deve retira-la? armedUnitSettlement.attack=Atacar @@ -2193,9 +2257,13 @@ buy.takeOffer=Aceitar a oferta buy.text=A Nação %nation% gostaria de vender %goods% por %gold% moedas de ouro: clearTradeRoute.text=%unit% está atribuído à rota comercial %route%. Definir o seu destino vai removê-lo da rota comercial. Tem certeza que deseja fazer isso? client.fullScreen=Modo de tela cheia não é suportado para este GraphicsDevice.\nVoltando para o modo de janela. +# Fuzzy confirmHostile.alliance=Você não pode atacar uma nação aliada! Tem a certeza de que pretende quebrar a sua aliança com os %nation% e declarar guerra? +# Fuzzy confirmHostile.ceaseFire=Você assinou um cessar-fogo com os %nation%. Você realmente quer atacar? +# Fuzzy confirmHostile.peace=Você está em paz com os %nation%. Deseja realmente declarar guerra? +# Fuzzy confirmTribute.broke=Nossos espiões reportam que a nação %nation% estão completamente arruinados. Melhor que não percamos tempo exigindo tributos deles. confirmTribute.european=A %nation% %danger%, and %finance%. Quanto de tributo devemos exigir deles? confirmTribute.happy=A %nation% no assentamento %settlement% são bons amigos, é uma pena machucar nossa amizade. @@ -2263,7 +2331,9 @@ defeated.text=Você foi derrotado! Você prefere: defeated.yes=Ficar e assistir defeatedSinglePlayer.text=Foi derrotado!\n\nEis chegada a terrível hora da noite, quando se escancaram os cemitérios e o inferno expele a sua pestilência sobre o mundo. Agora podia eu matar e cometer atos tão lúgubres que ao vê-los o dia tremeria. defeatedSinglePlayer.yes=Entrar no Modo Vingança +# Fuzzy diplomacy.offerAccepted=A Nação %nation% aceitou sua oferta generosa. +# Fuzzy diplomacy.offerRejected=A Nação %nation% rejeitou sua oferta generosa. disbandUnit.text=Tem certeza que quer eliminar esta unidade? disbandUnit.yes=Dispersar @@ -2308,7 +2378,9 @@ move.noAccessContact=Excelência, primeiro devemos estabelecer contato com os %n move.noAccessGoods=Os %nation% não negociarão com um %unit% vazio. move.noAccessSettlement=Os %nation% não permitem que a unidade %unit% entre no seu acampamento. move.noAccessSkill=%unit% não pode aprender com os nativos. +# Fuzzy move.noAccessTrade=Não temos autoridade necessária para efetuar trocas comerciais com outras nações europeias, como os %nation%. +# Fuzzy move.noAccessWar=Não podemos fazer trocas comerciais com os %nation% enquanto estivermos em guerra. move.noAccessWater=%unit% tem de desembarcar antes de entrar no acampamento. move.noAttackWater=A nossa unidade %unit% tem de estar em terra para atacar. @@ -2363,6 +2435,7 @@ server.invalidPlayerNations=Cada jogador deve escolher uma nação diferente ant server.maximumPlayers=Desculpe, o número máximo de jogadores já foi atingido. server.missingUserName=O nome de usuário está ausente na solicitação de login. server.missingVersion=A versão do FreeCol está ausente na solicitação de login. +# Fuzzy server.noRouteToServer=O servidor não pode ser público. Você deve modificar suas configurações de firewall para permitir conexões na porta em uso. server.noSuchPlayer=O jogo não contém um jogador chamado: %player% server.notAllReady=Nem todos os jogadores estão prontos para começar o jogo! @@ -2372,6 +2445,7 @@ server.timeOut=Tempo limite esgotado para tentar conectar ao servidor. server.userNameInUse=O nome de usuário especificado já se encontra em uso. server.userNameNotPresent=O usuário específico não está neste jogo. server.wrongFreeColVersion=As versões do cliente e servidor do jogo não coincidem. +# Fuzzy buildColony.others=A %nation% tem fundado a nova colônia de %colony% em %region%. cashInTreasureTrain.colonial=Um tesouro com %amount% moedas de ouro chegou na Europa. %cashInAmount% moedas de ouro foram depositadas. cashInTreasureTrain.independent=Um tesouro de %amount% foi adicionado ao caixa nacional. @@ -2472,6 +2546,7 @@ colopedia.unit.offensivePower=Poder Ofensivo: colopedia.unit.price=Preço na Europa: colopedia.unit.productionBonus={{plural:%number%|one=Modificador|other=Modificadores}} de produção: colopedia.unit.requirements=Requerimentos: +# Fuzzy colopedia.unit.school=Estrutura requerida para treinar: colopedia.unit.skill=Habilidade: report.labour.allColonists=Todos os Colonos @@ -2507,8 +2582,8 @@ report.colony.growing.description=%colony% pode crescer por abrigar mais {{plura # Fuzzy report.colony.improve.description=Colonos que poderiam melhorar a produção no que diz respeito a unidade que atualmente esta fazendo o trabalho report.colony.improve.header=Melhorar +# Fuzzy report.colony.improving.description=%colony%: Para fazer %amount% de %goods%, substitua %oldUnit% por %unit% -report.colony.wanting.description=%colony%: Para produzir mais %amount% de %goods% adicione %unit% report.colony.making.blocking.description=%colony%: %amount% %goods% são necessários para %buildable% ser completada {{plural:%turns%|one=no turno seguinte|other=em %turns% turnos}} report.colony.making.constructing.description=%colony%: %buildable% será completada {{plural:%turns%|one=no turno seguinte|other=em %turns% turnos}} report.colony.making.description=O que esta colônia está produzindo @@ -2518,20 +2593,21 @@ report.colony.making.noconstruction.description=%colony%: Não há construção report.colony.making.noteach.description=%colony%: %teacher% precisa de um estudante report.colony.name.description=A lista das colônias report.colony.name.header=Colônia -report.colony.plow.description=Número de terrenos da colônia que beneficiariam da aração -report.colony.plow.header=P -report.colony.plowing.description=%colony% beneficiaria se arrace {{plural:%amount%|one=um terreno|other=%amount% terrenos}} +# Fuzzy report.colony.production.description=%colony%: produção líquida de %goods% = %amount% +# Fuzzy report.colony.production.export.description=%colony%: produção líquida de %goods% é de %amount% (acima de exportação de %export%) report.colony.production.header=Produção líquida de %goods% +# Fuzzy report.colony.production.high.description=%colony%: produção líquida de %goods% = %amount%; completa {{plural:%turns%|one=no turno seguinte|other=em %turns% turnos}} +# Fuzzy report.colony.production.low.description=%colony%: produção líquida de %goods% = %amount%;\ndesaparecerá {{plural:%turns%|one=no turno seguinte|other=em %turns% turnos}} +# Fuzzy report.colony.production.waste.description=%colony%: produção líquida de %goods% = %amount%; armazém irá atingir a sua capacidade, %waste% irão ser desperdiçados -report.colony.road.description=Número de terrenos da colônia que beneficiariam da construção de estradas -report.colony.road.header=R -report.colony.roadBuilding.description=%colony% se beneficiaria da construção de {{plural:%amount%|one=uma estrada|other=%amount% estradas}} report.colony.shrinking.description=%colony% deve desabrigar cerca de {{plural:%amount%|one=uma unidade|other=%amount% unidades}} para melhorar a produção report.colony.starving.description=%colony%: haverá fome {{plural:%turns%|one=no próximo turno|other=em %turns% turnos}} +# Fuzzy +report.colony.wanting.description=%colony%: Para produzir mais %amount% de %goods% adicione %unit% report.continentalCongress.available=Disponível report.continentalCongress.elected=Eleito: %turn% report.continentalCongress.none=(nenhum) @@ -2574,26 +2650,25 @@ report.production.selectGoods=Selecionar bens report.production.update=Atualizado report.requirements.badAssignment=A colônia %colony% tem um %expert% trabalhando como %expertWork%, enquanto um %nonExpert% trabalha como %nonExpertWork%. A produção será maior se os colonos trocassem de funções. report.requirements.canTrainExperts=As unidades {{plural:2|%unit%}} podem ser treinadas em: -report.requirements.clearTile=%type%, a %direction% de %colony% seria beneficiado por um desmatamento. +# Fuzzy report.requirements.exploreTile=%type%, a %direction% de %colony%, sairia beneficiada por uma exploração. report.requirements.met=Todos os requeirimentos foram atingidos. report.requirements.missingGoods=%colony% está produzindo %goods%, mas precisa de mais %input%. report.requirements.misusedExperts=Há {{plural:2|%unit%}} que não estão trabalhando como %work% em report.requirements.noExpert=A colônia %colony% está produzindo %goods%, mas não possui um %unit%. -report.requirements.plowCenter=%colony% seria beneficiada pela arasão. -report.requirements.plowTile=%type%, a %direction% de %colony%, seria beneficiada pela arasão. -report.requirements.roadTile=%type% a %direction% de %colony% seria beneficiada pela construção de uma estrada. report.requirements.severalExperts=As seguintes colônias têm mais de um {{plural:2|%unit%}}: report.requirements.surplus=As seguintes colônias estão com excedente de %goods%: report.trade.afterTaxes=Faturamento após o imposto report.trade.beforeTaxes=Faturamento antes do imposto report.trade.cargoUnits=Unidades na Carga +# Fuzzy report.trade.hasCustomHouse=* Esta colônia possui Casa de Comério; estes bens são exportados. report.trade.totalDelta=Total de Produção report.trade.totalUnits=Total de Unidades report.trade.unitsSold=Unidades compradas ou vendidas report.turn.filter=Não exiba este tipo de mensagem (%type%) report.turn.ignore=Ignore esta mensagem (Colônia: %colony%, Bens: %goods%) +# Fuzzy report.turn.playerNation=%nation% de %player% aboutPanel.copyright=Copyright © 2002-2015 A Equipe FreeCol aboutPanel.legalDisclaimer=FreeCol é software livre: pode redistribuí-lo e/ou modificá-lo sob os termos da GNU General Public License tal como publicada pela Free Software Foundation, versão 2 da Licença ou posterior. @@ -2619,6 +2694,7 @@ colonyPanel.buildQueue=Fila de Construção colonyPanel.colonyUnits=Unidades da colônia colonyPanel.inPort=No porto colonyPanel.outsideColony=Fora da Colônia +# Fuzzy colonyPanel.producing=Produzindo: colonyPanel.reducePopulation=Se você reduzir a população abaixo de %number%, %colony% não poderá mais construir %buildable%. colonyPanel.unitChange=Na colônia, um %oldType% tornou-se um %newType%. @@ -2632,7 +2708,9 @@ confirmDeclarationDialog.areYouSure.no=Talvez depois confirmDeclarationDialog.areYouSure.text=Deixe-nos renunciar à tirania e injustiça de %monarch% e declarar a independência de nossas colônias! confirmDeclarationDialog.areYouSure.yes=Independência ou Morte! confirmDeclarationDialog.createFlag=e seus inimigos tremerão sobre a mira de seu estandarte desafiador +# Fuzzy confirmDeclarationDialog.defaultCountry=Estados Unidos de %nation% +# Fuzzy confirmDeclarationDialog.defaultNation=%nation% Livre confirmDeclarationDialog.enterCountry=A partir daí, o nosso país será conhecido como confirmDeclarationDialog.enterNation=e todos os cidadãos da nossa gloriosa nação terão o orgulho em serem conhecidos como @@ -2684,9 +2762,11 @@ negotiationDialog.add=Adicionar negotiationDialog.cancel=Cancelar negotiationDialog.clear=Limpar negotiationDialog.contact.tutorial=Você encontrou europeus. Eles competirão com você por terras e riquezas, e poderão até declarar guerra contra você. Apenas depois que Jan de Witt entrar no congresso, você poderá comercializar com eles. +# Fuzzy negotiationDialog.demand=A nação %nation% exige da nação %otherNation% negotiationDialog.exchange=em troca de negotiationDialog.goldAvailable=(%amount% ouro disponível) +# Fuzzy negotiationDialog.offer=A nação %nation% oferece à nação %otherNation% negotiationDialog.send=Enviar negotiationDialog.title.contact=Encontrando os colegas europeus @@ -2709,10 +2789,9 @@ findSettlementPanel.displayAll=Encontrar todos os acampamentos findSettlementPanel.displayOnlyEuropean=Buscar apenas acampamentos de europeus findSettlementPanel.displayOnlyNatives=Buscar apenas acampamentos de nativos findSettlementPanel.name=Encontrar acampamento +# Fuzzy firstContactDialog.meeting.natives=Conhecendo os nativos... firstContactDialog.meeting.natives.tutorial=Você conheceu nativos. Mande guerreiros para o assentamento deles para conhecer mais sobre eles,e seus servos contratados e colonos livres com a finalidade de aprender com eles. Mande seus navios e carroças para seus assentamentos para realizar trocas com eles. -firstContactDialog.meeting.AZTEC=A nação Asteca... -firstContactDialog.meeting.INCA=O império Inca... firstContactDialog.welcomeOffer.text=Os %nation% dão-lhe as boas vindas. Somos uma nação gloriosa de %camps% %settlementType%. Para celebrar a nossa amizade, oferecemos-lhe como presente a terra que ocupa agora. Aceita o nosso tratado e viver em paz connosco, como irmãos? firstContactDialog.welcomeSimple.text=Os %nation% dão-lhe as boas vindas. Somos uma nação gloriosa de %camps% %settlementType%. Aceita o nosso tratado e viver em paz connosco, como irmãos? abandonColony.no=Cancelar diff --git a/data/strings/FreeColMessages_pt_PT.properties b/data/strings/FreeColMessages_pt_PT.properties index 91015e069..faf87462c 100644 --- a/data/strings/FreeColMessages_pt_PT.properties +++ b/data/strings/FreeColMessages_pt_PT.properties @@ -1,5 +1,6 @@ # Messages for Portuguese (português) # Exported from translatewiki.net +# Author: Cainamarques # Author: Clno # Author: Crazymadlover # Author: Danielsouzat @@ -10,6 +11,7 @@ # Author: Imperadeiro90 # Author: Imperadeiro98 # Author: JasonZe +# Author: Jkb8 # Author: Knitter # Author: Luckas # Author: Luckas Blade @@ -60,8 +62,7 @@ connect=Connectar # Fuzzy current=Atual false=Falso -# Fuzzy -fill=Resultado final +fill=Preencher height=Altura help=Ajuda high=Alto @@ -198,8 +199,9 @@ cli.no-memory-check=salta a verificação de memória cli.no-sound=executa o FreeCol sem som cli.private=inicia um servidor privado (não será publicitado no meta-servidor) cli.seed=fornece uma SEMENTE para o gerador de números pseudo-aleatórios -cli.server-name=especifica um NOME para o servidor +# Fuzzy cli.server=inicia um servidor autónomo no porto especificado +cli.server-name=especifica um NOME para o servidor cli.splash=mostra uma imagem indicada por FICHEIRO enquanto o jogo carrega cli.tc=carrega a conversão total com o NOME indicado cli.timeout=número de segundos que o servidor espera por uma resposta à pergunta @@ -258,7 +260,6 @@ colopediaAction.goods.name=Mercadorias colopediaAction.nations.name=Nações colopediaAction.nationTypes.name=Vantagens Nacionais colopediaAction.resources.name=Bónus de Recursos -colopediaAction.skills.name=Profissões colopediaAction.terrain.name=Tipo de Terreno colopediaAction.units.name=Unidades colopediaAction.name=%object% (Colopédia) @@ -424,6 +425,7 @@ model.option.interventionForce.name=Força de Intervenção model.option.interventionForce.shortDescription=A Força de Intervenção oferece-te apoio na Guerra de Independência. model.option.mercenaryForce.name=Força mercenária model.option.mercenaryForce.shortDescription=A Força Mercenária oferece-te apoio na tua Guerra de Independência. +model.option.warSupportForce.shortDescription=A Força máxima oferecida pelo Monarca para apoiar suas guerras. model.difficulty.government.name=Governo model.option.badGovernmentLimit.name=Limite de má governação model.option.badGovernmentLimit.shortDescription=O número máximo de monarquistas que não provocam uma penalização de produção. @@ -1188,6 +1190,7 @@ model.improvement.road.action=Construir estrada model.improvement.road.description=Estrada model.improvement.road.name=Estrada model.improvement.road.occupationString=E +# Fuzzy model.limit.independence.coastalColonies.description=Precisa de ter, pelo menos, %limit% colónias costeiras para poder declarar a independência. model.limit.independence.rebels.name=Limite de Rebeldes model.limit.independence.rebels.description=Pelo menos %limit%% dos seus colonos têm de apoiar a independência. @@ -1512,6 +1515,7 @@ model.colony.badGovernment=O governo de %colony% é ineficiente. Foram aplicadas model.colony.goodGovernment=O governo tornou-se mais eficiente! A comunidade partidária dos Filhos da Liberdade em %colony% é igual ou excede os %number%% da população. model.colony.governmentImproved1=O governo de %colony% melhorou, mas ainda é ineficiente. As penas à produção ainda vigoram. model.colony.governmentImproved2=O governo de %colony% melhorou. As penas à produção cessaram. +# Fuzzy model.colony.insufficientProduction=Podiam ser produzidos mais %outputAmount% de %outputType% na colónia %colony% se tivéssemos mais %inputAmount% de %inputType%. model.colony.lostGoodGovernment=O governo já não é tão eficiente. A comunidade partidária dos Filhos da Liberdade em %colony% já não é igual, nem excede, %number%% da população. A colónia já não recebe qualquer bónus de produção. model.colony.lostVeryGoodGovernment=O governo já não é tão eficiente. A comunidade partidária dos Filhos da Liberdade em %colony% já não é igual, nem excede, %number%% da população. Perderam-se alguns bónus de produção. @@ -1521,12 +1525,17 @@ model.colony.veryBadGovernment=O governo de %colony% é muito ineficiente. Foram model.colony.veryGoodGovernment=O governo tornou-se mais eficiente! A comunidade partidária dos Filhos da Liberdade em %colony% é igual ou excede os %number%% da população. model.colonyTile.claim=(reivindicar %direction%) model.diplomaticTrade.receive.contact=Saudações fraternas da gloriosa %nation% nação. +# Fuzzy model.diplomaticTrade.receive.diplomatic=Negociemos com a %nation%. model.diplomaticTrade.receive.trade=Consideremos a oferta comercial da %nation%. +# Fuzzy model.diplomaticTrade.receive.tribute=A %nation% está exigindo tributos de nós! model.diplomaticTrade.send.contact=Encontramos membros da nação %nation%. +# Fuzzy model.diplomaticTrade.send.diplomatic=Consideremos a nossa situação diplomática com a %nation%. +# Fuzzy model.diplomaticTrade.send.trade=Proponhamos uma troca com a %nation% em %settlement%. +# Fuzzy model.diplomaticTrade.send.tribute=Exigimos tributo da %nation% em %settlement%. model.direction.N.name=norte model.direction.NE.name=nordeste @@ -1537,23 +1546,32 @@ model.direction.SW.name=sudoeste model.direction.W.name=oeste model.direction.NW.name=noroeste model.historyEventType.abandonColony.description=Abandonou a colónia de %colony% +# Fuzzy model.historyEventType.ceaseFire.description=Cessar-fogo com %nation%. +# Fuzzy model.historyEventType.cityOfGold.description=Os %nation% descobrem a %city%, uma das Sete Cidades Douradas e um tesouro de %treasure% moedas de ouro. +# Fuzzy model.historyEventType.colonyConquered.description=A sua colónia %colony% foi conquistada pelos %nation%. +# Fuzzy model.historyEventType.colonyDestroyed.description=A sua colónia %colony% foi destruída pelos %nation%. # Fuzzy model.historyEventType.declareIndependence.description=Destruiu o acampamento %settlement% dos %nation%. +# Fuzzy model.historyEventType.declareWar.description=Guerra declarada com %nation%. +# Fuzzy model.historyEventType.destroyNation.description=Os %nation% destroem os %nativeNation%. model.historyEventType.discoverNewWorld.description=Descobre o Novo Mundo. +# Fuzzy model.historyEventType.discoverRegion.description=Os %nation% descobrem %region%. +# Fuzzy model.historyEventType.formAlliance.description=Aliança negociada com %nation%. model.historyEventType.foundColony.description=Fundou a colónia de %colony%. model.historyEventType.foundingFather.description=%father% entrou no Congresso Continental. model.historyEventType.independence.description=Conquistou a sua independência da Coroa! -model.historyEventType.meetNation.description=Encontra os %nation%. +model.historyEventType.meetNation.description=Encontra os %nation% nação. +# Fuzzy model.historyEventType.nationDestroyed.description=Os %nation% já não estão presentes no Novo Mundo. -model.historyEventType.spanishSuccession.description=Os %loserNation% cederam todas as colónias no Novo Mundo aos %nation%. +model.historyEventType.spanishSuccession.description=Os {{tag:country|%loserNation%}} cederam todas as colónias no Novo Mundo aos {{tag:country|%nation%}}. model.indianSettlement.mostHatedNone=Nenhum model.indianSettlement.mostHatedUnknown=Desconhecida model.indianSettlement.nameUnknown=Por determinar @@ -1603,6 +1621,7 @@ model.messageType.warehouseCapacity.name=Capacidade do Armazém model.messageType.warning.name=Avisos model.monarch.action.addToRef.no=Feito model.monarch.action.declarePeace.no=Feito +# Fuzzy model.monarch.action.declareWar.text=A insolência dos %nation% obriga-nos a declarar-lhes guerra! model.monarch.action.declareWar.no=Feito # Fuzzy @@ -1648,6 +1667,7 @@ model.noClaimReason.worked.description=Já há outro assentamento a usar estas t model.player.forces=Forças dos %nation% model.player.independentMarket=Europa model.player.startGame=Depois de meses no mar, finalmente avistou a costa de um continente desconhecido. Navegue {{tag:%direction%|west=para oeste|east=para este|default=contra o vento}} para descobrir o Novo Mundo e reivindicá-lo para a Coroa. +# Fuzzy model.player.waitingFor=À espera dos: %nation% model.regionType.coast.name=Costa model.regionType.coast.unknown=Zona Costeira desconhecida @@ -1704,10 +1724,9 @@ model.unit.underRepair=Reparar(%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S -model.unit.unitState.skipped=W +model.unit.unitState.skipped=X model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G model.noAddReason.alreadyPresent.description=Já presente nesta localização @@ -1741,6 +1760,7 @@ model.colony.warehouseOverfull=O armazém de %colony% atingiu o limite de capaci model.colony.warehouseSoonFull=O seu armazém em %colony% excederá a capacidade para %goods% durante a próxima jogada. %amount% unidades de %goods% serão perdidas. model.colony.warehouseWaste=O seu armazém em %colony% excedeu a capacidade para %goods%. Perderam-se %waste% unidades. model.colonyTile.resourceExhausted=Recurso %resource% esgotado em %colony% +# Fuzzy model.game.spanishSuccession=Vossa Excelência, a Guerra da Sucessão Espanhola na Europa terminou. No Tratado de Utrecht, os %loserNation% foram forçados a ceder todas as colónias do Novo Mundo aos %nation%! model.indianSettlement.mission.denounced=O seu missionário em %settlement% foi acusado e executado! model.indianSettlement.mission.destroyed=O seu missionário em %settlement% morreu na destruição do povoado. @@ -1750,7 +1770,7 @@ model.player.autoRecruit=A agitação religiosa em %europe% forçam a emigraçã model.player.colonyGoodsParty.harbour=Seus colonos em %colony% jogaram %amount% unidades de %goods% ao mar, em protesto à taxação injusta pretendida pela Coroa! model.player.colonyGoodsParty.horses=Os seus colonos de %colony% libertaram %amount% cavalos em protesto contra estes impostos injustos da Coroa! model.player.colonyGoodsParty.landLocked=Seus colonos em %colony% queimaram %amount% unidades de %goods% no mercado em protesto a esta taxação injusta da Coroa! -model.player.dead.european=Vossa Excelência, os %nation% declararam a sua retirada incondicional dos assuntos do Novo Mundo! +model.player.dead.european=Vossa Excelência, os{{tag:country|%nation%}} declararam a sua retirada incondicional dos assuntos do Novo Mundo! model.player.dead.native=Vossa Excelência, os %nation% foram destruídos. model.player.disaster.effect.colonyDestroyed=%colony% foi completamente destruída. model.player.disaster.strikes=A sua colónia %colony%, foi atacada por um %disaster%. @@ -1759,12 +1779,16 @@ model.player.foundingFatherJoinedCongress=%foundingFather% ingressou no Congress model.player.interventionForceArrives=Chega a prometida Força de Intervenção! model.player.soLDecrease=Os partidários dos Filhos da Liberdade nas suas colónias caíram para %newSoL% por cento! model.player.soLIncrease=Os partidários dos Filhos da Liberdade nas suas colónias já aumentaram para %newSoL% por cento! +# Fuzzy model.player.stance.alliance.declared=Vossa Excelência, os %nation% formaram uma aliança connosco! model.player.stance.alliance.others=Vossa Excelência, a nação %attacker% tem uma aliança com a nação %defender%. +# Fuzzy model.player.stance.ceaseFire.declared=Vossa Excelência, os %nation% aceitaram um acordo de cessar-fogo connosco! model.player.stance.ceaseFire.others=Vossa Excelência, a nação %attacker% acordou um cessar-fogo com os %defender%. +# Fuzzy model.player.stance.peace.declared=Vossa Excelência, os %nation% estão em paz connosco! model.player.stance.peace.others=Vossa Excelência, o exército %attacker% está em paz com o exército %defender%. +# Fuzzy model.player.stance.war.declared=Más notícias, Vossa Excelência. Os %nation% declararam guerra contra nós! model.player.stance.war.others=Vossa Excelência, os %attacker% declararam guerra aos %defender%. combat.automaticDefence=%unit% em %colony% pegou em armas para defender a colónia! @@ -1780,6 +1804,7 @@ combat.enemyShipEvaded=%enemyUnit% dos %enemyNation% escapou a um ataque por %un combat.enemyShipSunk=%unit% afundou %enemyUnit% dos %enemyNation%! combat.equipmentCaptured=Atenção, os guerreiros %nation% adquiriram %equipment%! combat.goodsStolen=%enemyUnit% dos %enemyNation% roubou %amount% %goods% de %colony%! +# Fuzzy combat.indianPlunder=%enemyUnit% dos %enemyNation% saqueou %amount% de %colony%. combat.indianRaid=Os nossos espiões relatam que os %nation% atacaram a colónia %colony% dos %colonyNation%. combat.indianSurprise=Os %nation% fazem um ataque surpresa à colónia %colony%, alarmando os nossos colonos. O chefe dos %nation% nega qualquer envolvimento. @@ -1834,14 +1859,15 @@ error.couldNotSave=Ocorreu um erro enquanto tentava gravar o jogo! main.defaultPlayerName=Nome do Jogador main.javaVersion=É recomendada a versão do Java %minVersion% ou mais recente para iniciar o Freecol (%version% detetada, use --no-java-check para saltar esta verificação). main.memory=É necessário atribuir mais de %memory% bytes de memória para a JVM.\n Reinicie o FreeCol com: java -Xmx %minMemory%M -jar FreeCol.jar +# Fuzzy client.choicePlayer=Por favor, escolha um jogador: metaServer.couldNotConnect=Desculpe, não foi possível ligar ao meta-servidor. Tente novamente mais tarde. metaServer.communicationError=Houve um erro na comunicação com o meta-servidor. Tente novamente mais tarde. abandonEducation.action.studying=estudas abandonEducation.action.teaching=ensino -abandonEducation.no=Não, continuar a educação +abandonEducation.no=Continuar a educação abandonEducation.text=Se o seu %unit% abandonar %colony% irá abandonar a %action% no %building%. Tem a certeza que deseja continuar? -abandonEducation.yes=Sim, deixar a colónia +abandonEducation.yes=Abandonar educação abandonTeaching.text=Se o %unit% abandonar a %building% vai parar de ensinar. Tem a certeza que ele o deve fazer? armedUnitSettlement.attack=Atacar boycottedGoods.dumpGoods=Largar Mercadorias @@ -1850,8 +1876,11 @@ buy.moreGold=Pedir para baixar o preço buy.takeOffer=Aceitar a oferta buy.text=Os %nation% gostariam de vender %goods% por %gold% moedas de ouro: clearTradeRoute.text=%unit% está atribuído à rota comercial %route%. Definir o seu destino vai removê-lo da rota comercial. Tem a certeza que deseja fazer isso? +# Fuzzy confirmHostile.alliance=Não pode atacar uma nação aliada! Tem a certeza de que pretende quebrar a sua aliança com os %nation% e declarar guerra? +# Fuzzy confirmHostile.ceaseFire=Assinou um cessar-fogo com os %nation%. Deseja mesmo atacar? +# Fuzzy confirmHostile.peace=Está em paz com os %nation%. Deseja mesmo declarar guerra? error.noSuchFile=O ficheiro indicado não existe ou não é um ficheiro. # Fuzzy @@ -1905,7 +1934,9 @@ defeated.text=Foi derrotado! Gostaria de: defeated.yes=Ficar e assistir defeatedSinglePlayer.text=Foi derrotado!\n\nEis chegada a terrível hora da noite, quando se escancaram os cemitérios e o inferno expele a sua pestilência sobre o mundo. Agora podia eu matar e cometer actos tão lúgubres que ao vê-los o dia tremeria. defeatedSinglePlayer.yes=Entrar no Modo de Vingança +# Fuzzy diplomacy.offerAccepted=Os %nation% aceitaram a sua generosa oferta. +# Fuzzy diplomacy.offerRejected=Os %nation% rejeitaram a sua generosa oferta. disbandUnit.text=Tem a certeza de que quer eliminar esta unidade? disbandUnit.yes=Dispersar @@ -1948,7 +1979,9 @@ move.noAccessContact=Excelência, primeiro é necessário estabelecer contacto c move.noAccessGoods=Os %nation% não negociarão com um %unit% vazio. move.noAccessSettlement=Os %nation% não permitem que a unidade %unit% entre no seu acampamento. move.noAccessSkill=%unit% não pode aprender com os indígenas. +# Fuzzy move.noAccessTrade=Não temos a autoridade necessária para efetuar trocas comerciais com outras nações europeias, como os %nation%. +# Fuzzy move.noAccessWar=Não podemos fazer trocas comerciais com os %nation% enquanto estivermos em guerra. move.noAccessWater=O nosso %unit% tem de desembarcar antes de entrar no acampamento. move.noAttackWater=A nossa unidade %unit% tem de estar em terra para atacar. @@ -1989,6 +2022,7 @@ server.invalidPlayerNations=Cada jogador deve escolher uma nação diferente par server.maximumPlayers=Desculpe, o número máximo de jogadores já foi atingido. server.missingUserName=Falta o nome de utilizador no pedido de inicio de sessão. server.missingVersion=Falta a versão do FreeCol no pedido de inicio de sessão. +# Fuzzy server.noRouteToServer=O servidor não pode ser público. Deve modificar as configurações da sua firewall para permitir ligações no porto indicado. server.notAllReady=Nem todos os jogadores estão prontos para começar o jogo! server.onlyAdminCanLaunch=Desculpe, só o administrador do servidor pode iniciar o jogo. @@ -2085,6 +2119,7 @@ colopedia.unit.offensivePower=Poder Ofensivo: colopedia.unit.price=Preço na Europa: colopedia.unit.productionBonus={{plural:%number%|one=Modificador|other=Modificadores}} de produção: colopedia.unit.requirements=Requisitos: +# Fuzzy colopedia.unit.school=Escola necessária para treinar: colopedia.unit.skill=Nível de Profissão: report.labour.allColonists=Todos os Colonos @@ -2117,19 +2152,16 @@ report.colony.exploring.description=%colony% iria beneficiar da exploração de report.colony.grow.description=Número de unidades que a colónia pode albergar sem prejudicar a produção report.colony.grow.header=+ report.colony.improve.header=Melhorar -report.colony.wanting.description=%colony%: Para produzir mais %amount% de %goods% adicione %unit% report.colony.making.description=O que esta colónia está a produzir report.colony.making.header=A fabricar report.colony.making.noconstruction.description=%colony%: Nada está a ser construído. report.colony.name.description=A lista de colónias report.colony.name.header=Colónia -report.colony.plow.description=Número de terrenos da colónia que iriam beneficiar se fossem arados -report.colony.plow.header=A -report.colony.plowing.description=%colony% iria beneficiar se ara-se {{plural:%amount%|one=um terreno|other=%amount% terrenos}} -report.colony.road.description=Número de terrenos da colónia que iriam beneficiar se fosse construída uma estrada -report.colony.road.header=E -report.colony.roadBuilding.description=%colony% iria beneficiar da construção de {{plural:%amount%|one=uma estrada|other=%amount% estradas}} +report.colony.tile.plow.description=%colony% iria beneficiar se ara-se {{plural:%amount%|one=um terreno|other=%amount% terrenos}} +report.colony.tile.plow.header=P report.colony.starving.description=%colony%: haverá fome {{plural:%turns%|one=no próximo turno|other=em %turns% turnos}} +# Fuzzy +report.colony.wanting.description=%colony%: Para produzir mais %amount% de %goods% adicione %unit% report.continentalCongress.available=Disponível # Fuzzy report.continentalCongress.elected=Eleito: @@ -2173,29 +2205,30 @@ report.production.selectGoods=Selecionar bens report.production.update=Atualizar report.requirements.badAssignment=A colónia %colony% tem um %expert% a trabalhar como %expertWork%, enquanto um %nonExpert% está a trabalhar como %nonExpertWork%. A produção seria maior se os colonos trocassem de funções. report.requirements.canTrainExperts=As unidades {{plural:2|%unit%}} podem ser treinadas em -report.requirements.clearTile=%type%, a %direction% de %colony% ficaria melhor com um derrube. +# Fuzzy report.requirements.exploreTile=%type%, a %direction% de %colony%, sairia beneficiada com exploração. report.requirements.met=Todos os requisitos foram atingidos. report.requirements.missingGoods=%colony% está a produzir %goods%, mas precisa de mais %input%. report.requirements.misusedExperts=Há {{plural:2|%unit%}} que não estão a trabalhar como %work% em report.requirements.noExpert=A colónia %colony% está a produzir %goods%, mas não tem um %unit%. -report.requirements.plowCenter=%colony% ficaria melhor se arasse o terreno. -report.requirements.plowTile=%type%, a %direction% de %colony%, ficaria melhor se arasse o terreno. -report.requirements.roadTile=%type% a %direction% de %colony% ficaria melhor com uma estrada. report.requirements.severalExperts=Há diversas unidades de {{plural:2|%unit%}} em report.requirements.surplus=Está a ser produzido um excedente de %goods% em report.trade.afterTaxes=Receita após os impostos report.trade.beforeTaxes=Receita antes dos impostos report.trade.cargoUnits=Unidades na Carga +report.trade.export=Exportando %goods% do sequinte valor %amount% +# Fuzzy report.trade.hasCustomHouse=* Esta colónia tem uma alfândega; estas mercadorias são exportadas. report.trade.totalDelta=Total de Produção report.trade.totalUnits=Total de Unidades report.trade.unitsSold=Unidades compradas ou vendidas report.turn.filter=Não mostrar este tipo de mensagens (%type%) report.turn.ignore=Ignorar esta mensagem (Colónia: %colony%, Mercadorias: %goods%) +# Fuzzy report.turn.playerNation=%nation% de %player% aboutPanel.copyright=Copyright © 2002-2015 A Equipa do FreeCol aboutPanel.legalDisclaimer=O FreeCol é software livre: pode redistribuí-lo ou modificá-lo nos termos da GNU General Public License tal como publicada pela Free Software Foundation, versão 2 da Licença ou qualquer versão posterior. +aboutPanel.manual=Descarga do manual de FreeCol aboutPanel.officialSite=Site oficial: aboutPanel.sfProject=Projeto SourceForge: aboutPanel.version=Versão: @@ -2218,6 +2251,7 @@ chooseFoundingFatherDialog.title=Nomear Pais Fundadores colonyPanel.colonyUnits=Unidades da colónia colonyPanel.inPort=No porto colonyPanel.outsideColony=Colónia Externa +# Fuzzy colonyPanel.producing=Produção: colonyPanel.reducePopulation=Se reduzir a população abaixo de %number%, a colónia %colony% não poderá construir %buildable%. colonyPanel.unitChange=Ao entrar na sua colónia, a unidade %oldType% tornou-se em %newType%. @@ -2229,8 +2263,8 @@ colonyPanel.notBestTile=%unit% poderia produzir mais %goods% em %tile%. confirmDeclarationDialog.areYouSure.no=Talvez Mais Tarde confirmDeclarationDialog.areYouSure.text=Renunciemos à tirania injusta de %monarch% e declaremos a independência da coroa para as nossas colónias! confirmDeclarationDialog.areYouSure.yes=A Liberdade ou a Morte! -confirmDeclarationDialog.defaultCountry=Estados Unidos de %nation% -confirmDeclarationDialog.defaultNation=%nation% Livre +confirmDeclarationDialog.defaultCountry=Estados Unidos de {{tag:country|%nation%}} +confirmDeclarationDialog.defaultNation=Livre {{tag:country|%nation%}} confirmDeclarationDialog.enterCountry=De ora em diante, o nosso país será conhecido por confirmDeclarationDialog.enterNation=e todos os cidadãos da nossa gloriosa nação terão orgulho em serem conhecidos por flag.backgroundColors.label=Cor de Fundo @@ -2241,8 +2275,10 @@ negotiationDialog.add=Adicionar negotiationDialog.cancel=Cancelar negotiationDialog.clear=Limpar negotiationDialog.contact.tutorial=Encontras companheiros europeus. Eles competirão contigo por terras e riquezas e poderão até declarar guerra contra ti. Mas depois que Jan de Witt tenha se juntado ao Congresso Continental, poderás negociar com eles. +# Fuzzy negotiationDialog.demand=Os %nation% exigem aos %otherNation% negotiationDialog.exchange=em troca por +# Fuzzy negotiationDialog.offer=Os %nation% oferecem aos %otherNation% negotiationDialog.send=Enviar negotiationDialog.title.contact=Encontrando Companheiros Europeus @@ -2261,8 +2297,7 @@ europePanel.transaction.price=Preço:\t%gold% europePanel.transaction.purchase=Comprar %amount% %goods% por %gold% de ouro europePanel.transaction.sale=Vender %amount% %goods% @%gold% europePanel.transaction.tax=-%tax%%:\t%gold% -firstContactDialog.meeting.AZTEC=A nação Asteca... -firstContactDialog.meeting.INCA=O império Inca... +firstContactDialog.meeting.inca=O império Inca firstContactDialog.welcomeOffer.text=Os %nation% dão-lhe as boas vindas. Somos uma nação gloriosa de %camps% %settlementType%. Para celebrar a nossa amizade, oferecemos-lhe a terra que ocupa agora. Aceita o nosso tratado e viver em paz connosco, como irmãos? firstContactDialog.welcomeSimple.text=Os %nation% dão-lhe as boas vindas. Somos uma nação gloriosa de %camps% %settlementType%. Aceita o nosso tratado e viver em paz connosco, como irmãos? abandonColony.no=Cancelar diff --git a/data/strings/FreeColMessages_qqq.properties b/data/strings/FreeColMessages_qqq.properties index 226ad9e76..5f30a2abb 100644 --- a/data/strings/FreeColMessages_qqq.properties +++ b/data/strings/FreeColMessages_qqq.properties @@ -27,6 +27,7 @@ # Author: Siebrand # Author: Sp5uhe # Author: Umherirrender +# Author: Urhixidur # Author: Utar # Author: Verdy p # Author: Vesenina26 @@ -40,7 +41,9 @@ dry=Value for:\n* {{Msg-freecol|Model.option.humidity.name}} hot={{Identical|Hot}}\n\nValue for:\n* {{Msg-freecol|Model.option.temperature.name}} temperate=Value for:\n* {{Msg-freecol|Model.option.temperature.name}}\n{{Identical|Temperate}} veryDry=Value for:\n* {{Msg-freecol|Model.option.humidity.name}} +veryHigh=Value for:\n\nModel.option.? veryLarge=Can refer to "amount of X, where X can be villages, rivers and such" in addition to map size. +veryLow=Value for:\n\nModel.option.? verySmall=Can refer to "amount of X, where X can be villages, rivers and such" in addition to map size. veryWet=Value for:\n* {{Msg-freecol|Model.option.humidity.name}} warm=Value for:\n* {{Msg-freecol|Model.option.temperature.name}} @@ -58,15 +61,15 @@ color={{Identical|Color}} connect={{Identical|Connect}} current={{Identical|Current}}\nThe message is used in the audio options dialog (select Preferences -> Audio) and refers to the currently selected audio output device. false={{Identical|False}} -fill={{Identical|Load}} +fill={{Identical|Fill}} height={{Identical|Height}} help={{Identical|Help}} -high={{Identical|High}} +high={{Identical|High}}\nValue for:\n\nModel.option.? host={{Identical|Host}} large={{Identical|Large}}\nCan refer to "amount of X, where X can be villages, rivers and such" in addition to map size. load={{Identical|Load}} -low={{Identical|Low}} -many=murte\n{{Identical|Many}} +low={{Identical|Low}}\nValue for:\n\nModel.option.? +many={{Identical|Many}} medium=Can refer to "amount of X, where X can be villages, rivers and such" in addition to map size.\n{{Identical|Medium}} more={{Identical|More}} music={{Identical|Music}} @@ -125,14 +128,22 @@ list.down={{Identical|Down}} list.edit={{Identical|Edit}} list.remove={{Identical|Remove}} list.up={{Identical|Up}} +cli.arg.advantages=Is this a keyword and thus untranslatable? +cli.arg.clientOptions=Is this a keyword and thus untranslatable? +cli.arg.debug=Is this a keyword and thus untranslatable? +cli.arg.debugRun=Is this a keyword and thus untranslatable? +cli.arg.difficulty=Is this a keyword and thus untranslatable? cli.arg.dimensions={{FreeCol-CLI}} cli.arg.directory=See also {{msg-freecol|cli.freecol-data}}, {{msg-freecol|cli.home-directory}}.\n{{FreeCol-CLI}} +cli.arg.europeans=Is this a keyword and thus untranslatable? cli.arg.file=See also {{msg-freecol|cli.check-savegame}} {{msg-freecol|cli.load-savegame}}, {{msg-freecol|cli.splash}}.\n{{FreeCol-CLI}}\n{{Identical|File}} -cli.arg.gui-scale={{Identical|Scale}} +cli.arg.gui-scale={{Identical|Scale}}\nIs this a keyword and thus untranslatable? cli.arg.locale={{FreeCol-CLI}}\n{{Identical|Locale}} cli.arg.loglevel=See also {{msg-freecol|cli.log-level}}.\n{{FreeCol-CLI}} cli.arg.name=See also {{msg-freecol|cli.server-name}}, {{msg-freecol|cli.tc}}.\n{{FreeCol-CLI}}\n{{Identical|Name}} cli.arg.port={{FreeCol-CLI}}\n{{Identical|Port}} +cli.arg.seed=Is this a keyword and thus untranslatable? +cli.arg.timeout=Is this a keyword and thus untranslatable? cli.check-savegame={{FreeCol-CLI}} cli.debug={{FreeCol-CLI}} cli.default-locale={{FreeCol-CLI}} @@ -147,8 +158,8 @@ cli.no-java-check={{FreeCol-CLI}} cli.no-memory-check={{FreeCol-CLI}} cli.no-sound={{FreeCol-CLI}} cli.private={{FreeCol-CLI}} -cli.server-name=NAME should be the same as {{msg-freecol|cli.arg.name}}.\n{{FreeCol-CLI}} cli.server={{FreeCol-CLI}} +cli.server-name=NAME should be the same as {{msg-freecol|cli.arg.name}}.\n{{FreeCol-CLI}} cli.splash=FILE should be the same as {{msg-freecol|cli.arg.file}}.\n{{FreeCol-CLI}} cli.tc=NAME should be the same as {{msg-freecol|cli.arg.name}}.\n{{FreeCol-CLI}}\n\nFrom FreeCol developer: "total conversion" is the (somewhat unfortunate) name we use for a "rule set", or a "game". At the moment, we have the default rules, as well as the "classic" and "testing" rules. The latter two would be considered a "total conversion". cli.version={{FreeCol-CLI}} @@ -170,7 +181,6 @@ colopediaAction.fathers.name=[[Image:Freecol-colopedia-depot.png|thumb]] colopediaAction.goods.name=[[Image:Freecol-colopedia-improvements.jpg|thumb]]\n{{Identical|Goods}} colopediaAction.nations.name=[[Image:Freecol-colopedia-depot.png|thumb]]\n{{Identical|Nation}} colopediaAction.resources.name=[[Image:Freecol-colopedia-improvements.jpg|thumb]] -colopediaAction.skills.name=[[Image:Freecol-colopedia-depot.png|thumb]] colopediaAction.terrain.name=[[Image:Freecol-colopedia-improvements.jpg|thumb]] colopediaAction.units.name=[[Image:Freecol-colopedia-prairie.jpg|thumb]]\n{{Identical|Unit}} continueAction.accelerator={{optional}} @@ -452,7 +462,9 @@ model.unit.hardyPioneer.workingAs={{Identical|Pioneer}} model.unit.seasonedScout.workingAs={{Identical|Scout}} model.unit.veteranSoldier.workingAs={{Identical|Soldier}} model.abstractGoods.label={{optional}} +model.colony.insufficientProduction=Consumption deficit is a comma separated list of goods labels (e.g. "2 furs") model.direction.N.name=Unused at this time. +model.direction.W.name={{Identical|West}} model.historyEventType.meetNation.description=Used in "History report". Format is: YYYY (message) model.indianSettlement.mostHatedNone={{Identical|None}} model.indianSettlement.mostHatedUnknown={{Identical|Unknown}} @@ -496,7 +508,6 @@ model.unit.occupation.underRepair=A symbol; shorthand for the action a specific model.unit.occupation.unknown=A symbol; shorthand for the action a specific unit is doing on the map. See [http://www.freecol.org/images/screen-0.8.0-large.jpg example screenshot]. model.unit.unitState.fortified=A symbol; shorthand for the action a specific unit is doing on the map. See [http://www.freecol.org/images/screen-0.8.0-large.jpg example screenshot]. model.unit.unitState.fortifying=A symbol; shorthand for the action a specific unit is doing on the map. See [http://www.freecol.org/images/screen-0.8.0-large.jpg example screenshot]. -model.unit.unitState.improving=A symbol; shorthand for the action a specific unit is doing on the map. See [http://www.freecol.org/images/screen-0.8.0-large.jpg example screenshot]. model.unit.unitState.inColony=A symbol; shorthand for the action a specific unit is doing on the map. See [http://www.freecol.org/images/screen-0.8.0-large.jpg example screenshot]. model.unit.unitState.sentry=A symbol; shorthand for the action a specific unit is doing on the map. See [http://www.freecol.org/images/screen-0.8.0-large.jpg example screenshot]. model.unit.unitState.skipped=A symbol; shorthand for the action a specific unit is doing on the map. See [http://www.freecol.org/images/screen-0.8.0-large.jpg example screenshot]. @@ -522,6 +533,7 @@ disbandUnit.yes={{Identical|Disband}} tradeRoute.prefix=A concatenated message for a unit on a trade route, where the data portion can include multiple sub-messages with tradeRoute prefix. server.badNation=Used as error message server.reject=General message for errors that "can not happen" and which may indicate a client behaving badly +giveIndependence.otherAnnounce=Is the REF (Royal Expeditionary Force) singular or plural? colopedia.effects={{Identical|Effect}} colopedia.buildings.autoBuilt=[[File:Freecol-colopedia-depot.png|thumb]] colopedia.buildings.cost=[[File:Freecol-colopedia-depot.png|thumb]] @@ -560,10 +572,8 @@ report.labour.sutdent={{Identical|Student}} report.labour.workingAsOther={{Identical|Other}} report.colony.explore.header=Very narrow column, choose a single letter from the capitalized word in report.colony.explore.description report.colony.improving.description=HTML has been removed from a previous version of this source message. -report.colony.wanting.description=HTML was removed from a previous version of the source message report.colony.name.header={{Identical|Colony}} -report.colony.plow.header=Very narrow column, choose a single letter from the capitalized word in report.colony.plow.description -report.colony.road.header=Very narrow column, choose a single letter from the capitalized word in report.colony.road.description +report.colony.wanting.description=HTML was removed from a previous version of the source message report.continentalCongress.none={{Identical|None}} report.highScores.difficulty={{Identical|Difficulty}} report.highScores.nation={{Identical|Nation}} diff --git a/data/strings/FreeColMessages_ru.properties b/data/strings/FreeColMessages_ru.properties index 5c94433c1..a6bcfeade 100644 --- a/data/strings/FreeColMessages_ru.properties +++ b/data/strings/FreeColMessages_ru.properties @@ -12,6 +12,7 @@ # Author: Eleferen # Author: Eroha # Author: Ferrer +# Author: INS Pirat # Author: Inpw # Author: KennyTHPS # Author: Kirill @@ -25,6 +26,7 @@ # Author: Nanotranslate # Author: Neism # Author: Nirovulf +# Author: Nzeemin # Author: Oashnic # Author: Okras # Author: Phhh @@ -131,7 +133,9 @@ cargoOnCarrier=Груз на судне cashInTreasureTrain=Золота в обозе с сокровищами clearOrders=Очистить приказы colonists=Колонисты +colonyCenter=центр колонии colopedia=Колопедия +countryName={{tag:country|%nation%}} difficulty=Сложность docks=Пристань dumpCargo=Сбросить груз @@ -231,10 +235,12 @@ cli.no-intro=пропустить вступительное видео cli.no-java-check=пропустить проверку версии Java cli.no-memory-check=пропустить проверку памяти cli.no-sound=запустить FreeCol без звука +cli.no-splash=пропустить заставку cli.private=запустить частный сервер (без публикации на metaserver) cli.seed=начальное число для генератора псевдослучайных чисел -cli.server-name=указать ИМЯ сервера +# Fuzzy cli.server=запустить самостоятельный сервер по указанному порту +cli.server-name=указать ИМЯ сервера cli.splash=отображать заставку из ФАЙЛА во время загрузки игры cli.tc=загрузить набор правил с заданным ИМЕНЕМ cli.timeout=Время ожидания сервера для ответа на вопрос (секунды) @@ -259,6 +265,7 @@ menuBar.debug.addLiberty=Добавить очки свободы в кажду menuBar.debug.compareMaps.checkComplete=Проверка завершена. Рассинхронизации не обнаружено. menuBar.debug.compareMaps.problem=Возможны проблемы. Пожалуйста, прочтите информацию со стандартного вывода. menuBar.debug.compareMaps=Проверить рассинхронизация карты +menuBar.debug.displayAIMissions=Показать ИИ миссии menuBar.debug.displayErrorMessage=Отображать сообщение об ошибке menuBar.debug.displayEuropeStatus=Отобразить статус Европы menuBar.debug.displayMonarchPanel=Отображать панель Монарха @@ -301,7 +308,6 @@ colopediaAction.goods.name=Товары colopediaAction.nations.name=Нации colopediaAction.nationTypes.name=Национальные преимущества colopediaAction.resources.name=Бонусные ресурсы -colopediaAction.skills.name=Умения colopediaAction.terrain.name=Тип местности colopediaAction.units.name=Соединения colopediaAction.name=%object% (Колопедия) @@ -489,10 +495,13 @@ model.option.buildOnNativeLand.never.name=Никогда model.option.buildOnNativeLand.never.shortDescription=Строительство на индейской земле не разрешено. model.option.settlementNumber.name=Количество поселений индейцев model.option.settlementNumber.shortDescription=Настройка количества поселений индейцев на генерируемой карте. +model.option.settlementNumber.verySmall.name=Маленький model.option.settlementNumber.verySmall.shortDescription=Небольшое количество местных поселений model.option.settlementNumber.small.name=Маленький model.option.settlementNumber.small.shortDescription=Небольшое количество местных поселений +model.option.settlementNumber.medium.name=Средний model.option.settlementNumber.medium.shortDescription=Среднее количество местных посеелений +model.option.settlementNumber.large.name=Большой model.option.settlementNumber.large.shortDescription=Большое количество местных поселений model.option.settlementNumber.veryLarge.name=Очень большой model.option.settlementNumber.veryLarge.shortDescription=Многочисленные местные поселения @@ -654,6 +663,8 @@ model.option.lastYear.name=Последний год игры model.option.lastYear.shortDescription=Самый последний год в игре. model.option.lastColonialYear.name=Последний год игры за колонию model.option.lastColonialYear.shortDescription=Самый последний год игры для колониального игрока (не объявившего о независимости). +model.option.seasons.name=Времена года +model.option.seasons.shortDescription=Количество времён года в году gameOptions.prices.name=Параметры цены gameOptions.prices.shortDescription=Содержит созданные игрой параметры управления начальной ценой. model.option.food.minimumPrice.name=Минимальная начальная цена на продовольствие @@ -747,11 +758,13 @@ model.option.riverNumber.medium.name=Средний model.option.riverNumber.medium.shortDescription=Умеренное количество рек model.option.riverNumber.large.name=Обширный model.option.riverNumber.large.shortDescription=Большое количество рек +model.option.riverNumber.veryLarge.name=Очень большой model.option.riverNumber.veryLarge.shortDescription=Полноводные реки model.option.mountainNumber.name=Процент гор model.option.mountainNumber.shortDescription=Настройка для определения количества гор на генерируемых картах. model.option.mountainNumber.verySmall.name=Очень маленький model.option.mountainNumber.verySmall.shortDescription=Совсем мало гор +model.option.mountainNumber.small.name=Малый model.option.mountainNumber.small.shortDescription=Мало гор model.option.mountainNumber.medium.name=Средний model.option.mountainNumber.medium.shortDescription=Умеренное количество гор @@ -761,6 +774,7 @@ model.option.mountainNumber.veryLarge.name=Очень большой model.option.rumourNumber.name=Процент слухов model.option.rumourNumber.shortDescription=Опция для настройки количества слухов о Затерянном городе на создаваемой карте. model.option.rumourNumber.verySmall.name=Очень маленький +model.option.rumourNumber.small.name=Малый model.option.rumourNumber.small.shortDescription=Мало слухов model.option.rumourNumber.medium.name=Средний model.option.rumourNumber.large.name=Большой @@ -780,9 +794,15 @@ model.option.forestNumber.veryLarge.shortDescription=Многочисленны model.option.bonusNumber.name=Процент бонусных клеток model.option.bonusNumber.shortDescription=Настройка для определения количества бонусных клеток на генерируемых картах. model.option.bonusNumber.verySmall.name=Очень маленький +model.option.bonusNumber.verySmall.shortDescription=Очень мало бонусов +model.option.bonusNumber.small.name=Мало +model.option.bonusNumber.small.shortDescription=Малое количество бонусов model.option.bonusNumber.medium.name=Средний +model.option.bonusNumber.medium.shortDescription=Умеренное количество бонусов model.option.bonusNumber.large.name=Обширный +model.option.bonusNumber.large.shortDescription=Большое количество бонусов model.option.bonusNumber.veryLarge.name=Очень большой +model.option.bonusNumber.veryLarge.shortDescription=Многочисленные бонусы model.option.humidity.name=Влажность model.option.humidity.shortDescription=Настройка средней влажности карты. model.option.humidity.veryDry.name=Очень Сухой @@ -822,6 +842,7 @@ model.option.importSettlements.shortDescription=Позволяет импорт clientOptions.name=Настройки clientOptions.shortDescription=Опции клиента clientOptions.personal.name=Личные +clientOptions.personal.shortDescription=Настройки специфичные для конкретного игрока. model.option.playerName.name=Имя игрока: clientOptions.gui.name=Настройки экрана clientOptions.gui.shortDescription=Содержит установки для настройки внешнего вида игры. @@ -868,6 +889,10 @@ model.option.miniMapToggleBorders.name=Переключить границы н model.option.miniMapToggleBorders.shortDescription=Если выбрано: Рисовать границы на мини-карте. model.option.mapControls.name=Карта управления model.option.mapControls.shortDescription=Какой тип карты управления нужно отобразить? +clientOptions.gui.mapControls.CornerMapControls.name=Углы +clientOptions.gui.mapControls.CornerMapControls.shortDescription=Элементы управления картой занимают углы и нижний край. +clientOptions.gui.mapControls.ClassicMapControls.name=Классический +clientOptions.gui.mapControls.ClassicMapControls.shortDescription=Элементы управления картой занимают правый край. model.option.color.background.name=Цвет фона model.option.color.background.shortDescription=Этот цвет окружает карту на максимальном масштабе, обозначает «туман войны». clientOptions.minimap.color.background.black=Чёрный @@ -971,8 +996,13 @@ model.option.guiShowNotBestTile.name=Не лучшая клетка model.option.guiShowNotBestTile.shortDescription=Определяет, следует ли предупреждать, что подразделение работает не на лучшей доступной клетке model.option.colonyReport.name=Отчет по колонии model.option.colonyReport.shortDescription=Краткая информация о деятельности в каждой колонии. +clientOptions.messages.colonyReport.classic.name=Классический +clientOptions.messages.colonyReport.compact.name=Компактный model.option.labourReport.name=Отчёт о труде model.option.labourReport.shortDescription=Краткая информация о деятельности каждого подразделения +clientOptions.messages.labourReport.classic.name=Классический +clientOptions.messages.labourReport.compact.name=Компактный +clientOptions.messages.labourReport.compact.shortDescription=Более компактная версия классического отчета. clientOptions.savegames.name=Сохранённые игры clientOptions.savegames.shortDescription=Сохранённые игры model.option.showSavegameSettings.name=Диалог сохранения игры: @@ -1569,6 +1599,7 @@ model.improvement.road.description=Дорога model.improvement.road.name=Дорога model.improvement.road.occupationString=R model.limit.independence.coastalColonies.name=Лимит прибрежных колоний +# Fuzzy model.limit.independence.coastalColonies.description=Для объявления независимости необходимо иметь не менее %limit% прибрежных колоний. model.limit.independence.rebels.name=Рубеж восстания model.limit.independence.rebels.description=По меньшей мере, %limit%% ваших колонистов должны поддерживать независимость. @@ -1922,6 +1953,7 @@ model.colony.badGovernment=Правительство колонии %colony% н model.colony.goodGovernment=Эффективность правительства улучшена! Повстанческие настроения в колонии %colony% теперь равняются или превышают %number% процентов. model.colony.governmentImproved1=Правительство колонии %colony% улучшено, но всё ещё неэффективно. По-прежнему накладываются штрафы на производство. model.colony.governmentImproved2=Правительство колонии %colony% улучшено. Штрафы на производство больше не накладываются. +# Fuzzy model.colony.insufficientProduction=На %outputAmount% %outputType% больше может быть произведено в колонии %colony%, если бы там было на %inputAmount% %inputType% больше. model.colony.lostGoodGovernment=Эффективность правительства снизилась! Повстанческие настроения в колонии %colony% уже не равны или не превышают %number% процентов. Колония больше не имеет производственного бонуса. model.colony.lostVeryGoodGovernment=Эффективность правительства снизилась! Повстанческие настроения в колонии %colony% уже не равны или не превышают %number% процентов. Некоторые производственные бонусы были потеряны. @@ -1936,12 +1968,17 @@ model.colony.veryBadGovernment=Правительство колонии %colony model.colony.veryGoodGovernment=Эффективность правительства улучшена! Повстанческие настроения в колонии %colony% теперь равняются или превышают %number% процентов. model.colonyTile.claim=(претендует на %direction%) model.diplomaticTrade.receive.contact=Братский привет от славной нации %nation%. +# Fuzzy model.diplomaticTrade.receive.diplomatic=Давайте вести переговоры с %nation%. model.diplomaticTrade.receive.trade=Давайте рассмотрим торговое предложение нации %nation%. +# Fuzzy model.diplomaticTrade.receive.tribute=%nation% требуют с нас дань! model.diplomaticTrade.send.contact=Мы встретились с представителями нации %nation%. +# Fuzzy model.diplomaticTrade.send.diplomatic=Давайте рассмотрим нашу дипломатическую ситуацию с нацией %nation%. +# Fuzzy model.diplomaticTrade.send.trade=Позвольте нам предложить торговлю с нацией %nation% в поселении %settlement%. +# Fuzzy model.diplomaticTrade.send.tribute=Мы требуем дани с %nation% в поселении %settlement%. model.direction.N.name=север model.direction.NE.name=северо-восток @@ -1952,25 +1989,33 @@ model.direction.SW.name=юго-запад model.direction.W.name=запад model.direction.NW.name=северо-запад model.historyEventType.abandonColony.description=Вы оставили колонию %colony%. -model.historyEventType.ceaseFire.description=Прекратить боевые действия против %nation%. -model.historyEventType.cityOfGold.description=%nation% обнаружили %city%, один из Семи Золотых Городов. Добыча составила %treasure% золота. -model.historyEventType.colonyConquered.description=Ваша колония %colony% захвачена {{tag:with|%nation%}}. -model.historyEventType.colonyDestroyed.description=Ваша колония %colony% уничтожена {{tag:with|%nation%}}. +model.historyEventType.ceaseFire.description=Прекратить боевые действия против {{tag:country|%nation%}}. +model.historyEventType.cityOfGold.description={{tag:country|%nation%}} обнаружили %city%, один из Семи Золотых Городов. Добыча составила %treasure% золота. +model.historyEventType.colonyConquered.description={{tag:with|%nation%}} захватили вашу колонию %colony%. +model.historyEventType.colonyDestroyed.description={{tag:country|%nation%}} уничтожили вашу колонию %colony%. # Fuzzy model.historyEventType.conquerColony.description=Вы приняли наши щедрые условия сделки и еще уклоняетесь от оплаты? Такая двойственность сильно расстраивает нас. # Fuzzy model.historyEventType.declareIndependence.description=Вы уничтожили %settlement%, поселение {{tag:of|%nation%}}. +# Fuzzy model.historyEventType.declareWar.description=Объявлена война с %nation%. +# Fuzzy model.historyEventType.destroyNation.description=%nation% уничтожили {{tag:of|%nativeNation%}}. model.historyEventType.discoverNewWorld.description=Вы открыли Новый Свет. +# Fuzzy model.historyEventType.discoverRegion.description=%nation% открыли %region%. +# Fuzzy model.historyEventType.formAlliance.description=Альянс вел переговоры с %nation%. model.historyEventType.foundColony.description=Вы основали колонию %colony%. model.historyEventType.foundingFather.description=%father% присоединился к Континентальному конгрессу. model.historyEventType.independence.description=Вы достигли независимости от Короны. +# Fuzzy model.historyEventType.makePeace.description=Объявлено согласие на мир с %nation%. +# Fuzzy model.historyEventType.meetNation.description=Вы встретили {{tag:of|%nation%}}. +# Fuzzy model.historyEventType.nationDestroyed.description=В Новом Свете больше не осталось {{tag:of|%nation%}}. +# Fuzzy model.historyEventType.spanishSuccession.description=%loserNation% передали все свои колонии Нового Света нации %nation%. model.indianSettlement.mostHatedNone=нет model.indianSettlement.mostHatedUnknown=Неизвестно @@ -1984,6 +2029,8 @@ model.indianSettlement.tension.happy=Люди племени %nation% счаст model.indianSettlement.tension.hateful=Воины племени %nation% потрясают оружием. Они украсили свои пояса скальпами поверженных врагов, а их инструменты для пыток несут следы интенсивного использования. model.indianSettlement.tension.unknown=Неизвестно model.indianSettlement.tension.wary=Отзывчивы +model.indianSettlement.wantedGoodsNone=Нет +model.indianSettlement.wantedGoodsUnknown=Неизвестно model.lostCityRumour.burialGround.description=Вы осквернили священные кладбища {{tag:of|%nation%}}! Поэтому, вы должны умереть! model.lostCityRumour.cibola.description=Вы обнаружили %city%, один из Семи Золотых Городов. Стоимость добытых сокровищ составляет %money%! Доставьте обоз с сокровищами в одну из своих колоний, чтобы получить за них деньги, или отправьте его в Европу на галеоне. model.lostCityRumour.colonist.description=Вы встретили выживших людей из затерянной колонии. В обмен на еду они клянутся в верности престолу! @@ -2021,8 +2068,10 @@ model.messageType.warehouseCapacity.name=Вместимость склада model.messageType.warning.name=Предупреждения model.monarch.action.addToRef.text=Король добавил %number% {{plural:%number%|%unit%}} к численности Королевского Экспедиционного Войска. Правители колоний выражают обеспокоенность. model.monarch.action.addToRef.no=Готово +# Fuzzy model.monarch.action.declarePeace.text=Мы любезно согласились на мирный договор с {{tag:with|%nation%}}. model.monarch.action.declarePeace.no=Готово +# Fuzzy model.monarch.action.declareWar.text=Нахальство {{tag:of|%nation%}} принуждает нас объявить им войну! model.monarch.action.declareWar.no=Готово # Fuzzy @@ -2070,6 +2119,7 @@ model.nationState.available.name=доступна # Fuzzy model.nationState.available.shortDescription=Вы завоевали колонию %colony% у {{tag:of|%nation%}}. model.nationState.notAvailable.name=недоступна +model.nationState.notAvailable.shortDescription=Эта нация не доступна model.noClaimReason.europeans.description=Эта земля принадлежит другой европейской нации. model.noClaimReason.natives.description=На эту землю претендует племя дикарей. model.noClaimReason.occupied.description=Эта земля оккупирована опасным врагом. @@ -2082,6 +2132,7 @@ model.player.colonialIndependence=Только колониальные игро model.player.forces=Войска {{tag:of|%nation%}} model.player.independentMarket=Европа model.player.startGame=После нескольких месяцев плавания, вы прибыли, наконец, к побережью неизвестного континента. Плывите на {{tag:%direction%|west=запад|east=восток|default=по направлению ветра}}, чтобы исследовать Новый Свет и объявить его собственностью Короны. +# Fuzzy model.player.waitingFor=Ждём: %nation% model.regionType.coast.name=Побережье model.regionType.coast.unknown=Неизвестное побережье @@ -2121,6 +2172,7 @@ model.tradeItem.gold.name=Золото model.tradeItem.gold.description=сумма в %amount% золотых model.tradeItem.goods.name=Товары model.tradeItem.incite.name=Объявить войну +# Fuzzy model.tradeItem.incite.description=война против %nation% model.tradeItem.stance.name=Состояние model.tradeItem.unit.name=Юнит @@ -2144,10 +2196,9 @@ model.unit.underRepair=В ремонте ({{plural:%turns%|one=остался|ot model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S -model.unit.unitState.skipped=W +model.unit.unitState.skipped=X model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G model.noAddReason.alreadyPresent.description=Уже присутствует в этом месте. @@ -2174,6 +2225,7 @@ model.colony.colonyStarved=Голодает последний колонист model.colony.customs.sale=Таможня в %colony% продала: %data%. model.colony.customs.saleData=%amount% %goods% за %gold% model.colony.famineFeared=Ожидание голода в колонии %colony%. Осталось пищи только на %number% {{plural:%number%|one=ход|few=хода|many=ходов|default=ходов}}. +model.colony.starving=%colony% голодает. model.colony.newColonist=Новый поселенец в колонии %colony%. model.colony.newConvert=Новый крещёный индеец %nation% прибыл в колонию %colony%. model.colony.notBuildingAnything=Ничего не строится в колонии %colony%. @@ -2187,6 +2239,7 @@ model.colony.warehouseSoonFull=Ваш склад в колонии %colony% со model.colony.warehouseWaste=Ваш склад в колонии %colony% содержит слишком много %goods%. %waste% пришлось выбросить. model.colony.workersEvicted=В %colony% ваши колонисты не могут больше работать в %location% из-за присутствия %enemyUnit%. model.colonyTile.resourceExhausted=В колонии %colony% исчерпан ресурс %resource% +# Fuzzy model.game.spanishSuccession=Ваше Превосходительство, в Европе закончилась война за Испанское наследство. По Утрехтскому мирному договору %loserNation% были вынуждены передать все свои колонии в Новом Свете нации %nation%! model.indianSettlement.mission.denounced=Вашего миссионера в поселении %settlement% осудили и казнили! model.indianSettlement.mission.destroyed=Ваш миссионер погиб при уничтожении поселения %settlement%. @@ -2196,6 +2249,7 @@ model.player.autoRecruit=Религиозные беспорядки в %europe% model.player.colonyGoodsParty.harbour=Ваши колонисты в колонии %colony% выбросили %amount% единиц %goods% в гавань в знак протеста против этого несправедливого налогообложения со стороны Короны! model.player.colonyGoodsParty.horses=Ваши колонисты в колонии %colony% выпустили на волю %amount% лошадей в знак протеста против несправедливого налогообложения Короной! model.player.colonyGoodsParty.landLocked=Ваши колонисты в колонии %colony% сожгли %amount% единиц %goods% на рынке в знак протеста против этого несправедливого налогообложения со стороны Короны! +# Fuzzy model.player.dead.european=Ваше Превосходительство, %nation% заявили о безусловном выводе из дел Нового Света! model.player.dead.native=Ваше Превосходительство, %nation% уничтожены. model.player.disaster.bankruptcy.start=Вы не способны оплатить обслуживание всех зданий. Применены производственные штрафы. @@ -2209,12 +2263,16 @@ model.player.ignoredTax=Престол повысил ставку налога model.player.interventionForceArrives=Обещанное подкрепление от интервенции прибыло. model.player.soLDecrease=Членство сыновей свободы в Ваших колониях упало до %newSoL% процентов! model.player.soLIncrease=Членство сыновей свободы в Ваших колониях поднялось до %newSoL% процентов! +# Fuzzy model.player.stance.alliance.declared=Ваше Превосходительство, у {{tag:of|%nation%}} с нами заключен союз! model.player.stance.alliance.others=Ваше Превосходительство, %attacker% имеют союз с %defender%. +# Fuzzy model.player.stance.ceaseFire.declared=Ваше Превосходительство, у {{tag:of|%nation%}} с нами договор о прекращении огня! model.player.stance.ceaseFire.others=Ваше Превосходительство, %attacker% имеют договор о прекращении огня с %defender%. +# Fuzzy model.player.stance.peace.declared=Ваше Превосходительство, у {{tag:of|%nation%}} с нами заключен мир! model.player.stance.peace.others=Ваше Превосходительство, между %attacker% и %defender% мир. +# Fuzzy model.player.stance.war.declared=Плохие новости, Ваше Превосходительство, %nation% объявили нам войну! model.player.stance.war.others=Ваше Превосходительство, %attacker% объявили войну %defender%. combat.automaticDefence=Ваш %unit% из колонии %colony% взялся за оружие для защиты своей колонии! @@ -2230,6 +2288,7 @@ combat.enemyShipEvaded=%enemyNation% %enemyUnit% удалось уклонить combat.enemyShipSunk=%unit% потопил %enemyNation% %enemyUnit%! combat.equipmentCaptured=Внимание, воины {{tag:of|%nation%}} раздобыли %equipment%! combat.goodsStolen=%enemyUnit% {{tag:of|%enemyNation%}} выкрал %amount% %goods% из колонии %colony%! +# Fuzzy combat.indianPlunder=%enemyUnit% {{tag:of|%enemyNation%}} награбил %amount% в колонии %colony%. combat.indianRaid=Наша разведка доложила, что %nation% совершили нападение на колонию {{tag:of|%colonyNation%}} %colony%. combat.indianSurprise=%nation% совершают неожиданный набег на колонию %colony%, встревожив наших колонизаторов. Правитель {{tag:of|%nation%}} отрицает причастность своего народа к этому набегу. @@ -2277,16 +2336,14 @@ model.unit.noMoreTools=%location%: Ваш первопроходец испол model.unit.slowed=%enemyNation% %enemyUnit% замедлил скорость передвижения нашего %unit%. model.unit.unitRepaired=В %repairLocation% починили %unit%. model.unit.hardyPioneer.noMoreTools=%location%: Ваш выносливый первопроходец израсходовал все свои инструменты. -# Fuzzy -error.couldNotLoad=Произошла ошибка при запуске игры! -# Fuzzy -error.couldNotSave=Произошла ошибка при сохранении игры! +error.couldNotLoad=Произошла ошибка при загрузке игры из файла %name%! +error.couldNotSave=Произошла ошибка при сохранении игры в файл %name%! main.defaultPlayerName=Имя игрока main.javaVersion=Для запуска FreeCol рекомендуется Java версии %minVersion% или лучше\n(%version% обнаружена, используйте --no-java-check чтобы пропустить эту проверку). main.memory=Необходимо назначить более %memory% байт памяти для JVM.\n Перезапустите FreeCol с: java-Xmx%minMemory%М-jar FreeCol.jar main.userDir.fail=FreeCol не может найти подходящих каталогов для сохранения пользовательских данных. Продолжаем, но ждите неприятностей. client.baseData=Не удалось найти каталог базы данных %dir%. FreeCol не удалось найти файлы данных. Убедитесь, что они существуют. Если FreeCol ищет в неверной директории, тогда запустите игру с параметром командной строки: --freecol-data -client.choicePlayer=Выберите игрока: +client.choicePlayer=Пожалуйста, выбирайте нацию: client.classic=Не удалось загрузить ресурс из набора правил `классический'. client.debugConnect=Вы не можете подключиться к этой игре в режиме отладки. client.ending=Игра завершается. @@ -2298,9 +2355,9 @@ metaServer.couldNotConnect=Извините, не могу подключить metaServer.communicationError=Во время общения с мета-сервером возникла ошибка. Пожалуйста, поброуйте позже. abandonEducation.action.studying=изучение abandonEducation.action.teaching=обучение -abandonEducation.no=Нет, продолжить обучение +abandonEducation.no=Продолжить обучение abandonEducation.text=Если ваш %unit% покинет колонию %colony%, он откажется от %action% в %building%, вы уверены? -abandonEducation.yes=Да, покинуть колонию +abandonEducation.yes=Прервать обучение abandonTeaching.text=Если %unit% покинет %building% он прекратит обучение, вы уверены что ему пора это сделать? armedUnitSettlement.attack=Атаковать armedUnitSettlement.tribute=Требовать дань @@ -2311,10 +2368,14 @@ buy.takeOffer=Принять предложение buy.text=%nation% желают продать %goods% за %gold%: clearTradeRoute.text=Ваш %unit% назначен на торговый путь %route%. Установка назначения уберёт его с торгово пути. Вы уверены, что хотите это сделать? client.fullScreen=Видеокарта или драйвер к ней не поддерживает полноэкранный режим.\nВозвращаюсь в оконный режим. +# Fuzzy confirmHostile.alliance=Вы не можете атаковать союзников! Вы желаете расторгнуть союз с {{tag:with|%nation%}} и объявить войну? +# Fuzzy confirmHostile.ceaseFire=Вы подписывали договор о прекращении огня с {{tag:with|%nation%}}. Вы действительно хотите атаковать? +# Fuzzy confirmHostile.peace=Сейчас у вас мир с {{tag:with|%nation%}}. Вы действительно хотите объявить войну? confirmHostile.yes=Да, спустить псов войны! +# Fuzzy confirmTribute.broke=Наши шпионы сообщают, что народ «%nation%» совершенно сломлены. Не стоит медлить - потребуем с них дань. confirmTribute.european=Народ «%nation%» %danger% и %finance%. Какой данью стоит их обложить? confirmTribute.happy=Народ «%nation%» из поселения «%settlement%» - наши добрые друзья, было бы жалко разрушить узы братства. @@ -2334,6 +2395,7 @@ indianLand.cancel=Покинуть землю indianLand.pay=Предложить %amount% золотых за землю indianLand.take=Взять то, что по праву наше indianLand.text=Эта земля принадлежит игроку %player%. Что вы хотите: +# Fuzzy indianLand.unknown=В этих землях живут какие-то неизвестные люди. Ваши пожелания: info.autodetectLanguageSelected=Вы выбрали автоматическое определение языка. Это будет сделано после перезапуска игры. info.enterSomeText=Пожалуйста, введите текст. @@ -2379,7 +2441,9 @@ defeated.text=Вы потерпели поражение! Хотите ли Вы defeated.yes=Остаться и наблюдать defeatedSinglePlayer.text=Вы потерпели поражение!\n\nС этого момента настало время дьявольской ночи, когда церковь спит и ад выдыхает болезни в этот мир, когда я могу пить теплую кровь! и делать такие дела, что следующий день задрожит только от одного взгляда на них. defeatedSinglePlayer.yes=Перейти в режим мщения +# Fuzzy diplomacy.offerAccepted=%nation% приняли ваше щедрое предложение. +# Fuzzy diplomacy.offerRejected=%nation% отказались от вашего щедрого предложения. disbandUnit.text=Вы уверены, что хотите избавиться от этого юнита? disbandUnit.yes=Расформировать @@ -2425,7 +2489,8 @@ move.noAccessGoods=%nation% не станут торговать с %unit% бе move.noAccessMissionBan=%nation% отвергли все контакты с вашими миссионерами. move.noAccessSettlement=%nation% не разрешают войти в поселение нашему %unit%. move.noAccessSkill=Наш %unit% не может учиться у индейцев. -move.noAccessTrade=Мы не имеем права торговать с другими европейскими нациями, такими, как %nation%. +move.noAccessTrade=Мы не имеем права торговать с другими европейскими нациями, такими как {{tag:country|%nation%}}. +# Fuzzy move.noAccessWar=Мы не можем торговать с {{tag:with|%nation%}} во время войны. move.noAccessWater=Наш %unit% должен высадиться на берег, прежде чем входить в поселение. move.noAttackWater=Наши %unit% должны высадится на землю перед атакой. @@ -2481,6 +2546,7 @@ server.invalidPlayerNations=Перед началом игры каждый иг server.maximumPlayers=Извините, достигнуто максимальное количество игроков. server.missingUserName=В запросе на вход отсутствует имя пользователя. server.missingVersion=Версия FreeCol не соответствует запросу входа. +# Fuzzy server.noRouteToServer=Этот сервер не может быть публичным. Вам следует изменить настройки сетевого экрана (firewall) для установления соединения по выбранному порту. server.noSuchPlayer=В игре нет игрока под именем: %player% server.notAllReady=Не все игроки готовы начать игру! @@ -2490,6 +2556,7 @@ server.timeOut=Вышло время соединения с сервером. server.userNameInUse=Указанное имя пользователя уже используется. server.userNameNotPresent=Указанное имя пользователя отсутствует в этой игре. server.wrongFreeColVersion=Версии клиента и сервера FreeCol не совпадают. +# Fuzzy buildColony.others=%nation% основали новую колонию %colony% в %region%. cashInTreasureTrain.colonial=Сундуки сокровищ с %amount% золота прибыли в Европу. %cashInAmount% золота перечислено вам. cashInTreasureTrain.independent=В национальную казну были включёны сокровища, стоимостью %amount%. @@ -2593,6 +2660,7 @@ colopedia.unit.offensivePower=Сила атаки: colopedia.unit.price=Цена в Европе: colopedia.unit.productionBonus={{plural:%number%|one=Модификатор|other=Модификаторы}} производства: colopedia.unit.requirements=Требования: +# Fuzzy colopedia.unit.school=Обучение: colopedia.unit.skill=Умение: report.labour.allColonists=Все колонисты @@ -2618,6 +2686,7 @@ report.labour.unitTotal.tooltip=%unit% или становится %unit% report.labour.workingAs=Работает как report.labour.workingAsOther=другой report.colony.arriving.description=%colony%: новый %unit% появится через %turns% {{plural:%turns%|one=ход|few=хода|many=ходов}} +report.colony.arriving.summary.description=Среднее число ходов между прибытием каждого нового колониста в колонии на этом континенте. report.colony.birth.description=Число ходов до того как новый поселенец прибудет или начнет голодать report.colony.explore.description=Количество единиц площади, которые необходимо исследовать рядом с этой колонией report.colony.explore.header=И @@ -2625,11 +2694,12 @@ report.colony.exploring.description=%colony% извлечёт выгоду из report.colony.grow.description=Количество единиц, на которое может вырасти колония без ущерба для производства report.colony.grow.header=+ report.colony.growing.description=%colony% может быть увеличена на {{plural:%amount%|one=одного жителя|few=%amount% жителя|many=%amount% жителей}} без ущерба для производства. +report.colony.growing.summary.description=Общее число колонистов, которое может присоединиться к колониям на этом континенте, не навредив производству. # Fuzzy report.colony.improve.description=Средства, которые могут повысить производительность по сравнению со средствами, используемыми в настоящий момент report.colony.improve.header=Улучшение +# Fuzzy report.colony.improving.description=%colony%: чтобы произвести еще %amount% %goods%, замените%oldUnit% на %unit% -report.colony.wanting.description=%colony%: Чтобы производить товар %goods% на %amount% больше, добавьте юнит %unit% report.colony.making.blocking.description=%colony%: необходимо %amount% {{plural:%amount%|%goods%}} для %buildable% через %turns% {{plural:%turns%|one=ход|few=хода|many=ходов}} report.colony.making.constructing.description=%colony%: %buildable% завершается через %turns% {{plural:%turns%|one=ход|few=хода|many=ходов}} report.colony.making.description=Что делает эта колония @@ -2639,20 +2709,21 @@ report.colony.making.noconstruction.description=%colony%: Не осуществ report.colony.making.noteach.description=%colony%: %teacher% нуждается в ученике report.colony.name.description=Список колоний report.colony.name.header=Колония -report.colony.plow.description=Число единиц площади в данной колонии, которые будет выгодно распахать -report.colony.plow.header=P -report.colony.plowing.description=%colony% извлечёт выгоду из вспахивания {{plural:%amount%|one=одной клетки|other=%amount% клеток}} +# Fuzzy report.colony.production.description=%colony%: объём производства %goods% = %amount% +# Fuzzy report.colony.production.export.description=%colony%: объём производства товара %goods% равна %amount% (для экспорта %export%) report.colony.production.header=Объём производства товара %goods% +# Fuzzy report.colony.production.high.description=%colony%: объём производства %goods% = %amount%, достигнет максимума через %turns% {{plural:%turns%|one=ход|few=хода|many=ходов}} +# Fuzzy report.colony.production.low.description=%colony%: остаток товара %goods% = %amount%, будет исчерпан через %turns% {{plural:%turns%|one=ход|few=хода|many=ходов}} +# Fuzzy report.colony.production.waste.description=%colony%: масса нетто произведенного товара %goods% = %amount%, склад переполнен, %waste% будет утилизирован -report.colony.road.description=Число единиц площади в колонии, на которых выгодно строительство дорог -report.colony.road.header=R -report.colony.roadBuilding.description=%colony% извлечёт выгоду из строительства {{plural:%amount%|one=дороги|other=%amount% дорог}} report.colony.shrinking.description=%colony% должна быть увеличена на {{plural:%amount%|one=одного жителя|few=%amount% жителя|many=%amount% жителей}} для улучшения производства report.colony.starving.description=%colony%: голод через %turns% {{plural:%turns%|one=ход|few=хода|many=ходов}} +# Fuzzy +report.colony.wanting.description=%colony%: Чтобы производить товар %goods% на %amount% больше, добавьте юнит %unit% report.continentalCongress.available=доступно report.continentalCongress.elected=Выбран: %turn% report.continentalCongress.none=(нет) @@ -2696,37 +2767,36 @@ report.production.selectGoods=Выбор товаров report.production.update=Обновление report.requirements.badAssignment=В %colony% есть %expert%, работающий как %expertWork%, тогда как %nonExpert% работает как %nonExpertWork%. Было бы эффективнее поменять их места работы. report.requirements.canTrainExperts={{plural:5|%unit%}} можно обучить в -report.requirements.clearTile=%type% на %direction% от колонии %colony% может получить выгоду от вырубки леса. +# Fuzzy report.requirements.exploreTile=%type% на %direction% от колонии %colony% может получить выгоду от разведки. report.requirements.met=Все требования выполнены. report.requirements.missingGoods=В %colony% для производства %goods% не хватает %input%. report.requirements.misusedExperts=У вас есть {{plural:|%unit%}}, которые не работают в качестве %work% в report.requirements.noExpert=В %colony% производят %goods%, но там нет %unit%. -report.requirements.plowCenter=%colony% может получить выгоду от вспашки. -report.requirements.plowTile=%type% на %direction% от колонии %colony% может получить выгоду от вспашки. -report.requirements.roadTile=%type% на %direction% от колонии %colony% может получить выгоду от прокладки дороги. report.requirements.severalExperts=Несколько {{plural:5|%unit%}} присутствуют на report.requirements.surplus=Излишек %goods% производится в report.trade.afterTaxes=Доход после налогов report.trade.beforeTaxes=Доход до налогов report.trade.cargoUnits=Подразделений для перевозки +# Fuzzy report.trade.hasCustomHouse=* В колонии есть таможня; эти товары экспортируются. report.trade.totalDelta=Всего производится report.trade.totalUnits=Всего юнитов report.trade.unitsSold=Единиц куплено или продано report.turn.filter=Не показывать этот тип сообщений (%type%) report.turn.ignore=Игнорировать это сообщение (Колония: %colony%, товары: %goods%) +# Fuzzy report.turn.playerNation=%player% - %nation% aboutPanel.copyright=Авторские права © 2002—2015 Команда FreeCol aboutPanel.legalDisclaimer=FreeCol является свободным программным обеспечением. Вы можете распространять и/или изменять его в соответствии с условиями лицензии GNU GPL, опубликованной Фондом свободного программного обеспечения, версии 2 либо более поздней по вашему выбору. +aboutPanel.manual=Скачать руководство по FreeCol aboutPanel.officialSite=Сайт: aboutPanel.sfProject=Проект в SourceForge: aboutPanel.version=Версия: buildingToolTip.breeding=Вам нужно не менее %number% {{plural:%number%|%goods%}}, чтобы разводить %goods%. buildQueuePanel.buildings=Здания buildQueuePanel.buildQueue=Очередь постройки -# Fuzzy -buildQueuePanel.buyBuilding=Купить здание +buildQueuePanel.buyBuilding=Купить %buildable% buildQueuePanel.coastalOnly=Прибрежная колония buildQueuePanel.compactView=Компактный вид buildQueuePanel.currentlyBuilding=Строится: %buildable% @@ -2738,10 +2808,11 @@ captureGoodsDialog.title=Трофеи cargoPanel.cargoAndSpace=Груз на %name% (%space% {{plural:%space%|one=трюм|few=трюма|many=трюмов|default=трюмов}} свободно) chatPanel.message=Сообщение: chooseFoundingFatherDialog.title=Назначить Отца-основателя +colonyPanel.buildQueue=Очередь постройки colonyPanel.colonyUnits=Колониальные юниты colonyPanel.inPort=В порту colonyPanel.outsideColony=Снаружи колонии -colonyPanel.producing=Производство: +colonyPanel.producing=производство: colonyPanel.reducePopulation=Если вы уменьшите население колонии ниже %number%, то %colony% не сможет больше строить %buildable%. colonyPanel.unitChange=В %colony% ваш %oldType% стал %newType%. colonyPanel.warehouse=Склад @@ -2754,7 +2825,9 @@ confirmDeclarationDialog.areYouSure.no=Может быть, позже. confirmDeclarationDialog.areYouSure.text=Отвергнем несправедливую тиранию монарха %monarch% и объявим независимость наших колоний от короны! confirmDeclarationDialog.areYouSure.yes=Свобода или смерть! confirmDeclarationDialog.createFlag=и наши враги должны дрожать по виду нашего дерзкого баннера. +# Fuzzy confirmDeclarationDialog.defaultCountry={{tag:adj|%nation%}} Соединённые Штаты +# Fuzzy confirmDeclarationDialog.defaultNation=Свободные %nation% confirmDeclarationDialog.enterCountry=Впредь наша страна будет известна, как confirmDeclarationDialog.enterNation=а каждый гражданин нашей выдающейся нации должен гордиться тем, что будет зваться @@ -2805,8 +2878,10 @@ negotiationDialog.add=Добавить negotiationDialog.cancel=Отказаться negotiationDialog.clear=Очистить negotiationDialog.contact.tutorial=Вы встретили братских европейцев. Они будут соревноваться с вами землей и сокровищами, а также могут объявить Вам войну. Но после того, как Ян де Витт присоединился к континентальному конгрессу, вы можете торговать с ними. +# Fuzzy negotiationDialog.demand=%nation% спрашивают %otherNation% negotiationDialog.exchange=в обмен на +# Fuzzy negotiationDialog.offer=%nation% предлагают %otherNation% negotiationDialog.send=Послать negotiationDialog.title.contact=Встреча с земляками-европейцами @@ -2829,10 +2904,11 @@ findSettlementPanel.displayAll=Найти все поселения findSettlementPanel.displayOnlyEuropean=Найти только европейские поселения findSettlementPanel.displayOnlyNatives=Найти только местные поселения findSettlementPanel.name=Найти поселение +# Fuzzy firstContactDialog.meeting.natives=Встреча аборигенов… firstContactDialog.meeting.natives.tutorial=Вы встретили местных уроженцев. Посылайте ваших разведчиков к их поселениям для того, чтобы узнать о них больше, а закупов и свободных колонистов — чтобы учиться у них. Посылайте ваши корабли и обозы к их поселениям, если желаете торговать с ними. -firstContactDialog.meeting.AZTEC=Народ ацтеков… -firstContactDialog.meeting.INCA=Империя инков… +firstContactDialog.meeting.aztec=Нация ацтеков +firstContactDialog.meeting.inca=Империи инков firstContactDialog.welcomeOffer.text=%nation% приветствуют вас. Мы выдающаяся нация, у нас %camps% {{plural:%camps%|%settlementType%}}. Чтобы отпраздновать нашу дружбу, мы щедро дарим вам земли, которые вы сейчас занимаете. Примете ли вы наш договор, будете ли жить с нами в мире как братья? firstContactDialog.welcomeSimple.text=%nation% приветствуют вас. Мы выдающаяся нация, у нас %camps% {{plural:%camps%|%settlementType%}}. Примете ли вы наш договор, будите ли жить с нами в мире как братья? abandonColony.no=Отмена @@ -2976,6 +3052,9 @@ nameCache.mercenaries.0=Фридрих II (ландграф Гессен-Кас nameCache.mercenaries.1=Фридрих Август (князь Ангальт-Цербста) nameCache.mercenaries.2=Карл Александр, маркграф Бранденбург-Ансбаха nameCache.mercenaries.3=Карл I Брауншвейг-Вольфенбюттельский +nameCache.season.default=Время года %number% +nameCache.season.0=Весна +nameCache.season.1=Осень model.nation.dutch.region.river.1=Катскилл model.nation.dutch.region.mountain.1=Вильгельмбург model.nation.dutch.region.mountain.2=Кайзербург @@ -3034,6 +3113,7 @@ model.nation.spanish.region.land.1=Чили model.nation.spanish.region.land.2=Колумбия model.nation.spanish.region.land.3=Эквадор model.nation.spanish.region.land.4=Мексика +info.rgb=RGB-значение: %red%,%green%,%blue% prompt.selectDisaster=Выберите катастрофу prompt.selectGoodsAmount=Выберите количество товара prompt.selectGoodsType=Выберите тип товара diff --git a/data/strings/FreeColMessages_sk.properties b/data/strings/FreeColMessages_sk.properties index ba3e1cea6..76c773cbd 100644 --- a/data/strings/FreeColMessages_sk.properties +++ b/data/strings/FreeColMessages_sk.properties @@ -3,6 +3,7 @@ # Author: Helix84 # Author: Jaroslav.micek # Author: Kusavica +# Author: Mark # Author: Mikulas1 # Author: Rudko @@ -96,6 +97,7 @@ cashInTreasureTrain=Hotovosť v poklade clearOrders=Vymazať príkazy colonists=Kolonisti colopedia=Colopedia +countryName={{tag:country|%nation%}} difficulty=Obtiažnosť docks=Doky dumpCargo=Vyhodiť náklad @@ -105,7 +107,7 @@ gold=Zlato goldAmount=%amount% {{plural:%amount%|one=zlato|other=zlata|default=zlato}} goods=Tovar goToEurope=Ísť do Európy -goToThisTile=Ísť na toto políčko +goToThisTile=Ísť na toto pole immigrants=Prisťahovalci inPort=V prístave leaveShip=Opustiť loď @@ -119,11 +121,11 @@ player=Hráč purchase=Kúpiť recruit=Povolať rules=Pravidlá -sailingToAmerica=Plavba do Ameriky -sailingToEurope=Plavba do Európy +sailingToAmerica=Pláva do Ameriky +sailingToEurope=Pláva do Európy sales=Predaj sentry=Hliadkovať -setSail=Nastaviť plavbu +setSail=Vyplávať do settlement=Osada showProductionModifiers=Ukázať modifikátory výroby skillTaught=Naučené zručnosti @@ -143,71 +145,76 @@ status.savingGame=Čakajte prosím: Ukladanie hry status.startingGame=Čakajte prosím: Spúšťanie hry cli.arg.advantages=VÝHODY cli.arg.clientOptions=MOŽNOSTI SÚBORU -cli.arg.debug=LADENIE-REŽIMY -cli.arg.debugRun=ŤAHOV[,NÁZOV ULOŽENIA] +cli.arg.debug=REŽIMY LADENIA +cli.arg.debugRun=ŤAHOV[,SAVENAME] cli.arg.difficulty=OBTIAŽNOSŤ cli.arg.dimensions=ŠÍRKAxVÝŠKA cli.arg.directory=ADRESÁR cli.arg.europeans=EURÓPANIA cli.arg.file=SÚBOR +cli.arg.gui-scale=MIERKA cli.arg.locale=MIESTNY cli.arg.loglevel=LOGLEVEL cli.arg.name=MENO cli.arg.port=PORT cli.arg.seed=SEED cli.arg.timeout=ČASOVÝ LIMIT -cli.error.advantages=Očakávané výhody typu (%advantages%), založené: %arg% +cli.error.advantages=Očakávané výhody typu (%advantages%), nájdené: %arg% cli.error.badTC=Chyba pri otváraní množiny pravidiel %tc%. cli.error.clientOptions=Ignorovanie nečitateľného súboru možností klienta: %string% cli.error.debug=Očakávaný zoznam režimu ladenia (%modes%). -cli.error.difficulties=Očakávaný stupeň obtiažnosti (%difficulties%), zavedený: %arg% -cli.error.europeans=Počet Európskych národov musí byť minimálne %min% +cli.error.difficulties=Očakávaný stupeň obtiažnosti (%difficulties%), nájdený: %arg% +cli.error.europeans=Počet Európskych národov musí byť najmenej %min% cli.error.home.noRead=Nedá sa čítať z %string%. cli.error.home.noWrite=Nedá sa zapisovať do %string%. cli.error.home.notDir=%string% nieje adresár. cli.error.home.notExists=Adresár %string% neexistuje. cli.error.save=Nemožno čítať uloženú hru %string%. cli.error.serverPort=%string% nieje platné číslo portu. +cli.error.splash=Súbor s úvodným obrázkom %name% nenájdený. cli.error.timeout=%string% je príliš krátke (menej než %minimum%). cli.advantages=nastaviť typ VÝHOD (%advantages%) cli.check-savegame.failure=Kontrola konzistencie uloženej hry zlyhala, skontrolujte podrobnosti v denníku. cli.check-savegame.success=Kontrola konzistencie uloženej hry sa skončila, skontrolujte podrobnosti v denníku. cli.check-savegame=skontrolovať konzistenciu zvolenej uloženej hry -cli.clientOptions=XML súbor obsahuje užívateľské možnosti klienta. -cli.debug-run=spustiť N ťahov v režime ladenia, potom možnosť uložiť a ukončiť -cli.debug-start=okamžite začať novú hru pre jedného hráča -cli.debug=nastaviť FreeCol režim ladenia (%modes%) -cli.default-locale=nastaviť predvolené miestne nastavenia(JAZYK[_ZEM[_VARIANTA]]) +cli.clientOptions=XML súbor obsahujúci užívateľské možnosti klienta. +cli.debug-run=spustiť N ťahov v režime ladenia, potom možno uložiť a ukončiť +cli.debug-start=okamžite začať novú hru jedného hráča +cli.debug=nastaviť režimy ladenia (%modes%) FreeCol +cli.default-locale=nastaviť predvolené miestne nastavenia(LANGUAGE[_COUNTRY[_VARIANT]]) cli.difficulty=nastaviť úroveň OBTIAŽNOSTI cli.european-count=nastaviť počet povolených národov (koloniálny EURÓPANIA) cli.fast=vynechať všetky dialógy nastavenia cli.font=nastaviť predvolené písmo -cli.freecol-data=nastaviť údaje ADRESÁRA FreeCOL (obsahuje priečinok 'base') +cli.freecol-data=nastaviť údaje ADRESÁRA FreeCol (obsahuje podadresár s názvom 'base') +cli.full-screen=spustiť FreeCol v režime celej obrazovky +cli.gui-scale=odstupňovať prvky GUI, s voliteľnou MIERKOU (%scales%) cli.help=zobraziť túto obrazovku pomocníka cli.load-savegame=načítať daný SÚBOR uloženej hry -cli.log-console=prihlásenie do konzoly aj súboru -cli.log-file=nastaviť FreeCol súbor denníka (predvolené FreeCol.log) +cli.log-console=okrem záznamu do súboru aj záznam na konzolu +cli.log-file=nastaviť súbor záznamu FreeCol (predvolené do FreeCol.log) cli.log-level=nastaviť úroveň java log do LOGLEVEL cli.name=zadať MENO pre hráča cli.no-intro=vynechať úvodné video -cli.no-java-check=vynechať kontrolu verzie jávy +cli.no-java-check=vynechať kontrolu verzie javy cli.no-memory-check=vynechať kontrolu pamäte cli.no-sound=spustiť FreeCol bez zvuku +cli.no-splash=preskočiť úvodnú obrayovku cli.private=spustiť súkromný server (nepublikovaný na metaserver) cli.seed=zadať SEED pre pseudo generátor náhodných čísiel +# Fuzzy +cli.server=spustiť samostatný server na zadanom porte cli.server-name=zadať vlastný NÁZOV servera -cli.server=spustiť stand-alone server na určitom porte -cli.splash=zobraziť úvodný SÚBOR pri načítavaní hry +cli.splash=zobraziť úvodný obrázok FILE pri načítavaní hry cli.tc=načítať celkový prevod so zadaným MENOM cli.timeout=počet sekúnd, ktoré server čaká na odpoveď na otázku cli.user-cache-directory=nastaviť cache ADRESÁRA užívateľa FreeCol cli.user-config-directory=nastaviť ADRESÁR užívateľovej konfigurácie FreeCol cli.user-data-directory=nastaviť ADRESÁR údajov užívateľa FreeCol cli.version=zobraziť číslo verzie a odísť -# Fuzzy -cli.windowed=spustiť FreeCol vo vlastnom okne namiesto na celú obrazovku +cli.windowed=spustiť FreeCol v okne, s voliteľnými DIMENSIONS menuBar.colopedia=Kolopédia -menuBar.game=Hra +menuBar.game=Zver menuBar.orders=Príkazy menuBar.report=Hlásenie menuBar.tools=Nástroje @@ -215,14 +222,16 @@ menuBar.view=Zobrazenie menuBar.statusLine=Skóre: %score% | Zlato: %gold% | Daň: %tax%% | Rok: %year% menuBar.debug=Ladenie menuBar.debug.addBuilding=Pridať budovu do každej kolónie -menuBar.debug.addFoundingFather=Pridať zakladateľa +menuBar.debug.addFoundingFather=Pridať Otca zakladateľa menuBar.debug.addGold=Pridať zlato menuBar.debug.addImmigration=Pridať prisťahovalectvo menuBar.debug.addLiberty=Pridať slobodu do každej kolónie menuBar.debug.compareMaps.checkComplete=Kontrola dokončená. Žiadna nesynchronizácia nezistená. menuBar.debug.compareMaps.problem=Objavený možný problém. Prečítajte si prosím informácie o štandardnom výstupe. menuBar.debug.compareMaps=Skontrolovať desynchronizáciu mapy -menuBar.debug.displayErrorMessage=Zobraziť hlásenia chýb +menuBar.debug.displayAIMissions=Zobrazenie UI misie +menuBar.debug.displayAdditionalAIMissionInfo=Zobraziť dodatočné informácie o UI misii +menuBar.debug.displayErrorMessage=Zobraziť chybové hlásenie menuBar.debug.displayEuropeStatus=Zobraziť stav Európy menuBar.debug.displayMonarchPanel=Zobraziť panely kráľa menuBar.debug.displayPanels=Zobraziť panely @@ -235,12 +244,12 @@ menuBar.debug.runMonarch=Nastaviť ďalšiu akciu kráľa menuBar.debug.searchTrace=Zaznamenať všetky stopy vyhľadávania menuBar.debug.showColonyValue=Zobraziť hodnoty kolónie menuBar.debug.showCoordinates=Zobraziť súradnice -menuBar.debug.showResourceKeys=Zobraziť zdrojové kľúče +menuBar.debug.showResourceKeys=Zobraziť kľúče zdrojov menuBar.debug.skipTurns=Vynechať ťah menuBar.debug.stepRandomNumberGenerator=Krok generátora náhodných čísiel menuBar.debug.stopSkippingTurns=Zastaviť vynechávanie ťahov -menuBar.debug.useAI=Použiť AI -aboutAction.name=O hre FreeCol +menuBar.debug.useAI=Použiť UI +aboutAction.name=O FreeCol activeAction.name=Aktivovať jednotku assignTradeRouteAction.name=Priradiť obchodnú trasu buildColonyAction.name=Vybudovať/pridať sa ku kolónii @@ -249,19 +258,17 @@ changeAction.enterColony.name=Vstúpiť do kolónie changeAction.name=Ďalšia jednotka na políčku changeAction.nextUnitOnTile.name=Ďalšia jednotka na políčku changeAction.selectCarrier.name=Vybrať prepravcu -# Fuzzy -changeWindowedModeAction.name=Prepnúť režim na celú obrazovku -chatAction.name=Chat/Čet +changeWindowedModeAction.name=Celoobrazovkový režim +chatAction.name=Pokec clearForestAction.name=Vyrúbať les clearOrdersAction.name=Vymazať príkazy colopediaAction.buildings.name=Budovy colopediaAction.concepts.name=Predstavy -colopediaAction.fathers.name=Zakladatelia +colopediaAction.fathers.name=Otcovia zakladatelia colopediaAction.goods.name=Tovar colopediaAction.nations.name=Národy colopediaAction.nationTypes.name=Výhody národov colopediaAction.resources.name=Bonusové zdroje -colopediaAction.skills.name=Zručnosti colopediaAction.terrain.name=Druhy terénu colopediaAction.units.name=Jednotky colopediaAction.name=%object% (Colopedia) @@ -271,7 +278,7 @@ declareIndependenceAction.name=Vyhlásiť nezávislosť determineHighSeasAction.name=Určiť šíre more difficultyAction.name=Ukázať úroveň obtiažnosti disbandUnitAction.name=Rozpustiť -displayBordersAction.name=Zobraziť okraje +displayBordersAction.name=Zobraziť hranice displayGridAction.name=Zobraziť mriežku displayTileTextAction.empty.name=Nezobrazovať text na políčkach displayTileTextAction.names.name=Zobraziť názvy políčok @@ -279,7 +286,7 @@ displayTileTextAction.owners.name=Zobraziť vlastníkov políčok displayTileTextAction.regions.name=Zobraziť políčka regiónov endTurnAction.name=Ukončiť ťah europeAction.name=Európa -executeGotoOrdersAction.name=Ísť k príkazom +executeGotoOrdersAction.name=Vykonať príkaz Prejsť na ... findSettlementAction.name=Nájsť osadu fortifyAction.name=Opevniť sa gameOptionsAction.name=Zobraziť možnosti hry @@ -324,16 +331,15 @@ renameAction.name=Premenovať reportCargoAction.name=Hlásenie o náklade reportColonyAction.name=Poradca kolónie reportCongressAction.name=Kontinentálny snem -# Fuzzy -reportEducationAction.name=Vzdelávanie +reportEducationAction.name=Hlásenie o vzdelávaní reportExplorationAction.name=Hlásenie o prieskume reportForeignAction.name=Poradca pre zahraničné veci reportHighScoresAction.name=Najvyššie skóre -reportHistoryAction.name=História +reportHistoryAction.name=Hlásenie o histórii reportIndianAction.name=Poradca pre záležitosti indiánov -reportLabourAction.name=Poradca pre prácu +reportLabourAction.name=Pracovný poradca reportMilitaryAction.name=Vojenský poradca -reportNavalAction.name=Poradca pre námorníctvo +reportNavalAction.name=Námorný poradca reportProductionAction.name=Hlásenie o výrobe reportReligionAction.name=Poradca pre vierovyznanie reportRequirementsAction.name=Požiadavky @@ -342,7 +348,7 @@ reportTurnAction.name=Hlásenie o ťahu retireAction.name=Vzdať sa roadAction.name=Stavať cestu saveAction.name=Uložiť -saveAndQuitAction.name=Uložiť a ukončiť +saveAndQuitAction.name=Uložiť a skončiť scaleMapAction.name=Mierka mapy sentryAction.name=Hliadkovať showMainAction.name=Návrat na hlavnú stránku @@ -356,7 +362,7 @@ zoomInAction.name=Priblížiť zoomOutAction.name=Oddialiť actionManager.name=Klávesové skratky actionManager.shortDescription=Klávesové skratky -difficultyLevels.name=Stupne obiažnosti +difficultyLevels.name=Úrovne obiažnosti model.difficulty.veryEasy.name=Veľmi ľahká model.difficulty.easy.name=Ľahká model.difficulty.medium.name=Stredná @@ -375,23 +381,23 @@ model.option.priceIncreasePerType.name=Zvýšenie ceny pre typ jednotky model.option.priceIncreasePerType.shortDescription=Zvyšovanie ceny sa uplatňuje podľa jednotlivých typov jednotiek. model.option.priceIncrease.artillery.name=Zvýšenie ceny pre delostrelectvo model.option.priceIncrease.artillery.shortDescription=Zvyšuje cenu pre každé nové delostrelectvo. -model.option.expertStartingUnits.name=Zvoľ, ktoré začiatočné jednotky budú experti. -model.option.expertStartingUnits.shortDescription=Urob všetky začiatočné jednotky expertmi. +model.option.expertStartingUnits.name=Začiatočné jednotky expertov +model.option.expertStartingUnits.shortDescription=Urob všetky začiatočné jednotky expertmi. model.option.immigrants.name=Prisťahovalci model.option.immigrants.shortDescription=Prví prisťahovalci z Európy. model.difficulty.natives.name=Domorodci model.option.landPriceFactor.name=Faktor ceny pozemku -model.option.landPriceFactor.shortDescription=Zvyšuje cenu kúpy domorodého pozemku. +model.option.landPriceFactor.shortDescription=Zvyšuje náklady na nákup pozemku od domorodcov. model.option.nativeConvertProbability.name=Pravdepodobnosť konvertovania domorodcov -model.option.nativeConvertProbability.shortDescription=Zvyšuje pravdepodobnosť, že domorodci zo zničených osád konvertujú. +model.option.nativeConvertProbability.shortDescription=Zvyšuje pravdepodobnosť, že domorodci zo zničenej osady konvertujú. model.option.burnProbability.name=Pravdepodobnosť vypálenia osady model.option.burnProbability.shortDescription=Zvyšuje pravdepodobnosť, že domorodci vypália kolónie. model.option.nativeDemands.name=Požiadavky domorodcov model.option.nativeDemands.shortDescription=Zvyšuje množstvo požiadaviek domorodcov. model.option.rumourDifficulty.name=Obtiažnosť povestí -model.option.rumourDifficulty.shortDescription=Čím je toto číslo vyššie, tým je pravdepodobnosť pozitívnych povestí nižšia. -model.option.shipTradePenalty.name=Pokuta keď obchodujú lode -model.option.shipTradePenalty.shortDescription=Percentá pokuty z ceny keď obchodujú lode sú zaplatené domorodcami. +model.option.rumourDifficulty.shortDescription=Čím je toto číslo vyššie, tým je pravdepodobnosť pravdivosti povestí nižšia. +model.option.shipTradePenalty.name=Postih za obchodovanie z lode +model.option.shipTradePenalty.shortDescription=Percentá postihu z ceny ponúknutej domorodcami pri obchode s loďami. model.option.destroySettlementScore.name=Zničiť skóre osady model.option.destroySettlementScore.shortDescription=Zníženie skóre za zničenie domorodých osád model.option.buildOnNativeLand.name=Postaviť na území domorodcov @@ -406,6 +412,16 @@ model.option.buildOnNativeLand.never.name=Nikdy model.option.buildOnNativeLand.never.shortDescription=Stavba na území domorodcov nieje povolená. model.option.settlementNumber.name=Počet domorodých osád model.option.settlementNumber.shortDescription=Možnosť nastavenie počtu domorodých osád na generovaných mapách. +model.option.settlementNumber.verySmall.name=Veľmi malý +model.option.settlementNumber.verySmall.shortDescription=Veľmi málo domorodých osád +model.option.settlementNumber.small.name=Malý +model.option.settlementNumber.small.shortDescription=Malý počet domorodých osád +model.option.settlementNumber.medium.name=Priemerný +model.option.settlementNumber.medium.shortDescription=Priemerný počet domorodých osád +model.option.settlementNumber.large.name=Veľký +model.option.settlementNumber.large.shortDescription=Veľký počet domorodých osád +model.option.settlementNumber.veryLarge.name=Veľmi veľký +model.option.settlementNumber.veryLarge.shortDescription=Hojne domorodých osád model.difficulty.monarch.name=Kráľ model.option.monarchMeddling.name=Zasahovanie panovníka model.option.monarchMeddling.shortDescription=Zvyšuje množstvo a závažnosť zásahov kráľa. @@ -430,13 +446,15 @@ model.option.refSize.soldiers.shortDescription=Počet jednotiek pechoty. model.option.refSize.dragoons.name=Jazda model.option.refSize.dragoons.shortDescription=Počet jednotiek jazdy. model.option.refSize.menOfWar.name=Krížnik -model.option.refSize.menOfWar.shortDescription=Počet vojnových lodí, alebo Krížnikov. +model.option.refSize.menOfWar.shortDescription=Počet vojnových lodí, alebo krížnikov. model.option.refSize.artillery.name=Delostrelectvo model.option.refSize.artillery.shortDescription=Počet jednotiek delostrelectva. model.option.interventionForce.name=Intervenčné sily model.option.interventionForce.shortDescription=Intervenčné sily vyslané na podporu Vašej vojny za nezávislosť. model.option.mercenaryForce.name=Vojsko žoldierov model.option.mercenaryForce.shortDescription=Vojsko žoldnierov ponúknuté na podporu Vašej vojny za nezávislosť. +model.option.warSupportGold.name=Zlato na podporu vojny +model.option.warSupportGold.shortDescription=Maximum zlata ponúknuté monarchom na podporu Vašich vojen. model.difficulty.government.name=Vláda model.option.badGovernmentLimit.name=Limit zlej vlády model.option.badGovernmentLimit.shortDescription=Maximálny počet rojalistov, ktorý nespôsobia obmedzenie výroby. @@ -449,32 +467,42 @@ model.option.veryGoodGovernmentLimit.shortDescription=Minimálne percento rebelo model.difficulty.other.name=Iné model.option.startingMoney.name=Peniaze na začiatku model.option.startingMoney.shortDescription=Množstvo peňazí s ktorými začnete hru. -model.option.foundingFatherFactor.name=Faktor zakladateľa -model.option.foundingFatherFactor.shortDescription=Zvyšuje náklady pre voľbu nového zakladateľa. +model.option.foundingFatherFactor.name=Faktor Otca zakladateľa +model.option.foundingFatherFactor.shortDescription=Zvyšuje náklady pre voľbu nového otca zakladateľa. model.option.arrearsFactor.name=Faktor nedoplatkov model.option.arrearsFactor.shortDescription=Zvyšuje Vaše európske daňové nedoplatky. -model.option.unitsThatUseNoBells.name=Kolonisti, ktorí nepoužívajú zvony -model.option.unitsThatUseNoBells.shortDescription=Počet kolonistov v kolónii, ktorí nepoužívajú zvony. -model.option.tileProduction.name=Výroba políčka -model.option.tileProduction.shortDescription=Výroba políčok s rôznymi možnosťami výroby. +model.option.unitsThatUseNoBells.name=Kolonisti, ktorí nespotrebúvajú zvony +model.option.unitsThatUseNoBells.shortDescription=Počet kolonistov v kolónii, ktorí nespotebúvajú zvony. +model.option.tileProduction.name=Výroba na políčku +model.option.tileProduction.shortDescription=Výroba na políčkach s rôznymi možnosťami výroby. +model.option.tileProduction.veryLow.name=Veľmi nízka +model.option.tileProduction.veryLow.shortDescription=Veľmi nízka výroba na políčku +model.option.tileProduction.low.name=Nízka +model.option.tileProduction.low.shortDescription=Nízka výroba na políčku +model.option.tileProduction.medium.name=Priemerná +model.option.tileProduction.medium.shortDescription=Priemerná výroba na políčku +model.option.tileProduction.high.name=Vysoká +model.option.tileProduction.high.shortDescription=Vysoká výroba na políčku +model.option.tileProduction.veryHigh.name=Veľmi vysoká +model.option.tileProduction.veryHigh.shortDescription=Veľmi vysoká výroba na políčku model.option.badRumour.name=Šanca na zlú povesť -model.option.badRumour.decription=Percentuálna šanca na zlý výsledok povesti. +model.option.badRumour.decription=Percento šance na zlý výsledok povesti. model.option.goodRumour.name=Šanca na dobrú povesť -model.option.goodRumour.decription=Percentuálna šanca na dobrý výsledok povesti. -model.difficulty.cheat.name=AI-podvádzanie +model.option.goodRumour.decription=Percento šance na dobrý výsledok povesti. +model.difficulty.cheat.name=UI-podvádzanie model.option.liftBoycottCheat.name=Zrušiť bojkot -model.option.liftBoycottCheat.shortDescription=Percentuálna šanca na ťah AI hráča na zrušenie bojkotu bez zaplatenia nedoplatkov. +model.option.liftBoycottCheat.shortDescription=Percento šance v každom ťahu UI hráča na zrušenie bojkotu bez zaplatenia nedoplatkov. model.option.equipScoutCheat.name=Vybaviť ako prieskumníka -model.option.equipScoutCheat.shortDescription=Percentuálna šanca na ťah AI hráča na vybavenie jednotky v Európe ako prieskumníka zadarmo. +model.option.equipScoutCheat.shortDescription=Percento šance v každom ťahu UI hráča na vybavenie jednotky v Európe ako prieskumníka zadarmo. model.option.equipPioneerCheat.name=Vybaviť ako priekopníka -model.option.equipPioneerCheat.shortDescription=Percentuálna šanca na ťah AI hráča na vybavenie jednotky v Európe ako priekopníka zadarmo. +model.option.equipPioneerCheat.shortDescription=Percento šance v každom ťahu UI hráča na vybavenie jednotky v Európe ako priekopníka zadarmo. model.option.landUnitCheat.name=Získať pozemnú jednotku -model.option.landUnitCheat.shortDescription=Percentuálna šanca na ťah AI hráča pre získanie útočnej pozemnej jednotky zadarmo. +model.option.landUnitCheat.shortDescription=Percento šance v každom ťahu UI hráča na získanie útočnej pozemnej jednotky zadarmo. model.option.offensiveLandUnitCheat.name=Získať útočnú pozemnú jednotku model.option.offensiveNavalUnitCheat.name=Získať útočnú námornú jednotku -model.option.offensiveNavalUnitCheat.shortDescription=Percentuálna šanca (znížená námornou silou) na ťah AI hráča pre získanie útočnej námornej jednotky v Európe zadarmo. +model.option.offensiveNavalUnitCheat.shortDescription=Percento šance (znížené o námornú silu) v kaďom ťahu UI hráča na získanie útočnej námornej jednotky v Európe zadarmo. model.option.transportNavalUnitCheat.name=Získať dopravnú námornú jednotku -model.option.transportNavalUnitCheat.shortDescription=Percentuálna šanca na ťah AI hráča pre získanie dopravnej námornej jednotky v Európe zadarmo (ak má prácu pre viacero dopravných jednotiek). +model.option.transportNavalUnitCheat.shortDescription=Percento šance v každom ťahu UI hráča na získanie dopravnej námornej jednotky v Európe zadarmo (ak má prácu pre viacero dopravných jednotiek). gameOptions.name=Možnosti hry gameOptions.shortDescription=Možnosti hry gameOptions.map.name=Mapa @@ -484,9 +512,9 @@ model.option.turnsToSail.shortDescription=Počet ťahov potrebných na plavbu z model.option.settlementLimitModifier.name=Modifikátor limitu osady model.option.settlementLimitModifier.shortDescription=Množstvo pridané do limitu osady ako napríklad počet vozov, ktoré možno postaviť. model.option.fogOfWar.name=Hmla vojny -model.option.fogOfWar.shortDescription=Mali by byť nepriateľské jednotky mimo nášho dohľadu schované? -model.option.explorationPoints.name=Body prieskumu -model.option.explorationPoints.shortDescription=Mali by byť body prieskumu udelené za všetky prieskumy? +model.option.fogOfWar.shortDescription=Majú byť nepriateľské jednotky mimo nášho dohľadu schované? +model.option.explorationPoints.name=Body za prieskum +model.option.explorationPoints.shortDescription=Majú byť body za prieskum udelené za všetky objavy? model.option.amphibiousMoves.name=Obojživelné pohyby model.option.amphibiousMoves.shortDescription=Povoliť presun z námorných jednotiek priamo do osád. model.option.emptyTraders.name=Prázdne obchodné jednotky @@ -494,15 +522,17 @@ model.option.emptyTraders.shortDescription=Povoliť prázdnym obchodným jednotk model.option.settlementActionsContactChief.name=Kontakt s náčelníkom model.option.settlementActionsContactChief.shortDescription=Všetky akcie s osadou kontaktujú jej náčelníka a spotrebujú prieskumnícky bonus. model.option.enhancedMissionaries.name=Vylepšení misionári -model.option.enhancedMissionaries.shortDescription=Misionári vylepšia obchodné zručnosti osady a zobrazia okolie osady. +model.option.enhancedMissionaries.shortDescription=Misionári vylepšia obchodné zručnosti osady, vyučovanie zručností a zobrazia okolie osady. +model.option.missionInfluence.name=Vplyv misie +model.option.missionInfluence.shortDescription=Sila vplyvu misie na úroveň znepokojenia domorodcov v osade. model.option.giftProbability.name=Pravdepodobnosť daru -model.option.giftProbability.shortDescription=Percentuálna šanca na ťah, že mierumilovná osada s prebytkom poskytne dar priateľskej európskej osade. +model.option.giftProbability.shortDescription=Percento šanca v každom ťahu, že mierumilovná domorodá osada s prebytkom poskytne dar blízkej priateľskej európskej osade. model.option.demandProbability.name=Pravdepodobnosť požiadaviek -model.option.demandProbability.shortDescription=Percentuálna šanca na ťah, že nahnevaná domorodá osada bude požadovať poplatok od európskej osady. -model.option.continueFoundingFatherRecruitment.name=Pokračovať v nábore zakladateľov -model.option.continueFoundingFatherRecruitment.shortDescription=Pokračovať v nábore zakladateľov aj po udelení nezávislosti. +model.option.demandProbability.shortDescription=Percento šanca v každom ťahu, že nahnevaná domorodá osada bude požadovať poplatok od blízkej európskej osady, ktorá spôsobuje hnev. +model.option.continueFoundingFatherRecruitment.name=Pokračovať v nábore Otcov zakladateľov +model.option.continueFoundingFatherRecruitment.shortDescription=Pokračovať v nábore Otcov zakladateľov aj po získaní nezávislosti. model.option.teleportREF.name=Teleportovať Kráľovské vojsko -model.option.teleportREF.shortDescription=Kráľovské vojsko sa objaví v blízkosti svojho prvého cieľa. +model.option.teleportREF.shortDescription=Kráľovské vojsko sa objaví v na pobreží blízkosti svojho prvého cieľa. model.option.startingPositions.name=Začiatočné pozície model.option.startingPositions.shortDescription=Určuje začiatočné pozície Európskych hráčov. model.option.startingPositions.classic.name=Klasické @@ -510,25 +540,39 @@ model.option.startingPositions.classic.shortDescription=Európske národy začí model.option.startingPositions.random.name=Náhodne model.option.startingPositions.random.shortDescription=Európske národy začínajú na šírom mori hocikde na mape. model.option.startingPositions.historical.name=Historické -model.option.startingPositions.historical.shortDescription=Európske národy začínajú na šírom mori v blízkosti ich historických prvých kolón v Novom svete. +model.option.startingPositions.historical.shortDescription=Európske národy začínajú na šírom mori v blízkosti ich prvej historickej kolónie v Novom svete. model.option.initialImmigration.name=Začiatočný cieľ prisťahovalectva model.option.initialImmigration.shortDescription=Počet krížov, ktoré treba vyrobiť, aby sa objavil prvý Európsky prisťahovalec. model.option.peaceProbability.name=Pravdepodobnosť mieru -model.option.peaceProbability.shortDescription=Percentuálna šanca na ťah na udržanie mieru s nahnevaným AI. -model.option.europeanUnitImmigrationPenalty.name=Zníženie jednotiek európskych prisťahovalcov -model.option.europeanUnitImmigrationPenalty.shortDescription=Zníženie výroby krížov na ťah za každú jednotku čakajúcu v Európe. -model.option.playerImmigrationBonus.name=Zvýšenie prisťahovalcov hráča +model.option.peaceProbability.shortDescription=Percento šance v každom ťahu na udržanie mieru s nahnevaným UI. +model.option.europeanUnitImmigrationPenalty.name=Postih jednotiek európskych prisťahovalcov +model.option.europeanUnitImmigrationPenalty.shortDescription=Zníženie výroby krížov v každom ťahu za každú jednotku čakajúcu v Európe. +model.option.playerImmigrationBonus.name=Prisťahovalecký bonus hráča model.option.playerImmigrationBonus.shortDescription=Zvýšenie výroby krížov na ťah. +model.option.equipEuropeanRecruits.name=Vystroj európskych nováčikov +model.option.equipEuropeanRecruits.shortDescription=Novovycvičená alebo naverbovaná jednotka v Európe je vystrojená podľa jej predvolenej úlohy. gameOptions.colony.name=Možnosti kolónie -gameOptions.colony.shortDescription=Obsahuje možnosti správania sa kolónií. -model.option.customIgnoreBoycott.name=Vlastný dom ignoruje bojkot -model.option.customIgnoreBoycott.shortDescription=Vlastný dom môže predávať tovar počas bojkotu. +gameOptions.colony.shortDescription=Obsahuje možnosti, týkajúce sa správania sa kolónií. +model.option.bellAccumulationCapped.name=Obmedzenie tvorby zvonov. +model.option.bellAccumulationCapped.shortDescription=Kolónie nemôžu vytvárať ďalśie zvony, keď dosiahnu 100% rebelov. +model.option.captureUnitsUnderRepair.name=Zajať opravované jednotky +model.option.captureUnitsUnderRepair.shortDescription=Zajať jednotky, opravované v dobitej kolónii. +model.option.customIgnoreBoycott.name=Colnica ignoruje bojkot +model.option.customIgnoreBoycott.shortDescription=Colnica môže predávať tovar počas bojkotu. +model.option.customsOnCoast.name=Colnice na pobreží +model.option.customsOnCoast.shortDescription=Colnice môžu byť postavené len v pobrežných kolóniách. +model.option.disembarkInColony.name=Vylodiť v kolónii +model.option.disembarkInColony.shortDescription=Všetky jednotky sa vylodia, keď prepravca príde do kolónie. model.option.expertsHaveConnections.name=Experti majú konexie model.option.expertsHaveConnections.shortDescription=Experti môžu použiť svoje konexie, aby zabezpečili minimálne množstvá zdrojov pre výrobu v továrňach. model.option.foundColonyDuringRebellion.name=Založiť kolónie počas rebélie -model.option.foundColonyDuringRebellion.shortDescription=Hráč môže zakladať kolónie počas vojny za nezávislosť. +model.option.foundColonyDuringRebellion.shortDescription=Hráč môže pokračovať v zakladaní kolónií počas vojny za nezávislosť. +model.option.payForBuilding.name=Platba za stavbu +model.option.payForBuilding.shortDescription=Stavby môžu byť rýchlo dokončené zaplatením za chýbajúci tovar. model.option.saveProductionOverflow.name=Uložiť prebytok výroby model.option.saveProductionOverflow.shortDescription=Uložiť prebytok kladív, zvonov a krížov. +model.option.clearHammersOnConstructionSwitch.name=Vymaž kladivá pri zmene stavby +model.option.clearHammersOnConstructionSwitch.shortDescription=Vynuluj nazhormaždené kladivá ak sa zmení aktuálna stavba. model.option.allowStudentSelection.name=Povoliť výber študentov model.option.allowStudentSelection.shortDescription=Povoľuje manuálne priraďovanie študentov. model.option.enableUpkeep.name=Budovy potrebujú údržbu (EXPERIMENTÁLNE) @@ -536,20 +580,20 @@ model.option.enableUpkeep.shortDescription=Platiť za údržbu budov alebo trpie model.option.onlyNaturalImprovements.name=Len prírodné vylepšenia model.option.onlyNaturalImprovements.shortDescription=Len prírodné vylepšenia políčok prispievajú k výrobe nepotravinárskeho tovaru na políčku v strede kolónie. model.option.naturalDisasters.name=Prírodné katastrofy -model.option.naturalDisasters.shortDescription=Pravdepodobnosť prírodných katastrof na ťah. +model.option.naturalDisasters.shortDescription=Pravdepodobnosť prírodných katastrof v každom ťahu. gameOptions.victoryConditions.name=Podmienky víťazstva gameOptions.victoryConditions.shortDescription=Nastavenie možností ako sa dá hra vyhrať. model.option.victoryDefeatREF.name=Prvý hráč, ktorý získa nezávislosť model.option.victoryDefeatREF.shortDescription=Prvý ľudský hráč, ktorý porazí Kráľovské vojsko vyhrá hru. -model.option.victoryDefeatEuropeans.name=Všetci ostatní európsky hráči sú porazený +model.option.victoryDefeatEuropeans.name=Porážka všetkých ostatných európskych hráčov model.option.victoryDefeatEuropeans.shortDescription=Hociktorý hráč, ktorý porazí všetkých ostatných európskych hráčov vyhrá hru. -model.option.victoryDefeatHumans.name=Všetci ostatní ľudský hráči sú porazený +model.option.victoryDefeatHumans.name=Porážka všetkých ostatných ľudských hráčov model.option.victoryDefeatHumans.shortDescription=Hociktorý hráč, ktorý porazí všetkých ostatných ľudských hráčov vyhrá hru. gameOptions.years.name=Možnosti roka gameOptions.years.shortDescription=Obsahuje možnosti týkajúce sa rôznych špeciálnych rokov. model.option.startingYear.name=Začiatočný rok model.option.startingYear.shortDescription=Rok v ktorom hra začína. -model.option.seasonYear.name=Rok sezóny +model.option.seasonYear.name=Rok sezón model.option.seasonYear.shortDescription=Prvý rok v ktorom sú dve sezóny. model.option.mandatoryColonyYear.name=Rok povinnej kolónie model.option.mandatoryColonyYear.shortDescription=Rok v ktorom treba vlastniť kolóniu. @@ -557,6 +601,10 @@ model.option.lastYear.name=Posledný rok hry model.option.lastYear.shortDescription=Úplne posledný rok hry. model.option.lastColonialYear.name=Posledný rok koloniálnej hry model.option.lastColonialYear.shortDescription=Posledný rok hry koloniálneho hráča. +model.option.independenceTurn.name=Ťah nezávislosti +model.option.independenceTurn.shortDescription=Vyhlásenie nezávislosti pred týmto ťahom je ocenené bonusovým skóre. +model.option.seasons.name=Obdobia +model.option.seasons.shortDescription=Počet období v roku gameOptions.prices.name=Možnosti ceny gameOptions.prices.shortDescription=Obsahuje hrou generované možnosti kontroly počiatočných cien. model.option.food.minimumPrice.name=Minimálna počiatočná cena jedla @@ -642,18 +690,88 @@ model.option.maximumLatitude.name=Maximálna zemepisná šírka model.option.maximumLatitude.shortDescription=Najjužnejšia zemepisná šírka. Kladná hodnota udáva južnú zemepisnú šírku. model.option.riverNumber.name=Počet riek model.option.riverNumber.shortDescription=Možnosť nastavenia počtu riek na generovaných mapách. +model.option.riverNumber.verySmall.name=Veľmi malý +model.option.riverNumber.verySmall.shortDescription=Veľmi málo riek +model.option.riverNumber.small.name=Malý +model.option.riverNumber.small.shortDescription=Malý počet riek +model.option.riverNumber.medium.name=Priemerný +model.option.riverNumber.medium.shortDescription=Priemerný počet riek +model.option.riverNumber.large.name=Veľký +model.option.riverNumber.large.shortDescription=Veľký počet riek +model.option.riverNumber.veryLarge.name=Veľmi veľký +model.option.riverNumber.veryLarge.shortDescription=Hojne riek model.option.mountainNumber.name=Počet hôr model.option.mountainNumber.shortDescription=Možnosť nastavenia počtu hôr na generovaných mapách. +model.option.mountainNumber.verySmall.name=Veľmi malý +model.option.mountainNumber.verySmall.shortDescription=Veľmi málo hôr +model.option.mountainNumber.small.name=Malý +model.option.mountainNumber.small.shortDescription=Malý počet hôr +model.option.mountainNumber.medium.name=Priemerný +model.option.mountainNumber.medium.shortDescription=Priemerný počet hôr +model.option.mountainNumber.large.name=Veľý +model.option.mountainNumber.large.shortDescription=Veľký počet hôr +model.option.mountainNumber.veryLarge.name=Veľmi veľký +model.option.mountainNumber.veryLarge.shortDescription=Hojnosť hôr model.option.rumourNumber.name=Počet povestí stratených miest. model.option.rumourNumber.shortDescription=Možnosť nastavenia počtu povestí stratených miest na generovaných mapách. +model.option.rumourNumber.verySmall.name=Veľmi malý +model.option.rumourNumber.verySmall.shortDescription=Veľmi málo povestí +model.option.rumourNumber.small.name=Malý +model.option.rumourNumber.small.shortDescription=Malý počet povestí +model.option.rumourNumber.medium.name=Priemerný +model.option.rumourNumber.medium.shortDescription=Priemerný počet povestí +model.option.rumourNumber.large.name=Veľký +model.option.rumourNumber.large.shortDescription=Veľký počet povestí +model.option.rumourNumber.veryLarge.name=Veľmi veľký +model.option.rumourNumber.veryLarge.shortDescription=Hojnosť povestí model.option.forestNumber.name=Percento lesov model.option.forestNumber.shortDescription=Možnosť nastavenia percenta lesov na generovaných mapách. +model.option.forestNumber.verySmall.name=Veľmi malý +model.option.forestNumber.verySmall.shortDescription=Veľmi málo lesov +model.option.forestNumber.small.name=Malý +model.option.forestNumber.small.shortDescription=Malý počet lesov +model.option.forestNumber.medium.name=Priemerný +model.option.forestNumber.medium.shortDescription=Priemerný počet lesov +model.option.forestNumber.large.name=Veľý +model.option.forestNumber.large.shortDescription=Veľký počet lesov +model.option.forestNumber.veryLarge.name=Veľmi veľký +model.option.forestNumber.veryLarge.shortDescription=Hojnosť lesov model.option.bonusNumber.name=Percento bonusových políčok model.option.bonusNumber.shortDescription=Možnosť nastavenia percenta bonusových políčok na generovaných mapách. +model.option.bonusNumber.verySmall.name=Veľmi malý +model.option.bonusNumber.verySmall.shortDescription=Veľmi málo bonusov +model.option.bonusNumber.small.name=Malý +model.option.bonusNumber.small.shortDescription=Malý počet bonusov +model.option.bonusNumber.medium.name=Priemerný +model.option.bonusNumber.medium.shortDescription=Priemerný počet bonusov +model.option.bonusNumber.large.name=Veľý +model.option.bonusNumber.large.shortDescription=Veľký počet bonusov +model.option.bonusNumber.veryLarge.name=Veľmi veľký +model.option.bonusNumber.veryLarge.shortDescription=Hojnosť bonusov model.option.humidity.name=Vlhkosť model.option.humidity.shortDescription=Možnosť nastavenia priemernej vlhkosti mapy. +model.option.humidity.veryDry.name=Veľmi sucho +model.option.humidity.veryDry.shortDescription=Veľmi nízka vlhkosť +model.option.humidity.dry.name=Sucho +model.option.humidity.dry.shortDescription=Nízka vlhkosť +model.option.humidity.normal.name=Normálne +model.option.humidity.normal.shortDescription=Normálna vlhkosť +model.option.humidity.wet.name=Vlhko +model.option.humidity.wet.shortDescription=Vysoká vlhkosť +model.option.humidity.veryWet.name=Veľmi vlhko +model.option.humidity.veryWet.shortDescription=Veľmi vysoká vlhkosť model.option.temperature.name=Teplota model.option.temperature.shortDescription=Možnosť nastavenia priemernej teploty mapy. +model.option.temperature.cold.name=Mrazivo +model.option.temperature.cold.shortDescription=Veľmi nízka teplota +model.option.temperature.chilly.name=Chladno +model.option.temperature.chilly.shortDescription=Nízka teplota +model.option.temperature.temperate.name=Mierna +model.option.temperature.temperate.shortDescription=Normálna teplota +model.option.temperature.warm.name=Teplo +model.option.temperature.warm.shortDescription=Vysoká teplota +model.option.temperature.hot.name=Horúco +model.option.temperature.hot.shortDescription=Veľmi vzsoká teplota mapGeneratorOptions.import.name=Import mapGeneratorOptions.import.shortDescription=Možnosť importovania mapy alebo uloženej hry. model.option.importFile.name=Importovať súbor @@ -669,6 +787,7 @@ model.option.importSettlements.shortDescription=Umožňuje importovať domorodé clientOptions.name=Nastavenia clientOptions.shortDescription=Uprednostňované možnosti klienta clientOptions.personal.name=Osobné +clientOptions.personal.shortDescription=Možnosti špecifické pre hráča. model.option.playerName.name=Meno hráča: clientOptions.gui.name=Zobraziť clientOptions.gui.shortDescription=Obsahuje nastavenia pre prispôsobenie vzhľadu hry. @@ -715,6 +834,10 @@ model.option.miniMapToggleBorders.name=Prepnúť okraje na mini mape model.option.miniMapToggleBorders.shortDescription=Ak je vybrané: vykreslí na mini mape okraje. model.option.mapControls.name=Ovládanie mapy model.option.mapControls.shortDescription=Ktoré ovládacie prvky mapy zobraziť. +clientOptions.gui.mapControls.CornerMapControls.name=Rohy +clientOptions.gui.mapControls.CornerMapControls.shortDescription=Ovládanie mapy zaberá rohy a spodnú hranu. +clientOptions.gui.mapControls.ClassicMapControls.name=Klasické +clientOptions.gui.mapControls.ClassicMapControls.shortDescription=Ovládanie mapy zaberá pravú hranu. model.option.color.background.name=Farba pozadia model.option.color.background.shortDescription=Keď je mini mapa úplne vzdialená, táto farba obklopuje mapu a hmlu vojny. clientOptions.minimap.color.background.black=Čierne @@ -780,8 +903,8 @@ clientOptions.messages.guiMessagesGroupBy.source.name=Zdroj clientOptions.messages.guiMessagesGroupBy.source.shortDescription=Správy sú triedené podľa toho čo ich vytvorilo model.option.guiShowWarning.name=Varovné správy model.option.guiShowWarning.shortDescription=Určuje, či zobrazovať rôzne varovné správy. -model.option.guiShowSonsOfLiberty.name=Správy o slobode -model.option.guiShowSonsOfLiberty.shortDescription=Určuje, či zobrazovať správy o slobode na začiatku každého ťahu. +model.option.guiShowSonsOfLiberty.name=Správy o Synoch slobody +model.option.guiShowSonsOfLiberty.shortDescription=Určuje, či zobrazovať správy o Synoch slobody na začiatku každého ťahu. model.option.guiShowGovernmentEfficiency.name=Správy o výkonnosti vlády model.option.guiShowGovernmentEfficiency.shortDescription=Určuje, či zobrazovať správy o výkonnosti vlády na začiatku každého ťahu. model.option.guiShowWarehouseCapacity.name=Správy o kapacite skladu @@ -818,8 +941,16 @@ model.option.guiShowNotBestTile.name=Nie najlepšie políčko model.option.guiShowNotBestTile.shortDescription=Určuje, či zobrazovať, že jednotky nepracujú na najlepšom políčku. model.option.colonyReport.name=Hlásenie kolónie model.option.colonyReport.shortDescription=Súhrn činnosti v každej kolóne. +clientOptions.messages.colonyReport.classic.name=Klasické +clientOptions.messages.colonyReport.classic.shortDescription=Podrobné správy o kolónii. +clientOptions.messages.colonyReport.compact.name=Kompaktné +clientOptions.messages.colonyReport.compact.shortDescription=Kompaktné správy o kolónii sa snažia zobraziť čo najviac o kolónii v jedinom riadku. model.option.labourReport.name=Pracovné hlásenie model.option.labourReport.shortDescription=Súhrn činnosti každej jednotky +clientOptions.messages.labourReport.classic.name=Klasická +clientOptions.messages.labourReport.classic.shortDescription=Klasická správa o zamestnanosti. +clientOptions.messages.labourReport.compact.name=Kompaktná +clientOptions.messages.labourReport.compact.shortDescription=Kompaktnejšia verzia klasickej správy. clientOptions.savegames.name=Uložené hry clientOptions.savegames.shortDescription=Uložené hry model.option.showSavegameSettings.name=Uložiť dialógové okno hry @@ -852,6 +983,7 @@ model.option.lowLevel.name=Varovanie nízkej úrovne model.option.lowLevel.shortDescription=Vytvoriť varovanie keď zásoby klesnú pod túto úroveň. model.option.highLevel.name=Varovanie vysokej úrovne model.option.highLevel.shortDescription=Vytvoriť varovanie keď zásoby presiahnu túto úroveň. +model.option.stockAccountsForProduction.shortDescription=Obchodné cesty kontrolujú množstvo tovarov vrátane predpokladanej výroby aby určili, či majú navštíviť zastávku. clientOptions.audio.name=Zvuk clientOptions.audio.shortDescription=Nastavenia zvuku clientOptions.audio.audioMixer.automatic=Automatická detekcia audio výstupu @@ -865,16 +997,32 @@ clientOptions.other.name=Iné clientOptions.other.shortDescription=Možnosti, ktoré sa nehodia do ostatných kategórii model.option.autoloadEmigrants.name=Automaticky nalodiť prisťahovalcov pri plavbe do Ameriky model.option.autoloadEmigrants.shortDescription=Opýtať sa, či nalodiť prisťahovalcov pri plavbe do Ameriky. +model.option.autoloadSentries.name=Automaticky naložiť hliadkujúce jednotky keď príde vhodný prepravca. +model.option.autoloadSentries.shortDescription=Hliadkujúce jednotky budú automaticky naložené na dostupného dopravcu. model.option.autoEndTurn.name=Automaticky ukončiť ťah model.option.autoEndTurn.shortDescription=Automaticky ukončí ťah keď už nie sú jednotky, ktoré by sa mohli hýbať. model.option.showEndTurnDialog.name=Dialógové okno pri konci ťahu model.option.showEndTurnDialog.shortDescription=Ukázať dialógové okno pri konci ťahu ak ešte sú jednotky, ktoré by sa mohli hýbať. model.option.indianDemandResponse.name=Odpovedať na požiadavky indiánov model.option.indianDemandResponse.shortDescription=Čo urobiť keď domorodci žiadajú tovar. +clientOptions.other.indianDemandResponse.ask.name=Spýtať sa +clientOptions.other.indianDemandResponse.ask.shortDescription=Spýtať sa, čo robiť +clientOptions.other.indianDemandResponse.accept.name=Prijať +clientOptions.other.indianDemandResponse.accept.shortDescription=Prijať všetky požiadavky domorodcov +clientOptions.other.indianDemandResponse.reject.name=Odmietnuť +clientOptions.other.indianDemandResponse.reject.shortDescription=Odmietnuť všetky požiadavky domorodcov model.option.unloadOverflowResponse.name=Vyhodiť prebytok model.option.unloadOverflowResponse.shortDescription=Čo urobiť keď sa pri vykladaní tovaru z lode preplní sklad. +clientOptions.other.unloadOverflowResponse.ask.name=Spýtať sa +clientOptions.other.unloadOverflowResponse.ask.shortDescription=Spýtať sa, čo robiť +clientOptions.other.unloadOverflowResponse.never.name=Nikdy +clientOptions.other.unloadOverflowResponse.never.shortDescription=Nikdy nevykladať tovar, ktorý môže preplniť skladisko +clientOptions.other.unloadOverflowResponse.always.name=Vždy +clientOptions.other.unloadOverflowResponse.always.shortDescription=Vždy vyložiť tovar, aj keď preplní skladisko clientOptions.mods.name=Mody clientOptions.mods.shortDescription=Možnosti umožňujúce herné úpravy. +clientOptions.mods.userMods.name=Užívateľské úpravy +clientOptions.mods.userMods.shortDescription=Možnosti umožňujúce úpravy hry. model.ability.addTaxToBells.name=Pridať daň na zvony model.ability.addTaxToBells.shortDescription=Sadzba dane sa chová ako bonus výroby zvonov model.ability.alwaysOfferedPeace.name=Vždy ponúkaný mier @@ -929,6 +1077,8 @@ model.ability.carryTreasure.name=Môže prevážať poklad model.ability.carryTreasure.shortDescription=Táto jednotka môže niesť poklad model.ability.carryUnits.name=Prepravné jednotky model.ability.carryUnits.shortDescription=Táto jednotka má schopnosť prepravovať iné jednotky. +model.ability.coastalOnly.name=Len pobrežné +model.ability.coastalOnly.shortDescription=Obmedziť niektoré stavby len na pobrežné kolónie model.ability.consumeAllOrNothing.name=Spotrebovať všetko alebo nič model.ability.consumeAllOrNothing.shortDescription=Spotrebiteľ, ktorý môže spotrebovať všetok dostupný tovar na jeden ťah model.ability.customHouseTradesWithForeignCountries.name=Zahraničný predaj vlastným domom @@ -1036,6 +1186,8 @@ model.modifier.breedingDivisor.shortDescription=Veľkosť jedného stáda. Môž model.modifier.breedingFactor.name=Odchov z jedného stáda model.modifier.breedingFactor.shortDescription=Počet potomokov, ktoré bude každé stádo produkovať. model.modifier.buildingPriceBonus.name=Bonus ceny stavby/výroby +model.modifier.cargoPenalty.name=Znevýhodnenie nákladu +model.modifier.cargoPenalty.shortDescription=Zníženie bojovej efektivity za každý náklad model.modifier.consumeOnlySurplusProduction.name=Množstvo spotrebovaného prebytku model.modifier.consumeOnlySurplusProduction.shortDescription=Spotrebuje iba časť prebytku výroby, nespotrebúva zo skladovaných tovarov. model.modifier.conversionAlarmRate.name=Poplach konverzie @@ -1180,12 +1332,12 @@ model.disaster.effect.damagedUnit.name=Poškodenie jednotiek model.disaster.effect.damagedUnit=Bola poškodená jednotka %unit%. model.disaster.effect.lossOfBuilding.name=Strata budov model.disaster.effect.lossOfBuilding=Bola zničená budova %building%. -model.disaster.effect.lossOfBuildingProduction.name=Strata možnosti stavebných prác +model.disaster.effect.lossOfBuildingProduction.name=Strata produktivity budov model.disaster.effect.lossOfBuildingProduction=Niektoré budovy boli poškodené. Výroba sa znížila. model.disaster.effect.lossOfGoods.name=Strata tovaru model.disaster.effect.lossOfGoods=%goods% bolo stratené. model.disaster.effect.lossOfMoney.name=Strata peňazí -model.disaster.effect.lossOfMoney=%amount% ks zlata bolo stratené. +model.disaster.effect.lossOfMoney=%amount% zlata sa stratilo. model.disaster.effect.lossOfTileProduction.name=Strata výroby políčok model.disaster.effect.lossOfTileProduction=Boli poškodené polia a lesy. Znížila sa výroba. model.disaster.effect.lossOfUnit.name=Strata jednotiek @@ -1196,6 +1348,7 @@ model.event.freeBuilding.name=Budovy sú stavané zadarmo model.event.increaseSonsOfLiberty.name=Povstalecká nálada sa zvyšuje model.event.movementChange.name=Pohyb je zmenený model.event.newRecruits.name=Zmena povolávania Európanov +model.event.resetBannedMissions.name=Domorodci opäť prijmú vašich misionárov model.event.resetNativeAlarm.name=Poplach u domorodcov bol odstránený model.event.seeAllColonies.name=Všetky kolónie sú viditeľné model.foundingFather.adamSmith.description=Umožňuje budovanie tovární. @@ -1278,7 +1431,7 @@ model.goods.crosses.description=Kríže vyjadrujú náboženské nepokoje v Eur model.goods.crosses.workAs=Pracovať ako Kazateľ %claim%(%amount% ks krížov) model.goods.crosses.workingAs=Kazateľ model.goods.fish.name={{plural:%amount%|one=Ryba|other=Rýb|default=Ryba}} -model.goods.fish.description=Ryby sú automaticky spracované na jedenie. +model.goods.fish.description=Ryby sú automaticky zmenené na potraviny. model.goods.fish.workAs=Pracovať ako Rybár %claim%(%amount% ks rýb) model.goods.fish.workingAs=Rybár model.goods.food.name={{plural:%amount%|one=Potravina|other=Potravín|default=Potraviny}} @@ -1355,7 +1508,7 @@ model.improvement.road.description=Cesta model.improvement.road.name=Cesta model.improvement.road.occupationString=R model.limit.independence.coastalColonies.name=Limit pobrežných kolónií -model.limit.independence.coastalColonies.description=Potrebujete mať najmenej %limit% pobrežných kolónií pre vyhlásenie nezávislosti. +model.limit.independence.coastalColonies.description=Potrebujete mať najmenej %limit% {{plural:%limit%|one=pobrežnú kolóniu|two=pobrežné kolónie|three=pobrežné kolónie|four=pobrežné kolónie|other=pobrežných kolónií}} na vyhlásenie nezávislosti. model.limit.independence.rebels.name=Limit rebelov model.limit.independence.rebels.description=Najmenej %limit%% Vašich kolonistov musí podporovať nezávislosť. model.limit.independence.year.name=Limit roku @@ -1455,6 +1608,7 @@ model.resource.sugar.name=Cukrová trstina model.resource.sugar.description=Pôda tejto savany je mimoriadne vhodná na pestovanie cukrovej trstiny. model.resource.tobacco.name=Tabak model.resource.tobacco.description=Pôda tejto lúky je mimoriadne vhodná na pestovanie tabaku. +model.role.name=Úloha model.role.armedBrave.name=Ozbrojený bojovník model.role.cavalry.name=Jazdectvo model.role.default.name=Predvolené @@ -1463,6 +1617,7 @@ model.role.dragoon.noequipment=žiadne pušky model.role.infantry.name=Pechota model.role.missionary.name=Misionár model.role.missionary.noequipment=nepoverený +model.role.missionary.equipment=Biblia model.role.mountedBrave.name=Bojovník na koni model.role.nativeDragoon.name=Domorodý dragún model.role.pioneer.name=Priekopník @@ -1471,6 +1626,20 @@ model.role.scout.name=Prieskumník model.role.scout.noequipment=žiadne kone model.role.soldier.name=Vojak model.role.soldier.noequipment=žiadne pušky +model.role.change.dragoon=Vyzbrojiť ako dragúna +model.role.change.missionary=Vyslať ako misionára +model.role.change.pioneer=Vybaviť nástrojmi +model.role.change.scout=Vybaviť ako prieskumníka +model.role.change.default.soldier=Vyzbrojiť +model.role.change.dragoon.default=Odobrať všetko vybavenie +model.role.change.dragoon.soldier=Zosadiť z koňa +model.role.change.missionary.default=Zrušiť poslanie misionára +model.role.change.missionary.soldier=Ozbrojiť +model.role.change.pioneer.default=Odobrať nástroje +model.role.change.pioneer.soldier=Ozbroj +model.role.change.scout.default=Zosadiť z koňa +model.role.change.scout.soldier=Zosadiť z koňa a ozbrojiť +model.role.change.soldier.default=Odzbrojiť model.settlement.aztec.capital.name=Mesto Aztékov model.settlement.aztec.name=Mesto Aztékov model.settlement.aztec.plural=mestá @@ -1511,8 +1680,7 @@ model.tile.marsh.description=Bažina je druh mokraďovitého územia s trávou, model.tile.mixedForest.name=Zmiešaný les model.tile.mixedForest.description=Zmiešané lesy sa nachádzajú v miernom podnebí. Produkujú obilie, drevo, kožušiny a trochu bavlny. Vyrúbaním zmiešaných lesov vnikajú nížiny. model.tile.mountains.name=Hory -# Fuzzy -model.tile.mountains.description=Hory prevyšujú okolitý terén a sú všeobecne strmšie než kopce Sú ťažko dostupné a nedajú sa na nich zakladať kolónie. Sú veľmi užitočné na ťažbu železnej rudy a striebra. +model.tile.mountains.description=Hory sa týčia na d okolitým terénom v obmedzenej oblasti. Vo všeobecnosti sú strmšie než kopce. Ťažko sa cez ne cestuje a nedajú sa na nich zakladať kolónie. Poskytujú vysoký obranný bonus ale opevnenie ho uˇz nezvýši. Baníctvo je užitočné na ťažbu železnej rudy a striebra. model.tile.ocean.name=Oceán model.tile.ocean.description=Oceány sú slané vody, výborné na chytanie rýb. Množstvo rýb sa zvyšuje prítomnosťou pôdy a najviac ich je pri ústiach riek. model.tile.plains.name=Nížiny @@ -1629,6 +1797,7 @@ model.unit.kingsRegular.infantry=Pechota model.unit.seasonedScout.scout={{plural:%number%|one=Skúsený prieskumník|other=Skúsení prieskumníci|default=Skúsený prieskumník}} model.unit.veteranSoldier.dragoon={{plural:%number%|one=Dragún veterán|other=Dragúni veteráni|default=Dragún veterán}} model.unit.veteranSoldier.soldier={{plural:%number%|one=Vojak veterán|other=Vojaci veteráni|default=Vojak veterán}} +model.unit.colonialRegular.workingAs=Vojak model.unit.elderStatesman.workingAs=Štátnik model.unit.expertFarmer.workingAs=Farmár model.unit.expertFisherman.workingAs=Rybár @@ -1659,7 +1828,7 @@ model.colony.badGovernment=Vláda v kolónii %colony% je málo účinná. Výrob model.colony.goodGovernment=Zvýšila sa výkonnosť vlády! Rebelanstvo v kolónii %colony% sa teraz rovná alebo je väčšie ako %number% percent. model.colony.governmentImproved1=Vláda v kolónii %colony% sa zlepšila, ale stále nieje dosť efektívna. Zníženie produkcie stále trvá. model.colony.governmentImproved2=Vláda v kolónii %colony% sa zlepšila. Výroba sa vrátila do normálu. -model.colony.insufficientProduction=V kolónii %colony% by sa dalo vyrobiť o %outputAmount% ks viac tovaru %outputType%, keby sme mali o %inputAmount% ks viac tovaru %inputType%. +model.colony.insufficientProduction=V kolónii %colony% by sa dalo vyrobiť o %outputAmount% kusov viac %outputType%, keby sme mali o %consumptionDeficit% kusov naviac. model.colony.lostGoodGovernment=Znížila sa výkonnosť vlády! Rebelanstvo v kolónii %colony% sa už teraz viac nerovná alebo nie je väčšie ako %number% percent. Výrobný bonus v kolónii skončil. model.colony.lostVeryGoodGovernment=Znížila sa výkonnosť vlády! Rebelanstvo v kolónii %colony% sa už teraz viac nerovná alebo nie je väčšie ako %number% percent. model.colony.minimumColonySize=%object% zabraňuje ďalšiemu zníženiu populácie. @@ -1673,13 +1842,13 @@ model.colony.veryBadGovernment=Vláda v kolónii %colony% je veľmi neúčinná. model.colony.veryGoodGovernment=Zvýšila sa výkonnosť vlády! Rebelanstvo v kolónii %colony% sa teraz rovná alebo je väčšie ako %number% percent. model.colonyTile.claim=(nárokovať si %direction%) model.diplomaticTrade.receive.contact=Bratské pozdravy od slávneho národa %nation%. -model.diplomaticTrade.receive.diplomatic=Dovoľte nám vyjednávať s národom %nation%. +model.diplomaticTrade.receive.diplomatic=Poďme rokovať s {{tag:country|%nation%}}. model.diplomaticTrade.receive.trade=Uvažujme o ponuke od %nation%. -model.diplomaticTrade.receive.tribute=%nation% od nás požadujú poplatok! +model.diplomaticTrade.receive.tribute={{tag:country|%nation%}} od nás požadujú poplatok! model.diplomaticTrade.send.contact=Stretli sme členov národa %nation%. -model.diplomaticTrade.send.diplomatic=Uvažujme o našej diplomatickej situácii s %nation%. -model.diplomaticTrade.send.trade=Navrhnime obchod s %nation% v %settlement%. -model.diplomaticTrade.send.tribute=Požadujeme poplatok od %nation% v %settlement%. +model.diplomaticTrade.send.diplomatic=Uvažujme o našej diplomatickej situácii s {{tag:country|%nation%}}. +model.diplomaticTrade.send.trade=Navrhnime obchod s {{tag:country|%nation%}} v %settlement%. +model.diplomaticTrade.send.tribute=Požadujeme poplatok od {{tag:country|%nation%}} v %settlement%. model.direction.N.name=sever model.direction.NE.name=severovýchod model.direction.E.name=východ @@ -1689,26 +1858,25 @@ model.direction.SW.name=juhozápad model.direction.W.name=západ model.direction.NW.name=severozápad model.historyEventType.abandonColony.description=Opustili ste kolóniu %colony%. -model.historyEventType.ceaseFire.description=%nation% s nami podpísali dohodu o neútoční. -model.historyEventType.cityOfGold.description=Národ %nation% objavili mesto %city% a v ňom poklad v hodnote %treasure% ks zlata. -model.historyEventType.colonyConquered.description=Vašu kolóniu %colony% dobyli %nation%. -model.historyEventType.colonyDestroyed.description=Vašu kolóniu %colony% zničili %nation%. -# Fuzzy -model.historyEventType.conquerColony.description=Odvážili ste sa prijať naše podmienky a pritom sa vyhnúť platbe? Takýto čin bude žať trpkú odmenu. -# Fuzzy -model.historyEventType.declareIndependence.description=Zničili ste osadu %settlement% národa %nation%. -model.historyEventType.declareWar.description=%nation% nám vyhlásili vojnu. -model.historyEventType.destroyNation.description=%nation% zničili domorodý národ %nativeNation%. +model.historyEventType.ceaseFire.description=Zastaviť paľbu s {{tag:country|%nation%}}. +model.historyEventType.cityOfGold.description={{tag:country|%nation%}} objavili %city%, jedno zo Siedmych zlatých miest a v ňom poklad %treasure% zlata. +model.historyEventType.colonyConquered.description=Vašu kolóniu %colony% dobyli {{tag:country|%nation%}}. +model.historyEventType.colonyDestroyed.description=Vašu kolóniu %colony% zničili {{tag:country|%nation%}}. +model.historyEventType.conquerColony.description=Dobyli ste %nation% kolóniu %colony%. +model.historyEventType.declareIndependence.description=Vyhlásili ste nezávislosť od Koruny. +model.historyEventType.declareWar.description={{tag:country|%nation%}} nám vyhlásili vojnu. +model.historyEventType.destroyNation.description={{tag:country|%nation%}} zničili domorodý národ %nativeNation%. +model.historyEventType.destroySettlement.description=Zničíte osadu %settlement% národa %nation%. model.historyEventType.discoverNewWorld.description=Objavili ste Nový svet. -model.historyEventType.discoverRegion.description=Národ %nation% objavili %region%. -model.historyEventType.formAlliance.description=%nation% s nami uzavreli alianciu. +model.historyEventType.discoverRegion.description={{tag:country|%nation%}} objavili %region%. +model.historyEventType.formAlliance.description={{tag:country|%nation%}} s nami uzavreli alianciu. model.historyEventType.foundColony.description=Založili ste kolóniu %colony%. model.historyEventType.foundingFather.description=Zakladateľ %father% sa pridal ku Kontinentálnemu kongresu. model.historyEventType.independence.description=Dosiahli ste nezávislosť od kráľovstva. -model.historyEventType.makePeace.description=%nation% s nami podpísali mier. +model.historyEventType.makePeace.description=Mierová dohoda s {{tag:country|%nation%}}. model.historyEventType.meetNation.description=Stretli ste príslušníkov národa %nation%. model.historyEventType.nationDestroyed.description=Národ %nation% sa už v Novom svete nenachádza. -model.historyEventType.spanishSuccession.description=%loserNation% odovzdali všetky svoje kolónie Nového sveta národu %nation%. +model.historyEventType.spanishSuccession.description={{tag:country|%loserNation%}} odovzdali všetky svoje kolónie v Novom svete národu {{tag:country|%nation%}}. model.indianSettlement.mostHatedNone=Žiadne model.indianSettlement.mostHatedUnknown=Neznámy model.indianSettlement.nameUnknown=Neznáme @@ -1721,6 +1889,9 @@ model.indianSettlement.tension.happy=Členovia národa %nation% šťastne tancuj model.indianSettlement.tension.hateful=Bojovníci národa %nation% hrozia svojimi zbraňami. Opasky si ozdobili skalpami svojich nepriateľov na ktorých sú znaky strašného mučenia. model.indianSettlement.tension.unknown=Neznámy model.indianSettlement.tension.wary=Ostražití +model.indianSettlement.wantedGoodsNone=Žiadny +model.indianSettlement.wantedGoodsUnknown=Neznámy +model.lostCityRumour.name=Povesti o stratenom meste model.lostCityRumour.burialGround.description=Znesvätili ste posvätné pohrebiská národa %nation% a preto musíte zomrieť! model.lostCityRumour.cibola.description=Objavili ste mesto %city% a ukoristili poklad v hodnote %money% ks zlata. Odvezte poklad do jednej z Vašich kolónií. model.lostCityRumour.colonist.description=Stretli ste pozostalých zo stratenej kolónie. Výmenou za jedlo prisahajú vernosť kráľovstvu. @@ -1758,12 +1929,12 @@ model.messageType.warehouseCapacity.name=Kapacita skladu model.messageType.warning.name=Upozornenia model.monarch.action.addToRef.text=Kráľovstvo pridalo %number% {{plural:%number%|%unit%}} do Kráľovských expedičných síl. Vodcovia kolonistov vyjadrujú znepokojenie. model.monarch.action.addToRef.no=Hotovo -model.monarch.action.declarePeace.text=Milostivo sme sa s národom %nation% dohodli na mierovej zmluve. +model.monarch.action.declarePeace.text=Milostivo sme sa dohodli na mierovej zmluve s národom {{tag:country|%nation%}}. model.monarch.action.declarePeace.no=Hotovo -model.monarch.action.declareWar.text=Drzosť národa %nation% Nás núti im vyhlásiť vojnu! +model.monarch.action.declareWar.text=Drzosť národa {{tag:country|%nation%}} Nás núti im vyhlásiť vojnu! +model.monarch.action.declareWarSupported.text=Drzosť národa {{tag:country|%nation%}} Nás núti im vyhlásiť vojnu! Pre urýchlenie tejto záležitosti vaše rozkazy očakávajú naše verný vojaci (%force%) a do vášej pokladnice bola pridaná suma %gold% zlata. model.monarch.action.declareWar.no=Hotovo -# Fuzzy -model.monarch.action.displeasure.text=Vyhlásili ste nezávislosť od kráľovstva. +model.monarch.action.displeasure.text=Opovážili ste sa prijať Naše veľkorysé podmienky a teraz sa vyhýbate plateniu? Za takú neúprimnosť zožnete horkú odmenu Našej nespokojnosti. model.monarch.action.displeasure.no=Hotovo model.monarch.action.forceTax.text=Pohŕdame Vašim pokusom vyhnúť sa plateniu daní. Výška daní je teraz %amount%%. model.monarch.action.forceTax.no=Hotovo @@ -1803,10 +1974,11 @@ model.advantages.fixed.shortDescription=Všetky národy používajú svoje predv model.advantages.selectable.name=Voliteľné model.advantages.selectable.shortDescription=Výhody národov sú voliteľné a nemusia byť jedinečné. model.nationState.aiOnly.name=iba počítač +model.nationState.aiOnly.shortDescription=Tento národ je k dispozícii len pre UI hráčov model.nationState.available.name=dostupné -# Fuzzy -model.nationState.available.shortDescription=Dobyli ste kolóniu %colony% národa %nation%. +model.nationState.available.shortDescription=Možete hrať ako tento národ model.nationState.notAvailable.name=nie je k dispozícii +model.nationState.notAvailable.shortDescription=Tento národ nie je k dispozícii model.noClaimReason.europeans.description=Tento pozemok si nárokuje iný Európsky národ. model.noClaimReason.natives.description=Tento pozemok si nárokuje domorodý kmeň. model.noClaimReason.occupied.description=Tento pozemok je obsadený nebezpečným nepriateľom. @@ -1819,7 +1991,7 @@ model.player.colonialIndependence=Len koloniálny hráči môžu vyhlásiť nez model.player.forces=sily národa %nation% model.player.independentMarket=Európa model.player.startGame=Po mesiacoch na mori ste konečne prišli k pobrežiu neznámeho kontinentu. Plaviť sa {{tag:%direction%|západ=západne|východ=východne|default=po vetre}} pre objavenie Nového sveta a získať ho pre kráľa. -model.player.waitingFor=Čakanie na: %nation% +model.player.waitingFor=Čakanie na: {{tag:country|%nation%}} model.regionType.coast.name=Pobrežie model.regionType.coast.unknown=Neznáma pobrežná oblasť model.regionType.desert.name=Púšť @@ -1837,6 +2009,7 @@ model.regionType.river.unknown=Neznáma rieka model.stance.alliance.name=Aliancia model.stance.ceaseFire.name=Zastaviť paľbu model.stance.peace.name=Mier +model.stance.uncontacted.name=Nekontaktovaný model.stance.war.name=Vojna model.tension.happy.name=Šťastní model.tension.content.name=Obsah @@ -1858,9 +2031,11 @@ model.tradeItem.gold.name=Zlato model.tradeItem.gold.description=suma %amount% ks zlata model.tradeItem.goods.name=Tovar model.tradeItem.incite.name=Vyhlásiť vojnu proti -model.tradeItem.incite.description=vojna proti %nation% +model.tradeItem.incite.description=vojna proti {{tag:country|%nation%}} model.tradeItem.stance.name=Postoj model.tradeItem.unit.name=Jednotka +model.tradeRoute.allEmpty=Všetky zastávky sú prázdne. +model.tradeRoute.alwaysPresent=%goodsType% sa naloží na všetkých zastávkach. model.tradeRoute.duplicateName=Táto obchodná cesta má taký istý názov ako už existujúca obchodná cesta: %name%. Prosím, vyberte iný názov. model.tradeRoute.notEnoughStops=Obchodná trasa potrebuje najmenej 2 zastávky! model.tradeRoute.nullOwner=Táto obchodná trasa nemá majiteľa! @@ -1874,11 +2049,12 @@ model.unit.occupation.inTradeRoute=T model.unit.occupation.underRepair=R model.unit.onBoard=Na palube jednotky %unit% model.unit.underRepair=Oprava(%turns%) +model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F model.unit.unitState.inColony=B model.unit.unitState.sentry=S -model.unit.unitState.skipped=W +model.unit.unitState.skipped=X model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G model.noAddReason.alreadyPresent.description=Už sa na tomto mieste nachádza. @@ -1905,6 +2081,7 @@ model.colony.colonyStarved=Posledný hladujúci kolonista opustil kolóniu %colo model.colony.customs.sale=Vlastný dom v kolónii %colony% predaný: %data%. model.colony.customs.saleData=%amount% %goods% za %gold% model.colony.famineFeared=V kolónii %colony% hrozí hladomor. Jedla ostáva už len na počet ťahov %number%. +model.colony.starving=%colony% hladuje. model.colony.newColonist=Nový kolonista v kolónii %colony%. model.colony.newConvert=Domorodec národa %nation% konvertoval a prišiel do kolónie %colony%. model.colony.notBuildingAnything=V kolónii %colony% sa nič nestavia. @@ -1918,7 +2095,7 @@ model.colony.warehouseSoonFull=Váš sklad v kolónii %colony% pri ďalšom ťah model.colony.warehouseWaste=Váš sklad v kolónii %colony% presiahol maximálnu kapacitu tovaru %goods%. %waste% ks bolo zničených. model.colony.workersEvicted=Vaši kolonisti v kolónii %colony% na políčku %location% prestali pracovať pretože sa tam nachádzajú nepriateľské jednotky %enemyUnit%. model.colonyTile.resourceExhausted=Zdroj %resource% v kolónii %colony% vyčerpaný -model.game.spanishSuccession=Vaša excelencia, v Európe sa skončila vojna o španielske dedičstvo. V zmluve z Utrechtu sa %loserNation% zaviazali odovzdať všetky svoje kolónie Nového sveta národu %nation%! +model.game.spanishSuccession=Vaša excelencia, v Európe sa skončila Vojna o španielske dedičstvo. V zmluve z Utrechtu sa {{tag:country|%loserNation%}} zaviazali odovzdať všetky svoje kolónie v Novom svete národu {{tag:country|%nation%}}! model.indianSettlement.mission.denounced=Váš misionár v osade %settlement% bol popravený. model.indianSettlement.mission.destroyed=Váš misionár v osade %settlement% zomrel pri zničení osady. model.player.alarmIncrease.tension.angry=Náčelník %nation% národa v osade %settlement% nás varuje, že ich bojovníci otvorene požadujú vojnu s národom %enemy% a chcú vyhnať osadníkov z ich územia. @@ -1927,7 +2104,7 @@ model.player.autoRecruit=Náboženské nepokoje v kraji %europe% nútia jednotku model.player.colonyGoodsParty.harbour=Na znak protestu proti vysokým daniam, Vaši kolonisti v kolónii %colony% vyhodili %amount% ks tovaru %goods% do mora! model.player.colonyGoodsParty.horses=Na protest proti nespravodlivým daniam, ktoré treba platiť kráľovstvu Vaši kolonisti v kolónii %colony% pustili na slobodu %amount% ks koní. model.player.colonyGoodsParty.landLocked=Na znak protestu proti vysokým daniam, Vaši kolonisti v kolónii %colony% spálili %amount% ks tovaru %goods%! -model.player.dead.european=Vaša excelencia, %nation% vyhlásili bezpodmienečné vysťahovanie z Nového sveta! +model.player.dead.european=Vaša excelencia, {{tag:country|%nation%}} vyhlásili bezpodmienečné stiahnutie sa zo záležitostí Nového sveta! model.player.dead.native=Vaša excelencia, %nation% boli zničení. model.player.disaster.bankruptcy.start=Nedokázali ste platiť za údržbu všetkých budov. Výroba niektorých tovarov sa znížila. model.player.disaster.bankruptcy.stop=Znovu ste neboli schopní zaplatiť za údržbu všetkých budov. Výroba tovarov sa zastavuje. @@ -1942,11 +2119,11 @@ model.player.soLDecrease=Členský klub Synova slobody vo Vašich kolóniách kl model.player.soLIncrease=Členský klub Synovia slobody vo Vašich kolóniách vzrástol na %newSoL% percent! model.player.stance.alliance.declared=Vaša excelencia, %nation% sú naši spojenci! model.player.stance.alliance.others=Vaša excelencia, %attacker% uzavreli alianciu s národom %defender%. -model.player.stance.ceaseFire.declared=Vaša excelencia, %nation% súhlasili s nami podpísať dohodu o neútočení! +model.player.stance.ceaseFire.declared=Vaša excelencia, %nation% súhlasili s podpisom dohody o neútočení! model.player.stance.ceaseFire.others=Vaša excelencia, %attacker% súhlasili podpísať dohodu o neútočení s národom %defender%. model.player.stance.peace.declared=Vaša excelencia, medzi nami a národom %nation% je mier! model.player.stance.peace.others=Vaša excelencia, %attacker% uzavreli mier s národom %defender%. -model.player.stance.war.declared=Zlé správy Vaša excelencia. %nation% nám vyhlásili vojnu! +model.player.stance.war.declared=Zlé správy, Vaša excelencia, %nation% nám vyhlásili vojnu! model.player.stance.war.others=Vaša excelencia, %attacker% vyhlásili vojnu národu %defender%. combat.automaticDefence=Vaša jednotka %unit% v kolónii %colony% pozdvihla zbrane na obranu kolónie! combat.buildingDamaged=Nepriateľská jednotka %enemyUnit% národa %enemyNation% zničila v kolónii %colony% budovu %building%! @@ -2008,27 +2185,27 @@ model.unit.noMoreTools=%location%: Váš priekopník použil všetko svoje nára model.unit.slowed=Nepriateľská jednotka %enemyUnit% národa %enemyNation% spomaľuje pohyb našej jednotky %unit%. model.unit.unitRepaired=Jednotka %unit% bola v %repairLocation% opravená. model.unit.hardyPioneer.noMoreTools=%location%: Váš Majster priekopník opotreboval všetky svoje nástroje. -# Fuzzy -error.couldNotLoad=Pri načítaní hry došlo k chybe! -# Fuzzy -error.couldNotSave=Pri ukladaní hry došlo k chybe! +error.couldNotLoad=Pri pokuse o načítanie hry zo súboru %name% nastala chyba! +error.couldNotSave=Pri pokuse o uloženie hry do súboru %name% nastala chyba! main.defaultPlayerName=Meno hráča main.javaVersion=Java %minVersion% alebo vyššia verzia je odporúčaná na hranie FreeCol\n(%version% detekovaná, použite--no-java-check na vynechanie tejto kontroly). main.memory=Potrebujete priradiť viac než %memory% bytov pamäte pre JVM.\n Reštartujte FreeCol s: java -Xmx%minMemory%M -jar FreeCol.jar main.userDir.fail=FreeCol nemôže nájsť vhodné adresáre na uloženie používateľských dát.\nPokračuje sa, ale očakávajte problémy. client.baseData=Nemožno nájsť základný adresár %dir%.\nHra FreeCol nemôže nájsť dátové súbory.\nUistite sa, že ich máte.\nAk hra FreeCol hľadá v zlom adresári, tak spustite hru príkazom: --freecol-data -client.choicePlayer=Prosím zvoľte hráča: +client.choicePlayer=Prosím zvoľte národ: client.classic=Nepodarilo sa načítať nastavenia pre "klasickú hru". +client.ending=Hra sa končí. client.headlessDebug=Bezhlavý režim vyžaduje spustenie ladenia. client.headlessRequires=Bezhlavý režim vyžaduje uloženú hru alebo špecifikáciu. client.laf=Nemožno nainštalovať FreeCol pozeraj-a-cíť. +client.noPlayers=V tejto hre nie sú dostupný žiadnz hráči. metaServer.couldNotConnect=Ospravedlňujeme sa, nedá sa pripojiť na meta-server. Skúste znovu neskôr prosím. metaServer.communicationError=Pri komunikácii s meta-serverom sa vyskytla chyba. Prosím skúste znovu neskôr. abandonEducation.action.studying=štúdium abandonEducation.action.teaching=výučba -abandonEducation.no=Nie, pokračovať vo vzdelávaní +abandonEducation.no=Pokračovať vo vzdelávaní abandonEducation.text=Ak Vaša jednotka %unit% opustí kolóniu %colony% prestane %action% v %building%. Naozaj chcete, aby odišla? -abandonEducation.yes=Áno, opustiť kolóniu +abandonEducation.yes=Opustiť kolóniu abandonTeaching.text=Ak Vaša jednotka %unit% opustí budovu %building% prestane sa učiť. Naozaj chcete, aby odišla? armedUnitSettlement.attack=Zaútočiť armedUnitSettlement.tribute=Požadovať poplatok @@ -2039,15 +2216,15 @@ buy.takeOffer=Prijať ponuku buy.text=%nation% by radi predali svoje %goods% za %gold%: clearTradeRoute.text=Vaša jednotka %unit% je priradená k obchodnej ceste %route%. Nastavenie jej cieľa vymaže priradenú obchodnú cestu. Ste si istý, že to chcete urobiť? client.fullScreen=Toto grafické zariadenie nepodporuje režim celej obrazovky.\nVracia sa späť do režimu zobrazenia v okne. -confirmHostile.alliance=Nemôžete zaútočiť na spojenecký národ. Naozaj chcete zrušiť alianciu s národom %nation% a vyhlásiť im vojnu? -confirmHostile.ceaseFire=Podpísali ste dohodu o neútočení s národom %nation%. Naozaj si prajete zaútočiť? -confirmHostile.peace=Medzi Vami a národom %nation% je mier. Naozaj si prajete vyhlásiť vojnu? -confirmTribute.broke=Naši špióni nám hlásia, že %nation% sú úplne zlomení. Nemrhajme časom na poplatky. +confirmHostile.alliance=Nemôžete zaútočiť na spojenecký národ! Naozaj chcete zrušiť spojenectvo s národom {{tag:country|%nation%}} a vyhlásiť im vojnu? +confirmHostile.ceaseFire=Podpísali ste dohodu o neútočení s národom {{tag:country|%nation%}}. Naozaj si želáte zaútočiť? +confirmHostile.peace=Medzi Vami a národom {{tag:country|%nation%}} je mier. Naozaj si želáte vyhlásiť im vojnu? +confirmHostile.yes=Áno, rozpútať vojnu! +confirmTribute.broke=Naši špióni nám hlásia, že {tag:country|%nation%}} sú úplne na mizine. Nemrhajme časom požiadavkami na poplatky. confirmTribute.european=%nation% %danger%, a %finance%. Aký veľký poplatok od nich požadovať? confirmTribute.happy=%nation% v %settlement% sú naši dobrí priatelia. Je to škoda ničiť naše priateľstvo. confirmTribute.no=Možno by sme nemali -# Fuzzy -confirmTribute.normal=Požadovať mierny poplatok +confirmTribute.normal=Nie je to isté, ale %nation% v %settlement% môže mať niečo hodnotné. Máme od nich požadovať daň? confirmTribute.unwise=%nation% sú silní a početní. Je múdre ich provokovať? confirmTribute.warLikely=Pozor, žiadať poplatok môže znovu vyvolať vojnu s národom %nation%. confirmTribute.yes=Pokračovať v požadovaní poplatku @@ -2058,14 +2235,11 @@ error.noSuchFile=Zadaný súbor neexistuje alebo to nieje normálny súbor. finance.high=sú finančne zabezpečení finance.low=sú známy tým, že sú chudobní finance.normal=majú malú rezervu zlata -# Fuzzy indianLand.cancel=Opustiť pozemok. -# Fuzzy -indianLand.pay=Ponúknuť %amount% zlata za pozemok. -# Fuzzy -indianLand.take=Vziať si to čo nám právom patrí. +indianLand.pay=Ponúknuť %amount% kusov zlata za pozemok. +indianLand.take=Vziať si, čo nám právom patrí. indianLand.text=Toto územie vlastní hráč %player%. Chceli by ste: -indianLand.unknown=V tomto kraji žijú nejaký neznámi ľudia. Chceli by ste: +indianLand.unknown=V tomto kraji žijú nejakí neznámi ľudia. Chcete: info.autodetectLanguageSelected=Vybrali ste si autodetekciu jazyka. Tá sa uskutoční po nasledujúcom reštartovaní hry. info.enterSomeText=Prosím, zadajte nejaký text. info.newLanguageSelected=Nastavuje sa jazyk %language%. Je potrebné hru reštartovať, aby sa zmeny plne prejavili. @@ -2110,8 +2284,8 @@ defeated.text=Porazili Vás! Čo chcete urobiť: defeated.yes=Ostať a dívať sa defeatedSinglePlayer.text=Porazili Vás!\n\nToto je teraz čarovná noc keď kostoly spánkom zívajú a peklo závistlivo dýcha na tento svet. Teraz by som mohol preliať krv a pohľadom zatriasť zem. defeatedSinglePlayer.yes=Vstúpiť do režimu pomsty -diplomacy.offerAccepted=%nation% prijali vašu veľkorysú ponuku. -diplomacy.offerRejected=%nation% odmietli Vašu štedrú ponuku. +diplomacy.offerAccepted={{tag:country|%nation%}} prijali vašu veľkorysú ponuku. +diplomacy.offerRejected={{tag:country|%nation%}} odmietli Vašu veľkorysú ponuku. disbandUnit.text=Naozaj chcete odstrániť túto jednotku? disbandUnit.yes=Rozpustiť disembark.text=Zdravíme ťa námorník, prajete si niekoho vylodiť? @@ -2153,9 +2327,10 @@ missionarySettlement.inciteQuestion=Na ktoré európske vojsko máme zaútočiť move.noAccessBeached=Loď národa %nation% pri brehu, blokuje našu cestu. move.noAccessContact=Najskôr musíme nadviazať kontakt s národom %nation%, Vaša excelencia. move.noAccessGoods=Národ %nation% nebude obchodovať s prázdnou jednotkou %unit%. +move.noAccessMissionBan=%nation% odmietli všetky kontakty s našimi misionármi. move.noAccessSettlement=Národ %nation% nedovoľuje našej jednotke %unit% vstúpiť do ich osady. move.noAccessSkill=Naša jednotka %unit% sa nemôže učiť od domorodcov. -move.noAccessTrade=Nemáme oprávnenie na obchodovanie s inými európskymi národmi ako aj s národom %nation%. +move.noAccessTrade=Nemáme oprávnenie na obchodovanie s inými európskymi národmi ako napríklad s {{tag:country|%nation%}}. move.noAccessWar=Počas vojny nemôžeme obchodovať s národom %nation%. move.noAccessWater=Naša jednotka %unit% musí pred vstupom do osady pristáť na pevnine. move.noAttackWater=Naša jednotka %unit% musí pred útokom pristáť na pevnine. @@ -2164,6 +2339,7 @@ nameRegion.text=Objavili ste región %type% a nárokujete ho pre Vášho kráľa newLand.text=Prosím, pomenujte našu novú krajinu: payArrears.noGold=Nemáte dosť zlata na to, aby ste zaplatili daňový dlh v hodnote %amount% ks zlata. payArrears.text=Kráľ zablokoval tento tovar pretože ste nezaplatili daňový dlh v množstve %amount% ks zlata. Chcete ho teraz zaplatiť? +payForBuilding.disabled=Platby za dokončenie stavieb sú v tejto hre zakázané. payForBuilding.text=Chcete zaplatiť %amount% zlata na dokončenie tejto budovy? renameColony.text=Prosím navrhnite nový názov pre našu kolóniu: renameUnit.text=Prosím navrhnite nový názov pre našu jednotku: @@ -2173,8 +2349,7 @@ scoutSettlement.speakDie=Prezradili ste posvätné tajomstvá kmeňa! Priviažem scoutSettlement.speakNothing=Vždy radi privítame cestovateľov národa %nation%. scoutSettlement.speakTales=Je nám potešením privítať cestovateľov z takej diaľky. Prisadnite si k nášmu ohňu a my Vám porozprávame príbehy o okolitej krajine. sellProposition.text=Chcete predať nejaký tovar? -# Fuzzy -trade.noTrade=Obchod odmietnutý. +trade.noTrade=%settlement% odmietol obchod. trade.noTradeGoods=Ospravedlňujeme sa %goods% už viac nepotrebujeme! trade.noTradeHaggle=Už sme unavení z Vášho neustáleho vyjednávania. trade.noTradeHostile=Pohŕdame Vami aj Vašim tovarom. Choďte preč! @@ -2182,6 +2357,7 @@ trade.nothingToSell=Ospravedlňujeme sa, v túto chvíľu nemáme nič na predaj tradeProposition.welcome=Obchodovanie s %nation% v %settlement% tradeRoute.atStop=V %location%: tradeRoute.loadStop=Naložené %amount% %goods%. +tradeRoute.loadStopBlocked=Na palube sa nečakane sa našlo %goods%. tradeRoute.loadStopExport=Naložené %amount% %goods%. %more% ostalo v sklade. tradeRoute.loadStopImport=Naložené %amount% %goods%. Chýba priestor pre %more% viac. tradeRoute.loadStopNoExport=Naložené nula %goods%. %more% ostalo v sklade. @@ -2195,12 +2371,12 @@ tradeRoute.unloadStopImport=Vyložené %amount% %goods% a vyhodené %more%. tradeRoute.unloadStopNoExport=Vyložené nula %goods% a %more% ostalo na palube. tradeRoute.wait=Nemá prácu, čaká. traderoute.warehouseCapacity=Vyloženie jednotky %unit% v kolónii %colony% by presiahlo kapacitu skladu. %amount% %goods% by sa vyhodilo. Chcete napriek tomu tovar vyložiť? -# Fuzzy -twoTurnsPerYear=Počínajúc rokom %year% budú dva ťahy za rok namiesto jedného. +twoTurnsPerYear=Počínajúc rokom %year% budú %amount% ťahy za rok namiesto jedného. server.badColor=Neplatná farba server.badNation=Neplatný národ server.badNationType=Neplatný typ národa server.couldNotConnect=Nedá sa pripojiť k serveru. +server.couldNotLogin=Nie je možné prihlásiť sa na server. server.errorStartingGame=Pri spúšťaní hry došlo k chybe. server.fileNotFound=Nepodarilo sa nájsť súbor so zadaným názvom. server.incompatibleVersions=Uloženú hru ktorú sa snažíte nahrať nieje kompatibilná s touto verziou FreeCol. @@ -2209,7 +2385,9 @@ server.invalidPlayerNations=Pred začiatkom hry si všetci hráči musia vybrať server.maximumPlayers=Je nám ľúto. Bol dosiahnutý maximálny počet hráčov. server.missingUserName=Prihláseniu chýba užívateľské meno. server.missingVersion=Prihláseniu chýba verzia hry FreeCol. +# Fuzzy server.noRouteToServer=Server sa nedá zverejniť. Mali by ste upraviť Vaše nastavenie brány firewall. +server.noSuchPlayer=Hra neobsahuje hrávča menom: %player% server.notAllReady=Nie všetci hráči sú pripravení na začiatok hry! server.onlyAdminCanLaunch=Je nám ľúto, hru môže spustiť iba administrátor servera. server.reject=Server to nemôže urobiť. @@ -2217,7 +2395,7 @@ server.timeOut=Časový limit pre pripojenie k serveru. server.userNameInUse=Zadané užívateľské meno sa už používa. server.userNameNotPresent=V tejto hre sa zadané užívateľské meno nenachádza. server.wrongFreeColVersion=Klient a verzia hry FreeCol sa nezhodujú. -buildColony.others=Národ %nation% založil novú kolóniu %colony% v %region%. +buildColony.others=Národ {{tag:country|%nation%}} založil novú kolóniu %colony% v oblasti %region%. cashInTreasureTrain.colonial=Poklad s %amount% ks zlata pristál v Európe. Zinkasovali sme %cashInAmount% ks zlata. cashInTreasureTrain.independent=Do národnej pokladice bolo pridané %amount% ks zlata. cashInTreasureTrain.otherColonial=Poklad v hodnote %amount% ks zlata pristál v Európe. Kráľ národa %nation% sa zjavne potešil. @@ -2225,6 +2403,7 @@ cashInTreasureTrain.otherIndependent=Do národnej pokladnice národa %nation% bo declareIndependence.announce=Kolónie %oldNation% vyhlásili nezávislosť od %ruler% a sú teraz známe ako %newNation%. declareIndependence.continentalArmyMuster=Pre posilnenie Vášho vyhlásenia nezávislosti boli nasledovné jednotky %number% {{plural:%number%|%oldUnit%}} v kolónii %colony% povýšené na {{plural:%number%|%unit%}}! declareIndependence.interventionForce={{tag:country|%nation%}} slávnostne sľubuje vyslať intervenčné sily na podporu Vášho legitímneho boja za nezávislosť, v prípade, že vyprodukujete %number% {{plural:%number%|one=Zvon slobody|two=Zvony|other=Zvonov}} slobody, aby ste preukázali Vaše odhodlanie. +declareIndependence.nativeHostile=Naši špióni oynamujú, že Kráľovské expedičné sily sa spriatelili s národom %nation%. Dajte si pozor, môžu plánovať útok! declareIndependence.resolution=V tento deň prijal Kongres najdôležitejšie uznesenia aké kedy boli v Amerike vytvorené.\n\nVeľmi dobre si uvedomujem koľko driny, krvi a peňazí bude stáť udržanie deklarácie a podpora a obrana týchto štátov. Napriek všetkým chmáram vidím lúče svetla a slávy. Vidím, že koniec bude stáť za to, že naši potomkovia zvíťazia a verím v Boha, že to nebudeme ľutovať.\n\nKráľovské vojsko nás čoskoro napadne. Poriadne pripravme našu obranu a zvýšme počet dobrovoľníkov v novej Kontinentálnej armáde. declareIndependence.unitsSeized=Ako reakciu na Vaše vyhlásenie nezávislosti, kráľovstvo zabavila nasledovné jednotky v Európe a na mori: %units% deliverGift.goods=Hráč %player% doviezol do osady %settlement% dar %amount% %type%. @@ -2262,6 +2441,8 @@ colopedia.concepts.education.name=Vzdelávanie colopedia.concepts.education.description=

Najúčinnejší spôsob ako vzdelávať Vašich kolonistov je postaviť základnú školu a priradiť nejakého experta/majstra ako učiteľa. Učiteľ potom vyučí slobodného kolonistu svojmu remeslu. Učitelia sú schopný zmeniť kriminálnika na sluhu a sluhu na slobodného kolonistu.

Niektoré zručnosti sa dajú naučiť aj od domorodcov a to tak, že k nim do osady pošlete žiť slobodného kolonistu alebo sluhu. Niektoré zručnosti sa dajú naučiť aj vďaka skúsenostiam. Slobodný kolonista, ktorý pracuje na určitom políčku v kolónii získava za svoju prácu skúsenosti čo mu dáva šancu na dosiahnutie špecializácie.

colopedia.concepts.efficiency.name=Účinnosť colopedia.concepts.efficiency.description=

Efektívnosť Vašich kolónií závisí od ich podpory myšlienky o nezávislosti. Ak 50% kolonistov podporuje nezávislosť, kolónii sa udelí výrobný bonus +1. Akonáhle sa podpora zvýši na 100%, kolónii sa udelí výrobný bonus +2.

Na druhej strane ak počet feudalistov presiahne stanovený limit pre zlú vládu, kolóniu zasiahne zníženie výroby na -1. Ak počet feudalistov presiahne limit per veľmi zlú vládu, zníženie výroby sa zvýši na -2. Tieto dva limity závisia od úrovne obtiažnosti a môžete si ich skontrolovať kliknutím na hlásenie úrovne obtiažnosti.

V záujme zvýšenia efektívnosti kolónie musíte znížiť jej populáciu alebo zvýšiť výrobu Zvonov slobody.

+colopedia.concepts.fortification.name=Opevnenie +colopedia.concepts.fortification.description=

Jednotky sa môžu na políčku opevniť (vybudovaním dočasných zákopov a prekážok), aby tým zvýšili svoju obranyschopnosť. Plne sa opevniť trvá jeden ťah. Opevnenie taktiež chráni pred prepadnutím a opevnené delostrelectvo už nie je považované za "nechránené" aj keď útok poškodí opevnenie. Opevnenie poskytuje obranný bonus len v prípade neprítomnosti iných zvýhodňujúcich obranných vlastností, preto opevnenie na horách alebo v kolónii s pevnosťou alebo veľkou pevnosťou nepridá žiadny obranný bonus. colopedia.concepts.independence.name=Nezávislosť colopedia.concepts.independence.description=

Hru začínate ako prieskumník s niekoľkými jednotkami k dispozícii. Kráľ od Vás očakáva, že v Novom svete založíte kolóniu a budete domov nosiť poklady a exotický tovar. Vy však máte iné plány: založiť nezávislý národ.

Na vyhlásenie nezávislosti potrebujete presvedčiť aspoň 50% populácie Vašich kolónií. To sa dá dosiahnuť výrobou takzvaných zvonov slobody, ktoré zároveň zvyšujú efektívnosť Vašich kolónií.

Určite si uvedomujete, že kráľa to nenechá chladným. Po vyhlásení nezávislosti musíte bojovať a zničiť Kráľovské expedičné sily (KES). Ak KES budú ovládať všetky Vaše prímorské kolónie, alebo najmenej 90% populácie, Vaša snaha o nezávislosť skončí neúspechom.

colopedia.concepts.interventionForce.name=Intervenčné sily @@ -2300,10 +2481,8 @@ colopedia.nationType.skills=Naučené zručnosti: colopedia.nationType.typeOfSettlements=Druh osád: colopedia.nationType.units=Počiatočné jednotky: colopedia.terrain.colonyCenterTile=Políčko centra kolónie -# Fuzzy colopedia.terrain.defenseBonus=Obranný bonus colopedia.terrain.description=Popis -# Fuzzy colopedia.terrain.movementCost=Cena presunu colopedia.terrain.resource=Možný zdroj colopedia.terrain.terrainImage=Obrázok terénu @@ -2320,7 +2499,7 @@ colopedia.unit.offensivePower=Útočná sila: colopedia.unit.price=Cena v Európe: colopedia.unit.productionBonus=Výrobná/é {{plural:%number%|one=úprava|other=úpravy}}: colopedia.unit.requirements=Požiadavky: -colopedia.unit.school=Požadovaná škola na výcvik: +colopedia.unit.school=Môže sa vyučiť v: colopedia.unit.skill=Úroveň zručností: report.labour.allColonists=Všetci kolonisti report.labour.amateursWorking=amatéri @@ -2352,11 +2531,9 @@ report.colony.exploring.description=kolónii %colony% by prospelo preskúmať {{ report.colony.grow.description=Počet jednotiek, ktoré môže kolónia vychovať bez toho, aby sa znížila výroba report.colony.grow.header=+ report.colony.growing.description=%colony% môže vychovať {{plural:%amount%|one=jednu jednotku||two=dve jednotky|three=tri jednotky|four=štyri jednotky|other=%amount% jednotiek}} bez toho, aby sa znížila výroba -# Fuzzy -report.colony.improve.description=Jednotky, ktoré by mohli zvýšiť výrobu s ohľadom na jednotky, ktoré už prácu vykonávajú +report.colony.improve.description=Jednotky, ktoré môžu zvýšiť výrobu. report.colony.improve.header=Vylepšiť -report.colony.improving.description=%colony%: Aby ste vyrábali o %amount% ks viac tovaru %goods%, vymeňte jednotku %oldUnit% za jednotku %unit% -report.colony.wanting.description=%colony%: Na vyrobenie o %amount% ks viac tovaru %goods%, pridajte jednotku %unit% +report.colony.improving.description=%colony% %location%: Aby ste vyrábali o %amount% ks viac tovaru %goods%, vymeňte jednotku %oldUnit% za jednotku %unit% report.colony.making.blocking.description=%colony%: %amount% ks tovaru %goods% bude treba na %buildable% {{plural:%turns%|one=na ďalší ťah|two=za dva ťahy|three=za tri ťahy|four=za štyri ťahy|other=za %turns% ťahov}} report.colony.making.constructing.description=%colony%: %buildable% budova dokončená {{plural:%turns%|one=na ďalší ťah|two=za dva ťahy|three=za tri ťahy|four=za štyri ťahy|other=za %turns% ťahov}} report.colony.making.description=Čo táto kolónia práve vytvára @@ -2366,22 +2543,24 @@ report.colony.making.noconstruction.description=%colony%: žiadne prebiehajúce report.colony.making.noteach.description=%colony%: učiteľ %teacher% nemá študenta report.colony.name.description=Zoznam kolónií report.colony.name.header=Kolónia -report.colony.plow.description=Počet políčok kolónie, ktoré by profitovali keby boli poorané -report.colony.plow.header=P -report.colony.plowing.description=kolónii %colony% by prospelo poorať {{plural:%amount%|one=jedno políčko|two=dve políčka|three=tri políčka|four=štyri políčka|other=%amount% políčok}} -report.colony.production.description=%colony%: čistá výroba tovaru %goods% = %amount% -report.colony.production.export.description=%colony%: čistá výroba tovaru %goods% je %amount% (exportovať nad %export%) +report.colony.production.description=%colony%: Vyrába sa %amount% ks tovaru %goods% +report.colony.production.export.description=%colony%: Vyrába sa %amount% ks tovaru %goods% (exportovať nad %export%) report.colony.production.header=Čistá výroba tovaru %goods% -report.colony.production.high.description=%colony%: čistá výroba tovaru %goods% = %amount%, plná {{plural:%turns%|one=ďalším ťahom|two=za dva ťahy|three=za tri ťahy|four=za štyri ťahy|other=za %turns% ťahov}} -report.colony.production.low.description=%colony%: čistá výroba tovaru %goods% = %amount%, zmizne {{plural:%turns%|one=ďaľším ťahom|two=za dva ťahy|three=za tri ťahy|four=za štyri ťahy|other=za %turns% ťahov}} -report.colony.production.waste.description=%colony%: čistá výroba tovaru %goods% = %amount%, sklad bude preplnený, %waste% ks bude vyhodených -report.colony.road.description=Počet políčok kolónie, ktoré by profitovali z postavenej cesty -report.colony.road.header=R -report.colony.roadBuilding.description=kolónii %colony% by prospelo postaviť {{plural:%amount%|one=cestu|two=dve cesty|three=tri cesty|four=štyri cesty|other=%amount% ciest}} +report.colony.production.high.description=%colony%: Vyrába sa %amount% ks tovaru %goods%, zaplnenie {{plural:%turns%|one=ďalším ťahom|two=za dva ťahy|three=za tri ťahy|four=za štyri ťahy|other=za %turns% ťahov}} +report.colony.production.low.description=%colony%: Spotrebúva sa %amount% ks tovaru %goods%, spotrebuje sa {{plural:%turns%|one=v ďaľšom ťahu|two=za dva ťahy|three=za tri ťahy|four=za štyri ťahy|other=za %turns% ťahov}} +report.colony.production.summary.description=Množstvo tovarov, ktoré sú vytvorené alebo spotrebované +report.colony.production.waste.description=%colony%: Vyrába sa %amount% ks tovaru %goods% , sklad bude preplnený, %waste% ks bude vyhodených +report.colony.tile.clearForest.header.description=Počet políčok kolónie, ktoré by profitovali z výrubu. +report.colony.tile.clearForest.summary.description=Celkový počet políčok kolónie na tomto kontinente, ktoré by profitovali z výrubu. +report.colony.tile.plow.description=kolónii %colony% by prospelo poorať {{plural:%amount%|one=jedno políčko|two=dve políčka|three=tri políčka|four=štyri políčka|other=%amount% políčok}} +report.colony.tile.road.header=R +report.colony.tile.road.header.description=Počet políčok kolónie, ktoré by profitovali z postavenej cesty. +report.colony.tile.road.summary.description=Celkový počet políčok kolónie na tomto kontinente, ktoré by profitovali z postavenej cesty. report.colony.shrinking.description=Kolónia %colony% musí byť zmenšená o{{plural:%amount%|one=jednu jednotku|two=dve jednotky|three=tri jednotky|four=štyri jednotky|other=%amount% jednotiek}} pre zvýšenie výroby report.colony.starving.description=%colony%: hladomor {{plural:%turns%|one=na ďalší ťah|two=za dva ťahy|three=za tri ťahy|four=za štyri ťahy|other=za %turns% ťahov}} -# Fuzzy -report.continentalCongress.elected=Zvolení: +report.colony.wanting.description=%colony% %location%: Na vyrobenie o %amount% kusov tovaru %goods% naviac pridajte jednotku %unit% +report.continentalCongress.available=Dostupný +report.continentalCongress.elected=Zvolený: %turn% report.continentalCongress.none=(žiadny) report.continentalCongress.recruiting=Nábor report.education.students=Potenciálny študenti @@ -2418,42 +2597,42 @@ report.indian.tension=Napätie report.indian.tradeInterests=Obchodné záujmy report.indian.tribeTension=Domorodé napätie: report.indian.typeOfSettlements=Druh osád: +report.labour.details.name=Podrobnosti Správy o zamestnanosti report.production.selectGoods=Výber tovaru report.production.update=Aktualizovať report.requirements.badAssignment=V kolónii %colony% pracuje %expert% ako %expertWork%, kým %nonExpert% pracuje ako %nonExpertWork%. Keby si títo kolonisti vymenili prácu, výroba by sa zvýšila. report.requirements.canTrainExperts={{plural:2 jedotky|%unit%}} sa môžu vytrénovať v -report.requirements.clearTile=%type% smerom na %direction% od kolónie %colony% bude profitovať z vyrúbania. -report.requirements.exploreTile=%type% smerom na %direction% od kolónie %colony% bude profitovať z prieskumu. +report.requirements.exploreTile=%location% by profitoval z prieskumu. report.requirements.met=Všetky požiadavky sú splnené. report.requirements.missingGoods=%colony% vyrába %goods%, ale potrebuje viac %input%. report.requirements.misusedExperts={{plural:2 jednotky|%unit%}} nepracujú ako %work% v kolónii report.requirements.noExpert=%colony% vyrába %goods%, ale nevyrába %unit%. -report.requirements.plowCenter=Kolónia %colony% by profitovala z poorania políčok. -report.requirements.plowTile=%type% smerom na %direction% od kolónie %colony% bude profitovať z poorania. -report.requirements.roadTile=%type% smerom na %direction% od kolónie %colony% bude profitovať z výstavby ciest. +report.requirements.tile.clearForest=%location% by mal prospech z výrubu. +report.requirements.tile.road=%location% by mal prospech zo stavby cesty. report.requirements.severalExperts={{plural:2 jednotky|%unit%}} sú prítomné v report.requirements.surplus=Vyrobil sa prebytok tovaru %goods% v report.trade.afterTaxes=Príjem po zdanení report.trade.beforeTaxes=Príjem pred zdanením report.trade.cargoUnits=Jednotiek v náklade -report.trade.hasCustomHouse=* Táto kolónia má vlastný dom, tento tovar je exportovaný. +report.trade.export=Vyvážať %goods% nad %amount% +report.trade.hasCustomHouse=* Táto kolónia má colnicu, a môže vyvážať tovar. report.trade.totalDelta=Výroba celkom report.trade.totalUnits=Jednotiek celkom report.trade.unitsSold=Kúpené alebo predané jednotky report.turn.filter=Nezobrazovať tento druh správ (%type%) report.turn.ignore=Ignorovať túto správu (Kolónia: %colony%, Tovar: %goods%) -report.turn.playerNation=%player% %nation% -# Fuzzy -aboutPanel.copyright=Copyright © 2002-2014 The FreeCol Team +report.turn.playerNation=%player% {{tag:country|%nation%}} +aboutPanel.copyright=Copyright © 2002-2015 FreeCol Team aboutPanel.legalDisclaimer=FreeCol je softvér zadarmo: môžete ho šíri a upravovať podľa všeobecných užívateľských podmienok publikovaných Free Software Foundation verzie 2 a viac. +aboutPanel.manual=Manuálne stiahnutie FreeCol aboutPanel.officialSite=Oficiálna stránka: aboutPanel.sfProject=SourceForge projekt: aboutPanel.version=Verzia: buildingToolTip.breeding=Potrebujete najmenej %number% {{plural:%number%|%goods%}} na chov %goods%. buildQueuePanel.buildings=Budovy buildQueuePanel.buildQueue=Stavebné poradie -# Fuzzy -buildQueuePanel.buyBuilding=Kúpiť budovu +buildQueuePanel.buyBuilding=Kúpiť %buildable% +buildQueuePanel.coastalOnly=Pobrežná kolónia buildQueuePanel.compactView=Kompaktné zobrazenie buildQueuePanel.currentlyBuilding=Budova: %buildable% buildQueuePanel.populationTooSmall=Populácia: %number% @@ -2464,12 +2643,14 @@ captureGoodsDialog.title=Korisť cargoPanel.cargoAndSpace=Náklad na %name% (%space% {{plural:%space%|one=miesto|other=miesta|default=miesto}}ostáva) chatPanel.message=Správa chooseFoundingFatherDialog.title=Nominovať Otca zakladateľa +colonyPanel.buildQueue=Stavebné poradie colonyPanel.colonyUnits=Jednotky kolónie colonyPanel.inPort=V prístave colonyPanel.outsideColony=Mimo kolónie -colonyPanel.producing=Vyrába: +colonyPanel.producing=vyrába: colonyPanel.reducePopulation=Ak znížite populáciu pod %number%, %colony% nebude môcť vybudovať %buildable%. colonyPanel.unitChange=Pri vstupe do kolónie sa Vaša jednotka %oldType% stala jednotkou %newType%. +colonyPanel.warehouse=Skladisko colonyPanel.bonusLabel=Bonus: %number%%extra% colonyPanel.populationLabel=Populácia: %number% colonyPanel.rebelLabel=Rebeli: %number% @@ -2479,8 +2660,8 @@ confirmDeclarationDialog.areYouSure.no=Možno neskôr confirmDeclarationDialog.areYouSure.text=Vzdajme sa nespravodlivej tyranie kráľa %monarch% a vyhlásme nezávislosť našich kolónii od kráľovstva. confirmDeclarationDialog.areYouSure.yes=Sloboda alebo smrť! confirmDeclarationDialog.createFlag=a naši nepriatelia sa budú triasť pri pohľade na náš nezlomný banner. -confirmDeclarationDialog.defaultCountry=Spojené štáty %nation% -confirmDeclarationDialog.defaultNation=Slobodný %nation% +confirmDeclarationDialog.defaultCountry=Spojené štáty {{tag:country|%nation%}} +confirmDeclarationDialog.defaultNation=Slobodný {{tag:country|%nation%}} confirmDeclarationDialog.enterCountry=Odteraz bude naša krajina známa ako confirmDeclarationDialog.enterNation=a každý občan nášho slávneho národa bude hrdý na to, že je známy ako flag.background.FESSES=Delené @@ -2525,14 +2706,16 @@ flag.unionShape.TRIANGLE=Trojuholník flag.unionShape.label=Union Shape constructionPanel.clickToBuild=Klikni na stavenisko pre výber stavby budovy alebo vytvorenie jednotky. constructionPanel.turnsToComplete=(Ťahov na dokončenie: %number%) +difficultyDialog.name=Obtiažnosť negotiationDialog.accept=Súhlasiť negotiationDialog.add=Pridať negotiationDialog.cancel=Zrušiť negotiationDialog.clear=Vyčistiť negotiationDialog.contact.tutorial=Stretáte kolegov Európanov. Budú s Vami súťažiť o pôdu a bohatstvo a možno Vám aj vyhlásia vojnu. Ale potom ako sa Jan de Witt pripojil ku Kontinentálnemu kongresu môžete s nimi obchodovať. -negotiationDialog.demand=%nation% požaduje od %otherNation% +negotiationDialog.demand={{tag:country|%nation%}} požaduje od {{tag:country|%otherNation%}} negotiationDialog.exchange=výmenou za -negotiationDialog.offer=%nation% za %otherNation% +negotiationDialog.goldAvailable=(%amount% zlata k dispozícii) +negotiationDialog.offer={{tag:country|%nation%}} ponúka {{tag:country|%otherNation%}} negotiationDialog.send=Poslať negotiationDialog.title.contact=Stretnutie kolegov Európanov negotiationDialog.title.diplomatic=Diplomatické vyjednávanie @@ -2554,10 +2737,10 @@ findSettlementPanel.displayAll=Nájsť všetky osady findSettlementPanel.displayOnlyEuropean=Nájsť iba európske osady findSettlementPanel.displayOnlyNatives=Nájsť iba pôvodné osady findSettlementPanel.name=Nájsť osadu -firstContactDialog.meeting.natives=Stretnutie s domorodcami... +firstContactDialog.meeting.natives=Stretnutie s domorodcami firstContactDialog.meeting.natives.tutorial=Stretli ste sa s domorodcami. Pošlite do ich osád svojich prieskumníkov, aby ste sa o nich dozvedeli viac a sluhov a slobodných kolonistov, aby ste sa od nich učili. Pošlite do ich osád svoje vozy a lode ak si s nimi prajete obchodovať. -firstContactDialog.meeting.AZTEC=Národ Aztékov... -firstContactDialog.meeting.INCA=Ríša Inkov... +firstContactDialog.meeting.aztec=Národ Aztékov +firstContactDialog.meeting.inca=Ríša Inkov firstContactDialog.welcomeOffer.text=Víta Vás národ %nation%. Náš slávny národ sa skladá z %camps% %settlementType%. Na oslavu nášho priateľstva Vám veľkoryso darujeme pozemok na ktorom sa práve nachádzate. Chcete s nami žiť v mieri ako bratia? firstContactDialog.welcomeSimple.text=Víta Vás národ %nation%. Náš slávny národ sa skladá z %camps% %settlementType%. Chcete s nami žiť v mieri ako bratia? abandonColony.no=Zrušiť @@ -2579,11 +2762,15 @@ indianSettlementPanel.learnableSkill=V tejto osade sa dá naučiť nasledovná z indianSettlementPanel.highlyWanted=Táto osada sa veľmi zaujíma o obchodovanie s: indianSettlementPanel.otherWanted=Ostatný tovar s ktorým sa dá obchodovať v tejto osade je: indianSettlementPanel.mostHated=V tejto osade najviac nenávidia národ: +infoPanel.defenseBonus=Obrana %bonus%% infoPanel.endTurn=Na ukončenie ťahu stlačte enter. +infoPanel.movementCost=Presun %cost% infoPanel.moves=Ťahy: +informationPanel.display=Zobraziť %object% loadingSavegameDialog.port=Brána: loadingSavegameDialog.privateMultiplayer=Súkromná hra pre viacerých hráčov loadingSavegameDialog.publicMultiplayer=Verejná hra pre viacerých hráčov +loadingSavegameDialog.serverName=Meno servera: loadingSavegameDialog.singlePlayer=Hra jedného hráča loadingSavegameDialog.name=Nahrávanie uloženej hry mapEditorTransformPanel.chooseResource=Vybrať zdroj @@ -2595,6 +2782,8 @@ freecol.map.America_large=Amerika (veľká) freecol.map.Australia=Austrália freecol.map.Caribbean_basin=Karibská oblasť mapSizeDialog.mapSize=Zvoliť veľkosť mapy +modifierFormat.unknown=??? +modifierFormat.scopeMethod.isIndian.name=domorodci monarchDialog.default=Správa z kráľovstva newPanel.editDifficulty=Upraviť obtiažnosť newPanel.getServerList=Získať zoznam serverov @@ -2619,6 +2808,7 @@ quickActionMenu.clearSpeciality=Vymazať špecialitu quickActionMenu.experience=Skúsenosti ako %job% : quickActionMenu.leaveTown=Opustiť mesto quickActionMenu.loadOnTo=Naložiť na %unit% +quickActionMenu.profit=Európske čisté imanie: %amount% quickActionMenu.teaching=Výučba %unit% quickActionMenu.upgrade=Pravdepodobnosť zvýšenia úrovne: rebelToolTip.100percent=Ťahov na dosiahnutie 100% @@ -2626,6 +2816,8 @@ rebelToolTip.50percent=Ťahov na dosiahnutie 50% rebelToolTip.changeLess=Odobrať kolonistov na zlepšenie bonusu rebelToolTip.changeMore=Pridať kolonistov k aktuálnemu bonusu rebelToolTip.nextMember=Ťahov na zvýšenie počtu rebelov +rebelToolTip.rebelLabel=Rebeli: %number% +rebelToolTip.royalistLabel=Rojalisti: %number% recruitPanel.clickOn=Kliknite na jednu z osôb pre rekrutovanie. Budete musieť zaplatiť %money% zlata za jeho prechod. On sám bude schopný zaplatiť za svoj prechod za %number% ťahy/ov. riverStyleDialog.text=Štýl rieky selectAmountDialog.text=Prosím, zadajte presné množstvo tovaru na prenos: @@ -2645,7 +2837,9 @@ info.noEuropeans=Podmienka poraziť všetkých ostatných Európanov už bola sp memoryManager.freeMemory=Voľná memoryManager.maxMemory=Max memoryManager.totalMemory=Celkom +tilePanel.defenseBonus=Obranný bonus: tilePanel.label=%label% (%x%, %y%) +tilePanel.movementCost=Cena presunu: tilePanel.owner=Vlastník: tilePanel.region=Oblasť: tilePanel.settlement=Osada: @@ -2675,16 +2869,39 @@ warehouseDialog.exportLevel.shortDescription=Nič neexportovať pod touto úrov warehouseDialog.highLevel.shortDescription=Upozorniť ma, keď zásoby presiahnu toto percento kapacity. warehouseDialog.lowLevel.shortDescription=Upozorniť ma, keď zásoby klesnú pod toto percento kapacity. warehouseDialog.name=Sklad -# Fuzzy -workProductionPanel.zeroThreshold=Žiadny +workProductionPanel.zeroThreshold=Žiadny záporná výroba nameCache.base.colony=Kolónia nameCache.base.settlement=Osada nameCache.base.ship=Loď nameCache.base.tradeRoute=Nová obchodná cesta +nameCache.lostCityRumour.cityName.0=Aira +nameCache.lostCityRumour.cityName.1=Anhuib +nameCache.lostCityRumour.cityName.2=Ansalli +nameCache.lostCityRumour.cityName.3=Ansesseli +nameCache.lostCityRumour.cityName.4=Ansodi +nameCache.lostCityRumour.cityName.5=Ansolli +nameCache.lostCityRumour.cityName.6=Con nameCache.mercenaries.0=Frederik II, kieža z Hesse-Kassel nameCache.mercenaries.1=Frederick Augustus, princ z Anhalt-Zerbst nameCache.mercenaries.2=Charles Alexander, gróf z Brandenburg-Ansbach nameCache.mercenaries.3=Charles I, vojvoda z Brunswick-Wolfenbüttel +nameCache.season.default=Ročné obdobie %number% +nameCache.season.0=Jar +nameCache.season.1=Jeseň +error.disasterAvoided=Katastrofa %disaster% sa vyhla kolónii %colony% +error.notAIColony=%colony% nie je kolónia UI +info.rgb=Hodnota RGB: %red%,%green%,%blue% +prompt.selectDisaster=Vyberte katastrofu +prompt.selectGoodsAmount=Vyberte množstvo tovaru +prompt.selectGoodsType=Vyberte druh tovaru +prompt.selectImmigration=Vyberte množstvo prisťahovalcov +prompt.selectLostCityRumour=Vyberte povesti o Stratenom meste +prompt.selectOwner=Vyberte vlastníka +prompt.selectRole=Vyberte úlohu +prompt.selectTurnsToSkip=Vyberte počet ťahov na preskočenie +prompt.selectUnitType=Vyberte typ jednotky +prompt.stepRNG=Krok generátora náhodných čísel (%value%) +prompt.selectGold=Vyberte množstvo zlata installer.FreeCol.description=FreeCol aplikácia a dátové súbory. installer.FreeColLanguage.autodetect=Autodetekcia pri spustení hry installer.FreeColLanguage.description=Toto nastavenie môžete zmeniť neskôr v hre pomocou menu Nastavenia. diff --git a/data/strings/FreeColMessages_sv_SE.properties b/data/strings/FreeColMessages_sv_SE.properties index 9a46f1bf5..975901ee8 100644 --- a/data/strings/FreeColMessages_sv_SE.properties +++ b/data/strings/FreeColMessages_sv_SE.properties @@ -1,6 +1,7 @@ # Messages for Swedish (svenska) # Exported from translatewiki.net # Author: Boivie +# Author: BroderTuck # Author: Cohan # Author: Harald Khan # Author: Jenniesarina @@ -52,6 +53,7 @@ all=Alla and=och browse=Bläddra cancel=Avbryt +client=Klient close=Stäng color=Färg connect=Anslut @@ -112,6 +114,7 @@ colopedia=Colopedia difficulty=Svårighetsgrad docks=Kajer dumpCargo=Dumpa lasten +finalResult=Slutresultat fortify=Befäst gold=Guld goldAmount=%amount% guld @@ -188,6 +191,7 @@ cli.default-locale=ange förvald locale (SPRÅK[_LAND[_VARIANT]]) cli.difficulty=ställ in SVÅRIGHETSNIVÅN cli.font=Ange förvalstypsnitt cli.freecol-data=ange i vilken KATALOG FreeCol lagrar data (har en underkatalog som heter 'base') +cli.full-screen=kör FreeCol i helskärmsläge cli.help=visa denna hjälpskärm cli.load-savegame=läs in angiven FIL med sparat spel cli.log-console=skriv logg i konsol utöver i fil @@ -200,14 +204,14 @@ cli.no-memory-check=hoppa över minneskontroll cli.no-sound=kör FreeCol utan ljud cli.private=starta en privat server (som ej publiceras på metaservern) cli.seed=tillhandahåller ett FRÖ till den pseudo-slumpmässiga nummergeneratorn -cli.server-name=ange ett anpassat NAMN för servern +# Fuzzy cli.server=starta en självständig server på angiven port +cli.server-name=ange ett anpassat NAMN för servern cli.splash=visa en uppstartsskärm med bildFIL när spelet läses in cli.tc=läs in den totala omvandlingen med angivet NAMN cli.timeout=antalet sekunder som servern väntar på ett svar på en fråga cli.version=visa versionnummer och avsluta -# Fuzzy -cli.windowed=kör FreeCol i fönsterläge istället för i helskärmsläge +cli.windowed=kör FreeCol i fönsterläge, med valfria MÅTT menuBar.colopedia=Colopedia menuBar.game=Spel menuBar.orders=Order @@ -224,6 +228,8 @@ menuBar.debug.addLiberty=Lägg till frihet till varje koloni menuBar.debug.compareMaps.checkComplete=Kontrollen genomförd. Kartan i sync. menuBar.debug.compareMaps.problem=Möjligt problem upptäckt. Vänligen läs informationen som skrivits till standard output. menuBar.debug.compareMaps=Kontrollera kartans synkronisering +menuBar.debug.displayAIMissions=Visa AI-uppdrag +menuBar.debug.displayAdditionalAIMissionInfo=Visa ytterligare information om AI-uppdrag menuBar.debug.displayErrorMessage=Visa felmeddelande menuBar.debug.displayEuropeStatus=Visa Europa-status menuBar.debug.displayMonarchPanel=Visa monarkpanel @@ -262,7 +268,6 @@ colopediaAction.goods.name=Varor colopediaAction.nations.name=Nationer colopediaAction.nationTypes.name=Nationella fördelar colopediaAction.resources.name=Bonusresurser -colopediaAction.skills.name=Yrkesmän colopediaAction.terrain.name=Terrängtyp colopediaAction.units.name=Trupper colopediaAction.name=%object% (Colopedia) @@ -321,8 +326,7 @@ renameAction.name=Döp om reportCargoAction.name=Fraktgodsrapport reportColonyAction.name=Kolonirådgivare reportCongressAction.name=Kontinentala regeringen -# Fuzzy -reportEducationAction.name=Utbildning +reportEducationAction.name=Utbildningsrapport reportExplorationAction.name=Utforskningsrapport reportForeignAction.name=Utrikesrådgivare reportHighScoresAction.name=Högsta poäng @@ -489,6 +493,8 @@ model.option.initialImmigration.name=Inledande immigrationsmål model.option.initialImmigration.shortDescription=Antal kross som produceras innan de första europeiska utvandrarna dyker upp. model.option.peaceProbability.name=Sannolikhet för fred model.option.peaceProbability.shortDescription=Chans i procent per runda att freden fortsätter med en arg AI. +model.option.equipEuropeanRecruits.name=Utrusta europeiska rekryter +model.option.equipEuropeanRecruits.shortDescription=Nyutbildade eller rekryterade enheter i Europa är utrustade enligt deras standardroll. gameOptions.colony.name=Kolonialternativ gameOptions.colony.shortDescription=Innehåller alternativ som berör hur en koloni fungerar. model.option.customIgnoreBoycott.name=Tullhus ignorerar bojkott @@ -497,9 +503,11 @@ model.option.expertsHaveConnections.name=Specialister har kontakter model.option.expertsHaveConnections.shortDescription=Specialister kan utnyttja sitt kontaktnät för att tillhandahålla minimala mängder av resurser för produktion i fabriker. model.option.saveProductionOverflow.name=Spara produktionsöverflöd model.option.saveProductionOverflow.shortDescription=Spara överflöd av hammare, klockor och kors. +model.option.clearHammersOnConstructionSwitch.name=Nollställ hammare vid byggnationsbyte +model.option.clearHammersOnConstructionSwitch.shortDescription=Nollställ antalet hammare om byggnationen ändras. model.option.allowStudentSelection.name=Tillåt val av student model.option.allowStudentSelection.shortDescription=Tillåter att studenter utses manuellt snarare än automatiskt -model.option.enableUpkeep.name=Byggnader kräver underhåll +model.option.enableUpkeep.name=Byggnader kräver underhåll (EXPERIMENTELLT) model.option.enableUpkeep.shortDescription=Betala för underhåll av byggnader eller produktionen blir lidande. model.option.naturalDisasters.name=Naturkatastrofer model.option.naturalDisasters.shortDescription=Sannolikheten för naturkatastrofer per omgång. @@ -524,8 +532,7 @@ model.option.lastYear.shortDescription=Det sista året i spelet. model.option.lastColonialYear.name=Sista koloniala spelåret model.option.lastColonialYear.shortDescription=Sista spelåret för en kolonial spelare. gameOptions.prices.name=Prisalternativ -# Fuzzy -gameOptions.prices.shortDescription=Initala prisomfånget för olika varor. +gameOptions.prices.shortDescription=Innehåller spelgenererade inställningar som styr startpriset för olika varor. model.option.food.minimumPrice.name=Ursprungliga minimipriser för livsmedel model.option.food.maximumPrice.name=Högsta startpris för livsmedel model.option.food.spread.name=Skillnaden mellan köp- och säljpris för livsmedel. @@ -588,6 +595,7 @@ model.option.landMass.shortDescription=Alternativ för att ange andelen landmass model.option.landGeneratorType.name=Landmasstyp (EXPERIMENTELL!) model.option.landGeneratorType.shortDescription=Alternativ för att välja typ av landgenerator som ska användas. model.option.landGeneratorType.classic.name=Klassisk +model.option.landGeneratorType.classic.shortDescription=En stor kontinent och några öar. model.option.landGeneratorType.continent.name=Kontinent model.option.landGeneratorType.continent.shortDescription=De mesta av landytan består av en enda kontinent. model.option.landGeneratorType.archipelago.name=Skärgård @@ -608,6 +616,8 @@ model.option.maximumLatitude.name=Högsta latitud model.option.maximumLatitude.shortDescription=Den sydligaste latituden. Ett positivt värde anger sydlig breddgrad. model.option.riverNumber.name=Antal floder model.option.riverNumber.shortDescription=Alternativ för att ange antal floder på genererade kartor. +model.option.riverNumber.verySmall.name=Mycket liten +model.option.riverNumber.verySmall.shortDescription=Mycket få floder model.option.mountainNumber.name=Antal berg model.option.mountainNumber.shortDescription=Alternativ för att ange antal berg på genererade kartor. model.option.rumourNumber.name=Antal rykten om Förlorade Städer @@ -635,6 +645,7 @@ model.option.importSettlements.shortDescription=Möjliggör import av inhemska b clientOptions.name=Inställningar clientOptions.shortDescription=Prioriterade klientalternativ clientOptions.personal.name=Personliga +clientOptions.personal.shortDescription=Spelarspecifika alternativ. model.option.playerName.name=Spelarens namn: clientOptions.gui.name=Visning clientOptions.gui.shortDescription=Innehåller inställningar för att justera spelets utseende. @@ -782,13 +793,17 @@ clientOptions.savegames.shortDescription=Sparade spel model.option.showSavegameSettings.name=Dialog för sparade spel: model.option.showSavegameSettings.shortDescription=Visa en dialog för att ställa in serveralternativ när man läser in ett sparat spel. clientOptions.savegames.showSavegameSettings.never.name=Aldrig +clientOptions.savegames.showSavegameSettings.never.shortDescription=Visa aldrig dialog för att ställa in serveralternativ clientOptions.savegames.showSavegameSettings.multiplayer.name=Multiplayer +clientOptions.savegames.showSavegameSettings.multiplayer.shortDescription=Visa endast dialog för att ställa in serveralternativ i flerspelarläge clientOptions.savegames.showSavegameSettings.always.name=Alltid -model.option.autosavePeriod.name=Automatspara var x drag: +clientOptions.savegames.showSavegameSettings.always.shortDescription=Visa alltid dialog för att ställa in serveralternativ +model.option.autosavePeriod.name=Automatspara var x drag model.option.autosavePeriod.shortDescription=Den frekvens med vilken spelet automatiskt sparas, där 0 stänger av den automatiska sparningen. -model.option.autosaveValidity.name=Radera automatiskt sparade filer efter x dagar: -model.option.autosaveDelete.name=Ta bort automatiskt sparade spel: -model.option.autosaveDelete.shortDescription=Ta bort automatiskt sparade spel när ett nytt spel påbörjas. +model.option.autosaveValidity.name=Radera automatiskt sparade filer efter x dagar +model.option.autosaveValidity.shortDescription=Tid i dagar som automatiskt sparad fil är giltig efter skapelsen. Sätt till 0 för att inte sätta någon gräns. +model.option.autosaveDelete.name=Ta bort automatiskt sparade spel +model.option.autosaveDelete.shortDescription=Ta bort gamla automatiskt sparade spel när ett nytt spel påbörjas. clientOptions.warehouse.name=Varulagerinställningar clientOptions.warehouse.shortDescription=Ändra standardinställningen för varulager och tullhus. model.option.customStock.name=Standardlagerhållning i tullhus @@ -816,16 +831,28 @@ model.option.showEndTurnDialog.name=Dialog vid sista omgången model.option.indianDemandResponse.name=Svar på krav från indianer # Fuzzy model.option.indianDemandResponse.shortDescription=När de infödda frågar efter eller begär varor, så acceptera alltid, avvisa alltid eller begär instruktioner. +clientOptions.other.indianDemandResponse.ask.name=Fråga +clientOptions.other.indianDemandResponse.ask.shortDescription=Fråga vad du vill göra clientOptions.other.indianDemandResponse.accept.name=Acceptera +clientOptions.other.indianDemandResponse.accept.shortDescription=Acceptera alla krav från infödingar +clientOptions.other.indianDemandResponse.reject.name=Avslå +clientOptions.other.indianDemandResponse.reject.shortDescription=Avvisa alla krav från infödingar model.option.unloadOverflowResponse.name=Lasta av överflöd -model.option.unloadOverflowResponse.shortDescription=Vad som skall göras när ett förråd blir överfyllda vid urlastning. +model.option.unloadOverflowResponse.shortDescription=Vad som skall göras när ett förråd blir överfyllt vid urlastning. clientOptions.other.unloadOverflowResponse.ask.name=Fråga +clientOptions.other.unloadOverflowResponse.ask.shortDescription=Fråga vad du vill göra clientOptions.other.unloadOverflowResponse.never.name=Aldrig +clientOptions.other.unloadOverflowResponse.never.shortDescription=Lasta aldrig av varor som skulle svämma över ett lager +clientOptions.other.unloadOverflowResponse.always.name=Alltid +clientOptions.other.unloadOverflowResponse.always.shortDescription=Lasta alltid av varor även om det svämmar över ett lager clientOptions.mods.name=Ändringar clientOptions.mods.shortDescription=Alternativ för att aktivera spelmodifikationer. -# Fuzzy -model.ability.alwaysOfferedPeace.name=Européerna erbjuder alltid fred +model.ability.addTaxToBells.name=Lägg till skatt till klockor +model.ability.addTaxToBells.shortDescription=Skattesatsen fungerar som en bonus till klockproduktion +model.ability.alwaysOfferedPeace.name=Alltid erbjuden fred +model.ability.alwaysOfferedPeace.shortDescrption=Européiska nationer är alltid beredda att erbjuda fred model.ability.ambushBonus.name=Bakhållsbonus +model.ability.ambushBonus.shortDescription=Bakhållsbonus när enheter attackeras i det fria. model.ability.ambushPenalty.name=Bakhållsavdrag model.ability.ambushPenalty.shortDescription=Denna nation får avdrag för bakhåll model.ability.autoProduction.name=Automatisk produktion @@ -841,23 +868,27 @@ model.ability.bornInColony.name=Född i kolonierna # Fuzzy model.ability.bornInIndianSettlement.name=Född i inhemska bosättningar model.ability.build.name=Bygg -# Fuzzy -model.ability.build.shortDescription=Möjligheten att bygga enheter, utrustning eller byggnader. -# Fuzzy -model.ability.buildCustomHouse.name=Förmåga att bygga tullhus -# Fuzzy -model.ability.buildFactory.name=Förmåga att bygga fabriker +model.ability.build.shortDescription=Möjligheten att bygga enheter, utrustning eller byggnader, ibland av en viss typ +model.ability.buildCustomHouse.name=Bygga tullhus +model.ability.buildCustomHouse.shortDescription=Förmåga att bygga tullhus +model.ability.buildFactory.name=Bygga fabriker +model.ability.buildFactory.shortDescription=Förmåga att bygga fabriker model.ability.canBeCaptured.name=Kan fångas +model.ability.canBeCaptured.shortDescription=Enheter som kan fångas model.ability.canBeEquipped.name=Kan utrustas +model.ability.canBeEquipped.shortDescription=Enheter som kan utrustas model.ability.canRecruitUnit.name=Rekrytera enheter model.ability.canRecruitUnit.shortDescription=Denna nation har förmågan att rekrytera enheter. model.ability.captureEquipment.name=Kan ta över utrustning +model.ability.captureEquipment.shortDescription=Förmågan att fånga utrustning model.ability.captureGoods.name=Erövra varor model.ability.captureGoods.shortDescription=Denna trupp kan erövra varor. model.ability.captureUnits.name=Kan fånga enheter +model.ability.captureUnits.shortDescription=Förmågan att fånga enheter i strid model.ability.carryGoods.name=Frakta varor model.ability.carryGoods.shortDescription=Denna trupp kan frakta varor. model.ability.carryTreasure.name=Kan bära skatter +model.ability.carryTreasure.shortDescription=Den här enheten kan bära skatter model.ability.carryUnits.name=Frakta trupper model.ability.carryUnits.shortDescription=Denna trupp kan frakta andra trupper. # Fuzzy @@ -866,24 +897,26 @@ model.ability.demoteOnAllEquipLost.name=Degraderas efter nederlag model.ability.disposeOnAllEquipLost.name=Kan inte fångas # Fuzzy model.ability.disposeOnCombatLoss.name=Kan inte fångas +model.ability.disposeOnCombatLoss.shortDescription=Denna enhet förstörs om den förlorar en strid model.ability.electFoundingFather.name=Välj statsbildare model.ability.electFoundingFather.shortDescription=Denna nation kan välja statsbildare model.ability.evadeAttack.name=Undvik angrepp model.ability.evadeAttack.shortDescription=Denna enhet har möjligheten att undvika angrepp. model.ability.export.name=Exportera varor -# Fuzzy -model.ability.export.shortDescription=Kan exportera varor direkt till Europa. +model.ability.export.shortDescription=Kan exportera varor direkt till Europa model.ability.foundColony.name=Grunda koloni -# Fuzzy -model.ability.foundColony.shortDescription=Denna trupp kan grunda en ny koloni. +model.ability.foundColony.shortDescription=Denna trupp kan grunda en ny koloni model.ability.foundInLostCity.name=Hittad i förlorade städer model.ability.foundsColonies.name=Grundar kolonier model.ability.foundsColonies.shortDescription=Denna nation har förmågan att grunda nya kolonier. -# Fuzzy model.ability.hasPort.name=Tillgång till havet -# Fuzzy model.ability.hasPort.shortDescription=Denna plats står i direkt eller indirekt förbindelse med havet model.ability.ignoreEuropeanWars.name=Ignorera europeiska krig +model.ability.ignoreEuropeanWars.shortDescription=Krigsförklaringar i Europa påverkar inte längre denna nation +model.ability.improveTerain.name=Förbättra terräng +model.ability.improveTerain.shortDescription=Den här enheten kan förbättra terräng +model.ability.inciteNatives.name=Hetsa infödda +model.ability.inciteNatives.shortDescription=Denna enhet kan hetsa infödda nationer mot en fiendenation model.ability.independenceDeclared.name=Oavhängighetsförklaring # Fuzzy model.ability.independenceDeclared.shortDescription=Denna stat har utropat sin oavhängighet @@ -898,12 +931,12 @@ model.ability.native.name=Indian model.ability.native.shortDescription=Indian model.ability.navalUnit.name=Sjötrupp model.ability.navalUnit.shortDescription=Denna enhet är en marin enhet. -# Fuzzy -model.ability.person.name=Är en person -# Fuzzy -model.ability.pillageUnprotectedColony.name=Kan plundra kolonier som är utan försvar -# Fuzzy -model.ability.piracy.name=Är en piratenhet +model.ability.person.name=Person +model.ability.person.shortDescription=Denna enhet är en person +model.ability.pillageUnprotectedColony.name=Plundring +model.ability.pillageUnprotectedColony.shortDescription=Kan plundra kolonier som är utan försvar +model.ability.piracy.name=Sjöröveri +model.ability.piracy.shortDescription=Detta är en piratenhet # Fuzzy model.ability.plunderNatives.name=Bonus för indianskatter # Fuzzy @@ -912,15 +945,23 @@ model.ability.repairUnits.name=Reparations enheter # Fuzzy model.ability.repairUnits.shortDescription=Kan reparera vissa typer av skadade enheter. model.ability.royalExpeditionaryForce.name=Kungliga expeditionskåren -# Fuzzy -model.ability.royalExpeditionaryForce.shortDescription=Denna nation är en kunglig expeditionskår -# Fuzzy -model.ability.selectRecruit.name=Möjlighet att välja rekryter -# Fuzzy -model.ability.supportUnit.name=Är en stödenhet +model.ability.royalExpeditionaryForce.shortDescription=Denna nation har en kunglig expeditionskår +model.ability.rumoursAlwaysPositive.name=Rykten alltid positiva +model.ability.rumoursAlwaysPositive.shortDescription=Att undersöka rykten har alltid ett positivt resultat +model.ability.seeAllColonies.name=Se alla kolonier +model.ability.seeAllColonies.shortDescription=Kan se alla utländska kolonier +model.ability.selectRecruit.name=Välj rekryter +model.ability.selectRecruit.shortDescription=Möjlighet att välja rekryter +model.ability.speakWithChief.name=Tala med hövding +model.ability.speakWithChief.shortDescription=Denna enhet kan tala med hövdingen i en indianby +model.ability.spyOnColony.name=Spionera på kolonin +model.ability.spyOnColony.shortDescription=Denna enhet kan spionera på utländska kolonier +model.ability.supportUnit.name=Stödenhet +model.ability.supportUnit.shortDescription=Denna enhet finns i stödtrupper model.ability.teach.name=Lär ut färdigheter -# Fuzzy -model.ability.teach.shortDescription=Expertenheter kan undervisa andra sina färdigheter. +model.ability.teach.shortDescription=Expertenheter kan lära ut sina färdigheter +model.ability.tradeWithForeignColonies.name=Handel med utländska kolonier +model.ability.tradeWithForeignColonies.shortDescription=Möjlighet att handla med utländska kolonier # Fuzzy model.ability.undead.name=Hämndläge # Fuzzy @@ -942,10 +983,13 @@ model.modifier.nativeAlarmModifier.name=Indianorosfördel model.modifier.nativeAlarmModifier.shortDescription=Denna nation skapar mindre oro bland indianerna model.modifier.nativeConvertBonus.name=Bonus för indiankonvertiter model.modifier.nativeConvertBonus.shortDescription=Denna nation konverterar fler indianer +model.modifier.offence.name=Attackbonus model.modifier.offenceAgainst.name=Brott mot model.modifier.offenceAgainst.shortDescription=Förbättrar chansen till seger när du attackerar. model.modifier.religiousUnrestBonus.name=Fördel vad gäller missnöje i trosuppfattningsfrågor model.modifier.religiousUnrestBonus.shortDescription=Denna nation orsakar mer missnöje i trosuppfattningsfrågor +model.modifier.tileTypeChangeProduction.name=Timmeravkastning +model.modifier.tileTypeChangeProduction.shortDescription=Ökar mängden virke som produceras när skog avverkas. model.modifier.tradeBonus.name=Handelsfördel model.modifier.tradeBonus.shortDescription=Denna nation drar fördelar av handel model.modifier.warehouseStorage.description=Varulager @@ -1024,8 +1068,7 @@ model.building.schoolhouse.description=En koloni med en befolkning på minst 4 k model.building.shipyard.name=Skeppsvarv model.building.shipyard.description=Skeppsvarvet gör så att kolonisterna kan producera fisk på havsrutor i närheten av kolonin, reparera skepp och också så att de kan bygga nya skepp. \n\nOm du bygger ett skeppsvarv kan kolonin bygga nya skepp. model.building.stables.name=Stallar -# Fuzzy -model.building.stables.description=Förbättrar kapaciteten för hästavel +model.building.stables.description=Stallet förbättrar kapaciteten för hästavel genom att minska flockarnas storlek. model.building.stockade.name=Pålverk model.building.stockade.description=Pålverket, vilket kan byggas senare när kolonins befolkning uppnått 3, skyddar kolonisterna från anfall. Pålverket kan uppgraderas till en skans, vilken ger bättre skydd och kan bombardera kaparfartyg och fienders sjötrupper på närliggade havsrutor. Skansen kan ersättas av en fästning senare när befolkningen uppnått 8. \n\nOm du bygger ett pålverk ökar det försvaret med 100%. model.building.textileMill.name=Textilfabrik @@ -1091,8 +1134,7 @@ model.foundingFather.peterStuyvesant.description=Möjliggör byggandet av tullhu model.foundingFather.peterStuyvesant.text=Utsågs till generalguvernör för Nya Holland som, efter den brittiska invasion han var oförmögen att hindra, blev New York. model.foundingFather.peterStuyvesant.birthAndDeath=1592-1672 model.foundingFather.janDeWitt.name=Jan de Witt -# Fuzzy -model.foundingFather.janDeWitt.description=Möjliggör handel med främmande kolonier. +model.foundingFather.janDeWitt.description=Möjliggör handel med främmande kolonier, och mer information om rivaliserande kolonier visas. model.foundingFather.janDeWitt.text=De Witt var en stor holländsk statsman. Han representerade handelsmännen och uppmuntrade industri och handel. Han underhandlade och slöt flera viktiga avtal som ledde till slutet av kriget mellan Holland och England. model.foundingFather.janDeWitt.birthAndDeath=1625-1672 model.foundingFather.ferdinandMagellan.name=Ferdinand Magellan @@ -1282,7 +1324,7 @@ model.improvement.road.description=Väg model.improvement.road.name=Väg model.improvement.road.occupationString=V model.limit.independence.coastalColonies.name=Gränsen för den kustnära kolonin -model.limit.independence.coastalColonies.description=Du behöver minst %limit% kustnära kolonierna för att förklara självständighet. +model.limit.independence.coastalColonies.description=Du behöver minst %limit% kustnära {{plural:%limit%|one=koloni|other=kolonier}} för att kunna förklara självständighet. model.limit.independence.rebels.name=Rebellgräns model.limit.independence.rebels.description=Minst %limit%% av dina kolonister måste stödja sjävständighet. model.limit.independence.year.name=Årsgräns @@ -1430,6 +1472,13 @@ model.role.scout.name=Spejare model.role.scout.noequipment=inga hästar model.role.soldier.name=Soldat model.role.soldier.noequipment=inga musköter +model.role.change.dragoon=Utrusta som dragon +model.role.change.pioneer=Utrusta med verktyg +model.role.change.scout=Utrusta som scout +model.role.change.default.soldier=Beväpna +model.role.change.dragoon.default=Ta bort all utrustning +model.role.change.pioneer.default=Ta bort verktyg +model.role.change.pioneer.soldier=Beväpna model.settlement.aztec.capital.name=Aztekstad model.settlement.aztec.name=Aztekstad model.settlement.aztec.plural=städer @@ -1470,8 +1519,7 @@ model.tile.marsh.description=Kärr är en sort våtmark med gräs, vass säv och model.tile.mixedForest.name=Blandskog model.tile.mixedForest.description=Blandskog som återfinns på tempererade latituder kan producera spannmål, timmer, pälsar och lite bomull. Om skogen huggs ner blir de till slätt. model.tile.mountains.name=Berg -# Fuzzy -model.tile.mountains.description=Berg sträcker sig över den omgivande terrängen inom ett begränsat område. Berg är vanligen brantare än kullar. De är svåra att färdas genom och kolonier kan inte grundas i dem. Men de är användbara för gruvdrift och både järnmalm och silver kan brytas i dem. +model.tile.mountains.description=Berg sträcker sig över den omgivande terrängen inom ett begränsat område. Berg är vanligen brantare än kullar. De är svåra att färdas genom och kolonier kan inte grundas i dem. De erbjuder en hög försvarsbonus, men denna kan inte förstärkas ytterligare genom fortifikation. De är användbara för gruvdrift och både järnmalm och silver kan brytas i dem. model.tile.ocean.name=Hav model.tile.ocean.description=Hav är stora saltvattenytor med gott fiske. Mängden fisk ökar med närheten till land och i synnerhet flodmynningar. model.tile.plains.name=Slätt @@ -1533,7 +1581,7 @@ model.unit.masterFurTrader.description=En pälshandlare gör pälskappor av päl model.unit.masterGunsmith.name={{plural:%number%|one=Mästervapensmed|other=Mästervapensmedar|default=Mästervapensmed}} model.unit.masterGunsmith.description=En vapensmed framställer musköter av redskap. model.unit.masterSugarPlanter.name={{plural:%number%|one=Professionell sockerodlare|other=Professionella sockerodlare|default=Professionell sockerodlare}} -model.unit.masterSugarPlanter.description=Sockerodlaren odllar sockerrör. +model.unit.masterSugarPlanter.description=Sockerodlaren odlar sockerrör. model.unit.masterTobaccoPlanter.name={{plural:%number%|one=Mästartobaksodlare|other=Mästartobaksodlare|default=Mästartobaksodlare}} model.unit.masterTobaccoPlanter.description=Tobaksodlaren odlar tobak. model.unit.masterTobacconist.name={{plural:%number%|one=Mästartobakshandlare|other=Mästartobakshandlare|default=Mästartobakshandlare}} @@ -1562,8 +1610,7 @@ model.unit.artillery.name={{plural:%number%|one=Artilleripjäs|other=Artilleripj model.unit.artillery.description=Artilleri är bra på att anfalla och försvara kolonier, men är mycket sårbart på öppen mark. model.unit.damagedArtillery.name={{plural:%number%|one=Skadat artilleri|other=Skadade artillerier|default=Skadat artilleri}} model.unit.damagedArtillery.description=Skadat artilleri är som artilleri på alla sätt men svagare. -# Fuzzy -model.unit.treasureTrain.name=Värdetransport +model.unit.treasureTrain.name={{plural:%number%|one=Värdetransport|other=Värdetransporter|default=Värdetransport}} model.unit.treasureTrain.description=En värdetransports enda syfte är att transportera guld som hittats i ruinerna av en förlorad stad eller plundrats från en indianbosättning. Om du flyttar den in i en av dina kolonier så kommer Kronan att erbjuda sig att transportera den till Europa för en "rimlig kostnad". Om du har en galeon så kan du transportera den till Europa själv. model.unit.wagonTrain.name={{plural:%number%|one=Konvoj|other=Konvojer|default=Konvoj}} model.unit.wagonTrain.description=Konvojen kan frakta upp till 200 enheter varor över land. Du kan använda den för att handla med andra spelare eller för att flytta varor mellan dina egna kolonier. @@ -1580,16 +1627,14 @@ model.unit.undead.description=De vandöda är den flygande holländarens besätt # Fuzzy model.unit.colonialRegular.dragoon=Kolonialt kavalleri model.unit.colonialRegular.soldier=Kontinentalarmé -# Fuzzy -model.unit.hardyPioneer.pioneer=Hårdför pionjär -# Fuzzy -model.unit.jesuitMissionary.missionary=Jesuitmissionär +model.unit.hardyPioneer.pioneer={{plural:%number%|one=Hårdför pionjär|other=Hårdföra pionjärer|default=Hårdför pionjär}} +model.unit.jesuitMissionary.missionary={{plural:%number%|one=Jesuitmissionär|other=Jesuitmissionärer|default=Jesuitmissionär}} model.unit.kingsRegular.cavalry=Kavalleri model.unit.kingsRegular.infantry=Infanteri model.unit.seasonedScout.scout={{plural:%number%|one=Erfaren spejare|other=Erfarna spejare|default=Erfaren spejare}} -# Fuzzy -model.unit.veteranSoldier.dragoon=Veterandragon +model.unit.veteranSoldier.dragoon={{plural:%number%|one=Veterandragon|other=Veterandragoner|default=Veterandragoner}} model.unit.veteranSoldier.soldier={{plural:%number%|one=Veteransoldat|other=Veteransoldater|default=Veteransoldat}} +model.unit.colonialRegular.workingAs=Soldat model.unit.elderStatesman.workingAs=Statsman model.unit.expertFarmer.workingAs=Bonde model.unit.expertFisherman.workingAs=Fiskare @@ -1619,7 +1664,7 @@ model.building.locationLabel=I %location% model.colony.badGovernment=Ledarskapet i %colony% är odugligt. Produktionen i kolonin är reducerad. model.colony.governmentImproved1=Ledarskapet i %colony% har förbättrats men har fortfarande brister. Produktionen i kolonin är fortfarande reducerad. model.colony.governmentImproved2=Ledarskapet i %colony% är inte längre odugligt. Produktionen i kolonin är inte längre reducerad. -model.colony.insufficientProduction=%outputAmount% mer %outputType% kan produceras i %colony%, om vi bara hade %inputAmount% mer överskott av %inputType%. +model.colony.insufficientProduction=%outputAmount% mer %outputType% skulle kunna produceras i %colony%, om vi bara hade %consumptionDeficit% mer. model.colony.minimumColonySize=Tack vare %object% så kan inte befolkningen minskas mer model.colony.stance.alliance=%nation% är glada att se en pålitlig allierad som dig. model.colony.stance.ceaseFire=%nation% blänger på dig, och förbereder uppenbarligen sitt försvar. @@ -1630,13 +1675,13 @@ model.colony.unbuildable=%colony% kan inte bygga %object% just nu. %object% har model.colony.veryBadGovernment=Ledarskapet i %colony% är odugligt. Produktionen i kolonin är starkt reducerad. model.colonyTile.claim=(kräv %direction%) model.diplomaticTrade.receive.contact=Broderliga hälsningar från den ärorika %nation% nationen. -model.diplomaticTrade.receive.diplomatic=Låt oss förhandla med %nation%. +model.diplomaticTrade.receive.diplomatic=Låt oss förhandla med {{tag:country|%nation%}}. model.diplomaticTrade.receive.trade=Låt oss överväga %nation% handelserbjudande. -model.diplomaticTrade.receive.tribute=%nation% kräver en tribut av oss! +model.diplomaticTrade.receive.tribute={{tag:country|%nation%}} kräver en tribut av oss! model.diplomaticTrade.send.contact=Vi har stött på medlemmar i den %nation% nationen. -model.diplomaticTrade.send.diplomatic=Låt oss överväga vår diplomatiska situation med %nation%. -model.diplomaticTrade.send.trade=Låt oss föreslå en handel med %nation% på %settlement%. -model.diplomaticTrade.send.tribute=Vi kräver tribut av %nation% vid %settlement%. +model.diplomaticTrade.send.diplomatic=Låt oss överväga vår diplomatiska situation med {{tag:country|%nation%}}. +model.diplomaticTrade.send.trade=Låt oss föreslå en handel med {{tag:country|%nation%}} på %settlement%. +model.diplomaticTrade.send.tribute=Vi kräver tribut av {{tag:country|%nation%}} vid %settlement%. model.direction.N.name=norr model.direction.NE.name=nordöst model.direction.E.name=öst @@ -1646,22 +1691,25 @@ model.direction.SW.name=sydväst model.direction.W.name=väst model.direction.NW.name=nordväst model.historyEventType.abandonColony.description=Du ger upp kolonin %colony%. -model.historyEventType.cityOfGold.description=%nation% upptäcker %city%, en utav de sju "Städerna av guld", och en skatt bestående av %treasure% guld. -model.historyEventType.colonyConquered.description=Din koloni %colony% har erövrats av %nation%. -model.historyEventType.colonyDestroyed.description=Din koloni %colony% är förstörd av %nation%. -# Fuzzy -model.historyEventType.declareIndependence.description=Du förstör %nation%s bosättning %settlement%. -model.historyEventType.destroyNation.description=%nation% förstör %nativeNation%. +model.historyEventType.ceaseFire.description=Fredsavtal med {{tag:country|%nation%}}. +model.historyEventType.cityOfGold.description={{tag:country|%nation%}} upptäcker %city%, en utav de sju "Städerna av guld", och en skatt bestående av %treasure% guld. +model.historyEventType.colonyConquered.description=Din koloni %colony% har erövrats av {{tag:country|%nation%}}. +model.historyEventType.colonyDestroyed.description=Din koloni %colony% är förstörd av {{tag:country|%nation%}}. +model.historyEventType.conquerColony.description=Du erövrar {{tag:country|%nation%}}s koloni %colony%. +model.historyEventType.declareIndependence.description=Du utropar oavhängighet från kronan. +model.historyEventType.declareWar.description=Krig har förklarats med {{tag:country|%nation%}}. +model.historyEventType.destroyNation.description={{tag:country|%nation%}} förstör %nativeNation%. +model.historyEventType.destroySettlement.description=Du förstör %nation%s bosättning %settlement%. model.historyEventType.discoverNewWorld.description=Du utforskar den nya världen. -model.historyEventType.discoverRegion.description=%nation% upptäcker %region%. -model.historyEventType.formAlliance.description=Alliansen framförhandlad med %nation%. +model.historyEventType.discoverRegion.description={{tag:country|%nation%}} upptäcker %region%. +model.historyEventType.formAlliance.description=Alliansen framförhandlad med {{tag:country|%nation%}}. model.historyEventType.foundColony.description=Du grundar kolonin %colony%. model.historyEventType.foundingFather.description=%father% går med i den kontinentala kongressen. model.historyEventType.independence.description=Du uppnår oavhängighet från kronan. -model.historyEventType.makePeace.description=Fredsavtal med %nation%. -model.historyEventType.meetNation.description=Du möter %nation%. -model.historyEventType.nationDestroyed.description=!%nation% finns inte längre i Nya världen. -model.historyEventType.spanishSuccession.description=%loserNation% avstår alla sina kolonier i den nya världen till %nation%. +model.historyEventType.makePeace.description=Fredsavtal med {{tag:country|%nation%}}. +model.historyEventType.meetNation.description=Du möter nationen %nation%. +model.historyEventType.nationDestroyed.description=Den %nation% nationen finns inte längre i Nya världen. +model.historyEventType.spanishSuccession.description={{tag:country|%loserNation%}} avstår alla sina kolonier i den nya världen till {{tag:country|%nation%}}. model.indianSettlement.mostHatedNone=Inga model.indianSettlement.mostHatedUnknown=Okänd model.indianSettlement.nameUnknown=Okänd @@ -1729,8 +1777,7 @@ model.advantages.selectable.name=Valbar model.advantages.selectable.shortDescription=Nationella fördelar är valbara och behöver inte vara unika. model.nationState.aiOnly.name=Endast AI model.nationState.available.name=tillgänglig -# Fuzzy -model.nationState.available.shortDescription=Du erövrar %nation%s koloni %colony%. +model.nationState.available.shortDescription=Du kan spela som denna nation model.nationState.notAvailable.name=ej tillgänglig model.noClaimReason.europeans.description=Detta markområde har tagits i anspråk av en annan Europeisk nation. model.noClaimReason.natives.description=Detta markområde har tagits i anspråk av en infödingsstam. @@ -1742,8 +1789,8 @@ model.noClaimReason.water.description=Vi gör inte anspråk på vattnen. model.noClaimReason.worked.description=En annan bosättning använder redan detta landområde. model.player.forces=%nation%s styrkor model.player.independentMarket=Europa -model.player.startGame=Efter flera månader till sjöss anländer du slutligen till kusten av en okänd kontinent. Segla {{tag:%direction%|west=westward|east=eastward|default=into the wind}} för att upptäcka den Nya Världen och hävda Kronans överhöghet över den. -model.player.waitingFor=Väntar på: %nation% +model.player.startGame=Efter flera månader till sjöss anländer du slutligen till kusten av en okänd kontinent. Segla {{tag:%direction%|west=västerut|east=österut|default=dit vindarna bär}} för att upptäcka den Nya Världen och hävda Kronans överhöghet över den. +model.player.waitingFor=Väntar på: {{tag:country|%nation%}} model.regionType.coast.name=Kust model.regionType.coast.unknown=Okänd kustregion model.regionType.desert.name=Öken @@ -1782,7 +1829,7 @@ model.tradeItem.gold.name=Guld model.tradeItem.gold.description=totalt %amount% guld model.tradeItem.goods.name=Varor model.tradeItem.incite.name=Förklara krig mot -model.tradeItem.incite.description=krig mot %nation% +model.tradeItem.incite.description=krig mot {{tag:country|%nation%}} model.tradeItem.stance.name=Hållning model.tradeItem.unit.name=Trupp model.tradeRoute.invalidStop=Stop %name% är ogiltigt. @@ -1800,10 +1847,9 @@ model.unit.underRepair=Reparation(%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S -model.unit.unitState.skipped=W +model.unit.unitState.skipped=X model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G model.noAddReason.alreadyPresent.description=Finns redan på denna plats. @@ -1834,11 +1880,13 @@ model.colony.warehouseOverfull=Ditt varulager i %colony% innehåller nu så myck model.colony.warehouseSoonFull=Ditt varulager i %colony% kommer efter nästa drag att innehålla så mycket %goods% som kan lagras där. %amount% enheter av %goods% kommer att gå förlorade. model.colony.warehouseWaste=Ditt varulager i %colony% innehåller redan så mycket %goods% som kan lagras där. %waste% enheter gick förlorade. model.colonyTile.resourceExhausted=Resursen %resource% är slut i %colony%. +# Fuzzy model.game.spanishSuccession=Ers excellens, det spanska tronföljdskriget har tagit slut i Europa. Under Utrechtfördragets statuter tvingades %loserNation% att överlämna alla kolonier i Nya Världen till %nation%! model.indianSettlement.mission.denounced=Din missionär i %settlement% har avrättats! model.player.colonyGoodsParty.harbour=Kolonisterna i %colony% har kastat %amount% enheter av %goods% i hamnen som protest mot den orättfärdiga beskattningen från Kronan! model.player.colonyGoodsParty.horses=Dina kolonister i %colony% har frigivit %amount% hästar i protest mot den orättfärdiga skatten från kronan! model.player.colonyGoodsParty.landLocked=Kolonisterna i %colony% har bränt %amount% enheter av %goods% på marknadsplatsen som protest mot den orättfärdiga beskattningen från Kronan! +# Fuzzy model.player.dead.european=Ers Excellens, %nation% har deklarerat att de fullständigt drar sig tillbaka från Nya Världen! model.player.dead.native=Ers excellens, %nation% har tillintetgjorts. model.player.disaster.bankruptcy.start=Du kunde inte betala för underhåll av alla byggnader. Omfattande sanktioner mot produktion tillämpas. @@ -1849,12 +1897,16 @@ model.player.foundingFatherJoinedCongress=%foundingFather% ingår nu i regeringe model.player.interventionForceArrives=Den utlovade insatsstyrkan anländer! model.player.soLDecrease=Medlemsskap i Frihetens söner i dina kolonier har fallit till %newSoL% procent! model.player.soLIncrease=Medlemsskap i Frihetens söner i dina kolonier har stigit till %newSoL% procent! +# Fuzzy model.player.stance.alliance.declared=Ers nåd, %nation% är nu våra allierade! model.player.stance.alliance.others=Ers nåd, %attacker% och %defender% har ingått en allians. +# Fuzzy model.player.stance.ceaseFire.declared=Ers nåd, %nation% har gått med på vapenstillestånd! model.player.stance.ceaseFire.others=Ers nåd, %attacker% har ingått vapenstillestånd med %defender%. +# Fuzzy model.player.stance.peace.declared=Ers nåd, det råder fred mellan oss och %nation%! model.player.stance.peace.others=Ers nåd, det råder nu fred mellan %attacker% och %defender%. +# Fuzzy model.player.stance.war.declared=Dåliga nyheter, ers nåd, %nation% har förklarat krig mot oss! model.player.stance.war.others=Ers nåd, %attacker% har förklarat krig mot %defender%. combat.automaticDefence=Din %unit% i %colony% har tagit till vapen för att försvara kolonin! @@ -1870,7 +1922,7 @@ combat.enemyShipEvaded=%enemyNation%s %enemyUnit% har klarat sig undan en attack combat.enemyShipSunk=%unit% har sänkt %enemyNation%s %enemyUnit%! combat.equipmentCaptured=Tag er i akt, %nation%s krigare har skaffat sig %equipment%! combat.goodsStolen=%enemyNation%s %enemyUnit% stjäl %amount% %goods% i %colony%! -combat.indianPlunder=%colony% plundras på %amount% av %enemyNation%s %enemyUnit%. +combat.indianPlunder=%enemyNation%s %enemyUnit% plundras på %amount% guld från %colony%. combat.indianTreasure=Du plundrar %settlement% på %amount% guld. combat.nativeCapitalBurned=Du har bränt %nation%s huvudstad %name% till marken, och %nation% kapitulerar inför din makt! combat.newConvertFromAttack=En skrämd %unit% från %nation% ansluter sig till dig! @@ -1923,13 +1975,14 @@ main.defaultPlayerName=Spelarnamn main.javaVersion=Java version %minVersion% eller nyare rekommenderas för att köra FreeCol (%version% detected, använd --no-java-check för att hoppa över denna kontroll). main.memory=Du måste tilldela mer än %memory% byte minne till JVM. Starta om FreeCol med: java -Xmx%minMemory%M -jar FreeCol.jar main.userDir.fail=FreeCol kan inte hitta lämpliga kataloger att spara användardata i. Fortsätter, men räkna med problem. -client.choicePlayer=Välj en spelare: +client.choicePlayer=Välj en nation: +client.debugConnect=Du kan inte ansluta till ett existerande spel i felsökningsläge. metaServer.couldNotConnect=Kunde tyvärr inte ansluta till meta-servern. Försök senare. metaServer.communicationError=Fel uppstod vid kommunikation med meta-servern. Försök senare. abandonEducation.action.studying=studerar abandonEducation.action.teaching=undervisar -abandonEducation.no=Nej, fortsätt utbildningen -abandonEducation.yes=Ja, lämna kolonin +abandonEducation.no=Fortsätt utbildningen +abandonEducation.yes=Överge utbildning armedUnitSettlement.attack=Attackera armedUnitSettlement.tribute=Kräv tribut boycottedGoods.dumpGoods=Dumpa varor @@ -1938,9 +1991,10 @@ buy.moreGold=Begär lägre pris buy.takeOffer=Antag erbjudandet buy.text=%nation% skulle vilja sälja %goods% till dig för %gold% guld: clearTradeRoute.text=Din %unit% är tilldelad handelsrutt %route%. Att ange en destination kommer att ta den från handelsrutten. Är du säker att du vill göra detta? -confirmHostile.alliance=Du kan inte anfalla en allierad nation! Vill du verkligen bryta din allians med %nation% och förklara krig? +confirmHostile.alliance=Du kan inte anfalla en allierad nation! Vill du verkligen bryta din allians med {{tag:country|%nation%}} och förklara krig? +# Fuzzy confirmHostile.ceaseFire=Du har undertecknat en vapenvila med %nation%. Vill du verkligen anfalla? -confirmHostile.peace=Du har fred med %nation%. Vill du verkligen förklara krig mot dem? +confirmHostile.peace=Du har fred med {{tag:country|%nation%}}. Vill du verkligen förklara krig mot dem? danger.high=mycket bättre beväpnade än oss danger.low=är inget hot mot oss danger.normal=kan visa sig vara ett hot @@ -1999,8 +2053,8 @@ defeated.text=Du har blivit besegrad! Skulle du vilja: defeated.yes=Stanna kvar och se hur det går defeatedSinglePlayer.text=Du har blivit besegrad!\n\nDet är nu den mörka nattens tid, när kyrkogårdar gäspar och själva helvetet andas ut sin smitta över denna jord, nu skulle jag kunna dricka hett blod! och göra sådana bittra dåd som skulle få dagen att skaka om den såg dem. defeatedSinglePlayer.yes=Aktivera hämndläge -diplomacy.offerAccepted=%nation% har godtagit ditt generösa erbjudande. -diplomacy.offerRejected=%nation% har avslagit ditt generösa erbjudande. +diplomacy.offerAccepted={{tag:country|%nation%}} har godtagit ditt generösa erbjudande. +diplomacy.offerRejected={{tag:country|%nation%}} har avslagit ditt generösa erbjudande. disbandUnit.text=Är du säker på att du vill demobilisera denna trupp? disbandUnit.yes=Demobilisera disembark.text=Var hälsad sjöman, vill du lämna skeppet? @@ -2042,8 +2096,8 @@ move.noAccessContact=Ers Excellens, vi måste först upprätta kontakt med %nati move.noAccessGoods=%nation% kommer inte att byteshandla med en tom %unit%. move.noAccessSettlement=%nation% låter inte våra trupper av typ %unit% komma in i deras bosättning. move.noAccessSkill=Vår trupp av typen %unit% kan inte lära sig något av urinvånarna. -move.noAccessTrade=Vi har inte befogenhet att handla med andra europeiska nationer som%nation%. -move.noAccessWar=Vi kan inte handla med%nation% medan vi är i krig med dem. +move.noAccessTrade=Vi har inte befogenhet att handla med andra europeiska nationer som {{tag:country|%nation%}}. +move.noAccessWar=Vi kan inte handla med {{tag:country|%nation%}} medan vi är i krig med dem. move.noAccessWater=Vår trupp av typen %unit% måste landstiga innan den kan gå in i bosättningen. move.noAttackWater=Vår %unit% måste landa innan den kan attackera. move.noTile=Vår %unit% finns inte på kartan! @@ -2060,8 +2114,7 @@ scoutSettlement.speakDie=Du har brutit stammens heliga tabu! Vi skall binda dig scoutSettlement.speakNothing=Vi är alltid glada att kunna välkomna resenärer från %nation%. scoutSettlement.speakTales=Vi är glada att kunna välkomna långväga resenärer. Kom, sitt med oss runt elden och låt oss berätta för dig om dessa trakter. sellProposition.text=Vill du sälja lite varor? -# Fuzzy -trade.noTrade=Handel avböjs. +trade.noTrade=Handel avböjd vid %settlement%. trade.noTradeGoods=Tyvärr, vi har inget behov av mer %goods% trade.noTradeHaggle=Vi börjar bli trötta på ditt ständiga köpslående. trade.noTradeHostile=Vi föraktar dig och dina varor. Försvinn! @@ -2082,17 +2135,18 @@ tradeRoute.unloadStopImport=Lossade %amount% %goods% och kasserade %more%. tradeRoute.unloadStopNoExport=Lossade inget %goods% med %more% mer sparat ombord. tradeRoute.wait=Har inget arbete att göra, väntar. traderoute.warehouseCapacity=Om du sätter i land din %unit% i %colony% så skulle varulagrets kapacitet överskridas. %amount% %goods% skulle gå förlorade. Vill du lasta ur varorna i alla fall? -# Fuzzy -twoTurnsPerYear=Från och med år %year% kommer det att vara två varv per år, i stället för ett!! +twoTurnsPerYear=Från och med år %year% kommer det att vara %amount% varv per år, i stället för ett! server.badColor=Ogiltig färg server.badNation=Ogiltig nation server.badNationType=Ogiltig typ av nation server.couldNotConnect=Kunde inte skapa anslutning till servern. +server.couldNotLogin=Kan inte logga in på servern. server.errorStartingGame=Ett fel uppstod när spelet skulle startas. server.fileNotFound=Kunde inte hitta filen med angivet filnamn. server.incompatibleVersions=Det sparade spel som du försöker läsa in är inkompatibelt med denna version av FreeCol. server.invalidPlayerNations=Varje spelare måste välja en unik nation innan spelet kan starta. server.maximumPlayers=Beklagar, maximalt antal spelare har redan anslutit sig till spelet. +# Fuzzy server.noRouteToServer=Servern kan inte öppnas för allmänheten. Du behöver justera dina brandväggsinställningar så att anslutningar tillåts på den port du angav. server.notAllReady=Alla spelare är inte klara att börja spela än! server.onlyAdminCanLaunch=Beklagar, enbart serverns administratör kan starta spelet. @@ -2113,6 +2167,11 @@ giveIndependence.otherAnnounce=%nation% har besegrat %ref% och blivit självstä giveIndependence.unitsAcquired=Följande Kungliga Expeditionskårsenheter har överlämnats till dina segrande styrkor: %units% indianSettlement.mission.enemyDenounce=en %enemy% missionär anklagade vår missionär i %settlement% för kätteri, men %nation% avslog yrkandet. indianSettlement.mission.noDenounce=%nation% avvisar alla anklagelser om kätteri, och avrättar din missonär som en falsk profet. +indianSettlement.mission.tension.angry=Missionären fångades, %nation% förkastar din nya religion. +indianSettlement.mission.tension.content=Mission grundades, %nation% närmar sig din nya religion med nyfikenhet. +indianSettlement.mission.tension.displeased=Mission grundades, %nation% är upprörda. +indianSettlement.mission.tension.happy=Mission grundades, %nation% närmar sig din nya religion med glädje. +indianSettlement.mission.tension.hateful=Missionären offrades, %nation% skrattar åt din nya religion. scoutSettlement.tributeAgree=Vi går med på att betala %amount% guld för att bevara freden, men försök inte med detta en gång till! scoutSettlement.tributeDisagree=Vi går inte med på era krav. Ge er av från våra marker! colopedia.birthAndDeath=Födelse och död @@ -2186,6 +2245,7 @@ colopedia.unit.offensivePower=Anfallsstyrka: colopedia.unit.price=Pris i Europa: colopedia.unit.productionBonus=Produktions{{plural:%number%|one=modifierare|other=modifierare}}: colopedia.unit.requirements=Förutsättningar: +# Fuzzy colopedia.unit.school=Skola behövs för att utbilda: colopedia.unit.skill=Specialkunskap: report.labour.allColonists=Alla kolonisatörer @@ -2219,8 +2279,6 @@ report.colony.making.noconstruction.description=%colony%: Inget är under konstr report.colony.making.noteach.description=%colony%: %teacher% saknar en student report.colony.name.description=Listan över kolonier report.colony.name.header=Koloni -report.colony.plow.header=P -report.colony.road.header=R report.continentalCongress.elected=Vald: %turn% report.continentalCongress.none=(ingen) report.continentalCongress.recruiting=Rekryterar @@ -2270,15 +2328,15 @@ report.requirements.surplus=Ett överskott av %goods% framställs i report.trade.afterTaxes=Inkomst efter skatt report.trade.beforeTaxes=Inkomst före skatt report.trade.cargoUnits=Enheter i last -report.trade.hasCustomHouse=* Denna koloni har ett tullhus; dessa varor exporteras. +report.trade.hasCustomHouse=* Denna koloni har ett tullhus; dessa varor kan exporteras. report.trade.totalDelta=Sammanlagd produktion report.trade.totalUnits=Totalt antal enheter report.trade.unitsSold=Antal köpta eller sålda enheter report.turn.filter=Visa inte denna typ av meddelanden (%type%) report.turn.ignore=Ignorera detta meddelande (Koloni: %colony%, Vara: %goods%) -report.turn.playerNation=%nation% för %player% # Fuzzy -aboutPanel.copyright=Copyright © 2002-2014 FreeCol-teamet +report.turn.playerNation=%nation% för %player% +aboutPanel.copyright=Copyright © 2002-2015 FreeCol-teamet aboutPanel.legalDisclaimer=FreeCol är fri mjukvara: du kan vidaredistribuera den och/eller modifiera den under vad som specifieras i GNU General Public License som denna publicerats av Free Software Foundation, antingen version 2 av licensen eller någon senare version. aboutPanel.officialSite=Officiell hemsida: aboutPanel.sfProject=SourceForge-projekt: @@ -2286,8 +2344,7 @@ aboutPanel.version=Version: buildingToolTip.breeding=Du behöver minst %number% {{plural:%number%|%goods%}} att föda upp %goods%. buildQueuePanel.buildings=Byggnader buildQueuePanel.buildQueue=Byggkö -# Fuzzy -buildQueuePanel.buyBuilding=Köp byggnad +buildQueuePanel.buyBuilding=Köp %buildable% buildQueuePanel.compactView=Kompakt visning buildQueuePanel.currentlyBuilding=Bygger: %buildable% buildQueuePanel.populationTooSmall=Befolkning %number% @@ -2295,13 +2352,13 @@ buildQueuePanel.requires=Kräver: %string% buildQueuePanel.showAll=Visa allt buildQueuePanel.units=Trupper captureGoodsDialog.title=Plundringslast -cargoPanel.cargoAndSpace=Fraktgods ombord på %name% (%space% {{plural:%space%|one=rymmer|other=rymmer|default=rymmer}} vänster) +cargoPanel.cargoAndSpace=Fraktgods ombord på %name% (%space% {{plural:%space%|one=plats|other=platser|default=platser}} kvar) chatPanel.message=Meddelande chooseFoundingFatherDialog.title=Nominera grundare colonyPanel.colonyUnits=Kolonienheter colonyPanel.inPort=I hamn colonyPanel.outsideColony=Utanför kolonin -colonyPanel.producing=Producerar: +colonyPanel.producing=producerar: colonyPanel.reducePopulation=Om du minskar befolkningen under %number%, kan inte %colony% längre bygga %buildable%. colonyPanel.unitChange=Vid ankomst till din koloni blev din %oldType% en %newType%. colonyPanel.warehouse=Lager @@ -2313,7 +2370,9 @@ colonyPanel.notBestTile=%unit% kan producera mer %goods% på %tile%. confirmDeclarationDialog.areYouSure.no=Kanske senare confirmDeclarationDialog.areYouSure.text=Låt oss kasta av oket av den tyranni som %monarch% utsätter oss för och förklara våra kolonier för oavhängiga från kronan! confirmDeclarationDialog.areYouSure.yes=Frihet eller döden! +# Fuzzy confirmDeclarationDialog.defaultCountry=%nation%s förenta stater +# Fuzzy confirmDeclarationDialog.defaultNation=Den fria nationen %nation% confirmDeclarationDialog.enterCountry=Hädanefter skall vårt land vara känt som confirmDeclarationDialog.enterNation=och varje medborgare i vårt ärorika land skall vara stolta över att kallas för @@ -2339,9 +2398,9 @@ negotiationDialog.add=Lägg till negotiationDialog.cancel=Avbryt negotiationDialog.clear=Rensa negotiationDialog.contact.tutorial=Du träffar på andra européer. De konkurrerar med dig om land och rikedomar, och kan mycket väl dra ut i krig mot dig. Men efter att Jan de Witt har anslutit sig till kolonialstyret så kan du handla med dem. -negotiationDialog.demand=%nation% kräver av %otherNation% +negotiationDialog.demand={{tag:country|%nation%}} kräver av {{tag:country|%otherNation%}} negotiationDialog.exchange=i utbyte mot -negotiationDialog.offer=%nation% erbjuder %otherNation% +negotiationDialog.offer={{tag:country|%nation%}} erbjuder {{tag:country|%otherNation%}} negotiationDialog.send=Skicka negotiationDialog.title.contact=Träffar andra européer negotiationDialog.title.diplomatic=Diplomatiska förhandlingar @@ -2363,10 +2422,10 @@ findSettlementPanel.displayAll=Hitta alla bosättningar findSettlementPanel.displayOnlyEuropean=Hitta endast Europeiska bosättningar findSettlementPanel.displayOnlyNatives=Hitta endast inhemska bosättningar findSettlementPanel.name=Hitta bosättning -firstContactDialog.meeting.natives=Träffar infödingarna... +firstContactDialog.meeting.natives=Träffar infödingarna firstContactDialog.meeting.natives.tutorial=Du träffar på indianer. Sänd dina spejare till deras bosättningar för att lära dig mer om dem, och dina kontraktarbetare och nybyggare för att lära sig mer av dem. Sänd dina skepp och konvojer till deras bosättningar om du önskar handla med dem. -firstContactDialog.meeting.AZTEC=Azteknationen... -firstContactDialog.meeting.INCA=Inkariket... +firstContactDialog.meeting.aztec=Azteknationen +firstContactDialog.meeting.inca=Inkariket firstContactDialog.welcomeOffer.text=%nation% välkomnar dig. Vi är en strålande nation på %camps% %settlementType%. För att fira vår vänskap erbjuder vi generöst det land du nu bor på som en gåva. Vill du acceptera vårt fördrag och leva i fred med oss som bröder? firstContactDialog.welcomeSimple.text=%nation% välkomar dig. Vi är en strålande nation på %camps% %settlementType%. Vill du leva i fred med oss som bröder? abandonColony.no=Avbryt @@ -2388,7 +2447,9 @@ indianSettlementPanel.learnableSkill=Följande specialkunskaper lärs ut i denna indianSettlementPanel.highlyWanted=Denna bosättning vill mycket gärna köpa: indianSettlementPanel.otherWanted=Andra varor som kan säljas vid denna bosättning är: indianSettlementPanel.mostHated=Den mest hatade nationen i denna bosättning: +infoPanel.defenseBonus=Försvar %bonus%% infoPanel.endTurn=Tryck på Enter för att avsluta draget. +infoPanel.movementCost=Förflyttning %cost% infoPanel.moves=Steg: loadingSavegameDialog.port=Port: loadingSavegameDialog.privateMultiplayer=Privat flerspelarspel @@ -2476,8 +2537,7 @@ warehouseDialog.exportLevel.shortDescription=Exportera inte något under denna n warehouseDialog.highLevel.shortDescription=Ge mig en varning när antalet i lager överskrider denna procentandel av kapaciteten warehouseDialog.lowLevel.shortDescription=Ge mig en varning när antalet i lager sjunker under denna procentandel av kapaciteten warehouseDialog.name=Varulager -# Fuzzy -workProductionPanel.zeroThreshold=Ingen +workProductionPanel.zeroThreshold=Ingen negativ produktion nameCache.base.colony=Koloni nameCache.base.settlement=Bosättning nameCache.base.ship=Fartyg diff --git a/data/strings/FreeColMessages_tl.properties b/data/strings/FreeColMessages_tl.properties index 73a956873..bc3c575e8 100644 --- a/data/strings/FreeColMessages_tl.properties +++ b/data/strings/FreeColMessages_tl.properties @@ -160,8 +160,9 @@ cli.no-memory-check=laktawan ang pagsusuri ng alaala cli.no-sound=patakbuhing walang tunog ang FreeCol cli.private=pagsimulain ang isang pansariling serbidor (hindi nakalathala sa tagapaghain ng meta) cli.seed=magbigay ng isang SEED para sa di-tunay na alin mang pagpiling tagalikha ng bilang -cli.server-name=tumukoy ng isang pinasadyang PANGALAN para sa serbidor +# Fuzzy cli.server=pagsimulain ang isang nakatatayo ng mag-isang serbidor sa ibabaw ng tinukoy na daungan +cli.server-name=tumukoy ng isang pinasadyang PANGALAN para sa serbidor cli.splash=ipakita ang ang isang talaksang may sumasaboy na larawan sa panooran habang ikinakarga ang laro cli.tc=ikarga ang kabuoan ng pagpapalit na may ibinigay na PANGALAN cli.timeout=bilang ng mga segundo na maghihintay ang tagapaghain ng sagot para sa isang tanong @@ -229,7 +230,6 @@ colopediaAction.goods.name=Mabuting mga dala-dalahin colopediaAction.nations.name=Mga Bansa colopediaAction.nationTypes.name=Pambansang mga Kapakinabangan colopediaAction.resources.name=Karagdagang mga Mapagkukunan -colopediaAction.skills.name=Mga kasanayan colopediaAction.terrain.name=Mga uri ng lupain colopediaAction.units.name=Mga yunit (bahagi) colopediaAction.name=%object% (Colopedia) @@ -1239,6 +1239,7 @@ model.improvement.road.description=Daan model.improvement.road.name=Daan model.improvement.road.occupationString=D model.limit.independence.coastalColonies.name=Hangganan ng Kolonyang Pangdalampasigan +# Fuzzy model.limit.independence.coastalColonies.description=Nangangailangan ka ng kahit na %limit% mga kolonyang pandalampasigan upang makapagpahayag ng kasarinlan. model.limit.independence.rebels.name=Hangganan ng Manghihimagsik model.limit.independence.rebels.description=Hindi dapat bababa sa %limit%% ng mga kolonista mo ang tatangkilik sa pagsasarili. @@ -1568,6 +1569,7 @@ model.colony.badGovernment=Kulang sa katalaban ang pamahalaan ng %colony%. Naaan model.colony.goodGovernment=Uminam na ang katalaban ng pamahalaan! Katumbas na o lumampas na sa %number% bahagdan ang damdaming mapanghimagsik sa loob ng %colony%. model.colony.governmentImproved1=Uminam na ang pamahalaan ng %colony%, ngunit kulang pa rin sa katalaban. Naaangkop pa rin ang\nmga pagmumulta sa produksyon. model.colony.governmentImproved2=Uminam na ang pamahalaan ng %colony%. Hindi na naaangkop ang mga pagmumulta sa produksyon. +# Fuzzy model.colony.insufficientProduction=%outputAmount% dagdag pang %outputType% ang magagawa sa %colony%, kung mayroon lamang tayong %inputAmount% dagdag pang %inputType% bilang pasobra. model.colony.lostGoodGovernment=Bumaba ang katalaban ng pamahalaan! Hindi na katumbas ng o lampas na sa %number% bahagdan ang damdaming mapanghimagsik sa loob ng %colony%. Hindi na nakakatamo ng anumang bonus sa produksyon ang kolonya. model.colony.lostVeryGoodGovernment=Bumaba ang katalaban ng pamahalaan! Hindi na katumbas o lumampas na sa %number% bahagdan ang damdaming mapanghimagsik sa loob ng %colony%. Nawala ang ilang mga bonus sa produksyon. @@ -1585,21 +1587,29 @@ model.direction.SW.name=timog-kanluran model.direction.W.name=kanluran model.direction.NW.name=hilaga-kanluran model.historyEventType.abandonColony.description=Iniwanan mo ang kolonya ng %colony%. +# Fuzzy model.historyEventType.cityOfGold.description=Natuklasan ng %nation% ang %city%, isa sa Pitong mga Lungsod ng Ginto, at isang kayamanan ng gintong %treasure%. +# Fuzzy model.historyEventType.colonyConquered.description=Sinakop ng %nation% ang iyong kolonyang %colony%. +# Fuzzy model.historyEventType.colonyDestroyed.description=Winasak ng %nation% ang iyong kolonyang %colony%. # Fuzzy model.historyEventType.conquerColony.description=Nangangahas kang tanggapin ang Aming may kagandahang loob na katakdaan subalit umiiwas din sa pagbabayad? Ang ganyang pagdadalawang-mukha ay magtatamo ng mapait na gantimpala ng Aming pagkayamot. # Fuzzy model.historyEventType.declareIndependence.description=Wawasakin mo ang isang maliit na pamayanang %settlement% ng %nation%. +# Fuzzy model.historyEventType.destroyNation.description=Wawasakin ng %nation% ang %nativeNation%. model.historyEventType.discoverNewWorld.description=Tuklasin mo ang Bagong Mundo. +# Fuzzy model.historyEventType.discoverRegion.description=Natuklasan ng %nation% ang %region%. model.historyEventType.foundColony.description=Inilunsad mo ang kolonya ng %colony%. model.historyEventType.foundingFather.description=Sumali si %father% sa Kongresong Kontinental. model.historyEventType.independence.description=Nakamit mo ang kasarinlan mula sa Korona. +# Fuzzy model.historyEventType.meetNation.description=Nakaharap mo ang %nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=Wala na ngayong %nation% sa Bagong Mundo. +# Fuzzy model.historyEventType.spanishSuccession.description=Isinusuko ng %loserNation% sa %nation% ang lahat ng kanilang mga kolonyang nasa Bagong Mundo. model.indianSettlement.mostHatedNone=Wala model.indianSettlement.nameUnknown=Hindi alam @@ -1644,8 +1654,10 @@ model.messageType.warehouseCapacity.name=Sukat ng Mailululan sa Bahay-Imbakan model.messageType.warning.name=Mga babala model.monarch.action.addToRef.text=Ang Korona ay nagdagdag ng %number% {{plural:%number%|%unit%}} sa Royal na Puwersang Pang-ekspedisyon. Nagpahayag ng pangangamba ang mga pinunong pangkolonya. model.monarch.action.addToRef.no=Nagawa na +# Fuzzy model.monarch.action.declarePeace.text=May karikitan kaming sumasang-ayon sa isang kasunduang pangkapayapaan sa piling ng %nation%. model.monarch.action.declarePeace.no=Nagawa na +# Fuzzy model.monarch.action.declareWar.text=Ang kawalang-hiyaan ng %nation% ang pumupuwersa sa Amin na magpahayag ng digmaan sa kanila! model.monarch.action.declareWar.no=Nagawa na # Fuzzy @@ -1690,6 +1702,7 @@ model.noClaimReason.worked.description=Mayroon nang ibang maliit na pamayanan na model.player.forces=Mga Puwersa ng %nation% model.player.independentMarket=Europa model.player.startGame=Makalipas ang ilang mga buwan habang nasa dagat, narating mo na rin sa wakas ang sa may baybayin ng isang hindi nakikilalang kontinente. Maglayag {{tag:%direction%|west=pakanluran|east=pasilangan|default=pasagupa sa hangin}} upang matuklasan ang Bagong Mundo at angkinin ito para sa Korona. +# Fuzzy model.player.waitingFor=Hinihintay ang: %nation% model.regionType.coast.name=Dalampasigan model.regionType.coast.unknown=Hindi Nalalamang Rehiyon ng Dalampasigan @@ -1744,9 +1757,9 @@ model.unit.underRepair=Kinukumpuni (%turns% {{plural:%turns%|one=lumiliko sa|oth model.unit.unitState.active=- model.unit.unitState.fortified=P model.unit.unitState.fortifying=P -model.unit.unitState.improving=# model.unit.unitState.inColony=H model.unit.unitState.sentry=B +# Fuzzy model.unit.unitState.skipped=L model.unit.unitState.toAmerica=P model.unit.unitState.toEurope=P @@ -1783,12 +1796,14 @@ model.colony.warehouseOverfull=Umabot na sa kanyang kayang mailulang %goods% ang model.colony.warehouseSoonFull=Lalampas na sa kanyang kayang mailulang %goods% ang iyong bahay-imbakang nasa %colony% sa loob ng susunod na pagkakataon. Masasayang ang %amount% mga yunit ng %goods%. model.colony.warehouseWaste=Lumagpas na sa kanyang kayang mailulang %goods% ang iyong bahay-imbakang nasa %colony%. Nasayang ang %waste% mga yunit. model.colonyTile.resourceExhausted=Naubos na ang pangangailangang %resource% na nasa %colony% +# Fuzzy model.game.spanishSuccession=Aming Kamahalan, nagwakas na sa Europa ang Digmaan ng Kastilang Paghahalili. Sa Tratado ng Utrecht, ang %loserNation% ay napilitang isuko sa %nation% ang lahat ng mga kolonyang nasa Bagong Mundo! model.indianSettlement.mission.denounced=Pinaratangan ang iyong misyonero sa %settlement% at pinaslang! model.player.autoRecruit=Ang kaguluhang pangrelihiyon sa %europe% ay nag-udyok sa %unit% upang mandayuhan. model.player.colonyGoodsParty.harbour=Nagtapon sa daungan ang iyong mga kolonistang nasa %colony% ng %amount% ng mga yunit ng %goods% bilang pagtutol laban sa hindi patas na pagbubuwis ng Korona! model.player.colonyGoodsParty.horses=Nagpalaya ang mga kolonista mong nasa %colony% ng %amount% mga kabayo bilang pagtutol sa ganitong hindi patas na pagbubuwis mula sa Korona! model.player.colonyGoodsParty.landLocked=Nagsunog sa pook ng pamilihan ang iyong mga kolonistang nasa %colony% ng %amount% ng mga yunit ng %goods% bilang pagtutol laban sa hindi patas na pagbubuwis ng Korona! +# Fuzzy model.player.dead.european=Aming Kamahalaan, nagpahayag ang %nation% ng ganap na pag-alis mula sa mga usapin ng Bagong Mundo! model.player.dead.native=Aming kamahalan, nawasak na ang %nation%. model.player.disaster.bankruptcy.start=Nabigo ka sa pagbabayad para sa pangangalaga ng lahat ng mga gusali. Ilalapat ang matinding mga multa sa produksiyon. @@ -1800,12 +1815,16 @@ model.player.foundingFatherJoinedCongress=Nakilahok na sa kongreso si %foundingF model.player.interventionForceArrives=Dumating na ang ipinangakong Puwersang Pampamamagitan! model.player.soLDecrease=Bumaba na hanggang %newSoL% bahagdan ang kasapian sa Mga Anak na Lalaki ng Kalayaan na nasa mga kolonya mo! model.player.soLIncrease=Tumaas na hanggang %newSoL% bahagdan ang kasapian sa Mga Anak na Lalaki ng Kalayaan na nasa mga kolonya mo! +# Fuzzy model.player.stance.alliance.declared=Aming Kamahalan, umanib na sa atin ang %nation%! model.player.stance.alliance.others=Aming Kamahalan, umanib sa %attacker% ang %defender%. +# Fuzzy model.player.stance.ceaseFire.declared=Aming Kamahalan, pumayag ang %nation% na makipagtigil-putukan sa atin! model.player.stance.ceaseFire.others=Aming Kamahalan, pumayag ang %attacker% na makipagtigil-putukan sa %defender%. +# Fuzzy model.player.stance.peace.declared=Aming Kamahalan, nakipagkasundo sa atin ng kapayapaan ang %nation%! model.player.stance.peace.others=Aming Kamahalan, nakipagkasundo ang %attacker% ng kapayapaan sa %defender%. +# Fuzzy model.player.stance.war.declared=Masamang balita, Aming Kamahalan, nagpahayag ng digmaan laban sa atin ang %nation%! model.player.stance.war.others=Aming Kamahalan, nagpahayag ng digmaan ang %attacker% laban sa %defender%. combat.automaticDefence=Ang %unit% mo sa %colony% ay nagsigamit ng mga sandata upang maipagtanggol ang kolonya! @@ -1821,6 +1840,7 @@ combat.enemyShipEvaded=Nakaiwas ang %enemyUnit% ng %enemyNation% mula sa isang p combat.enemyShipSunk=Napalubog ng %unit% ang %enemyUnit% ng %enemyNation%! combat.equipmentCaptured=Mag-ingat, napasakamay ng mga matatapang ng %nation% ang %equipment%! combat.goodsStolen=Nagnakaw ng %amount% ng mga %goods% ang %enemyUnit% ng %enemyNation% mula sa %colony%! +# Fuzzy combat.indianPlunder=Nangulimbat ng %amount% ang %enemyUnit% ng %enemyNation% mula sa %colony%. combat.indianRaid=Nag-ulat ang aming mga espiya na nilusob ng %nation% ang kolonyang %colonyNation% ng %colony%. combat.indianSurprise=Nagsagawa ng hindi inaakalang paglusob ang %nation% doon sa %colony%, na nakapagpangamba sa aming mga kolonista. Ipinagkakaila ng pinuno ng %nation% ang pagiging kasangkot. @@ -1873,13 +1893,16 @@ error.couldNotLoad=Naganap ang isang kamalian habang sinusubok na ikarga ang lar # Fuzzy error.couldNotSave=Naganap ang isang kamalian habang sinasagip ang laro! main.defaultPlayerName=Pangalan ng Manlalaro +# Fuzzy client.choicePlayer=Pumili lamang po ng isang manlalaro: metaServer.couldNotConnect=Paumanhin, hindi makaugnay/makakunekta sa serbidor ng meta. Pakisubok na lang uli mamaya. metaServer.communicationError=Nagkaroon ng isang kamalian habang nakikipagtalastasan/nakikipag-ugnayan sa serbidor ng meta. Pakisubok muli mamaya. abandonEducation.action.studying=nag-aaral abandonEducation.action.teaching=nagtuturo +# Fuzzy abandonEducation.no=Huwag, ipagpatuloy ang edukasyon abandonEducation.text=Kapag nilisan ng %unit% mo ang %colony% pababayaan nito ang %action% sa loob ng %building%, nakatitiyak ka bang dapat itong umalis? +# Fuzzy abandonEducation.yes=Oo, umalis mula sa kolonya boycottedGoods.dumpGoods=Itambak ang mabubuting mga daladalahin boycottedGoods.text=Dahil binoykoteo (hindi tinangkilik) ng Korona ang %goods%, hindi mo maipagbibili ang mga ito sa %europe%. Nais mo bang bayaran ang mga utang mo (%amount% ng ginto), o ibig mong itapon ang mga ito sa daungan, na wawasak sa mga ito? @@ -1887,8 +1910,11 @@ buy.moreGold=Humiling ng mas mababa pang halaga buy.takeOffer=Tanggapin ang alok buy.text=Nais ipagbili ng %nation% ang kanilang %goods% bilang kapalit ng %gold%: clearTradeRoute.text=Ang %unit% mo ay itinalagang mangalakal sa rutang %route%. Ang pagtatakda ng destinasyon nito ay makapagtatanggal nito mula sa ruta ng kalakalan. Nakatitiyak ka bang ito ang nais mong gawin? +# Fuzzy confirmHostile.alliance=Hindi mo maaaring lusubin ang isang kakamping bansa! Talaga bang nais mong putulin ang iyong pakikipagtulungan sa %nation%. +# Fuzzy confirmHostile.ceaseFire=Lumagda ka ng isang tigil putukan na kasama ang %nation%. Talaga bang nais mong lumusob? +# Fuzzy confirmHostile.peace=Mapayapa ang pakikitungo mo sa %nation%. Talaga bang nais mong magpahayag ng digmaan? error.noSuchFile=Hindi umiiral ang tinukoy na talaksan o hindi isang pangkaraniwang talaksan. # Fuzzy @@ -1942,7 +1968,9 @@ defeated.text=Natalo ka na! Nais mo bang: defeated.yes=Manatili at magmatyag defeatedSinglePlayer.text=Nagapi ka na!\n\nNgayon ay kalaliman na ng gabi, Kung kailan humihikab na ang bakuran ng mga simbahan at naghihinga ang impiyerno ng mga paminsala sa mundong ito, makainom kaya ako ngayon ng mainit na dugo?! At makagawa ng ganyang mapait na kaabalahan, habang yumayanig ang araw upang tumanaw. defeatedSinglePlayer.yes=Ipasok ang Gawi ng Paghihiganti +# Fuzzy diplomacy.offerAccepted=Tinanggap ng %nation% ang iyong masaganang alok. +# Fuzzy diplomacy.offerRejected=Tinanggap ng %nation% ang masagana mong alok. disbandUnit.text=Nakatitiyak ka bang nais mong pagwatak-watakin ang yunit na ito? disbandUnit.yes=Pagwatak-watakin na @@ -1985,7 +2013,9 @@ move.noAccessContact=Kailangan muna nating magtatag ng ugnayan sa %nation%, Kama move.noAccessGoods=Ang %nation% ay hindi makikipagkalakal sa isang %unit% na walang laman. move.noAccessSettlement=Hindi pinapahintulutan ng %nation% ang ating %unit% na pumasok sa kanilang maliit na pamayanan. move.noAccessSkill=Hindi maaaring matuto mula sa mga katutubo ang ating %unit%. +# Fuzzy move.noAccessTrade=Wala tayong kapangyarihang makipagkalakal sa ibang mga nasyong Europeo na katulad ng %nation%. +# Fuzzy move.noAccessWar=Hindi tayo maaaring makipagkalakalan sa %nation% habang may digmaan. move.noAccessWater=Kailangan lumapag ng ating %unit% bago pumasok sa maliit na pamayanan. move.noAttackWater=Dapat na lumapag muna ang aming %unit% bago lumusob. @@ -2020,6 +2050,7 @@ server.invalidPlayerNations=Kinakailangang pumili muna ng isang bukod-tanging ba server.maximumPlayers=Paumanhin, naabot na ang pinakamataas na bilang ng mga manlalaro. server.missingUserName=Ang pangalan ng tagagamit ay nawawala mula sa hiling ng paglagda. server.missingVersion=Nawawala ang bersiyon ng FreeCol mula sa hiling na paglagda. +# Fuzzy server.noRouteToServer=Hindi maaaring ipakita sa madla/publiko ang serbidor. Dapat mong baguhin ang mga pagtatakda mong pang-"pader na pamigil ng pagkalat ng apoy" (''firewall'') upang pahintulutan ang mga ugnayan/konseksyon sa daungang tinukoy mo. server.notAllReady=Hindi pa nakahandang magsimula ng laro ang lahat ng mga manlalaro! server.onlyAdminCanLaunch=Paumanhin, tanging ang tagapangasiwa lamang ng serbidor ang makapaglulunsad ng laro. @@ -2112,6 +2143,7 @@ colopedia.unit.offensivePower=Lakas ng Pagsalakay: colopedia.unit.price=Halaga sa Europa: colopedia.unit.productionBonus={{plural:%number%|isa=tagapagbago|iba=mga tagapagbago}} ng produksyon: colopedia.unit.requirements=Mga kailangan: +# Fuzzy colopedia.unit.school=Kailangang paaralan upang makapagsanay: colopedia.unit.skill=Antas ng Kasanayan: report.labour.allColonists=Lahat ng mga Kolonista @@ -2149,8 +2181,6 @@ report.colony.improve.description=Mga yunit na makapagpapainam ng produksiyon na report.colony.improve.header=Painamin # Fuzzy report.colony.improving.description=%colony%: Upang makagawa ng %amount% pang mga %goods%
Palitan ang %oldUnit% ng %unit% -# Fuzzy -report.colony.wanting.description=%colony%: Upang makagawa ng %amount% mas marami pang %goods%
Idagdag ang %unit% report.colony.making.blocking.description=%colony%: %amount% ng %goods% ang kailangan para sa %buildable% sa {{plural:%turns%|one=susunod na pagkakataon|other=loob ng %turns% na mga pagkakataon}} report.colony.making.constructing.description=%colony%: ang %buildable% ang bubuo sa {{plural:%turns%|one=susunod na pagkakataon|other=loob ng %turns% na mga pagkakataon}} report.colony.making.description=Ano ang ginagawa ng kolonyang ito @@ -2160,21 +2190,22 @@ report.colony.making.noconstruction.description=%colony%: Walang nagaganap na ko report.colony.making.noteach.description=%colony%: ang %teacher% ay kulang ng isang mag-aaral report.colony.name.description=Ang listahan ng mga kolonya report.colony.name.header=Kolonya -report.colony.plow.description=Bilang ng mga tisa ng kolonya na makikinabang mula sa Pag-aararo -report.colony.plow.header=P -report.colony.plowing.description=Ang %colony% ay maaaring makinabang mula sa pang-aararo sa {{plural:%amount%|one=isang tisa|other=%amount% na mga tisa}} +# Fuzzy report.colony.production.description=%colony%: netong produksiyon ng %goods% = %amount% +# Fuzzy report.colony.production.export.description=%colony%: ang netong produksiyon ng %goods% ay %amount% (magluluwas ng mahigit kaysa sa %export%) report.colony.production.header=Netong produksiyon ng %goods% +# Fuzzy report.colony.production.high.description=%colony%: netong produksiyon ng %goods% = %amount%, mapupuno sa {{plural:%turns%|one=susunod na pagkakataon|other=loob ng %turns% na mga pagkakataon}} +# Fuzzy report.colony.production.low.description=%colony%: netong produksiyon ng %goods% = %amount%, ubos na sa {{plural:%turns%|one=susunod na pagkakataon|other=loob ng %turns% na mga pagkakataon}} +# Fuzzy report.colony.production.waste.description=%colony%: netong produksiyon ng %goods% = %amount%, aapaw na ang bodega, masasayang ang %waste% -report.colony.road.description=Bilang ng mga tisa ng kolonya na makikinabang mula sa pagtatayo ng Daan -report.colony.road.header=D -report.colony.roadBuilding.description=Ang %colony% ay maaaring makinabang mula sa paggawa ng {{plural:%amount%|one=isang lansangan|other=%amount% na mga lansangan}} report.colony.shrinking.description=Ang %colony% ay dapat na mapaliit ng {{plural:%amount%|one=isang yunit|other=%amount% mga yunit}} upang mapainam ang produksiyon report.colony.starving.description=%colony%: kagutuman sa {{plural:%turns%|one=susunod na pagkakataon|other=sa loob ng %turns% na mga pagkakataon}} # Fuzzy +report.colony.wanting.description=%colony%: Upang makagawa ng %amount% mas marami pang %goods%
Idagdag ang %unit% +# Fuzzy report.continentalCongress.elected=Nahalal: report.continentalCongress.none=(wala) report.continentalCongress.recruiting=Pangangalap ng tauhan @@ -2215,26 +2246,25 @@ report.production.selectGoods=Pumili ng mabubuting mga dala-dalahin report.production.update=Isapanahon report.requirements.badAssignment=Ang %colony% ay may isang %expert% na kasalukuyang naghahanapbuhay bilang isang %expertWork%, habang ang isang %nonExpert% ay gumaganap bilang isang %nonExpertWork%. Mas darami ang produksyon kung magpapalitan ng mga hanapbuhay ang mga kolonista. report.requirements.canTrainExperts=Ang mga {{plural:2|%unit%}} ay maaaring sanayin doon sa -report.requirements.clearTile=Ang %type% na papunta sa %direction% ng %colony% ay makikinabang mula sa paghahawan. +# Fuzzy report.requirements.exploreTile=Ang %type% na papunta sa %direction% ng %colony% ay makikinabang mula sa panggagalugad. report.requirements.met=Naabot na ang lahat ng mga kinakailangan. report.requirements.missingGoods=Ang %colony% ay gumagawa ng %goods%, ngunit nangangailangan ng mas marami pang %input%. report.requirements.misusedExperts=Mayroong mga {{plural:2|%unit%}} na hindi naghahanapbuhay bilang %work% doon sa report.requirements.noExpert=Ang %colony% ay gumagawa ng %goods%, ngunit walang %unit%. -report.requirements.plowCenter=Ang %colony% ay makikinabang mula sa pag-aararo ng tisa nito. -report.requirements.plowTile=Ang %type% na papunta sa %direction% ng %colony% ay makikinabang mula sa pag-aararo. -report.requirements.roadTile=Ang %type% na papunta sa %direction% ng %colony% ay makikinabang mula sa paggawa ng lansangan. report.requirements.severalExperts=Ilang mga {{plural:2|%unit%}} ang naroroon sa report.requirements.surplus=Isang kalabisan ng mga %goods% ang nagagawa sa report.trade.afterTaxes=Kita makatapos ang mga pagbubuwis report.trade.beforeTaxes=Kita bago ang mga pagbubuwis report.trade.cargoUnits=Mga Yunit na nasa Kargada +# Fuzzy report.trade.hasCustomHouse=* May isang bahay-adwana ang kolonyang ito; mga iniluwas ang mabubuting mga daladalahing ito. report.trade.totalDelta=Kabuoan ng Produksyon report.trade.totalUnits=Kabuoan ng mga Yunit report.trade.unitsSold=Mga yunit na nabili o naipagbili report.turn.filter=Huwag ipakita ang ganitong uri ng mensahe (%type%) report.turn.ignore=Balewalain ang mensaheng ito (Kolonya: %colony%, Mabubuting mga Dala-dalahin: %goods%) +# Fuzzy report.turn.playerNation=%nation% ng %player% # Fuzzy aboutPanel.copyright=Karapatan sa Paglalathala © 2002-2013 Ang Pangkat ng FreeCol @@ -2267,7 +2297,9 @@ colonyPanel.notBestTile=Makagagawa ang %unit% ng marami pang %goods% sa %tile%. confirmDeclarationDialog.areYouSure.no=Maaaring mamaya na lamang confirmDeclarationDialog.areYouSure.text=Iwaksi natin ang hindi makatarungang paniniil ng %monarch% at ipahayag ang kasarinlan ng ating mga kolonya mula sa korona! confirmDeclarationDialog.areYouSure.yes=Kalayaan o Kamatayan! +# Fuzzy confirmDeclarationDialog.defaultCountry=Nagkakaisang mga Estado ng %nation% +# Fuzzy confirmDeclarationDialog.defaultNation=Malayang %nation% confirmDeclarationDialog.enterCountry=Mula ngayon, makikilala ang ating bansa bilang confirmDeclarationDialog.enterNation=at bawat mamamayan ng ating maluwalhating bansa ay magmamalaking makikilala bilang diff --git a/data/strings/FreeColMessages_tr.properties b/data/strings/FreeColMessages_tr.properties index 77ed66d11..16b158c8e 100644 --- a/data/strings/FreeColMessages_tr.properties +++ b/data/strings/FreeColMessages_tr.properties @@ -7,8 +7,11 @@ # Author: Erdemaslancan # Author: Joseph # Author: Karduelis +# Author: KorkmazO +# Author: McAang # Author: Meelo # Author: Nighteagle2000 +# Author: Rapsar # Author: Trockya # Author: Uğurkent # Author: Violetanka @@ -104,6 +107,7 @@ cargoOnCarrier=Taşıyıcının kargosu cashInTreasureTrain=Hazine trenindeki para clearOrders=Siparişleri temizle colonists=Koloniciler +colonyCenter=Koloni merkezi colopedia=Colopedi difficulty=Zorluk docks=Rıhtım @@ -144,7 +148,7 @@ unitType=Ünite Türü units=Birimler list.add=Ekle list.down=Aşağı -list.edit=Düzenle +list.edit=Değiştir list.remove=Çıkar list.up=Yukarı status.loadingGame=Lütfen bekleyin: Oyun yükleniyor @@ -197,8 +201,9 @@ cli.no-java-check=java sürüm kontrolünü atla cli.no-memory-check=hafıza kontrolünü atla cli.no-sound=FreeCol'u sessiz çalıştır cli.private=özel sunucu başlat (metasunucuda yayınlanmaz) -cli.server-name=sunucu için özel bir İSİM belirle +# Fuzzy cli.server=belirlenen portta bağımsız sunucu başlat +cli.server-name=sunucu için özel bir İSİM belirle cli.splash=oyunu yüklerken giriş ekranı resim DOSYASI göster cli.tc=İSİM ile belirlenen toplu dönüşümü yükle cli.timeout=sunucunun bir soruya yanıt için saniye olarak beklediği süre @@ -256,7 +261,6 @@ colopediaAction.goods.name=Mallar colopediaAction.nations.name=Uluslar colopediaAction.nationTypes.name=Ulus Avantajları colopediaAction.resources.name=Bonus Kaynaklar -colopediaAction.skills.name=Yetenekler colopediaAction.terrain.name=Arazi tipleri colopediaAction.units.name=Birimler declareIndependenceAction.name=Bağımsızlık İlan Et @@ -798,6 +802,7 @@ model.direction.S.name=güney model.direction.SW.name=güney-batı model.direction.W.name=batı model.direction.NW.name=kuzey-batı +# Fuzzy model.historyEventType.colonyConquered.description=Koloniniz %colony%, %nation%. tarafından fethedildi. model.indianSettlement.mostHatedNone=Hiçbiri model.indianSettlement.mostHatedUnknown=Bilinmiyor @@ -833,6 +838,7 @@ model.noClaimReason.terrain.description=Bu arazi koloni için uygun değil. model.noClaimReason.water.description=Sularda hak iddia etmeyiz. model.noClaimReason.worked.description=Zaten başka bir yerleşim bu araziyi kullanıyor. model.player.startGame=Denizde geçen aylardan sonra, nihayet bilinmeyen bir kıtanın sahillerine ulaştınız. {{tag:%direction%|west=Batıya|east=Doğuya|default=Rüzgara doğru}} yelken açarak Yeni Dünya'yı keşfedebilir ve Krallık adına bu toprakları sahiplenebilirsiniz. +# Fuzzy model.player.waitingFor=Bekleniyor: %nation% model.regionType.lake.unknown=Bilinmeyen sayfa model.regionType.river.unknown=Bilinmeyen kullanıcı @@ -873,6 +879,7 @@ model.noAddReason.occupiedByEnemy.description=Bu konum başka bir ulustan bir bi model.noAddReason.ownedByEnemy.description=Bu konum başka bir ulusa ait. model.noAddReason.wrongType.description=Bu konum için yanlış tür. model.player.alarmIncrease.tension.content=%settlement% yerleşimindeki %nation% şefi dostu %enemy% ulusunu selamlıyor. Aramızdaki dayanışmanın ilerlemesinden memnunuz fakat yerleşimcilerinin topraklarımıza sokulmasından endişe duyuyoruz. +# Fuzzy model.player.stance.war.declared=Kötü haber Ekselansları, %nation% bize savaş ilan etti! model.region.antarctic.name=Antarktika error.couldNotLoad=%name% dosyasından oyunu yüklemeye çalışırken bir hata oluştu! @@ -881,13 +888,16 @@ main.defaultPlayerName=Oyuncu Adı main.javaVersion=FreeCol oyununun çalıştırılabilmesi için %minVersion% veya daha üst Java sürümü önerilir (tespit edilen sürüm %version%, bu denetlemeyi atlamak için --java-denetimi-yok seçeneğini kullanın). main.memory=JVM'ye %memory% bayttan daha fazla bellek atamanız gerekmektedir.\n FreeCol'u şu şekilde yeniden başlatın: java -Xmx%minMemory%M -jar FreeCol.jar main.userDir.fail=FreeCol, kullanıcı verilerini kaydetmek için uygun dizinleri bulamıyor. Devam ediliyor fakat sorun çıkması muhtemel. +# Fuzzy client.choicePlayer=Lütfen bir oyuncu seçin: metaServer.couldNotConnect=Üzgünüz, tanımlayıcı sunucuya bağlanılamıyor. Lütfen tekrar deneyin. metaServer.communicationError=Tanımlayıcı sunucuyla haberleşirken bir hata oluştu. Lütfen tekrar deneyin. abandonEducation.action.studying=öğreniyor abandonEducation.action.teaching=öğretiyor +# Fuzzy abandonEducation.no=Hayır, eğitime devam et abandonEducation.text=Eğer %unit% birimin %colony% kolonisinden ayrılırsa, %building% binasındaki %action% eylemini terketmiş olacak, yine de ayrılsın mı? +# Fuzzy abandonEducation.yes=Evet, koloniden ayrıl abandonTeaching.text=Eğer %unit% birimin %building% binasından ayrılırsa eğitim durur, ayırmak istediğine emin misin? boycottedGoods.dumpGoods=Malları Terket @@ -926,7 +936,9 @@ cashInTreasureTrain.pay=Kral eğer ganimetten %fee%% altın pay alırsa hazineni defeated.text=Yenildin! Şimdi ne yapmak istersin? defeated.yes=Kal ve izle defeatedSinglePlayer.yes=Öç Alma Moduna Gir +# Fuzzy diplomacy.offerAccepted=%nation% cömert teklifinizi kabul etti. +# Fuzzy diplomacy.offerRejected=%nation% cömert teklifinizi reddetti. disbandUnit.text=Birimi terhis etmek istediğine emin misin? disbandUnit.yes=Dağıt @@ -956,7 +968,9 @@ learnSkill.yes=Evet, isterim move.noAccessGoods=%nation% ulusu boş bir %unit% ile ticaret yapmayacak. move.noAccessSettlement=%nation% ulusu %unit% birimimizin yerleşim yerlerine girmesine izin vermiyor. move.noAccessSkill=%unit% birimimiz yerlilerden öğrenemez. +# Fuzzy move.noAccessTrade=%nation% ulusu gibi diğer Avrupalı uluslarla ticaret yapacak yetkimiz yok. +# Fuzzy move.noAccessWar=Savaş halindeyken %nation% ulusu ile ticaret yapamayız. move.noAccessWater=%unit% birimimiz yerleşime girmeden önce karaya ayak basmalı. move.noAttackWater=%unit% birimimiz saldırmadan önce karaya ayak basmalı. @@ -994,6 +1008,7 @@ report.continentalCongress.none=(hiçbiri) report.foreignAffair.numberOfColonies=Koloni sayısı report.foreignAffair.stance=Durum report.turn.ignore=Bu mesajı yoksay (Colony: %colony%, Goods: %goods%) +# Fuzzy report.turn.playerNation=%player% yönetimindeki %nation% aboutPanel.copyright=Telif Hakkı © 2002-2015 FreeCol Ekibi buildingToolTip.breeding=%goods% üretebilmen için en az %number% {{plural:%number%|%goods%}} daha lazım. @@ -1012,6 +1027,7 @@ chooseFoundingFatherDialog.title=Kurucu Görevlendir colonyPanel.colonyUnits=Koloni Birimleri colonyPanel.inPort=Limanda colonyPanel.outsideColony=Dış Koloni +# Fuzzy colonyPanel.producing=Üretilen: colonyPanel.reducePopulation=Eğer nüfus %number% seviyesinin altına düşerse %colony%, %buildable% inşa edemez. colonyPanel.bonusLabel=Bonus: %number%%extra% @@ -1021,14 +1037,17 @@ colonyPanel.royalistLabel=Sadıklar: %number% colonyPanel.notBestTile=%unit%, %tile% alanında daha fazla %goods% üretebilir. confirmDeclarationDialog.areYouSure.no=Belki Daha Sonra confirmDeclarationDialog.areYouSure.yes=Ya Özgürlük ya Ölüm! +# Fuzzy confirmDeclarationDialog.defaultCountry=%nation% Birleşik Devletleri constructionPanel.clickToBuild=Bina veya birim üretmek için üretim alanına tıklayın. constructionPanel.turnsToComplete=(Bitirmek için gereken tur: %number%) negotiationDialog.accept=Kabul et negotiationDialog.add=Ekle negotiationDialog.cancel=İptal +# Fuzzy negotiationDialog.demand=%nation% ulusunun isteği %otherNation% negotiationDialog.exchange=karşılığında +# Fuzzy negotiationDialog.offer=%nation% ulusunun teklifi %otherNation% negotiationDialog.send=Gönder editSettlementDialog.removeSettlement=Yerleşimi kaldır diff --git a/data/strings/FreeColMessages_uk.properties b/data/strings/FreeColMessages_uk.properties index e6da54357..1a0a746a0 100644 --- a/data/strings/FreeColMessages_uk.properties +++ b/data/strings/FreeColMessages_uk.properties @@ -213,8 +213,9 @@ cli.no-memory-check=Пропустити перевірку пам'яті cli.no-sound=запустити FreeCol без звуку cli.private=запустити приватний сервер (без публікації на metaserver) cli.seed=надайте ВИСІВ для генератора псевдовипадкових чисел -cli.server-name=вказати НАЗВУ сервера +# Fuzzy cli.server=запустити самостійний сервер по вказаному порту +cli.server-name=вказати НАЗВУ сервера cli.splash=відображати заставку з ФАЙЛУ під час завантаження гри cli.tc=завантажити набір правил із заданою НАЗВОЮ cli.timeout=час очікування сервера для відповіді на запит (секунди) @@ -278,7 +279,6 @@ colopediaAction.goods.name=Товари colopediaAction.nations.name=Нації colopediaAction.nationTypes.name=Національні переваги colopediaAction.resources.name=Бонусні ресурси -colopediaAction.skills.name=Знання colopediaAction.terrain.name=Типи території colopediaAction.units.name=Юніти colopediaAction.name=%object% (Колопедія) @@ -1450,6 +1450,7 @@ model.improvement.road.description=Дорога model.improvement.road.name=Дорога model.improvement.road.occupationString=R model.limit.independence.coastalColonies.name=Обмеження прибережених колоній +# Fuzzy model.limit.independence.coastalColonies.description=Вам потрібно принаймні %limit% прибережних колоній, щоб заявити про незалежність. model.limit.independence.rebels.name=Межа бунтарства model.limit.independence.rebels.description=Принаймні %limit%% ваших колоністів мають підтримувати незалежність. @@ -1804,6 +1805,7 @@ model.colony.badGovernment=Уряд %colony% неефективний. Заст model.colony.goodGovernment=Ефективність уряду підвищилася. Бунтівні настрої в %colony% тепер рівні або перевищують %number% відсотків. model.colony.governmentImproved1=Уряд %colony% поліпшено, але він досі малоефективний. Все ще застовуються штрафи на виробництво. model.colony.governmentImproved2=Уряд %colony% поліпшено. Штрафи на виробництво вже не застосовуються. +# Fuzzy model.colony.insufficientProduction=Можна виготовити на %outputAmount% більше %outputType% у %colony% за умови, що ми матимемо на %inputAmount% більше надлишку %inputType%. model.colony.lostGoodGovernment=Знизилася ефективність уряду! Повстанські настрої в %colony% більше не рівні або не перевищують %number% відсотків. Колонія більше не має отримує виробничих бонусів. model.colony.lostVeryGoodGovernment=Ефективність уряду зменшилася! Бунтівні настрої в %colony% більше не рівні або не перевищують %number% відсотків. Деякі виробничі бонуси втрачено. @@ -1818,12 +1820,17 @@ model.colony.veryBadGovernment=Уряд %colony% дуже неефективни model.colony.veryGoodGovernment=Ефективність уряду підвищилася. Бунтівні настрої в %colony% тепер дорівнює або перевищують %number% відсотків. model.colonyTile.claim=(претендує %direction%) model.diplomaticTrade.receive.contact=Братський привіт від славної нації %nation%. +# Fuzzy model.diplomaticTrade.receive.diplomatic=Давайте домовлятися з нацією %nation%. model.diplomaticTrade.receive.trade=Давайте розглянемо торгову пропозицію нації %nation%. +# Fuzzy model.diplomaticTrade.receive.tribute=Нація %nation% вимагає данини з нас! model.diplomaticTrade.send.contact=Ми зустрілись з представниками нації %nation%. +# Fuzzy model.diplomaticTrade.send.diplomatic=Давайте розглянемо нашу дипломатичну ситуацію з нацією %nation%. +# Fuzzy model.diplomaticTrade.send.trade=Дозвольте нам запропонувати торгівлю з нацією %nation% у поселенні %settlement%. +# Fuzzy model.diplomaticTrade.send.tribute=Ми вимагаємо данини з %nation% у поселенні %settlement%. model.direction.N.name=Північ model.direction.NE.name=Північний Схід @@ -1834,25 +1841,37 @@ model.direction.SW.name=Південний Захід model.direction.W.name=Захід model.direction.NW.name=Північний Захід model.historyEventType.abandonColony.description=Ви покинули колонію %colony%. +# Fuzzy model.historyEventType.ceaseFire.description=Припинено вогонь з нацією %nation%. +# Fuzzy model.historyEventType.cityOfGold.description=%nation% знайшли %city%, одне з Семи Золотих Міст. Здобич склала %treasure% золота. +# Fuzzy model.historyEventType.colonyConquered.description=Вашу колонію %colony% завоювали %nation%. +# Fuzzy model.historyEventType.colonyDestroyed.description=Вашу колонію %colony% було знищено %nation%. # Fuzzy model.historyEventType.conquerColony.description=Ви зважилися прийняти Наші щедрі умови та все ж ухиляєтеся від виплат? Така двоєдушність пожне гіркі плоди Нашого невдоволення. # Fuzzy model.historyEventType.declareIndependence.description=Ви знищили %settlement%, поселення %nation%. +# Fuzzy model.historyEventType.declareWar.description=Оголошена війна нації %nation%. +# Fuzzy model.historyEventType.destroyNation.description=%nation% знищує %nativeNation%. model.historyEventType.discoverNewWorld.description=Ви відкрили Новий Світ. +# Fuzzy model.historyEventType.discoverRegion.description=%nation% відкрили %region%. +# Fuzzy model.historyEventType.formAlliance.description=Альянс вів переговори з нацією %nation%. model.historyEventType.foundColony.description=Ви заснували колонію %colony%. model.historyEventType.foundingFather.description=%father% вступив до Континентального конгресу. model.historyEventType.independence.description=Ви досягли незалежності від Корони. +# Fuzzy model.historyEventType.makePeace.description=Мир досягнуто з нацією %nation%. +# Fuzzy model.historyEventType.meetNation.description=Ви зустріли %nation%. +# Fuzzy model.historyEventType.nationDestroyed.description=%nation% більше не присутні в Новому Світі. +# Fuzzy model.historyEventType.spanishSuccession.description=%loserNation% передали всі свої колонії Нового Світу нації %nation%. model.indianSettlement.mostHatedNone=Нічого model.indianSettlement.mostHatedUnknown=Невідомо @@ -1903,8 +1922,10 @@ model.messageType.warehouseCapacity.name=Місткість складу model.messageType.warning.name=Застереження model.monarch.action.addToRef.text=Король додав %number% {{plural:%number%|%unit%}} до чисельності Королівського Експедиційного Війська. Правителі колоній висловлюють заклопотаність. model.monarch.action.addToRef.no=Готово +# Fuzzy model.monarch.action.declarePeace.text=Ми погодилися милостиво на Мирний договір з {{tag:with|%nation%}}. model.monarch.action.declarePeace.no=Готово +# Fuzzy model.monarch.action.declareWar.text=Зухвалість {{tag:of|%nation%}} змушує Нас оголосити їм війну! model.monarch.action.declareWar.no=Готово # Fuzzy @@ -1964,6 +1985,7 @@ model.player.colonialIndependence=Тільки колоніальні гравц model.player.forces=%nation% сили model.player.independentMarket=Європа model.player.startGame=Після місяців плавання ви нарешті прибули до берегу невідомого континенту. Пливіть на {{tag:%direction%|west=захід|east=схід|default=за вітром}} щоб дослідити Новий Світ і проголосити його власністю Корони. +# Fuzzy model.player.waitingFor=Чекаємо: %nation% model.regionType.coast.name=Узбережжя model.regionType.coast.unknown=Невідомий прибережний регіон @@ -2003,6 +2025,7 @@ model.tradeItem.gold.name=Золото model.tradeItem.gold.description=сума %amount% золотих монет model.tradeItem.goods.name=Товари model.tradeItem.incite.name=Оголосити війну проти +# Fuzzy model.tradeItem.incite.description=війна проти %nation% model.tradeItem.stance.name=Положення model.tradeItem.unit.name=Юніт @@ -2024,9 +2047,9 @@ model.unit.underRepair=Ремонт (%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S +# Fuzzy model.unit.unitState.skipped=W model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G @@ -2067,6 +2090,7 @@ model.colony.warehouseSoonFull=Ваш склад в %colony% перевищит model.colony.warehouseWaste=Ваш склад в %colony% перевищив максимальну ємкість для %goods%. %waste% одиниць було втрачено. model.colony.workersEvicted=В %colony% ваші колоністи більше не можуть працювати на %location% через присутність %enemyUnit%. model.colonyTile.resourceExhausted=У %colony% вичерпався %resource% +# Fuzzy model.game.spanishSuccession=Ваше Превосходительство, в Європі закінчилася війна за Іспанський спадок. За Утрехтським мирним договором %loserNation% були вимушені передати всі свої колонії в Новому Світі нації %nation%! model.indianSettlement.mission.denounced=Вашого місіонера у %settlement% засуджено і страчено! model.indianSettlement.mission.destroyed=Ваш місіонер загинув при знищенні %settlement%. @@ -2076,6 +2100,7 @@ model.player.autoRecruit=Релігійні заворушення у %europe% model.player.colonyGoodsParty.harbour=Ваш колоніст у %colony% викинув %amount% одиниць %goods% у гавань в знак протесту проти цього несправедливого оподаткування з боку корони! model.player.colonyGoodsParty.horses=Ваш колоніст у %colony% відпустив %amount% коней в знак протесту проти цього несправедливого оподаткування з боку корони! model.player.colonyGoodsParty.landLocked=Ваш колоніст у %colony% спалив %amount% одиниць %goods% на базарі в знак протесту проти цього несправедливого оподаткування з боку корони! +# Fuzzy model.player.dead.european=Ваше Превосходительство, %nation% оголосили безумовне відлучення від справ Нового Світу! model.player.dead.native=Ваше Превосходительство, %nation% були знищені. model.player.disaster.bankruptcy.start=Ви не змогли оплатити утримання всіх будівель. Деякі виробничі санкції застосовуються. @@ -2089,12 +2114,16 @@ model.player.ignoredTax=Корона підняла ставки податку model.player.interventionForceArrives=Обіцяні сили інтервенції прибули. model.player.soLDecrease=Кількість Синів Свободи у ваших колоніях опустилася до %newSoL% відсотків! model.player.soLIncrease=Кількість Синів Свободи у ваших колоніях піднялася до %newSoL% відсотків! +# Fuzzy model.player.stance.alliance.declared=Ваше Превосходительство, між нами і %nation% затверджено союз! model.player.stance.alliance.others=Ваше Превосходительство, %attacker% мають союз з %defender%. +# Fuzzy model.player.stance.ceaseFire.declared=Ваша ясновельможносте, %nation% погодилися на припинення вогню! model.player.stance.ceaseFire.others=Ваше Превосходительство, %attacker% мають договір про скорочення вогню з %defender%. +# Fuzzy model.player.stance.peace.declared=Ваше Превосходительство, між нами і %nation% встановлено мир! model.player.stance.peace.others=Ваше Превосходительство, між %attacker% і %defender% мир. +# Fuzzy model.player.stance.war.declared=Ваша світлість, погані новини, %nation% оголосила нам війну! model.player.stance.war.others=Ваша світлість, %attacker% оголосила війну %defender%. combat.automaticDefence=Ваш %unit% в %colony% взявся за зброю, щоб захистити колонію! @@ -2110,6 +2139,7 @@ combat.enemyShipEvaded=%enemyNation% %enemyUnit% уникнув атаки %unit combat.enemyShipSunk=%unit% затопив %enemyNation% %enemyUnit%. combat.equipmentCaptured=Стережіться, воїни %nation% отримали %equipment%! combat.goodsStolen=%enemyNation% %enemyUnit% украв %amount% %goods% в %colony%! +# Fuzzy combat.indianPlunder=%enemyNation% %enemyUnit% пограбував %colony% на %amount%. combat.indianRaid=Наші шпигуни повідомляють, що %nation% здійснила напад на %colonyNation% колонії %colony%. combat.indianSurprise=%nation% здійснили несподіваний набіг на колонію %colony%, стривоживши наших колоністів. Правитель {{tag:of|%nation%}} заперечує причетність свого народу до цього набігу. @@ -2166,6 +2196,7 @@ main.javaVersion=Java версії %minVersion% або більшої реко main.memory=Необхідно надати більше %memory% байт пам'яті для JVM.\n Перезапустіть FreeCol з: java-Xmx%minMemory%М-jar FreeCol.jar main.userDir.fail=FreeCol не можете знайти відповідні каталоги для збереження даних користувача. Продовжуємо, але очікуємо неприємності. client.baseData=Не вдалося знайти каталог бази даних %dir% .\n Файли даних не знайдені FreeCol.\n Переконайтеся, що вони наявні.\n Якщо FreeCol потім шукає в помилковому каталозі, то\n запустіть гру у командному рядку з параметром:\n --freecol-data +# Fuzzy client.choicePlayer=Будь ласка, виберіть гравця: client.classic=Не вдалося завантажити зіставлення ресурсів з набору правил "класичний". client.headlessDebug=Автоматичний режим потребує запуску налагодження. @@ -2175,8 +2206,10 @@ metaServer.couldNotConnect=Вибачте, неможливо з’єднати metaServer.communicationError=Сталася помилка під час з’єднання з мета-сервером. Будь ласка, спробуйте пізніше. abandonEducation.action.studying=вивчення abandonEducation.action.teaching=навчання +# Fuzzy abandonEducation.no=Ні, продовжити навчання abandonEducation.text=Якщо ваш %unit% покине колонію %colony%, то він відмовиться від %action% у %building%. Ви справді хочете цього? +# Fuzzy abandonEducation.yes=Так, покинути поселення abandonTeaching.text=Якщо %unit% покине %building%, то він припине навчання. Ви справді впевнені, що йому пора це зробити? armedUnitSettlement.attack=Атакувати @@ -2188,9 +2221,13 @@ buy.takeOffer=Прийняти пропозицію buy.text=%nation% хотіли би продати свій %goods% за %gold%: clearTradeRoute.text=Ваш %unit% призначений на торговий шлях %route%. Установка цілі забере його з торгового шляху. Ви справді хочете це зробити? client.fullScreen=Повноекранний режим не підтримується для цієї відеокарти.\nПовертаємося у віконний режим. +# Fuzzy confirmHostile.alliance=Ви не можете атакувати союзників! Ви бажаєте розірвати союз із %nation% і об'явити війну? +# Fuzzy confirmHostile.ceaseFire=Ви підписали припинання вогню з %nation%. Ви справді хочете атакувати? +# Fuzzy confirmHostile.peace=Зараз у вас мир з %nation%. Ви дійсно бажаєте об'явити війну? +# Fuzzy confirmTribute.broke=Наші шпигуни зазначають, що нація %nation% повністю зруйнована. Давайте не гаймо часу з вимогами данини. confirmTribute.european=Нація %nation% %danger% та %finance%. Скільки данини нам вимагати з них? confirmTribute.happy=Нація %nation% у поселенні %settlement% - добрі друзі з нами. Шкода псувати наше товариство. @@ -2258,7 +2295,9 @@ defeated.text=Ви зазнали поразки! Чи хотіли би ви: defeated.yes=Стояти і чекати defeatedSinglePlayer.text=Ви зазнали поразки!\n\nЗ цього моменту настав час диявольської ночі, коли церква спить і пекло видихає хвороби у цей світ, коли я можу пити теплу кров та робити такі справи, що наступного дня світ затремтить тільки від одного погляду на них. defeatedSinglePlayer.yes=Ввійти у режим помсти +# Fuzzy diplomacy.offerAccepted=%nation% прийняли Вашу щедру пропозицію. +# Fuzzy diplomacy.offerRejected=%nation% відхилили Вашу щедру пропозицію. disbandUnit.text=Ви впевнені, що хочете розпустити цього юніта? disbandUnit.yes=Розформувати @@ -2303,7 +2342,9 @@ move.noAccessContact=Ваше превосходительство, ми пов move.noAccessGoods=%nation% не торгуватимуть з %unit% без вантажу. move.noAccessSettlement=%nation% не дозволяють увійти до поселення нашому %unit%. move.noAccessSkill=Наш %unit% не може вчитись у індіанців. +# Fuzzy move.noAccessTrade=Ми не маємо права торгувати з іншими європейськими націями, такими, як %nation%. +# Fuzzy move.noAccessWar=Ми не можемо торгувати з %nation% під час війни. move.noAccessWater=Наш %unit% повинен висадитися на берег, перш ніж входити в поселення. move.noAttackWater=Наші %unit% повинні висадитися на землю перед атакою. @@ -2357,6 +2398,7 @@ server.invalidPlayerNations=Кожен гравець повинен обрат server.maximumPlayers=Пробачте, але уже досягнуто максимальне число гравців. server.missingUserName=У запиті на вхід втрачено ім'я користувача. server.missingVersion=У запиті на вхід втрачено версію FreeCol. +# Fuzzy server.noRouteToServer=Сервер не може бути публічним. Ви повинні змінити налаштування брандмауера, щоб дозволити з'єднання на порт, зазначений Вами. server.notAllReady=Не всі гравці готові почати гру! server.onlyAdminCanLaunch=Вибачте, тільки адміністратор сервера може почати гру. @@ -2365,6 +2407,7 @@ server.timeOut=Перевищення часу очікування відпов server.userNameInUse=Вказане ім'я користувача вже використовується. server.userNameNotPresent=Вказане ім'я користувача є не в цій грі. server.wrongFreeColVersion=Версії клієнта і сервера FreeCol не збігаються. +# Fuzzy buildColony.others=%nation% заснували нову колонію %colony% в %region%. cashInTreasureTrain.colonial=Гроші у сумі %amount% було вивантажено в Європі. %cashInAmount% золота було перетворено в готівку. cashInTreasureTrain.independent=У національну скарбницю були включені скарби, вартістю %amount%. @@ -2468,6 +2511,7 @@ colopedia.unit.offensivePower=Наступальна сила: colopedia.unit.price=Ціна в Європі: colopedia.unit.productionBonus={{plural:%number%|one=Регулятор|other=Регулятори}} виробництва: colopedia.unit.requirements=Вимоги: +# Fuzzy colopedia.unit.school=Потрібна школа, щоб тренувати: colopedia.unit.skill=Рівень кваліфікації: report.labour.allColonists=Всі колоністи @@ -2503,8 +2547,8 @@ report.colony.growing.description=%colony% може бути збільшена # Fuzzy report.colony.improve.description=Юніти, які можуть підвищити виробницто порівняно з юнітом, що працює зараз report.colony.improve.header=Поліпшення +# Fuzzy report.colony.improving.description=%colony%: Щоб зробити ще %amount% %goods%, замініть %oldUnit% на %unit% -report.colony.wanting.description=%colony%: Щоб зробити ще %amount% %goods%, додайте %unit% report.colony.making.blocking.description=%colony%: %amount% %goods% потрібно для %buildable% {{plural:%turns%|one=наступного ходу|other=за %turns% ходів}} report.colony.making.constructing.description=%colony%: %buildable% завершується {{plural:%turns%|one=наступного ходу|other=за %turns% ходів}} report.colony.making.description=Що робить ця колонія @@ -2514,21 +2558,22 @@ report.colony.making.noconstruction.description=%colony%: Будівництво report.colony.making.noteach.description=%colony%: %teacher% потребує учня report.colony.name.description=Список колоній report.colony.name.header=Поселення -report.colony.plow.description=Кількість плиток в колонії, які виграють від Оранки -report.colony.plow.header=О -report.colony.plowing.description=%colony% отримає вигоду із розорювання {{plural:%amount%|one=однієї клітинки|other=%amount% клітинок}} +# Fuzzy report.colony.production.description=%colony%: маса нетто вироблених %goods% = %amount% +# Fuzzy report.colony.production.export.description=%colony%: маса нетто виготовленого %goods% рівна %amount% (експортуєм більше %export%) report.colony.production.header=Маса нетто виготовлених %goods% +# Fuzzy report.colony.production.high.description=%colony%: маса нетто виготовленого %goods% = %amount%, буде заповнено {{plural:%turns%|one=наступного ходу|other=за %turns% ходів}} +# Fuzzy report.colony.production.low.description=%colony%: маса нетто вироблених %goods% = %amount%, буде вичерпано {{plural:%turns%|one=в наступному ході|other=за %turns% ходів}} +# Fuzzy report.colony.production.waste.description=%colony%: маса нетто виготовленого %goods% = %amount%, склад буде переповнено, %waste% змарнується -report.colony.road.description=Кількість плиток в колонії, які виграють від Прокладання доріг -report.colony.road.header=П -report.colony.roadBuilding.description=%colony% отримає вигоду із будівництва {{plural:%amount%|one=дороги|other=%amount% доріг}} report.colony.shrinking.description=%colony% повинна вирости на {{plural:%amount%|one=один юніт|other=%amount% юнітів}} для покращення виробництва report.colony.starving.description=%colony%: голодування {{plural:%turns%|one=наступного ходу|other=за %turns% ходів}} # Fuzzy +report.colony.wanting.description=%colony%: Щоб зробити ще %amount% %goods%, додайте %unit% +# Fuzzy report.continentalCongress.elected=Обраний: report.continentalCongress.none=(нічого) report.continentalCongress.recruiting=Вербування @@ -2570,26 +2615,25 @@ report.production.selectGoods=Вибір товарів report.production.update=Оновлення report.requirements.badAssignment=В %colony% є %expert%, який працює як %expertWork%, тоді як %nonExpert% працює як %nonExpertWork%. Було б ефективніше змінити їх місця роботи. report.requirements.canTrainExperts={{plural:2|%unit%}} може бути вивчений в -report.requirements.clearTile=%type% на %direction% від %colony% виграє від зачищення. +# Fuzzy report.requirements.exploreTile=%type% на %direction% від %colony% виграє від розвідки. report.requirements.met=Всі вимоги виконані. report.requirements.missingGoods=%colony% виробляє %goods%, але потребує більше %input%. report.requirements.misusedExperts=У вас є {{plural:2|%unit%}}, які не працюють як %work% в report.requirements.noExpert=%colony% виробляє %goods%, але не має %unit%. -report.requirements.plowCenter=%colony% виграє від оранки її поля. -report.requirements.plowTile=%type% на %direction% від %colony% виграє від оранки. -report.requirements.roadTile=%type% на %direction% від %colony% виграє від будування доріг. report.requirements.severalExperts=Кілька {{plural:2|%unit%}} присутні в report.requirements.surplus=Надлишок виробництва %goods% в report.trade.afterTaxes=Прибуток після податків report.trade.beforeTaxes=Прибуток перед податками report.trade.cargoUnits=Одиниць у вантажі +# Fuzzy report.trade.hasCustomHouse=* Ця колонія має митницю; ці товари експортуються. report.trade.totalDelta=Загальний обсяг виробництва report.trade.totalUnits=Всього одиниць report.trade.unitsSold=Продані або куплені одиниці report.turn.filter=Не показувати цей тип повідомлень (%type%) report.turn.ignore=Ігнорувати це повідомлення (Колонія: %colony%, Товари: %goods%) +# Fuzzy report.turn.playerNation=%player% - %nation% # Fuzzy aboutPanel.copyright=Авторські права © 2002-2014 Команда FreeCol @@ -2615,6 +2659,7 @@ chooseFoundingFatherDialog.title=Призначити Батьком-засно colonyPanel.colonyUnits=Юніти колонії colonyPanel.inPort=У порту colonyPanel.outsideColony=За межами колонії +# Fuzzy colonyPanel.producing=Виробництво: colonyPanel.reducePopulation=Якщо ви зменшете населення колонії нижче %number%, то %colony% не зможе більше будувати %buildable%. colonyPanel.unitChange=На вході в вашу колонію ваш %oldType% став %newType%. @@ -2627,7 +2672,9 @@ confirmDeclarationDialog.areYouSure.no=Можливо пізніше confirmDeclarationDialog.areYouSure.text=Відкинемо несправедливу тиранію %monarch% і оголосимо незалежність наших колоній від корони! confirmDeclarationDialog.areYouSure.yes=Свобода або смерть! confirmDeclarationDialog.createFlag=і наші вороги повинні тремтіти з вигляду нашого зухвалого банера. +# Fuzzy confirmDeclarationDialog.defaultCountry=Сполучені Штати %nation% +# Fuzzy confirmDeclarationDialog.defaultNation=Вільні %nation% confirmDeclarationDialog.enterCountry=Надалі наша країна буде відома, як confirmDeclarationDialog.enterNation=і кожен громадянин нашої славної нації повинні гордитися тим, що надалі буде відомий як @@ -2678,8 +2725,10 @@ negotiationDialog.add=Додати negotiationDialog.cancel=Скасувати negotiationDialog.clear=Очистити negotiationDialog.contact.tutorial=Ви зустріли братніх європейців. Вони будуть змагатися з вами за землю та скарби, і можуть оголосити Вам війну. Але після того, як Ян де Вітт приєднався до континентального конгресу, ви можете торгувати з ними. +# Fuzzy negotiationDialog.demand=%nation% вимагають від нації %otherNation% negotiationDialog.exchange=в обмін на +# Fuzzy negotiationDialog.offer=%nation% пропонують нації %otherNation% negotiationDialog.send=Послати negotiationDialog.title.contact=Зустріч із земляками-європейцями @@ -2702,10 +2751,9 @@ findSettlementPanel.displayAll=Знайти всі населені пункти findSettlementPanel.displayOnlyEuropean=Знайти тільки європейські поселення findSettlementPanel.displayOnlyNatives=Знайти тільки туземні поселення findSettlementPanel.name=Знайти поселення +# Fuzzy firstContactDialog.meeting.natives=Зустріч із корінними мешканцями. . . firstContactDialog.meeting.natives.tutorial=Ви зустріли корінних мешканців. Пошліть своїх скаутів до їхніх поселень, щоб дізнатися про них більше та своїх контрактих службовців і вільних колоністів, щоб навчатися у них. Якщо Ви хочете з ними торгувати, пошліть свої торгівельні судна і фургонний поїзд до їхніх поселень. -firstContactDialog.meeting.AZTEC=Нація ацтеків. . . -firstContactDialog.meeting.INCA=Імперія інків. . . firstContactDialog.welcomeOffer.text=%nation% вітають вас. Ми славетна нація, у нас %camps% {{plural:%camps%|%settlementType%}}. Для відзначення нашої дружби ми щедро даруємо вам землі, які ви зараз займаєте. Приймаєте наш договір і будете жити з нами у мирі як брати? firstContactDialog.welcomeSimple.text=%nation% вітають вас. Ми славетна нація, у нас %camps% {{plural:%camps%|%settlementType%}}. Приймаєте наш договір і будете жити з нами у мирі як брати? abandonColony.no=Скасувати diff --git a/data/strings/FreeColMessages_zh-hant.properties b/data/strings/FreeColMessages_zh-hant.properties index bb23fba0c..5db33166c 100644 --- a/data/strings/FreeColMessages_zh-hant.properties +++ b/data/strings/FreeColMessages_zh-hant.properties @@ -205,8 +205,9 @@ cli.no-memory-check=跳過記憶體檢查 cli.no-sound=靜音執行 FreeCol cli.private=啟動私人伺服器 (不對 metaserver 公開) cli.seed=為偽亂數產生器提供種子 -cli.server-name=自訂伺服器名稱 +# Fuzzy cli.server=在指定的埠上啟動獨立伺服器 +cli.server-name=自訂伺服器名稱 cli.splash=載入遊戲時顯示初始螢幕影像檔 cli.tc=載入具有給定名稱的總轉換 cli.timeout=伺服器等待問題的答案的秒數 @@ -271,7 +272,6 @@ colopediaAction.goods.name=貨物 colopediaAction.nations.name=國家 colopediaAction.nationTypes.name=國家特長 colopediaAction.resources.name=特產 -colopediaAction.skills.name=技能 colopediaAction.terrain.name=地形種類 colopediaAction.units.name=單位 colopediaAction.name=%object% (百科) @@ -1292,6 +1292,7 @@ model.colony.badGovernment=%colony% 的政府效率低下,生產懲罰出現 model.colony.goodGovernment=政府效率改善!%colony% 的獨立黨現在已經等於或超過 %number%%! model.colony.governmentImproved1=%colony% 的政府效率改善,但還是不夠。生產懲罰仍舊存在。 model.colony.governmentImproved2=%colony% 的政府效率改善,生產懲罰消失。 +# Fuzzy model.colony.insufficientProduction=如果 %colony% 城擁有超過 %inputAmount% 個 %inputType% 的話,我們就可以生產出超過 %outputAmount% 個 %outputType% 。 model.colony.lostGoodGovernment=政府效率下降!%colony% 的獨立黨現在已經比 %number%% 還小!所有生產獎勵喪失。 model.colony.lostVeryGoodGovernment=政府效率下降!%colony% 的獨立黨現在已經比 %number%% 還小!一些生產獎勵喪失。 @@ -1305,12 +1306,17 @@ model.colony.unbuildable=%colony% 現在不能建築 %object%。%object% 已經 model.colony.veryBadGovernment=%colony% 的政府效率非常糟糕,出現嚴重的生產懲罰。 model.colony.veryGoodGovernment=政府效率改善!%colony% 的獨立黨現在已經等於或超過 %number%%! model.diplomaticTrade.receive.contact=從光榮的 %nation% 致上兄弟般的問候。 +# Fuzzy model.diplomaticTrade.receive.diplomatic=讓我們與 %nation% 談判。 model.diplomaticTrade.receive.trade=讓我們考慮一下 %nation% 的貿易優惠。 +# Fuzzy model.diplomaticTrade.receive.tribute=%nation% 要我們致敬! model.diplomaticTrade.send.contact=我們遇到 %nation% 的一員。 +# Fuzzy model.diplomaticTrade.send.diplomatic=讓我們考慮一下我們與 %nation% 的外交處境。 +# Fuzzy model.diplomaticTrade.send.trade=讓我們提出與 %nation% 貿易於 %settlement% 。 +# Fuzzy model.diplomaticTrade.send.tribute=我們要求 %nation% 進貢於 %settlement% 。 model.direction.N.name=北 model.direction.NE.name=東北 @@ -1322,6 +1328,7 @@ model.direction.W.name=西 model.direction.NW.name=西北 # Fuzzy model.historyEventType.conquerColony.description=你敢接受慷慨的條款卻不付錢嗎?這種表裡不一的行為,會讓你嘗到因我們不滿而生的苦果。 +# Fuzzy model.historyEventType.nationDestroyed.description=%nation% 已經不存在於新世界了。 model.indianSettlement.mostHatedNone=無 model.indianSettlement.mostHatedUnknown=不明 @@ -1360,8 +1367,10 @@ model.messageType.warehouseCapacity.name=倉庫容量 model.messageType.warning.name=警告 model.monarch.action.addToRef.text=國王向皇家遠征軍增派了 %number% 個 {{plural:%number%|%unit%}}。殖民地首領們表示憂慮。 model.monarch.action.addToRef.no=好 +# Fuzzy model.monarch.action.declarePeace.text=我們欣然地和 %nation% 簽下和平條約。 model.monarch.action.declarePeace.no=好 +# Fuzzy model.monarch.action.declareWar.text=%nation% 的傲慢逼我們對他們開戰! model.monarch.action.declareWar.no=好 model.monarch.action.displeasure.no=好 @@ -1411,6 +1420,7 @@ model.noClaimReason.water.description=我們並不主張水域。 model.noClaimReason.worked.description=另一個解決辦法已經在使用這片土地。 model.player.independentMarket=歐洲 model.player.startGame=在幾個月的航行之後,你終於來到一個未知的大陸。{{標記: %direction% |west = 往西|east = 往東|default = 隨風}}航行,然後把這個大陸納入王國的版圖吧! +# Fuzzy model.player.waitingFor=等待:%nation% model.regionType.coast.unknown=未知海岸地區 model.regionType.desert.unknown=未知沙漠 @@ -1444,6 +1454,7 @@ model.tradeItem.gold.name=黃金 model.tradeItem.gold.description=共有 %amount% 黃金 model.tradeItem.goods.name=貨物 model.tradeItem.incite.name=宣戰 +# Fuzzy model.tradeItem.incite.description=向 %nation% 宣戰 model.tradeItem.unit.name=單位 model.tradeRoute.allEmpty=所有的停靠站都是空的。 @@ -1465,7 +1476,7 @@ model.unit.unitState.fortified=F model.unit.unitState.fortifying=F model.unit.unitState.inColony=B model.unit.unitState.sentry=S -model.unit.unitState.skipped=W +model.unit.unitState.skipped=X model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G model.noAddReason.alreadyPresent.description=已存在於這個位置。 @@ -1535,6 +1546,7 @@ combat.enemyShipEvaded=%enemyNation% 的 %enemyUnit% 已經躲開了 %unit% 所 combat.enemyShipSunk=%unit% 擊沉了 %enemyNation% 的 %enemyUnit%! combat.equipmentCaptured=注意,%nation% 已經拿到了 %equipment%! combat.goodsStolen=%enemyNation% 的 %enemyUnit% 已經偷走了 %amount% 個 %colony% 的 %goods%! +# Fuzzy combat.indianPlunder=%enemyNation% 的 %enemyUnit% 已經掠奪了 %colony% 的 %amount% 黃金。 combat.indianRaid=我們的間諜報告 %nation% 突襲了 %colonyNation% 的 %colony%。 combat.indianSurprise=%nation% 對 %colony% 發動突襲,驚動了我們的移民,但是 %nation% 的首領否認有參與。 @@ -1588,6 +1600,7 @@ main.javaVersion=推薦使用 JAVA 的 %minVersion% 或更新的版本執行 Fre main.memory=您需要分配多於 %memory% 位元組的記憶體給 JVM。重新啟動 FreeCol: java -Xmx %minMemory%M -jar FreeCol.jar main.userDir.fail=FreeCol 找不到合適的目錄來保存在使用者資料。正在進行,但可能會遇到麻煩。 client.baseData=找不到基礎資料的目錄:%dir%\nFreeCol 找不到該資料的檔案,請確定他們都存在。\n如果 FreeCol 找錯了目錄,請在命令列執行以下參數:\n --freecol-data <(資料所在的目錄)> +# Fuzzy client.choicePlayer=選擇玩家: client.classic=從「經典模式」的規則集載入資源映射失敗。 client.debugConnect=你不能在偵錯模式連結已存在的遊戲 @@ -1600,8 +1613,10 @@ metaServer.couldNotConnect=抱歉,無法連接到 meta 伺服器。請稍後 metaServer.communicationError=與 meta-server 伺服器通信時發生錯誤。請稍後再試。 abandonEducation.action.studying=學習 abandonEducation.action.teaching=教授 +# Fuzzy abandonEducation.no=否,繼續教學 abandonEducation.text=離開 %colony% 後,%unit% 就會放棄在 %building% 的 %action%,你確定要讓 %unit% 離開嗎? +# Fuzzy abandonEducation.yes=是,離開殖民地 abandonTeaching.text=%unit% 離開 %building% 後,%unit% 就會中止教學,你確定要讓 %unit% 離開嗎? armedUnitSettlement.attack=攻擊 @@ -1613,7 +1628,9 @@ buy.takeOffer=接受這交易 buy.text=%nation% 想要賣他們的 %goods% 以換取 %gold% 黃金: clearTradeRoute.text=您 %unit% 分配給貿易路線 %route% 。設置其目的地將下降它從貿易路線。你確定你要這樣做? client.fullScreen=全螢幕模式不支援這個影像設備。回到視窗模式。 +# Fuzzy confirmHostile.alliance=你不能攻擊盟國!你真的想撕毀與 %nation% 的盟約並宣戰嗎? +# Fuzzy confirmTribute.broke=我們的間諜報告說 %nation% 被幹掉了。我們再也不用浪費這些時間去要求進貢啦。 confirmTribute.european=%nation% %danger% ,而他們 %finance% 。我們應該要求他們進貢多少? confirmTribute.happy=%nation% 視我們 %settlement% 為好朋友,很可惜我們的友誼被破壞了。 @@ -1633,6 +1650,7 @@ indianLand.cancel=離開這片土地 indianLand.pay=用 %amount% 黃金買下這片土地 indianLand.take=奪取那本是我們的東西 indianLand.text=這片土地被 %player% 擁有,你要怎麼辦? +# Fuzzy indianLand.unknown=有不明人士住在這塊土地上。你要: info.autodetectLanguageSelected=你選擇了預設語言。它將會在下次開始遊戲時生效。 info.enterSomeText=請輸入一些文本。 @@ -1678,7 +1696,9 @@ defeated.text=你被打敗了!你希望: defeated.yes=繼續觀察 defeatedSinglePlayer.text=你被打敗了!\n\n今晚為行巫之時:當墳地綻裂、陰界蔓延至天下,即為吾輩嗜血之刻!只要做點嚴酷的交易,天下只得顫抖著…… defeatedSinglePlayer.yes=進入復仇模式 +# Fuzzy diplomacy.offerAccepted=%nation% 已接受你慷慨的提案。 +# Fuzzy diplomacy.offerRejected=%nation% 拒絕了你慷慨的提案。 disbandUnit.text=確定要刪除這調查嗎? disbandUnit.yes=解散 @@ -1724,7 +1744,9 @@ move.noAccessGoods=%nation% 不會和沒有 %unit% 的國家貿易。 move.noAccessMissionBan=%nation% 拒絕與你的傳教士建立任何聯繫。 move.noAccessSettlement=%nation% 不允許我們的 %unit% 進入他們的殖民地。 move.noAccessSkill=我們的 %unit% 沒法從原住民那邊學到些什麼。 +# Fuzzy move.noAccessTrade=我們並沒有同諸如 %nation% 之類歐洲國家貿易的許可。 +# Fuzzy move.noAccessWar=我們不能與處於戰爭的 %nation% 貿易。 move.noAccessWater=%unit% 在進入聚落前,必須先登陸。 move.noAttackWater=%unit% 在發動攻擊前,必須先登陸。 @@ -1780,6 +1802,7 @@ server.invalidPlayerNations=遊戲開始前所有玩家都要選出各自的國 server.maximumPlayers=抱歉,玩家人數已滿。 server.missingUserName=登入要求的使用者名稱缺失。 server.missingVersion=登入請求的 FreeCol 版本號缺失。 +# Fuzzy server.noRouteToServer=伺服器無法設定為公開。你應該修改防火牆設定,允許指定的埠口被連接。 server.noSuchPlayer=遊戲並沒有這個玩家: %player%。 server.notAllReady=還有玩家沒準好! @@ -1789,6 +1812,7 @@ server.timeOut=連接伺服器逾時。 server.userNameInUse=指定的使用者名稱已被使用。 server.userNameNotPresent=指定的使用者名稱不在遊戲內。 server.wrongFreeColVersion=網路端與客戶端的 FreeCol 版本不相同。 +# Fuzzy buildColony.others=%nation% 發現了 %colony% 於 %region% 的殖民地。 cashInTreasureTrain.colonial=一個價值 %amount% 黃金的寶藏送到了歐洲。%cashInAmount% 黃金送進你的金庫。 cashInTreasureTrain.independent=一個價值 %amount% 黃金的寶藏送進國庫。 @@ -1822,6 +1846,7 @@ colopedia.goods.buildings=建築物: colopedia.unit.natives=從原住民學到 colopedia.unit.requirements=需求: colopedia.unit.skill=技能等級: +report.colony.tile.plow.header=P report.continentalCongress.none=(無) report.foreignAffair.stance=狀態 report.highScores.difficulty=難易度: @@ -1830,6 +1855,7 @@ report.highScores.turn=年: report.production.update=更新 report.turn.filter=不要顯示這種訊息:%type% report.turn.ignore=忽略此訊息 (殖民地:%colony%、貨品:%goods%) +# Fuzzy report.turn.playerNation=%player%的%nation% aboutPanel.version=版本: buildingToolTip.breeding=你至少需要 %number% {{plural:%number% | %goods% }} 以繁殖 %goods% 。 @@ -1851,6 +1877,7 @@ chooseFoundingFatherDialog.title=提名開國元勳 colonyPanel.colonyUnits=殖民地單位 colonyPanel.inPort=在港口 colonyPanel.outsideColony=殖民地外 +# Fuzzy colonyPanel.producing=生產: colonyPanel.reducePopulation=如果你的人口在 %number% 以下, %colony% 將不能建造 %buildable% 。 colonyPanel.setGoods=貨物設置 @@ -1866,7 +1893,9 @@ confirmDeclarationDialog.areYouSure.no=也許以後吧 confirmDeclarationDialog.areYouSure.text=讓我們唾棄 %monarch% 不公不義的暴政、宣佈我們的殖民地從王國獨立吧! confirmDeclarationDialog.areYouSure.yes=不自由毋寧死! confirmDeclarationDialog.createFlag=和我們的敵人應發抖我們違抗橫幅的視線。 +# Fuzzy confirmDeclarationDialog.defaultCountry=%nation% 合眾國 +# Fuzzy confirmDeclarationDialog.defaultNation=%nation% 自由國 confirmDeclarationDialog.enterCountry=今後我們的國家要稱做: confirmDeclarationDialog.enterNation=而我光榮民族的公民們將以這個名字為傲: @@ -1918,8 +1947,10 @@ negotiationDialog.add=新增 negotiationDialog.cancel=取消 negotiationDialog.clear=清除 negotiationDialog.contact.tutorial=你遇見了歐洲人。他們會與你爭奪土地和財富,還有可能對你發動戰爭。但在 Jan de Witt 加入大陸會議後,你可以與他們交易。 +# Fuzzy negotiationDialog.demand=%nation% 要求 %otherNation% negotiationDialog.exchange=以換取 +# Fuzzy negotiationDialog.offer=%nation% 提供 %otherNation% negotiationDialog.send=傳送 negotiationDialog.title.contact=與歐洲人會見 @@ -1941,10 +1972,8 @@ findSettlementPanel.displayAll=尋找所有聚落 findSettlementPanel.displayOnlyEuropean=只找歐洲人聚落 findSettlementPanel.displayOnlyNatives=只找原住民聚落 findSettlementPanel.name=尋找聚落 -firstContactDialog.meeting.natives=遇見原住民…… +firstContactDialog.meeting.natives=遇見原住民 firstContactDialog.meeting.natives.tutorial=你發現了原住民。派你的探索者會瞭解原住民們、派你的長工和自由移民會讓他們學到技術、派你的船與貨車則可以與他們交易。 -firstContactDialog.meeting.AZTEC=阿兹特克人… -firstContactDialog.meeting.INCA=印加帝國… firstContactDialog.welcomeOffer.text=%nation% 歡迎您。我們是一個光榮的民族 %camps% %settlementType% 。為慶祝我們的友誼,我們慷慨地為您提供您現在佔據作為禮物的土地。你將會接受我們的條約和謊言與我們在和平中作為兄弟嗎? firstContactDialog.welcomeSimple.text=%nation% 歡迎您。我們是一個光榮的民族 %camps% %settlementType% 。你將會接受我們的條約和謊言與我們在和平中作為兄弟嗎? abandonColony.no=取消 diff --git a/data/strings/FreeColMessages_zh_CN.properties b/data/strings/FreeColMessages_zh_CN.properties index 1dba92b16..267a2ea11 100644 --- a/data/strings/FreeColMessages_zh_CN.properties +++ b/data/strings/FreeColMessages_zh_CN.properties @@ -116,7 +116,9 @@ cargoOnCarrier=货仓 cashInTreasureTrain=兑现财宝车中的财宝 clearOrders=清除命令 colonists=移民 +colonyCenter=殖民地中心 colopedia=Colopedia +countryName={{tag:country|%nation%}} difficulty=难度 docks=码头 dumpCargo=卸货 @@ -190,6 +192,7 @@ cli.error.home.notDir=%string%不是目录。 cli.error.home.notExists=目录%string%不存在。 cli.error.save=不能读取已保存的游戏 %string% 。 cli.error.serverPort=%string%不是一个有效的端口号。 +cli.error.splash=找不到污点文件%name%。 cli.error.timeout=%string%太短 (少于 %minimum% )。 cli.advantages=设置优势类型(%advantages%) cli.check-savegame.failure=存档完整性检查失败,检查日志细节。 @@ -219,8 +222,9 @@ cli.no-memory-check=跳过内存检查 cli.no-sound=无声运行FreeCol cli.private=开启私有服务器(不对metaserver公开) cli.seed=为伪随机数字生成器提供种子 -cli.server-name=自定义服务器名 +# Fuzzy cli.server=在指定端口上开启独立服务器 +cli.server-name=自定义服务器名 cli.splash=当读取存档时显示闪烁图片屏幕 cli.tc=读取给定名称的全部变化 cli.timeout=服务器应答的延迟 @@ -285,7 +289,6 @@ colopediaAction.goods.name=货物 colopediaAction.nations.name=国家 colopediaAction.nationTypes.name=国家特长 colopediaAction.resources.name=特产 -colopediaAction.skills.name=专家 colopediaAction.terrain.name=地形 colopediaAction.units.name=单位 colopediaAction.name=%object% (百科) @@ -469,6 +472,7 @@ model.option.interventionForce.name=干涉军 model.option.interventionForce.shortDescription=被派来支持你的独立战争的干涉部队。 model.option.mercenaryForce.name=雇佣兵部队 model.option.mercenaryForce.shortDescription=表示愿意支持你的独立战争的雇佣军。 +model.option.warSupportForce.name=战争支持力量 model.difficulty.government.name=政府 model.option.badGovernmentLimit.name=糟糕政府限制 model.option.badGovernmentLimit.shortDescription=不造成生产处罚的最大保皇党人数目。 @@ -490,12 +494,15 @@ model.option.unitsThatUseNoBells.shortDescription=一座殖民城市中不消耗 model.option.tileProduction.name=该格子产出的货物 model.option.tileProduction.shortDescription=格子拥有多种产品。 model.option.tileProduction.veryLow.name=非常少 +model.option.tileProduction.veryLow.shortDescription=极低瓷制品 model.option.tileProduction.low.name=低 model.option.tileProduction.low.shortDescription=低瓷制品 model.option.tileProduction.medium.name=中 +model.option.tileProduction.medium.shortDescription=中瓷制品 model.option.tileProduction.high.name=高 model.option.tileProduction.high.shortDescription=高瓷制品 model.option.tileProduction.veryHigh.name=非常高 +model.option.tileProduction.veryHigh.shortDescription=极高瓷制品 model.option.badRumour.name=坏的谣言的机会 model.option.badRumour.decription=百分比的谣言有一个坏结果的机会。 model.option.goodRumour.name=良好的谣言的机会 @@ -573,7 +580,7 @@ model.option.foundColonyDuringRebellion.name=在叛乱期间发现的殖民地 model.option.foundColonyDuringRebellion.shortDescription=播放机可以继续在独立战争期间发现的殖民地。 model.option.payForBuilding.name=支付建设 model.option.saveProductionOverflow.name=保存产品过载值 -model.option.saveProductionOverflow.shortDescription=保存过载锤子,自由钟及十字架。 +model.option.saveProductionOverflow.shortDescription=保存过载锤子、铃铛和十字架。 model.option.allowStudentSelection.name=允许选择学徒 model.option.allowStudentSelection.shortDescription=允许手动而非自动指定学徒 model.option.enableUpkeep.name=建筑物需要保养(实验) @@ -879,7 +886,7 @@ clientOptions.gui.enemyMoveAnimationSpeed.off=关闭 clientOptions.gui.enemyMoveAnimationSpeed.slow=慢 clientOptions.gui.enemyMoveAnimationSpeed.normal=一般 clientOptions.gui.enemyMoveAnimationSpeed.fast=快 -clientOptions.messages.name=信息 +clientOptions.messages.name=消息 clientOptions.messages.shortDescription=允许/禁止消息选项 model.option.guiMessagesGroupBy.name=群消息 model.option.guiMessagesGroupBy.shortDescription=决定是否发送群消息 @@ -997,7 +1004,9 @@ model.option.unloadOverflowResponse.shortDescription=当仓库或船舱过载时 clientOptions.other.unloadOverflowResponse.ask.name=问 clientOptions.other.unloadOverflowResponse.ask.shortDescription=问您做什么 clientOptions.other.unloadOverflowResponse.never.name=从不 +clientOptions.other.unloadOverflowResponse.never.shortDescription=从不在能够导致一座仓库溢出的情况下卸下货物 clientOptions.other.unloadOverflowResponse.always.name=总是 +clientOptions.other.unloadOverflowResponse.always.shortDescription=总是卸下货物,即使在一座仓库溢出 clientOptions.mods.name=Mods clientOptions.mods.shortDescription=允许游戏修改选项 clientOptions.mods.userMods.name=用户Mods @@ -1509,7 +1518,7 @@ model.improvement.road.description=道路 model.improvement.road.name=道路 model.improvement.road.occupationString=R model.limit.independence.coastalColonies.name=沿海的殖民城市限制 -model.limit.independence.coastalColonies.description=你至少要拥有%limit%座海边城市来宣布独立。 +model.limit.independence.coastalColonies.description=为了宣布独立,您需要至少 %limit% 座沿海{{plural:%limit%|one=殖民地|other=殖民地}}。 model.limit.independence.rebels.name=革命党限制 model.limit.independence.rebels.description=你的移民中至少要有 %limit%%支持独立。 model.limit.independence.year.name=年份期限 @@ -1863,6 +1872,7 @@ model.colony.badGovernment=%colony%城的政府工作效率低下。生产惩罚 model.colony.goodGovernment=政府效率改善了!%colony%城中自由党比例现在等于或超过%number%%了。 model.colony.governmentImproved1=%colony%城的政府工作效率得到改善,不过依旧不足。生产惩罚仍旧起作用。 model.colony.governmentImproved2=%colony%城的政府工作效率得到改善。生产惩罚不再起作用。 +# Fuzzy model.colony.insufficientProduction=在%colony%城中多于%outputAmount%的%outputType%可以被生产出来,只要我们拥有多于%inputAmount%的%inputType%。 model.colony.lostGoodGovernment=政府效率降低了!%colony%城中自由党比例不再等于或大于%number%%了。所有生产奖励丧失了。 model.colony.lostVeryGoodGovernment=政府效率降低了!%colony%城中自由党比例不再等于或大于%number%%了。一些生产奖励丧失了。 @@ -1877,13 +1887,14 @@ model.colony.veryBadGovernment=%colony%城政府效率非常低下!高生产惩 model.colony.veryGoodGovernment=政府效率改善了!%colony%城中自由党比例现在等于或超过%number%%了。 model.colonyTile.claim=(索要 %direction% ) model.diplomaticTrade.receive.contact=兄弟般的问候从光荣 %nation% 的国家。 -model.diplomaticTrade.receive.diplomatic=让我们与谈判 %nation% 。 +model.diplomaticTrade.receive.diplomatic=让我们与{{tag:country|%nation%}}谈判。 model.diplomaticTrade.receive.trade=让我们考虑一下 %nation% 贸易优惠。 -model.diplomaticTrade.receive.tribute=%nation% 要求我们致敬 ! +model.diplomaticTrade.receive.tribute={{tag:country|%nation%}}正在要求我们致敬 ! model.diplomaticTrade.send.contact=我们遇到的成员 %nation% 的国家。 +# Fuzzy model.diplomaticTrade.send.diplomatic=让我们考虑一下我们外交处境与 %nation% 。 -model.diplomaticTrade.send.trade=让我们提出与贸易 %nation% 在 %settlement% 。 -model.diplomaticTrade.send.tribute=我们要求进贡的 %nation% 在 %settlement% 。 +model.diplomaticTrade.send.trade=让我们提出与贸易{{tag:country|%nation%}}在 %settlement% 。 +model.diplomaticTrade.send.tribute=我们要求进贡的{{tag:country|%nation%}}在 %settlement% 。 model.direction.N.name=北 model.direction.NE.name=东北 model.direction.E.name=东 @@ -1893,24 +1904,27 @@ model.direction.SW.name=西南 model.direction.W.name=西 model.direction.NW.name=西北 model.historyEventType.abandonColony.description=你遗弃了殖民城市%colony%。 -model.historyEventType.ceaseFire.description=对%nation%停火。 +model.historyEventType.ceaseFire.description=对{{tag:country|%nation%}}停火。 +# Fuzzy model.historyEventType.cityOfGold.description=%nation%发现了七座黄金城之一的%city%,和一笔价值%treasure%黄金的财富。 -model.historyEventType.colonyConquered.description=你的殖民城市%colony%被%nation%人占领了。 -model.historyEventType.colonyDestroyed.description=你的殖民城市%colony%被%nation%人摧毁了。 +model.historyEventType.colonyConquered.description=你的殖民城市%colony%被{{tag:country|%nation%}}人占领了。 +model.historyEventType.colonyDestroyed.description=你的殖民城市%colony%被{{tag:country|%nation%}}人摧毁了。 model.historyEventType.conquerColony.description=您战胜了%colony%的%nation%殖民地。 model.historyEventType.declareIndependence.description=你宣布脱离王国独立。 -model.historyEventType.declareWar.description=向%nation%宣战的战争。 -model.historyEventType.destroyNation.description=%nation% 摧毁了 %nativeNation% 。 +model.historyEventType.declareWar.description=向{{tag:country|%nation%}}宣战的战争。 +model.historyEventType.destroyNation.description={{tag:country|%nation%}}摧毁了 %nativeNation% 。 model.historyEventType.discoverNewWorld.description=你发现了新大陆。 -model.historyEventType.discoverRegion.description=%nation%发现了%region%地区。 +model.historyEventType.discoverRegion.description={{tag:country|%nation%}}发现了%region%地区。 +# Fuzzy model.historyEventType.formAlliance.description=联盟谈判与 %nation% 。 model.historyEventType.foundColony.description=你完成了殖民城市%colony%。 model.historyEventType.foundingFather.description=%father%加入了大陆议会。 model.historyEventType.independence.description=你成功脱离王国并获得了独立。 -model.historyEventType.makePeace.description=决定与%nation%和平。 -model.historyEventType.meetNation.description=你遇到了%nation%人。 +model.historyEventType.makePeace.description=决定与{{tag:country|%nation%}}和平。 +model.historyEventType.meetNation.description=您见到了%nation%国。 +# Fuzzy model.historyEventType.nationDestroyed.description=在新的世界中, %nation%势力不再存在了。 -model.historyEventType.spanishSuccession.description=%loserNation%割让所有新大陆的殖民地给%nation%。 +model.historyEventType.spanishSuccession.description={{tag:country|%loserNation%}}割让所有新大陆的殖民地给{{tag:country|%nation%}}。 model.indianSettlement.mostHatedNone=无 model.indianSettlement.mostHatedUnknown=未知 model.indianSettlement.nameUnknown=未知 @@ -1962,8 +1976,9 @@ model.messageType.warehouseCapacity.name=仓库容量 model.messageType.warning.name=警告 model.monarch.action.addToRef.text=王国向皇家远征军增加了%number% {{plural:%number%|%unit%}}。殖民地首领们表现出了担忧。 model.monarch.action.addToRef.no=完成 -model.monarch.action.declarePeace.text=我们大方地同意与%nation%签署和平条约。 +model.monarch.action.declarePeace.text=我们大方地同意与{{tag:country|%nation%}}签署和平条约。 model.monarch.action.declarePeace.no=完成 +# Fuzzy model.monarch.action.declareWar.text=傲慢的%nation%人逼我们向他们开战了! model.monarch.action.declareWar.no=完成 model.monarch.action.displeasure.text=您敢接受我们慷慨的价钱,但逃避付款吗?这种不诚信将收获我们的不满情绪。 @@ -2021,7 +2036,7 @@ model.player.colonialIndependence=只有殖民地球员可以宣布独立。 model.player.forces=%nation%的武斗力量 model.player.independentMarket=欧洲 model.player.startGame=经过几个月的航海之后,你终于来到了一片未知大陆附近了。{{tag:%direction%|west=向西|east=向东|default=随风而}}航行来探索这个新世界并将它加入王国的版图。 -model.player.waitingFor=等待:%nation% +model.player.waitingFor=正在等待:{{tag:country|%nation%}} model.regionType.coast.name=海岸 model.regionType.coast.unknown=未知海岸区域 model.regionType.desert.name=沙漠 @@ -2061,7 +2076,7 @@ model.tradeItem.gold.name=黄金 model.tradeItem.gold.description=总计有%amount%黄金 model.tradeItem.goods.name=货物 model.tradeItem.incite.name=声明反对战争 -model.tradeItem.incite.description=反对战争%nation% +model.tradeItem.incite.description=反对战争{{tag:country|%nation%}} model.tradeItem.stance.name=和平状态 model.tradeItem.unit.name=单位 model.tradeRoute.allEmpty=所有停靠站都是空的。 @@ -2084,10 +2099,9 @@ model.unit.underRepair=修理中(%turns%) model.unit.unitState.active=- model.unit.unitState.fortified=F model.unit.unitState.fortifying=F -model.unit.unitState.improving=# model.unit.unitState.inColony=B model.unit.unitState.sentry=S -model.unit.unitState.skipped=W +model.unit.unitState.skipped=X model.unit.unitState.toAmerica=G model.unit.unitState.toEurope=G model.noAddReason.alreadyPresent.description=已存在于此位置。 @@ -2114,6 +2128,7 @@ model.colony.colonyStarved=%colony%城中的最后一名移民已经饿死了, model.colony.customs.sale=%colony%的海关销售了:%data%。 model.colony.customs.saleData=%amount%个%goods%卖%gold% model.colony.famineFeared=关于饥荒的恐惧在%colony%城中蔓延。城中的粮食中够维持%number%个回合。 +model.colony.starving=%colony%正在挨饿。 model.colony.newColonist=%colony%城产生新移民。 model.colony.newConvert=一个新的%nation%皈依者已到达%colony%城。 model.colony.notBuildingAnything=%colony%城中没有东西被建造。 @@ -2127,6 +2142,7 @@ model.colony.warehouseSoonFull=%colony%城仓库中的%goods%在下回合将达 model.colony.warehouseWaste=%colony%城仓库中%goods%的容量已达到最大。%waste%单位被浪费。 model.colony.workersEvicted=在%colony%,殖民者由于有%enemyUnit%不能再在%location%工作。 model.colonyTile.resourceExhausted=%colony%城中的%resource%资源耗尽 +# Fuzzy model.game.spanishSuccession=阁下,欧洲的战争以西班牙的胜利而告终。在乌德勒支条约中,%loserNation%被要求割让所有新世界的殖民地给%nation%! model.indianSettlement.mission.denounced=你在%settlement%的传教士被告发并被处决了。 model.indianSettlement.mission.destroyed=您在%settlement%的传教士已由于定居点的毁坏死亡。 @@ -2136,7 +2152,7 @@ model.player.autoRecruit=%europe%的宗教动乱使%unit%决定移民。 model.player.colonyGoodsParty.harbour=在%colony%城中的移民将%amount%%goods%倾倒入港口来表达他们对于国王不公平的税收政策的抗议! model.player.colonyGoodsParty.horses=你%colony%城中的移民释放了%amount%的马匹来表达他们对于国王不平等的税收制度的反抗! model.player.colonyGoodsParty.landLocked=Y在%colony%城中的移民将市场中%amount%%goods%烧毁来表达他们对于国王不公平的税收政策的抗议! -model.player.dead.european=阁下,%nation%无条件的宣布将不再参与新大陆的事务了! +model.player.dead.european=阁下,{{tag:country|%nation%}}无条件的宣布将不再参与新大陆的事务了! model.player.dead.native=阁下,%nation%已被消灭了。 model.player.disaster.bankruptcy.start=您未能支付的所有建筑物的维护费用。严重生产的惩罚产生了。 model.player.disaster.bankruptcy.stop=您再次能够支付所有建筑物的维持费用。生产的惩罚被解除。 @@ -2149,12 +2165,14 @@ model.player.ignoredTax=如先前宣布的一样,官方已经将税率提高 model.player.interventionForceArrives=许诺的干涉部队到达! model.player.soLDecrease=在你的殖民城市中自由党的比例下降至%newSoL%%! model.player.soLIncrease=在你的殖民城市中自由党的比例上升至%newSoL%%! -model.player.stance.alliance.declared=阁下,%nation%与我们结盟! +model.player.stance.alliance.declared=阁下,%nation%国与我们同盟! model.player.stance.alliance.others=阁下, %attacker%和%defender%是盟友关系。 +# Fuzzy model.player.stance.ceaseFire.declared=阁下,%nation%人同意停火了! model.player.stance.ceaseFire.others=阁下,%attacker%人同意和%defender%人停火了。 -model.player.stance.peace.declared=阁下,%nation%同我们处于和平状态! +model.player.stance.peace.declared=阁下,%nation%国与我们处于和平状态! model.player.stance.peace.others=阁下,%attacker%同%defender%处于和平状态。 +# Fuzzy model.player.stance.war.declared=坏消息,阁下,%nation%人向我们宣战了! model.player.stance.war.others=阁下,%attacker%向%defender%宣战了。 combat.automaticDefence=你在%colony%城中的%unit%已拿起武器保护城市! @@ -2170,6 +2188,7 @@ combat.enemyShipEvaded=%enemyNation%人的%enemyUnit%已躲开%unit%的一次进 combat.enemyShipSunk=%unit%击沉了%enemyNation%人的%enemyUnit%! combat.equipmentCaptured=注意,%nation%人勇士已获得%equipment%! combat.goodsStolen=%enemyNation%人的%enemyUnit%从%colony%城中偷走了%amount%%goods%! +# Fuzzy combat.indianPlunder=%enemyNation%人的%enemyUnit%洗劫%colony%城%amount%黄金。 combat.indianRaid=我们的间谍报告,%nation%突袭了%colonyNation%的%colony%城。 combat.indianSurprise=%nation%对%colony%进行突袭,警告我们的移民。%nation%的首领否认参与此事。 @@ -2224,7 +2243,7 @@ main.javaVersion=%minVersion%或更高版本的Java被推荐来运行FreeCol !( main.memory=您需要分配多于%memory%字节的内存给JVM。重新启动 FreeCol: java -Xmx %minMemory%M -jar FreeCol.jar main.userDir.fail=FreeCol找不到合适的文件夹来存储数据。正在继续,但可能遇到麻烦。 client.baseData=找不到基础数据目录 %dir% 。\n由 FreeCol 找不到数据文件。 !N!请确保他们都存在。\n如果 FreeCol 然后在错误的目录中查找 !N!使用命令行参数运行游戏: !N!— — freecol 数据 -client.choicePlayer=选择玩家: +client.choicePlayer=请选择一个国家: client.classic=未能从规则集 '经典'中加载资源映射。 client.debugConnect=您不可以在调试模式下连接现有游戏。 client.ending=游戏结束。 @@ -2236,9 +2255,9 @@ metaServer.couldNotConnect=在与meta-server服务器进行通信时发生错误 metaServer.communicationError=在与meta-server服务器进行通信时发生错误。请稍后再试。 abandonEducation.action.studying=学习 abandonEducation.action.teaching=教授 -abandonEducation.no=否,继续教育 +abandonEducation.no=继续教育 abandonEducation.text=如果您 %unit%离开%colony%它将放弃在 %building%中的%action%,确实应该离开吗? -abandonEducation.yes=是的离开殖民城市 +abandonEducation.yes=放弃教育 abandonTeaching.text=您的%unit%离开%building%后将会停止教育,确定么? armedUnitSettlement.attack=进攻 armedUnitSettlement.tribute=已索要贡物 @@ -2249,10 +2268,11 @@ buy.takeOffer=同意要价 buy.text=%nation%希望以%gold%黄金的价格卖出他们的%goods%: clearTradeRoute.text=你的%unit%被指定运行于贸易路线 %route%。设定它的目的地将会让它放弃当前的贸易路线。你确定要这样做吗? client.fullScreen=全屏幕模式下不支持此 GraphicsDevice。\n降回窗口模式。 -confirmHostile.alliance=你不能攻击盟友!你当真希望撕毁同%nation%盟约并开战吗? -confirmHostile.ceaseFire=你已同%nation%签定了停火协议。你真的想发动进攻吗? -confirmHostile.peace=你现在同%nation%处于和平状态。你真的希望对其宣战吗? +confirmHostile.alliance=您不能攻击同盟国!您真的希望破坏您与{{tag:country|%nation%}}之间的同盟关系并开战吗? +confirmHostile.ceaseFire=您已同{{tag:country|%nation%}}签定了停火协议。您真的想发动进攻吗? +confirmHostile.peace=您现在同{{tag:country|%nation%}}处于和平状态。您真的希望对其宣战吗? confirmHostile.yes=好,开战吧! +# Fuzzy confirmTribute.broke=报告说,我们的间谍 %nation% 是完全打破了。让我们不浪费我们的时间与进贡的要求。 confirmTribute.european=The %nation% %danger%, and %finance%.我们应该要求多少进贡的他们? confirmTribute.happy=在%settlement%的%nation%对我们都是好朋友,可惜有人正在破坏我们的友谊。 @@ -2274,6 +2294,7 @@ indianLand.pay=出价%amount%黄金购买土地。 # Fuzzy indianLand.take=应该是属于我们的。 indianLand.text=该土地被%player%拥有。你希望: +# Fuzzy indianLand.unknown=这些岛屿居住有未知人类。您希望: info.autodetectLanguageSelected=你选择了默认语言。它将会在下次开始游戏时生效。 info.enterSomeText=P请输入文字。 @@ -2319,8 +2340,8 @@ defeated.text=你被击败了!你希望: defeated.yes=继续观看 defeatedSinglePlayer.text=你被击败了!\n\n今晚正是使用巫术的好时间,墓地裂开并呼出瘟疫,此时也正是我品尝鲜血的时候!通过这个痛苦仪式,世界将会在你面前颤抖。 defeatedSinglePlayer.yes=进入复仇模式 -diplomacy.offerAccepted=%nation% 接受了你大方的馈赠。 -diplomacy.offerRejected=%nation% 拒绝了你大方的馈赠。 +diplomacy.offerAccepted={{tag:country|%nation%}}接受了你大方的馈赠。 +diplomacy.offerRejected={{tag:country|%nation%}}拒绝了你大方的馈赠。 disbandUnit.text=你确信要解散这个单位吗? disbandUnit.yes=解散 disembark.text=你好,水手,你确定想下船吗? @@ -2365,7 +2386,8 @@ move.noAccessGoods=%nation%不会与一个空的%unit%贸易。 move.noAccessMissionBan=%nation%拒绝与您的传教士的任何联系。 move.noAccessSettlement=%nation%人不允许我们的%unit%进入他们的聚落。 move.noAccessSkill=我们的%unit%无法从土著人处学到什么。 -move.noAccessTrade=我们未被授权同例如%nation%的其它欧洲国家进行贸易。 +move.noAccessTrade=我们未被授权同例如{{tag:country|%nation%}}的其它欧洲国家进行贸易。 +# Fuzzy move.noAccessWar=我们不能在战时同%nation%人进行贸易。 move.noAccessWater=在进入聚落前,%unit%必须先登陆。 move.noAttackWater=我们的%unit%在发起攻击之前必须先登陆。 @@ -2420,6 +2442,7 @@ server.invalidPlayerNations=游戏开始前所有玩家都必须选择一个唯 server.maximumPlayers=对不起,玩家人数已满。 server.missingUserName=登录请求缺少用户的用户名。 server.missingVersion=登录请求缺少的FreeCol版本号。 +# Fuzzy server.noRouteToServer=服务器无法被设置为公开。你应该修改防火墙设置以允许指定的端口允许被连接。 server.noSuchPlayer=游戏不包含叫这个名字的玩家:%player% server.notAllReady=不是所有的玩家都准备好了! @@ -2429,7 +2452,7 @@ server.timeOut=连接服务器超时。 server.userNameInUse=指定的用户名称已被使用。 server.userNameNotPresent=指定的用户名不在这个游戏中。 server.wrongFreeColVersion=客户端和服务器的FreeCol版本不匹配。 -buildColony.others=%nation%发现了%colony%在%region%的殖民地。 +buildColony.others={{tag:country|%nation%}}发现了%colony%在%region%的殖民地。 cashInTreasureTrain.colonial=一笔价值%amount%黄金的财宝被运到了欧洲。%cashInAmount%黄金流入了你的金库。 cashInTreasureTrain.independent=一笔价值%amount%黄金的财宝被加入进国库。 cashInTreasureTrain.otherColonial=%amount%的财宝被运到了欧洲。显然%nation%的君主感到高兴。 @@ -2493,7 +2516,7 @@ colopedia.goods.description=说明: colopedia.goods.equipment=装备: colopedia.goods.improvedBy=改善: colopedia.goods.improvement=%name%(%amount%) -colopedia.goods.initialPrice=初始价格 +colopedia.goods.initialPrice=初始价格: colopedia.goods.isFarmed=初级产品: colopedia.goods.madeFrom=原料: colopedia.goods.makes=被用来制造: @@ -2534,6 +2557,7 @@ colopedia.unit.offensivePower=攻击力: colopedia.unit.price=同期欧洲价格: colopedia.unit.productionBonus=产品{{plural:%number%|one=modifier|other=modifiers}}: colopedia.unit.requirements=需求: +# Fuzzy colopedia.unit.school=训练所需学校: colopedia.unit.skill=技术水平: report.labour.allColonists=所有移民 @@ -2568,31 +2592,38 @@ report.colony.grow.header=+ report.colony.growing.description=%colony%可通过增长 {{复数: %amount% 或 = 一 unit|other = %amount% 单位}} 不伤害生产 report.colony.improve.description=能够改进产品的单位。 report.colony.improve.header=改善 +# Fuzzy report.colony.improving.description=%colony%:为生产更多%amount%的%goods%
用%unit%更换%oldUnit% -report.colony.wanting.description=%colony%:要多制作%amount%个%goods%,增加%unit% report.colony.making.blocking.description=%colony%:{{plural:%turns%|one=下一回合|other=%turns%回合后}}%buildable%需要%amount%个%goods% report.colony.making.constructing.description=%colony%: %buildable% 完成 {{复数: %turns% 或 = 下一 turn|other = 在 %turns% 转}} report.colony.making.description=这个殖民城市在生产什么 report.colony.making.educating.description=%colony%: %teacher% 毕业生 {{复数: %turns% 或 = 下一 turn|other = 在 %turns% 转}} +report.colony.making.educationVacancy.description=%colony%:{{plural:%number%|one=一位学生座位|other=%number%位学生座位}}是空的 report.colony.making.header=制作 report.colony.making.noconstruction.description=%colony%:没有建设进行 report.colony.making.noteach.description=%colony%:%teacher%缺少一名学生 report.colony.name.description=殖民城市列表 report.colony.name.header=殖民地 -report.colony.plow.description=将受益于灌溉的殖民城市格子数 -report.colony.plow.header=P -report.colony.plowing.description=%colony%会从探索{{plural:%amount%|one=一格|other=%amount%格}}中获利 +# Fuzzy report.colony.production.description=%colony%:%goods%净产量=%amount% +# Fuzzy report.colony.production.export.description=%colony%:%goods% 净产量是%amount%(%export%以上出口) report.colony.production.header=%goods%净产量 +# Fuzzy report.colony.production.high.description=%colony%: 净额 %goods% 生产 = %amount% 、 充分 {{复数: %turns% 或 = 下一 turn|other = 在 %turns% 转}} -report.colony.production.low.description=%colony%: 净额 %goods% 生产 = %amount% 、 走 {{复数: %turns% 或 = 下一 turn|other = 在 %turns% 变成}} -report.colony.production.waste.description=%colony%:%goods% 净产量=%amount%,仓库将溢出,%waste%将被浪费 -report.colony.road.description=将受益于筑路的殖民城市格子数 -report.colony.road.header=R -report.colony.roadBuilding.description=%colony%会从探索{{plural:%amount%|one=一格|other=%amount%格}}中获利 +report.colony.production.low.description=%colony%:已消耗%amount%个%goods%,{{plural:%turns%|one=下一回合|other=%turns%回合后}}将消耗殆尽 +report.colony.production.waste.description=%colony%:%amount% %goods% 正在生产,仓库将溢出,%waste% 将被浪费 +report.colony.tile.clearForest.description=%colony%会从结算{{plural:%amount%|one=一格|other=%amount%格}}中获利 +report.colony.tile.clearForest.specific.description=%colony%会从清理%location%中获利 +report.colony.tile.clearForest.header=C +report.colony.tile.plow.description=%colony% 会从耕种{{plural:%amount%|one=一格|other=%amount% 格}}中获利 +report.colony.tile.plow.header=P +report.colony.tile.road.description=%colony%会从建造{{plural:%amount%|one=一条路|other=%amount%条路}}中获利 +report.colony.tile.road.header=R report.colony.shrinking.description=%colony%必须由收缩 {{复数: %amount% 或 = 一 unit|other = %amount% 单位}} 以改善生产 report.colony.starving.description=%colony%: 饥荒{{plural:%turns%|one=下回合|other=在%turns%回合内}} +# Fuzzy +report.colony.wanting.description=%colony%:要多制作%amount%个%goods%,增加%unit% report.continentalCongress.available=可用 report.continentalCongress.elected=选举:%turn% report.continentalCongress.none=(无) @@ -2635,29 +2666,30 @@ report.production.selectGoods=选择货物 report.production.update=更新 report.requirements.badAssignment=%colony% 城内的一个%expert%正在做%expertWork%,同时一个%nonExpert%正在做%nonExpertWork%。如果这两个移民交换他们的工作,那么产出的产品将会更多。 report.requirements.canTrainExperts={{plural:2|%unit%}}可以被训练于 -report.requirements.clearTile=%type%到%colony%的%direction%将受益于清理。 +# Fuzzy report.requirements.exploreTile=%colony%的%direction%的%type%将受益于探索。 report.requirements.met=所有需求均已达到。 report.requirements.missingGoods=%colony%虽然现在还能生产%goods%,但还是需要更多的%input%。 report.requirements.misusedExperts=现在有{{plural:2|%unit%}}并没有做%work%工作位于 report.requirements.noExpert=%colony%正在生产%goods%,但没有%unit%。 -report.requirements.plowCenter=%colony%将受益于耕种格子。 -report.requirements.plowTile=%colony%的%direction%的%type%将受益于耕种。 -report.requirements.roadTile=%colony%的%direction%的%type%将受益于道路建设。 +report.requirements.tile.clearForest=%location%会从结算中获利。 report.requirements.severalExperts=若干{{plural:2|%unit%}}可用于 report.requirements.surplus=下列城市中%goods%生产过剩: report.trade.afterTaxes=税后收入 report.trade.beforeTaxes=税前收入 report.trade.cargoUnits=货仓中的单位 +report.trade.export=正在出口 %goods%,价格为 %amount% +# Fuzzy report.trade.hasCustomHouse=* 这个城市拥有一个海关;这些货物可以出口了。 report.trade.totalDelta=总产量 report.trade.totalUnits=总单位数 report.trade.unitsSold=单位买卖 report.turn.filter=不显示该种(%type%)消息 report.turn.ignore=忽略消息(殖民城市:%colony%,产品: %goods%) -report.turn.playerNation=%player%的国家是%nation% +report.turn.playerNation=%player%的国家是{{tag:country|%nation%}} aboutPanel.copyright=版权所有 © 2002~2015 FreeCol团队 aboutPanel.legalDisclaimer=FreeCol是一款自由软件:你可以在自由软件基金会关于GNU公共许可证第2版或后绪版本条款约束下对其进行重新发布或修改。 +aboutPanel.manual=FreeCol手动下载 aboutPanel.officialSite=官方网址: aboutPanel.sfProject=SourceForge工程: aboutPanel.version=版本: @@ -2680,7 +2712,7 @@ colonyPanel.buildQueue=建造队列 colonyPanel.colonyUnits=殖民地单位 colonyPanel.inPort=港内 colonyPanel.outsideColony=殖民城外 -colonyPanel.producing=生产: +colonyPanel.producing=正在生产: colonyPanel.reducePopulation=如果你将人口降到%number%以下, %colony%将不能修建%buildable%。 colonyPanel.setGoods=设置货物 colonyPanel.traceWork=追踪工作 @@ -2695,8 +2727,8 @@ confirmDeclarationDialog.areYouSure.no=也许以后吧 confirmDeclarationDialog.areYouSure.text=让我们从%monarch%不公平的暴政下解放出来并宣布我们的殖民地脱离王国独立了! confirmDeclarationDialog.areYouSure.yes=不自由毋宁死! confirmDeclarationDialog.createFlag=和我们的敌人应发抖我们违抗横幅的视线。 -confirmDeclarationDialog.defaultCountry=%nation%合众国 -confirmDeclarationDialog.defaultNation=%nation%自由国 +confirmDeclarationDialog.defaultCountry={{tag:country|%nation%}}合众国 +confirmDeclarationDialog.defaultNation={{tag:country|%nation%}}自由国 confirmDeclarationDialog.enterCountry=从今以后,我们的国家将被称作 confirmDeclarationDialog.enterNation=并且我们光荣的民族中的每个公民都将被骄傲的知晓 flag.background.FESSES=供认 @@ -2747,10 +2779,10 @@ negotiationDialog.add=添加 negotiationDialog.cancel=取消 negotiationDialog.clear=清除 negotiationDialog.contact.tutorial=你碰到了欧洲的同行. 他们会和你争夺土地和财富,还有可能发动战争来对付你.不过在约翰·德·维特加入大陆议会后,你以可以同他们贸易。 -negotiationDialog.demand=%nation% 的要求%otherNation% +negotiationDialog.demand={{tag:country|%otherNation%}}的{{tag:country|%nation%}}需求 negotiationDialog.exchange=回应 negotiationDialog.goldAvailable=(%amount% 黄金可用) -negotiationDialog.offer=%nation%由%otherNation%提供 +negotiationDialog.offer={{tag:country|%nation%}}提供{{tag:country|%otherNation%}} negotiationDialog.send=发送 negotiationDialog.title.contact=遇到欧洲同行。 negotiationDialog.title.diplomatic=外交谈判 @@ -2773,10 +2805,10 @@ findSettlementPanel.displayOnlyEuropean=只找到欧洲定居点 findSettlementPanel.displayOnlyNatives=找到仅本机住区 findSettlementPanel.name=寻找聚落 findSettlementPanel.settlement=%name%%capital%(%nation%) -firstContactDialog.meeting.natives=遇到了土著人... +firstContactDialog.meeting.natives=正在与土著人见面 firstContactDialog.meeting.natives.tutorial=你碰到了土著人.你可以派探索者到他们的部落去了解更多他们的事,也可以让契约仆人或自由移民去那里学习他们的技术.如果想和他们贸易就派船或货车去到那儿去吧。 -firstContactDialog.meeting.AZTEC=阿兹特克人... -firstContactDialog.meeting.INCA=印加帝国... +firstContactDialog.meeting.aztec=阿兹特克国 +firstContactDialog.meeting.inca=印加帝国 firstContactDialog.welcomeOffer.text=%nation%人民欢迎你。我们是一个拥有%camps%座 %settlementType%的强大部落。为了表达我们的友好,我们慷慨地将我们被你占用的土地送给你。你同意接受我们提议并同我们如同兄弟般和平共处吗? firstContactDialog.welcomeSimple.text=%nation%人民欢迎你。我们是一个拥有%camps%座%settlementType%的强大部落。你同意接受我们提议并同我们如同兄弟般和平共处吗? abandonColony.no=取消 @@ -2819,6 +2851,7 @@ freecol.map.Australia=澳大利亚 freecol.map.Caribbean_basin=加勒比海盆地 mapSizeDialog.mapSize=选择地图大小 modifierFormat.unknown=??? +modifierFormat.scopeMethod.isIndian.name=土著人 monarchDialog.default=来自皇家的消息 newPanel.editDifficulty=编辑难度 newPanel.getServerList=取得服务器列表 @@ -2877,7 +2910,7 @@ tilePanel.defenseBonus=防卫奖金: tilePanel.label=%label%(%x%, %y%) tilePanel.movementCost=活动花费: tilePanel.owner=所有者: -tilePanel.region=地区: +tilePanel.region=区域: tilePanel.settlement=结算: tradeRouteInputPanel.addStop=增加货站 tradeRouteInputPanel.allColonies=所有殖民地 @@ -3766,6 +3799,7 @@ model.nation.tupi.settlementName.50=图皮尼求姆 model.nation.tupi.settlementName.51=乌穆阿拉马 model.nation.tupi.settlementName.52=乌鲁布 model.nation.tupi.settlementName.53=乌鲁 +model.other.region.river.16=蓝色 error.disasterAvoided=灾难%disaster%幸免于%colony% info.rgb=RGB值:%red%,%green%,%blue% prompt.selectDisaster=选择灾难 diff --git a/doc/FreeCol.tex b/doc/FreeCol.tex index 9253c613b..dda5abb10 100644 --- a/doc/FreeCol.tex +++ b/doc/FreeCol.tex @@ -189,6 +189,10 @@ The following differences between the ``Classic'' rule set and the first. FreeCol optionally allows you to select the unit to be trained yourself. This feature is off by default in the Classic rule set and on by default in the FreeCol rule set. +\item In the FreeCol ruleset, Francisco de Coronado grants full + ongoing visibility of foreign colonies and their surroundings. Classic + rules do not grant ongoing or surroundings visibility, and show + revealed colonies as having size of one. \end{itemize} @@ -250,15 +254,13 @@ defined in the file to match the location of the freecol icon. \hypertarget{System Requirements}{\section{System Requirements}} FreeCol is written in Java. In order to run, it requires a Java -Virtual Machine. In theory, FreeCol should run on any platform on -which a Java Virtual Machine compatible with Sun Java 7 or higher is -available. In practice, however, things are less clear cut. +Virtual Machine. FreeCol should run on any platform on which a Java +Virtual Machine compatible with Sun Java 8 or higher is available. -FreeCol is known to work with \href{http://java.sun.com/}{Oracle Java - 7}. FreeCol also works with OpenJDK, although some minor problems -and graphics glitches may remain. FreeCol is known to run on recent -versions of Windows, Linux, and Mac OS X. If you are using FreeCol on -a different platform, we would like to hear about it. +FreeCol is known to work with \href{http://java.sun.com/}{Oracle Java} +and \href{http://openjdk.java.net}{OpenJDK}. FreeCol is known to run on +recent versions of Windows, Linux, and Mac OS X. If you are using +FreeCol on a different platform, we would like to hear about it. FreeCol requires at least 256 MB memory, although some systems slow down badly and require 512MB. FreeCol works best with a screen @@ -336,8 +338,8 @@ options: \item\verb$--version$ Display the version number. \item\verb$--default-locale LOCALE$ Specify a locale. \item\verb$--freecol-data DIR$ Specify the directory that contains -FreeCol's data files. In general, you will only need to use this if -you have installed a modified copy of FreeCol's data files. + FreeCol's data files. In general, you will only need to use this if + you have installed a modified copy of FreeCol's data files. \item\verb$--advantages ADVANTAGES$ Set the European nation advantages type, which must be one of \texttt{Selected} (each nation may choose an advantage), \texttt{Fixed} (the standard advantage types are @@ -352,21 +354,23 @@ you have installed a modified copy of FreeCol's data files. European colonial nations (normally the classic four: Dutch, English, French, Spanish). \item\verb$--font FONTSPEC$ Override the default font with a Java -font specifier (e.g. Arial-BOLD-12). + font specifier (e.g. Arial-BOLD-12). \item\verb$--full-screen$ Run FreeCol in full screen mode. \item\verb$--load-savegame SAVEGAME_FILE$ Load the given - savegame. This is particularly useful in combination with the client + savegame. This is particularly useful in combination with the client option \hyperlink{show savegame settings}{show savegame settings}. \item\verb$--log-file FILE$ Override the location of the log file. \item\verb$--name NAME$ Specify a player name. \item\verb$--no-intro$ Skip the introductory video. -\item\verb$--no-sound$ Run FreeCol without sound. Note that the game -does not yet contain any music, so the only sounds you will hear will -be special effects. -\item\verb$--server PORT$ Start a stand-alone server on the specified -port. If you don't know what that means, you will not need the option. +\item\verb$--no-sound$ Run FreeCol without sound. Note that the game + does not yet contain background music, so the only sounds you will + hear will be special effects. +\item\verb$--no-splash$ Skip the splash screen. +\item\verb$--server$ Start a stand-alone server. +\item\verb$--server-name NAME$ Specify the server name. +\item\verb$--server-port PORT$ Specify the server port. \item\verb$--server-help$ Display a help screen for the more advanced -server options. + server options. \item\verb$--splash FILE$ Specify the location of the splash screen file. \item\verb$--timeout TIMEOUT$ Specifies the number of seconds the server should wait for a player to answer a question (e.g. demands @@ -378,20 +382,20 @@ server options. exist this option will be ignored. \item\verb$--user-config-directory DIRECTORY$ Use the given directory instead of your default FreeCol user configuration directory to load - client and custom options. You can use this in order to run the + client and custom options. You can use this in order to run the game from a USB stick\index{USB stick}, for example. Please note that specifying a client options file on the command line will override the options directory. If the specified directory does not exist this option will be ignored. \item\verb$--user-data-directory DIRECTORY$ Use the given directory instead of your default FreeCol user data directory to load and save - games, and user mods. You can use this in order to run the - game from a USB stick\index{USB stick}, for example. Please note + games, and user mods. You can use this in order to run the + game from a USB stick\index{USB stick}, for example. Please note that specifying a save game file on the command line will override the save game directory. If the specified directory does not exist FreeCol will exit. \item\verb$--windowed[[=]WIDTHxHEIGHT]$ Run FreeCol in windowed mode, - and optionally explicitly set the window width and height. If the + and optionally explicitly set the window width and height. If the size is not specified FreeCol will attempt to use as much space as possible without overlapping menu bars et al. Window size determination is not always correct for all combinations of @@ -2676,9 +2680,9 @@ a colony with access to the sea, your \hyperlink{Monarch}{Monarch} will offer to ship it to Europe for a ``reasonable fee'', unless \hyperlink{Hernan Cortes}{Hern\'an Cort\'es} has joined the \hyperlink{Continental Congress}{Continental Congress}, in which case -it will be shipped free of charge. If you have a -\hyperlink{Galleon}{Galleon}, however, you can take the Treasure Train -to Europe yourself. +it will be shipped free of charge. However if you have a +\hyperlink{Galleon}{Galleon}, you are expected to use it to take the +Treasure Train to Europe yourself. The \Unit{Caravel}, the \Unit{Merchantman} and the \Unit{Galleon} are unarmed \hypertarget{Naval Units}{naval units}, with two, four or six diff --git a/doc/developer.tex b/doc/developer.tex index 41f8d0ec7..c59d1df72 100644 --- a/doc/developer.tex +++ b/doc/developer.tex @@ -283,9 +283,9 @@ and launch the game right away. Enjoy. We have a NetBeans project with updated settings, but it is not at the standard location the IDE expects it at, as the IDE gets slower while a large project, like FreeCol, is open. -NetBeans (currently on version 8.02) also, for a long time, contains a bug +NetBeans (currently on version 8.0.2) also, for a long time, contains a bug in that it wont read or write the editor setting for the Java version, if it -was correctly set to 1.7. +was correctly set to 1.8. It is therefore set to 1.5 in the project file and causes the Editor to show a huge amount of wrong compatibility warnings, though compilation is not affected. @@ -300,7 +300,7 @@ you do not close the project manually. Each time you open the IDE right click on the ``FreeCol'' project name inside the ``Projects'' panel, choose ``Properties'', then from the opened dialog choose ``Java Sources'' on the tree part, then change the ``Source Level'' setting to -``JDK 1.7'' and click the ``OK'' button. This is necessary every time, until +``JDK 1.8'' and click the ``OK'' button. This is necessary every time, until the NetBeans bug got fixed! \hypertarget{Creating a new NetBeans project}{\subsection{Creating a new NetBeans project (thanks to ``xsainnz'')}} @@ -442,9 +442,15 @@ recommended for a release. Uploads to sourceforge use \texttt{sftp}. version number. \item[\texttt{www.freecol.org/index.html}] Add a reference to the new release. + \item[\texttt{www.freecol.org/sitemap.html}] Add a reference to the + new release. + \item[\texttt{www.freecol.org/status.html}] Update the release + version number. \item[\texttt{www.freecol.org/news/index.html}] Add a section for the new release containing the release announcement, and move the download button from the previous release to the new one. + \item[\texttt{www.freecol.org/news/releases.html}] Copy in the same + section from the previous file, these two are nearly identical. \end{description} Use \texttt{sftp} to log in at \emph{username}\texttt{,freecol@web.sf.net} to upload changes (the diff --git a/doc/version.sty b/doc/version.sty index 930d5707d..5a1052903 100644 --- a/doc/version.sty +++ b/doc/version.sty @@ -1,4 +1,4 @@ %-*-LaTeX-*- % Trivial file to contain the version number definition, used by both % FreeCol.tex and developer.tex. -\newcommand{\fcversion}{0.11.5} +\newcommand{\fcversion}{0.11.6} diff --git a/jars/jogg-0.0.17.jar b/jars/jogg-0.0.17.jar new file mode 100644 index 000000000..f614de473 Binary files /dev/null and b/jars/jogg-0.0.17.jar differ diff --git a/jars/jogg-0.0.7.jar b/jars/jogg-0.0.7.jar deleted file mode 100644 index 1cbd1ad56..000000000 Binary files a/jars/jogg-0.0.7.jar and /dev/null differ diff --git a/jars/jorbis-0.0.15.jar b/jars/jorbis-0.0.15.jar deleted file mode 100644 index 4cf51f90e..000000000 Binary files a/jars/jorbis-0.0.15.jar and /dev/null differ diff --git a/jars/jorbis-0.0.17.jar b/jars/jorbis-0.0.17.jar new file mode 100644 index 000000000..b345106c9 Binary files /dev/null and b/jars/jorbis-0.0.17.jar differ diff --git a/packaging/common/README b/packaging/common/README index 080bf3971..1e49f0bc5 100644 --- a/packaging/common/README +++ b/packaging/common/README @@ -14,7 +14,7 @@ VI. About I. Requirements ================================= The program is written in Java. It can be ran with any Java -Runtime Environment (JRE) that is at least version 1.7. +Runtime Environment (JRE) that is at least version 1.8. The JRE (or JVM) can be downloaded from: http://java.sun.com/getjava/download.html diff --git a/src/net/sf/freecol/FreeCol.java b/src/net/sf/freecol/FreeCol.java index f9ef7192c..d05ae3d52 100644 --- a/src/net/sf/freecol/FreeCol.java +++ b/src/net/sf/freecol/FreeCol.java @@ -21,17 +21,22 @@ package net.sf.freecol; import java.awt.Dimension; import java.io.File; -import java.io.FileFilter; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; import java.io.IOException; -import java.lang.Thread.UncaughtExceptionHandler; import java.net.InetAddress; import java.net.URL; import java.net.JarURLConnection; +import java.util.Arrays; import java.util.Locale; +import java.util.jar.JarFile; import java.util.jar.Manifest; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; import net.sf.freecol.client.ClientOptions; import net.sf.freecol.client.FreeColClient; @@ -39,7 +44,6 @@ import net.sf.freecol.common.FreeColException; import net.sf.freecol.common.FreeColSeed; import net.sf.freecol.common.debug.FreeColDebugger; import net.sf.freecol.common.i18n.Messages; -import net.sf.freecol.common.i18n.NameCache; import net.sf.freecol.common.io.FreeColDirectories; import net.sf.freecol.common.io.FreeColSavegameFile; import net.sf.freecol.common.io.FreeColTcFile; @@ -48,9 +52,8 @@ import net.sf.freecol.common.logging.DefaultHandler; import net.sf.freecol.common.model.NationOptions.Advantages; import net.sf.freecol.common.model.Specification; import net.sf.freecol.common.model.StringTemplate; -import net.sf.freecol.common.model.Turn; -import net.sf.freecol.common.networking.NoRouteToServerException; import net.sf.freecol.common.option.OptionGroup; +import static net.sf.freecol.common.util.CollectionUtils.*; import net.sf.freecol.server.FreeColServer; import org.apache.commons.cli.CommandLine; @@ -74,7 +77,7 @@ public final class FreeCol { private static final Logger logger = Logger.getLogger(FreeCol.class.getName()); /** The FreeCol release version number. */ - private static final String FREECOL_VERSION = "0.11.5"; + private static final String FREECOL_VERSION = "0.11.6"; /** The difficulty levels. */ public static final String[] DIFFICULTIES = { @@ -82,7 +85,7 @@ public final class FreeCol { }; /** The extension for FreeCol saved games. */ - public static final String FREECOL_SAVE_EXTENSION = ".fsg"; + public static final String FREECOL_SAVE_EXTENSION = "fsg"; /** The Java version. */ private static final String JAVA_VERSION @@ -91,17 +94,6 @@ public final class FreeCol { /** The maximum available memory. */ private static final long MEMORY_MAX = Runtime.getRuntime().maxMemory(); - /** A file filter to select the saved game files. */ - public static final FileFilter freeColSaveFileFilter - = new FileFilter() { - @Override - public boolean accept(File f) { - return f.isFile() - && f.getName().endsWith(FREECOL_SAVE_EXTENSION) - && f.getName().length() > FREECOL_SAVE_EXTENSION.length(); - } - }; - public static final String CLIENT_THREAD = "FreeColClient:"; public static final String SERVER_THREAD = "FreeColServer:"; public static final String METASERVER_THREAD = "FreeColMetaServer:"; @@ -122,10 +114,10 @@ public final class FreeCol { private static final int EUROPEANS_DEFAULT = 4; private static final int EUROPEANS_MIN = 1; private static final Level LOGLEVEL_DEFAULT = Level.INFO; - private static final String JAVA_VERSION_MIN = "1.7"; + private static final String JAVA_VERSION_MIN = "1.8"; private static final int MEMORY_MIN = 128; // Mbytes private static final int PORT_DEFAULT = 3541; - private static final String SPLASH_FILE_DEFAULT = "splash.jpg"; + private static final String SPLASH_DEFAULT = "splash.jpg"; private static final String TC_DEFAULT = "freecol"; public static final int TIMEOUT_DEFAULT = 60; // 1 minute public static final int TIMEOUT_MIN = 10; // 10s @@ -174,8 +166,8 @@ public final class FreeCol { private static int serverPort = -1; private static String serverName = null; - /** Where the splash file lives. */ - private static String splashFilename = SPLASH_FILE_DEFAULT; + /** A stream to get the splash image from. */ + private static InputStream splashStream; /** The TotalConversion / ruleset in play, defaults to "freecol". */ private static String tc = null; @@ -202,13 +194,30 @@ public final class FreeCol { */ public static void main(String[] args) { freeColRevision = FREECOL_VERSION; + JarURLConnection juc; try { - String revision = readVersion(FreeCol.class); - if (revision != null) { - freeColRevision += " (Revision: " + revision + ")"; + juc = getJarURLConnection(FreeCol.class); + } catch (IOException ioe) { + juc = null; + System.err.println("Unable to open class jar: " + + ioe.getMessage()); + } + if (juc != null) { + try { + String revision = readVersion(juc); + if (revision != null) { + freeColRevision += " (Revision: " + revision + ")"; + } + } catch (Exception e) { + System.err.println("Unable to load Manifest: " + + e.getMessage()); + } + try { + splashStream = getDefaultSplashStream(juc); + } catch (Exception e) { + System.err.println("Unable to open default splash: " + + e.getMessage()); } - } catch (Exception e) { - System.err.println("Unable to load Manifest: " + e.getMessage()); } // Java bug #7075600 causes BR#2554. The workaround is to set @@ -271,11 +280,8 @@ public final class FreeCol { + e.getMessage()); e.printStackTrace(); } - Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { - @Override - public void uncaughtException(Thread thread, Throwable e) { - baseLogger.log(Level.WARNING, "Uncaught exception from thread: " + thread, e); - } + Thread.setDefaultUncaughtExceptionHandler((Thread thread, Throwable e) -> { + baseLogger.log(Level.WARNING, "Uncaught exception from thread: " + thread, e); }); // Now we can find the client options, allow the options @@ -316,18 +322,43 @@ public final class FreeCol { /** - * Extract the package version from the class. + * Get the JarURLConnection from a class. * - * @param c The Class to extract from. - * @return A value of the package version attribute. + * @return The JarURLConnection. */ - private static String readVersion(Class c) throws IOException { + private static JarURLConnection getJarURLConnection(Class c) throws IOException { String resourceName = "/" + c.getName().replace('.', '/') + ".class"; URL url = c.getResource(resourceName); - Manifest mf = ((JarURLConnection)url.openConnection()).getManifest(); - return mf.getMainAttributes().getValue("Package-Version"); + return (JarURLConnection)url.openConnection(); + } + + /** + * Extract the package version from the class. + * + * @param juc The JarURLConnection to extract from. + * @return A value of the package version attribute. + */ + private static String readVersion(JarURLConnection juc) throws IOException { + Manifest mf = juc.getManifest(); + return (mf == null) ? null + : mf.getMainAttributes().getValue("Package-Version"); } + /** + * Get a stream for the default splash file. + * + * Note: Not bothering to check for nulls as this is called in try + * block that ignores all exceptions. + * + * @param juc The JarURLConnection to extract from. + * @return A suitable InputStream, or null on error. + */ + private static InputStream getDefaultSplashStream(JarURLConnection juc) throws IOException { + JarFile jf = juc.getJarFile(); + ZipEntry ze = jf.getEntry(SPLASH_DEFAULT); + return jf.getInputStream(ze); + } + /** * Exit printing fatal error message. * @@ -517,6 +548,9 @@ public final class FreeCol { options.addOption(OptionBuilder.withLongOpt("no-sound") .withDescription(Messages.message("cli.no-sound")) .create()); + options.addOption(OptionBuilder.withLongOpt("no-splash") + .withDescription(Messages.message("cli.no-splash")) + .create()); options.addOption(OptionBuilder.withLongOpt("private") .withDescription(Messages.message("cli.private")) .create()); @@ -527,14 +561,17 @@ public final class FreeCol { .create()); options.addOption(OptionBuilder.withLongOpt("server") .withDescription(Messages.message("cli.server")) - .withArgName(Messages.message("cli.arg.port")) - .hasOptionalArg() .create()); options.addOption(OptionBuilder.withLongOpt("server-name") .withDescription(Messages.message("cli.server-name")) .withArgName(Messages.message("cli.arg.name")) .hasArg() .create()); + options.addOption(OptionBuilder.withLongOpt("server-port") + .withDescription(Messages.message("cli.server-port")) + .withArgName(Messages.message("cli.arg.port")) + .hasArg() + .create()); options.addOption(OptionBuilder.withLongOpt("splash") .withDescription(Messages.message("cli.splash")) .withArgName(Messages.message("cli.arg.file")) @@ -722,29 +759,41 @@ public final class FreeCol { if (line.hasOption("no-sound")) { sound = false; } + if (line.hasOption("no-splash")) { + splashStream = null; + } if (line.hasOption("private")) { publicServer = false; } if (line.hasOption("server")) { - String arg = line.getOptionValue("server"); - if (!setServerPort(arg)) { - fatal(StringTemplate.template("cli.error.serverPort") - .addName("%string%", arg)); - } standAloneServer = true; } if (line.hasOption("server-name")) { serverName = line.getOptionValue("server-name"); } + if (line.hasOption("server-port")) { + String arg = line.getOptionValue("server-port"); + if (!setServerPort(arg)) { + fatal(StringTemplate.template("cli.error.serverPort") + .addName("%string%", arg)); + } + } if (line.hasOption("seed")) { FreeColSeed.setFreeColSeed(line.getOptionValue("seed")); } if (line.hasOption("splash")) { - splashFilename = line.getOptionValue("splash"); + String splash = line.getOptionValue("splash"); + try { + FileInputStream fis = new FileInputStream(splash); + splashStream = fis; + } catch (FileNotFoundException fnfe) { + gripe(StringTemplate.template("cli.error.splash") + .addName("%name%", splash)); + } } if (line.hasOption("tc")) { @@ -876,14 +925,10 @@ public final class FreeCol { * @return The type of advantages set, or null if none. */ private static Advantages selectAdvantages(String advantages) { - for (Advantages a : Advantages.values()) { - String msg = Messages.getName(a); - if (msg.equals(advantages)) { - setAdvantages(a); - return a; - } - } - return null; + Advantages adv = find(Advantages.values(), + a -> Messages.getName(a).equals(advantages), null); + if (adv != null) setAdvantages(adv); + return adv; } /** @@ -901,11 +946,8 @@ public final class FreeCol { * @return A list of advantage types. */ private static String getValidAdvantages() { - String ret = ""; - for (Advantages a : Advantages.values()) { - ret += "," + Messages.getName(a); - } - return ret.substring(1); + return Arrays.stream(Advantages.values()) + .map(a -> Messages.getName(a)).collect(Collectors.joining(",")); } /** @@ -924,15 +966,10 @@ public final class FreeCol { * @return The name of the selected difficulty, or null if none. */ public static String selectDifficulty(String arg) { - for (String d : DIFFICULTIES) { - String key = "model.difficulty." + d; - String value = Messages.getName(key); - if (value.equals(arg)) { - setDifficulty(key); - return key; - } - } - return null; + String difficulty = find(map(DIFFICULTIES, d -> "model.difficulty."+d), + k -> Messages.getName(k).equals(arg), null); + if (difficulty != null) setDifficulty(difficulty); + return difficulty; } /** @@ -960,13 +997,9 @@ public final class FreeCol { * @return The valid difficulty levels, comma separated. */ public static String getValidDifficulties() { - String s = ""; - for (String d : DIFFICULTIES) { - String key = "model.difficulty." + d; - String value = Messages.getName(key); - s += "," + value; - } - return s.substring(1); + return Arrays.stream(DIFFICULTIES) + .map(d -> Messages.getName("model.difficulty." + d)) + .collect(Collectors.joining(",")); } /** @@ -1312,7 +1345,7 @@ public final class FreeCol { // savegame was specified on command line } final FreeColClient freeColClient - = new FreeColClient(splashFilename, fontName, guiScale, headless); + = new FreeColClient(splashStream, fontName, guiScale, headless); freeColClient.startClient(windowSize, userMsg, sound, introVideo, savegame, spec); } @@ -1348,14 +1381,15 @@ public final class FreeCol { try { freeColServer = new FreeColServer(publicServer, false, spec, serverPort, serverName); - } catch (NoRouteToServerException nrtse) { - fatal(Messages.message("server.noRouteToServer")); - return; } catch (Exception e) { fatal(Messages.message("server.initialize") + ": " + e.getMessage()); return; } + if (publicServer && freeColServer != null + && !freeColServer.getPublicServer()) { + gripe(Messages.message("server.noRouteToServer")); + } } String quit = FreeCol.SERVER_THREAD + "Quit Game"; diff --git a/src/net/sf/freecol/client/ClientOptions.java b/src/net/sf/freecol/client/ClientOptions.java index 68b6af848..3b7e677aa 100644 --- a/src/net/sf/freecol/client/ClientOptions.java +++ b/src/net/sf/freecol/client/ClientOptions.java @@ -42,6 +42,7 @@ import net.sf.freecol.common.model.Colony; import net.sf.freecol.common.model.Europe; import net.sf.freecol.common.model.FreeColGameObject; import net.sf.freecol.common.model.Game; +import net.sf.freecol.common.model.Location; import net.sf.freecol.common.model.ModelMessage; import net.sf.freecol.common.model.Player; import net.sf.freecol.common.model.Unit; @@ -131,7 +132,7 @@ public class ClientOptions extends OptionGroup { /** * Selected tiles always gets centered if this option is enabled (even if - * the tile is {@link net.sf.freecol.client.gui.GUI#onScreen(Tile)}). + * the tile is on screen. * * @see net.sf.freecol.client.gui.GUI */ @@ -140,8 +141,7 @@ public class ClientOptions extends OptionGroup { /** * If this option is enabled, the display will recenter in order - * to display the active unit if it is not - * {@link net.sf.freecol.client.gui.GUI#onScreen(Tile)}). + * to display the active unit if it is not on screen. * * @see net.sf.freecol.client.gui.GUI */ @@ -430,67 +430,30 @@ public class ClientOptions extends OptionGroup { = "clientOptions.mods.userMods"; - /** - * Comparators for sorting colonies. - */ + // Comparators for sorting colonies. + /** Compare by ascending age. */ private static final Comparator colonyAgeComparator - = new Comparator() { - @Override - public int compare(Colony s1, Colony s2) { - return s1.getEstablished().getNumber() - - s2.getEstablished().getNumber(); - } - }; + = Comparator.comparingInt(c -> c.getEstablished().getNumber()); + /** Compare by name. */ private static final Comparator colonyNameComparator - = new Comparator() { - @Override - public int compare(Colony s1, Colony s2) { - return s1.getName().compareTo(s2.getName()); - } - }; + = Comparator.comparing(Colony::getName); + /** Compare by descending size then liberty. */ private static final Comparator colonySizeComparator - = new Comparator() { - @Override - public int compare(Colony s1, Colony s2) { - // sort size descending, then SoL descending - int dsize = s2.getUnitCount() - s1.getUnitCount(); - if (dsize == 0) { - return s2.getSoL() - s1.getSoL(); - } else { - return dsize; - } - } - }; + = Comparator.comparingInt(Colony::getUnitCount) + .thenComparingInt(Colony::getSoL) + .reversed(); + /** Compare by descending liberty then size. */ private static final Comparator colonySoLComparator - = new Comparator() { - @Override - public int compare(Colony s1, Colony s2) { - // sort SoL descending, then size descending - int dsol = s2.getSoL() - s1.getSoL(); - if (dsol == 0) { - return s2.getUnitCount() - s1.getUnitCount(); - } else { - return dsol; - } - } - }; + = Comparator.comparingInt(Colony::getSoL) + .thenComparingInt(Colony::getUnitCount) + .reversed(); + /** Compare by position on the map. */ private static final Comparator colonyPositionComparator - = new Comparator() { - @Override - public int compare(Colony s1, Colony s2) { - // sort north to south, then west to east - int dy = s1.getTile().getY() - s2.getTile().getY(); - if (dy == 0) { - return s1.getTile().getX() - s2.getTile().getX(); - } else { - return dy; - } - } - }; + = Comparator.comparingInt(c -> Location.getRank(c)); private class MessageSourceComparator implements Comparator { @@ -539,13 +502,8 @@ public class ClientOptions extends OptionGroup { /** Compare messages by type. */ private static final Comparator messageTypeComparator - = new Comparator() { - @Override - public int compare(ModelMessage message1, ModelMessage message2) { - return message1.getMessageType().ordinal() - - message2.getMessageType().ordinal(); - } - }; + = (m1, m2) -> m1.getMessageType().ordinal() + - m2.getMessageType().ordinal(); /** diff --git a/src/net/sf/freecol/client/FreeColClient.java b/src/net/sf/freecol/client/FreeColClient.java index f1d6ace99..c1d62a4ee 100644 --- a/src/net/sf/freecol/client/FreeColClient.java +++ b/src/net/sf/freecol/client/FreeColClient.java @@ -22,6 +22,7 @@ package net.sf.freecol.client; import java.awt.Dimension; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.util.Collections; import java.util.List; import java.util.logging.Level; @@ -132,21 +133,21 @@ public final class FreeColClient { private final boolean headless; - public FreeColClient(final String splashFilename, + public FreeColClient(final InputStream splashStream, final String fontName) { - this(splashFilename, fontName, FreeCol.GUI_SCALE_DEFAULT, true); + this(splashStream, fontName, FreeCol.GUI_SCALE_DEFAULT, true); } /** * Creates a new FreeColClient. Creates the control * objects. * - * @param splashFilename The name of the splash image. + * @param splashStream A stream to read the splash image from. * @param fontName An optional override of the main font. * @param scale The scale factor for gui elements. * @param headless Run in headless mode. */ - public FreeColClient(final String splashFilename, final String fontName, + public FreeColClient(final InputStream splashStream, final String fontName, final float scale, boolean headless) { mapEditor = false; this.headless = headless @@ -161,7 +162,7 @@ public final class FreeColClient { // Get the splash screen up early on to show activity. gui = (this.headless) ? new GUI(this, scale) : new SwingGUI(this, scale); - gui.displaySplashScreen(splashFilename); + gui.displaySplashScreen(splashStream); // Look for base data directory. Failure is fatal. File baseDirectory = FreeColDirectories.getBaseDirectory(); @@ -215,8 +216,6 @@ public final class FreeColClient { } catch (IOException e) { fatal(Messages.message("client.classic") + "\n" + e.getMessage()); } - actionManager = new ActionManager(this); - actionManager.initializeActions(inGameController, connectController); if (!this.headless) { // Swing system and look-and-feel initialization. @@ -226,6 +225,8 @@ public final class FreeColClient { fatal(Messages.message("client.laf") + "\n" + e.getMessage()); } } + actionManager = new ActionManager(this); + actionManager.initializeActions(inGameController, connectController); } /** @@ -281,40 +282,26 @@ public final class FreeColClient { // NewPanel to a call to the connect controller to start a game) if (savedGame != null) { soundController.playSound("sound.intro.general"); - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - if (!connectController.startSavedGame(savedGame, - userMsg)) { - gui.showMainPanel(userMsg); - } + SwingUtilities.invokeLater(() -> { + if (!connectController.startSavedGame(savedGame, userMsg)) { + gui.showMainPanel(userMsg); } }); } else if (spec != null) { // Debug or fast start soundController.playSound("sound.intro.general"); - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - if (!connectController.startSinglePlayerGame(spec, - true)) { - gui.showMainPanel(userMsg); - } + SwingUtilities.invokeLater(() -> { + if (!connectController.startSinglePlayerGame(spec, true)) { + gui.showMainPanel(userMsg); } }); } else if (showOpeningVideo) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - gui.showOpeningVideo(userMsg); - } + SwingUtilities.invokeLater(() -> { + gui.showOpeningVideo(userMsg); }); } else { soundController.playSound("sound.intro.general"); - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - gui.showMainPanel(userMsg); - } + SwingUtilities.invokeLater(() -> { + gui.showMainPanel(userMsg); }); } @@ -705,6 +692,19 @@ public final class FreeColClient { && player.equals(game.getCurrentPlayer()); } + /** + * Common utility routine to retrieve animation speed. + * + * @param player The Player to be animated. + * @return The animation speed. + */ + public int getAnimationSpeed(Player player) { + String key = (getMyPlayer() == player) + ? ClientOptions.MOVE_ANIMATION_SPEED + : ClientOptions.ENEMY_MOVE_ANIMATION_SPEED; + return getClientOptions().getInteger(key); + } + /** * Get a list of the player colonies. * @@ -733,14 +733,17 @@ public final class FreeColClient { * * When the game is clear, show the new game panel. * - * Called from the New action, often from the button on the MainPanel. + * Called from the New action, often from the button on the MainPanel, + * and IGC.victory() + * + * @param prompt If true, prompt to confirm stopping the game. */ - public void newGame() { + public void newGame(boolean prompt) { Specification specification = null; if (getGame() != null) { if (isMapEditor()) { specification = getGame().getSpecification(); - } else if (gui.confirmStopGame()) { + } else if (!prompt || gui.confirmStopGame()) { getConnectController().quitGame(true); FreeColSeed.incrementFreeColSeed(); } else { @@ -807,7 +810,7 @@ public final class FreeColClient { if (validPeriod != 0L && autoSave != null && (flist = autoSave.list()) != null) { for (String f : flist) { - if (!f.endsWith(FreeCol.FREECOL_SAVE_EXTENSION)) continue; + if (!f.endsWith("." + FreeCol.FREECOL_SAVE_EXTENSION)) continue; // delete files which are older than user option allows File saveGameFile = new File(autoSave, f); if (saveGameFile.lastModified() + validPeriod < timeNow) { diff --git a/src/net/sf/freecol/client/control/ConnectController.java b/src/net/sf/freecol/client/control/ConnectController.java index ed17fd833..4ee59d282 100644 --- a/src/net/sf/freecol/client/control/ConnectController.java +++ b/src/net/sf/freecol/client/control/ConnectController.java @@ -30,12 +30,15 @@ import java.util.logging.Logger; import javax.swing.SwingUtilities; import javax.xml.stream.XMLStreamException; -import net.sf.freecol.FreeCol; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import net.sf.freecol.FreeCol; import net.sf.freecol.client.ClientOptions; import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.client.gui.GUI; -import net.sf.freecol.client.gui.panel.ChoiceItem; -import net.sf.freecol.client.gui.panel.LoadingSavegameDialog; +import net.sf.freecol.client.gui.LoadingSavegameInfo; import net.sf.freecol.common.FreeColException; import net.sf.freecol.common.ServerInfo; import net.sf.freecol.common.debug.FreeColDebugger; @@ -52,14 +55,10 @@ import net.sf.freecol.common.model.Unit; import net.sf.freecol.common.networking.Connection; import net.sf.freecol.common.networking.DOMMessage; import net.sf.freecol.common.networking.LoginMessage; -import net.sf.freecol.common.networking.NoRouteToServerException; import net.sf.freecol.common.resources.ResourceManager; import net.sf.freecol.server.FreeColServer; import net.sf.freecol.server.FreeColServer.GameState; -import org.w3c.dom.Element; -import org.w3c.dom.NodeList; - /** * The controller responsible for starting a server and connecting to it. @@ -132,17 +131,20 @@ public final class ConnectController { */ private FreeColServer startServer(boolean publicServer, boolean singlePlayer, Specification spec, int port) { + FreeColServer freeColServer; try { - return new FreeColServer(publicServer, singlePlayer, spec, port, - null); - } catch (NoRouteToServerException e) { - gui.showErrorMessage("server.noRouteToServer"); - logger.log(Level.WARNING, "No route to server.", e); + freeColServer = new FreeColServer(publicServer, singlePlayer, + spec, port, null); } catch (IOException e) { + freeColServer = null; gui.showErrorMessage("server.initialize"); logger.log(Level.WARNING, "Could not start server.", e); } - return null; + if (publicServer && freeColServer != null + && !freeColServer.getPublicServer()) { + gui.showErrorMessage("server.noRouteToServer"); + } + return freeColServer; } /** @@ -296,7 +298,6 @@ public final class ConnectController { } freeColClient.setMyPlayer(player); freeColClient.addSpecificationActions(game.getSpecification()); - freeColClient.updateActions(); logger.info("FreeColClient logged in as " + user + "/" + player.getId()); @@ -317,10 +318,10 @@ public final class ConnectController { activeUnit.getOwner().setNextActiveUnit(activeUnit); gui.setActiveUnit(activeUnit); } else { - gui.setSelectedTile(entryTile, false); + gui.setSelectedTile(entryTile); } } else { - gui.setSelectedTile(entryTile, false); + gui.setSelectedTile(entryTile); } } } @@ -417,10 +418,13 @@ public final class ConnectController { List> choices = new ArrayList<>(); for (String n : names) { - choices.add(new ChoiceItem<>(Messages.getName(n), n)); + String nam = Messages.message(StringTemplate + .template("countryName") + .add("%nation%", Messages.nameKey(n))); + choices.add(new ChoiceItem<>(nam, n)); } - String choice = gui.getChoice(true, null, - Messages.message("client.choicePlayer"), null, + String choice = gui.getChoice(null, + Messages.message("client.choicePlayer"), "cancel", choices); if (choice == null) return false; // User cancelled @@ -581,7 +585,7 @@ public final class ConnectController { if (!gui.showLoadingSavegameDialog(defaultPublicServer, defaultSinglePlayer)) return false; - LoadingSavegameDialog lsd = gui.getLoadingSavegameDialog(); + LoadingSavegameInfo lsd = gui.getLoadingSavegameInfo(); singlePlayer = lsd.isSinglePlayer(); name = lsd.getServerName(); port = lsd.getPort(); @@ -596,65 +600,55 @@ public final class ConnectController { gui.showStatusPanel(Messages.message("status.loadingGame")); final File theFile = file; - Runnable loadGameJob = new Runnable() { - @Override - public void run() { - FreeColServer freeColServer = null; - StringTemplate err = null; - try { - final FreeColSavegameFile saveGame - = new FreeColSavegameFile(theFile); - freeColServer = new FreeColServer(saveGame, - (Specification)null, port, name); - freeColClient.setFreeColServer(freeColServer); - // Server might have bounced to another port. - freeColClient.setSinglePlayer(singlePlayer); - freeColClient.getInGameController().setGameConnected(); - if (login(FreeCol.getName(), freeColServer.getHost(), - freeColServer.getPort())) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - ResourceManager.setScenarioMapping(saveGame.getResourceMapping()); - if (userMsg != null) gui.showInformationMessage(userMsg); - gui.closeStatusPanel(); + Runnable loadGameJob = () -> { + FreeColServer freeColServer = null; + StringTemplate err = null; + try { + final FreeColSavegameFile saveGame + = new FreeColSavegameFile(theFile); + freeColServer = new FreeColServer(saveGame, + (Specification)null, port, name); + freeColClient.setFreeColServer(freeColServer); + // Server might have bounced to another port. + freeColClient.setSinglePlayer(singlePlayer); + freeColClient.getInGameController().setGameConnected(); + if (login(FreeCol.getName(), freeColServer.getHost(), + freeColServer.getPort())) { + SwingUtilities.invokeLater(() -> { + ResourceManager.setScenarioMapping(saveGame.getResourceMapping()); + if (userMsg != null) { + gui.showInformationMessage(userMsg); } + gui.closeStatusPanel(); }); - return; // Success! - } - err = StringTemplate.key("server.couldNotLogin"); - logger.warning("Could not log in."); - } catch (FileNotFoundException e) { - err = StringTemplate.key("server.fileNotFound"); - logger.log(Level.WARNING, "Can not find file.", e); - } catch (FreeColException e) { - err = StringTemplate.name(e.getMessage()); - logger.log(Level.WARNING, "FreeCol error.", e); - } catch (IOException e) { - err = StringTemplate.key("server.initialize"); - logger.log(Level.WARNING, "Error starting game.", e); - } catch (NoRouteToServerException e) { - err = StringTemplate.key("server.noRouteToServer"); - logger.log(Level.WARNING, "No route to server.", e); - } catch (XMLStreamException e) { - err = FreeCol.badLoad(theFile); - logger.log(Level.WARNING, "Stream error.", e); + return; // Success! } - if (err != null) { - // If this is a debug run, fail hard. - if (freeColClient.isHeadless() - || FreeColDebugger.getDebugRunTurns() >= 0) { - FreeCol.fatal(Messages.message(err)); - } - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - gui.closeMainPanel(); - gui.showMainPanel(null); - } - }); - SwingUtilities.invokeLater(new ErrorJob(err)); + err = StringTemplate.key("server.couldNotLogin"); + logger.warning("Could not log in."); + } catch (FileNotFoundException e) { + err = StringTemplate.key("server.fileNotFound"); + logger.log(Level.WARNING, "Can not find file.", e); + } catch (IOException e) { + err = StringTemplate.key("server.initialize"); + logger.log(Level.WARNING, "Error starting game.", e); + } catch (XMLStreamException e) { + err = FreeCol.badLoad(theFile); + logger.log(Level.WARNING, "Stream error.", e); + } catch (Exception e) { + err = StringTemplate.name(e.getMessage()); + logger.log(Level.WARNING, "FreeCol error.", e); + } + if (err != null) { + // If this is a debug run, fail hard. + if (freeColClient.isHeadless() + || FreeColDebugger.getDebugRunTurns() >= 0) { + FreeCol.fatal(Messages.message(err)); } + SwingUtilities.invokeLater(() -> { + gui.closeMainPanel(); + gui.showMainPanel(null); + }); + SwingUtilities.invokeLater(new ErrorJob(err)); } }; freeColClient.setWork(loadGameJob); diff --git a/src/net/sf/freecol/client/control/InGameController.java b/src/net/sf/freecol/client/control/InGameController.java index 2d32955f7..e2792ea41 100644 --- a/src/net/sf/freecol/client/control/InGameController.java +++ b/src/net/sf/freecol/client/control/InGameController.java @@ -21,7 +21,6 @@ package net.sf.freecol.client.control; import java.io.File; import java.io.IOException; -import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -29,18 +28,18 @@ import java.util.Iterator; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; - -import javax.swing.SwingUtilities; +import java.util.stream.Collectors; import net.sf.freecol.FreeCol; import net.sf.freecol.client.ClientOptions; import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.client.gui.GUI; import net.sf.freecol.client.gui.option.FreeColActionUI; -import net.sf.freecol.client.gui.panel.ChoiceItem; import net.sf.freecol.common.debug.DebugUtils; import net.sf.freecol.common.debug.FreeColDebugger; import net.sf.freecol.common.i18n.Messages; +import net.sf.freecol.common.i18n.NameCache; import net.sf.freecol.common.io.FreeColDirectories; import net.sf.freecol.common.model.Ability; import net.sf.freecol.common.model.AbstractGoods; @@ -99,13 +98,14 @@ import net.sf.freecol.common.model.UnitType; import net.sf.freecol.common.model.UnitTypeChange.ChangeType; import net.sf.freecol.common.model.UnitWas; import net.sf.freecol.common.model.WorkLocation; -import static net.sf.freecol.common.util.CollectionUtils.*; import net.sf.freecol.common.util.LogBuilder; import net.sf.freecol.common.networking.NetworkConstants; import net.sf.freecol.common.networking.ServerAPI; import net.sf.freecol.common.option.BooleanOption; import net.sf.freecol.server.FreeColServer; +import static net.sf.freecol.common.util.CollectionUtils.*; + /** * The controller that will be used while the game is played. @@ -235,6 +235,15 @@ public final class InGameController implements NetworkConstants { return freeColClient.askServer(); } + /** + * Play a sound. + * + * @param soundKey The sound resource key. + */ + private void sound(String soundKey) { + freeColClient.getSoundController().playSound(soundKey); + } + /** * Gets the specification for the current game. * @@ -251,13 +260,22 @@ public final class InGameController implements NetworkConstants { * @return True if it is our turn. */ private boolean requireOurTurn() { - if (!freeColClient.currentPlayerIsMyPlayer()) { - if (freeColClient.isInGame()) { - gui.showInformationMessage("info.notYourTurn"); - } - return false; + if (freeColClient.currentPlayerIsMyPlayer()) return true; + if (freeColClient.isInGame()) { + gui.showInformationMessage("info.notYourTurn"); } - return true; + return false; + } + + /** + * Display the colony panel for a colony, and select the unit that just + * arrived there if it is a carrier. + * + * @param colony The Colony to display. + * @param unit An optional Unit to select. + */ + private void colonyPanel(Colony colony, Unit unit) { + gui.showColonyPanel(colony, (unit.isCarrier()) ? unit : null); } /** @@ -294,22 +312,29 @@ public final class InGameController implements NetworkConstants { } else { // should not happen player = freeColClient.getGame().getUnknownEnemy(); } - return player.getNationName(); + return player.getNationLabel(); } /** - * Updates the GUI after a unit moves. + * Update the GUI and the active unit with a fallback tile. + * + * @param tile An optional fallback Tile to display if + * no active unit is found, useful when the last unit might have + * died. */ - private void updateControls() { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - freeColClient.updateActions(); - gui.updateMenuBar(); - } - }); + private void updateGUI(Tile tile) { + if (displayModelMessages(false, false)) { + ; // If messages are displayed they probably refer to the + // current unit, so do not update it. + } else if (updateActiveUnit(tile)) { + ; // setActiveUnit will update the menu bar + } else { + gui.updateMapControls(); + gui.updateMenuBar(); + } } + // Server access routines called from multiple places. /** @@ -345,8 +370,7 @@ public final class InGameController implements NetworkConstants { if (price < 0) { // not for sale return false; } else if (price > 0) { // for sale - ClaimAction act = gui.getClaimChoice(tile, player, price, - owner); + ClaimAction act = gui.getClaimChoice(tile, player, price, owner); if (act == null) return false; // Cancelled switch (act) { case ACCEPT: // accepted price @@ -370,17 +394,44 @@ public final class InGameController implements NetworkConstants { * to null. * * @param unit The Unit to clear the destination for. - * @return True if the unit has no destination. + * @return True if the unit now has no destination or trade route. */ private boolean askClearGotoOrders(Unit unit) { if (!askAssignTradeRoute(unit, null)) return false; if (unit.getDestination() == null) return true; - gui.clearGotoPath(); - return askSetDestination(unit, null); + if (askSetDestination(unit, null)) { + gui.clearGotoPath(); + return true; + } + return false; } + /** + * Embark onto a carrier. + * + * @param unit The Unit to embark. + * @param carrier The carrier Unit to board. + * @return True if boarding succeeded. + */ + private boolean askEmbark(Unit unit, Unit carrier) { + ColonyWas colonyWas = (unit.getColony() != null) + ? new ColonyWas(unit.getColony()) : null; + EuropeWas europeWas = (unit.isInEurope()) + ? new EuropeWas(unit.getOwner().getEurope()) : null; + UnitWas unitWas = new UnitWas(unit); + if (askServer().embark(unit, carrier, null) + && unit.getLocation() == carrier) { + sound("sound.event.loadCargo"); + unitWas.fireChanges(); + if (colonyWas != null) colonyWas.fireChanges(); + if (europeWas != null) europeWas.fireChanges(); + return true; + } + return false; + } + /** * A unit in Europe emigrates. * @@ -396,14 +447,49 @@ public final class InGameController implements NetworkConstants { || !MigrationType.validMigrantSlot(slot)) return null; EuropeWas europeWas = new EuropeWas(europe); - Unit ret = null; - if (askServer().emigrate(slot)) { + Unit newUnit = null; + if (askServer().emigrate(slot) + && (newUnit = europeWas.getNewUnit()) != null) { europeWas.fireChanges(); - ret = europeWas.getNewUnit(); } - return ret; + return newUnit; } + /** + * Select all the units to emigrate from Europe. If they are all + * the same they can be picked automatically, but otherwise use + * the emigration dialog. Only to be called if the player is + * allowed to select the unit type (i.e. FoY or has Brewster). + * + * The server contains the count of available FoY-units, and + * maintains the immigration/immigrationRequired amounts, so this + * routine will fail harmlessly if it asks for too much. + * + * @param player The Player that owns the unit. + * @param n The number of units known to be eligible to emigrate. + * @param fountainOfYouth True if this migration if due to a FoY. + */ + private void emigration(Player player, int n, boolean fountainOfYouth) { + final Europe europe = player.getEurope(); + if (europe == null) return; + + for (; n > 0 || player.checkEmigrate() ; n--) { + if (!allSame(europe.getRecruitables())) { + final int nf = n; + gui.showEmigrationDialog(player, fountainOfYouth, + (Integer value) -> { // Value is a valid slot + emigrate(player, + Europe.MigrationType.convertToMigrantSlot(value), + nf-1, fountainOfYouth); + }); + return; + } + Unit u = askEmigrate(europe, Europe.MigrationType.getDefaultSlot()); + if (u == null) break; // Give up on failure, try again next turn + player.addModelMessage(player.getEmigrationMessage(u)); + } + } + /** * Load some goods onto a carrier. * @@ -439,10 +525,12 @@ public final class InGameController implements NetworkConstants { // Try to purchase. int oldAmount = carrier.getGoodsContainer().getGoodsCount(type); - boolean ret = askServer().loadGoods(loc, type, amount, carrier) - && carrier.getGoodsContainer().getGoodsCount(type) != oldAmount; - if (ret && marketWas != null) marketWas.fireChanges(type, amount); - return ret; + if (askServer().loadGoods(loc, type, amount, carrier) + && carrier.getGoodsContainer().getGoodsCount(type) != oldAmount) { + if (marketWas != null) marketWas.fireChanges(type, amount); + return true; + } + return false; } /** @@ -473,10 +561,12 @@ public final class InGameController implements NetworkConstants { MarketWas marketWas = (market != null) ? new MarketWas(player) : null; int oldAmount = carrier.getGoodsContainer().getGoodsCount(type); - boolean ret = askServer().unloadGoods(type, amount, carrier) - && carrier.getGoodsContainer().getGoodsCount(type) != oldAmount; - if (ret && marketWas != null) marketWas.fireChanges(type, -amount); - return ret; + if (askServer().unloadGoods(type, amount, carrier) + && carrier.getGoodsContainer().getGoodsCount(type) != oldAmount) { + if (marketWas != null) marketWas.fireChanges(type, -amount); + return true; + } + return false; } @@ -493,8 +583,9 @@ public final class InGameController implements NetworkConstants { final String gid = Integer.toHexString(game.getUUID().hashCode()); final Turn turn = game.getTurn(); return (/* player.getName() + "_" */ gid - + "_" + Messages.message(player.getNationName()) - + "_" + turn.getSaveGameSuffix()) + + "_" + Messages.message(player.getNationLabel()) + + "_" + turn.getSaveGameSuffix() + + "." + FreeCol.FREECOL_SAVE_EXTENSION) .replaceAll(" ", "_"); } @@ -512,10 +603,10 @@ public final class InGameController implements NetworkConstants { final String prefix = options.getText(ClientOptions.AUTO_SAVE_PREFIX); final String lastTurnName = prefix + "-" + options.getText(ClientOptions.LAST_TURN_NAME) - + FreeCol.FREECOL_SAVE_EXTENSION; + + "." + FreeCol.FREECOL_SAVE_EXTENSION; final String beforeLastTurnName = prefix + "-" + options.getText(ClientOptions.BEFORE_LAST_TURN_NAME) - + FreeCol.FREECOL_SAVE_EXTENSION; + + "." + FreeCol.FREECOL_SAVE_EXTENSION; File autoSaveDir = FreeColDirectories.getAutosaveDirectory(); File lastTurnFile = new File(autoSaveDir, lastTurnName); File beforeLastTurnFile = new File(autoSaveDir, beforeLastTurnName); @@ -530,8 +621,7 @@ public final class InGameController implements NetworkConstants { int saveGamePeriod = options.getInteger(ClientOptions.AUTOSAVE_PERIOD); int turnNumber = game.getTurn().getNumber(); if (saveGamePeriod >= 1 && turnNumber % saveGamePeriod == 0) { - String fileName = prefix + "-" + getSaveGameString(game) - + FreeCol.FREECOL_SAVE_EXTENSION; + String fileName = prefix + "-" + getSaveGameString(game); saveGame(new File(autoSaveDir, fileName)); } } @@ -558,6 +648,7 @@ public final class InGameController implements NetworkConstants { return result; } + // Utilities for message handling. /** @@ -664,34 +755,16 @@ public final class InGameController implements NetworkConstants { Runnable uiTask; if (endOfTurn) { turnReportMessages.addAll(messages); - uiTask = new Runnable() { - @Override - public void run() { - displayTurnReportMessages(); - } - }; + uiTask = () -> { displayTurnReportMessages(); }; } else { - uiTask = new Runnable() { - @Override - public void run() { - gui.showModelMessages(messages); - } - }; - } - updateControls(); - if (SwingUtilities.isEventDispatchThread()) { - uiTask.run(); - } else { - try { - SwingUtilities.invokeAndWait(uiTask); - } catch (InterruptedException|InvocationTargetException ex) { - logger.log(Level.WARNING, "Message display", ex); - } + uiTask = () -> { gui.showModelMessages(messages); }; } + gui.invokeNowOrWait(uiTask); } return !messages.isEmpty(); } + // Utilities to handle the transitions between the active-unit, // execute-orders and end-turn states. @@ -762,12 +835,16 @@ public final class InGameController implements NetworkConstants { */ private boolean doEndTurn(boolean showDialog) { if (showDialog) { - List units = new ArrayList<>(); - for (Unit unit : freeColClient.getMyPlayer().getUnits()) { - if (unit.couldMove()) units.add(unit); - } + List units = freeColClient.getMyPlayer().getUnits().stream() + .filter(Unit::couldMove).collect(Collectors.toList()); if (!units.isEmpty()) { - gui.showEndTurnDialog(units); // Modal dialog takes over + // Modal dialog takes over + gui.showEndTurnDialog(units, + (Boolean value) -> { + if (value != null && value) { + endTurn(false); + } + }); return false; } } @@ -821,8 +898,10 @@ public final class InGameController implements NetworkConstants { * @return True if the active unit changes. */ private boolean updateActiveUnit(Tile tile) { - // Always flush outstanding messages first. - displayModelMessages(false, false); + // Make sure the active unit is done. + final Player player = freeColClient.getMyPlayer(); + Unit unit = gui.getActiveUnit(); + if (unit != null && unit.couldMove()) return false; // Flush any outstanding orders once the mode is raised. if (moveMode != MoveMode.NEXT_ACTIVE_UNIT @@ -830,12 +909,6 @@ public final class InGameController implements NetworkConstants { return false; } - // Look for active units and make sure the active unit is done. - final Player player = freeColClient.getMyPlayer(); - Unit unit = gui.getActiveUnit(); - if (unit != null && !unit.isDisposed() - && unit.couldMove()) return false; - // Successfully found a unit to display if (player.hasNextActiveUnit()) { gui.setActiveUnit(player.getNextActiveUnit()); @@ -851,9 +924,9 @@ public final class InGameController implements NetworkConstants { // If not already ending the turn, use the fallback tile if // supplied, then check for automatic end of turn, otherwise // just select nothing and wait. - ClientOptions options = freeColClient.getClientOptions(); + final ClientOptions options = freeColClient.getClientOptions(); if (tile != null) { - gui.setSelectedTile(tile, false); + gui.setSelectedTile(tile); } else if (options.getBoolean(ClientOptions.AUTO_END_TURN)) { doEndTurn(options.getBoolean(ClientOptions.SHOW_END_TURN_DIALOG)); } @@ -906,15 +979,12 @@ public final class InGameController implements NetworkConstants { // Clear ordinary destinations if arrived. if (movePath(unit, path) && unit.isAtLocation(destination)) { askClearGotoOrders(unit); - // Check cash-in, and if the unit has moves left and was - // not set to SKIPPED by moveDirection, then return true - // to show that this unit could continue. - if (!checkCashInTreasureTrain(unit) - && !unit.isDisposed() - && unit.getMovesLeft() > 0 - && unit.getState() != UnitState.SKIPPED) { - return true; + Colony colony = (unit.hasTile()) ? unit.getTile().getColony() + : null; + if (colony != null && !checkCashInTreasureTrain(unit)) { + colonyPanel(colony, unit); } + return unit.couldMove(); } return false; } @@ -936,9 +1006,10 @@ public final class InGameController implements NetworkConstants { // clear the destination. Unit.MoveType mt = unit.getMoveType(direction); Location destination = unit.getDestination(); + Tile oldTile = unit.getTile(); boolean clearDestination = destination != null - && unit.hasTile() - && Map.isSameLocation(unit.getTile().getNeighbourOrNull(direction), + && oldTile != null + && Map.isSameLocation(oldTile.getNeighbourOrNull(direction), destination); // Consider all the move types. @@ -989,8 +1060,7 @@ public final class InGameController implements NetworkConstants { // Illegal moves case MOVE_NO_ACCESS_BEACHED: if (interactive || clearDestination) { - freeColClient.getSoundController() - .playSound("sound.event.illegalMove"); + sound("sound.event.illegalMove"); StringTemplate nation = getNationAt(unit.getTile(), direction); gui.showInformationMessage(unit, StringTemplate .template("move.noAccessBeached") @@ -999,8 +1069,7 @@ public final class InGameController implements NetworkConstants { break; case MOVE_NO_ACCESS_CONTACT: if (interactive || clearDestination) { - freeColClient.getSoundController() - .playSound("sound.event.illegalMove"); + sound("sound.event.illegalMove"); StringTemplate nation = getNationAt(unit.getTile(), direction); gui.showInformationMessage(unit, StringTemplate .template("move.noAccessContact") @@ -1009,8 +1078,7 @@ public final class InGameController implements NetworkConstants { break; case MOVE_NO_ACCESS_GOODS: if (interactive || clearDestination) { - freeColClient.getSoundController() - .playSound("sound.event.illegalMove"); + sound("sound.event.illegalMove"); StringTemplate nation = getNationAt(unit.getTile(), direction); gui.showInformationMessage(unit, StringTemplate .template("move.noAccessGoods") @@ -1022,15 +1090,13 @@ public final class InGameController implements NetworkConstants { case MOVE_NO_ACCESS_LAND: if (!moveDisembark(unit, direction)) { if (interactive) { - freeColClient.getSoundController() - .playSound("sound.event.illegalMove"); + sound("sound.event.illegalMove"); } } break; case MOVE_NO_ACCESS_MISSION_BAN: if (interactive || clearDestination) { - freeColClient.getSoundController() - .playSound("sound.event.illegalMove"); + sound("sound.event.illegalMove"); StringTemplate nation = getNationAt(unit.getTile(), direction); gui.showInformationMessage(unit, StringTemplate .template("move.noAccessMissionBan") @@ -1041,8 +1107,7 @@ public final class InGameController implements NetworkConstants { break; case MOVE_NO_ACCESS_SETTLEMENT: if (interactive || clearDestination) { - freeColClient.getSoundController() - .playSound("sound.event.illegalMove"); + sound("sound.event.illegalMove"); StringTemplate nation = getNationAt(unit.getTile(), direction); gui.showInformationMessage(unit, StringTemplate .template("move.noAccessSettlement") @@ -1053,8 +1118,7 @@ public final class InGameController implements NetworkConstants { break; case MOVE_NO_ACCESS_SKILL: if (interactive || clearDestination) { - freeColClient.getSoundController() - .playSound("sound.event.illegalMove"); + sound("sound.event.illegalMove"); gui.showInformationMessage(unit, StringTemplate .template("move.noAccessSkill") .addStringTemplate("%unit%", @@ -1063,8 +1127,7 @@ public final class InGameController implements NetworkConstants { break; case MOVE_NO_ACCESS_TRADE: if (interactive || clearDestination) { - freeColClient.getSoundController() - .playSound("sound.event.illegalMove"); + sound("sound.event.illegalMove"); StringTemplate nation = getNationAt(unit.getTile(), direction); gui.showInformationMessage(unit, StringTemplate .template("move.noAccessTrade") @@ -1073,8 +1136,7 @@ public final class InGameController implements NetworkConstants { break; case MOVE_NO_ACCESS_WAR: if (interactive || clearDestination) { - freeColClient.getSoundController() - .playSound("sound.event.illegalMove"); + sound("sound.event.illegalMove"); StringTemplate nation = getNationAt(unit.getTile(), direction); gui.showInformationMessage(unit, StringTemplate .template("move.noAccessWar") @@ -1083,8 +1145,7 @@ public final class InGameController implements NetworkConstants { break; case MOVE_NO_ACCESS_WATER: if (interactive || clearDestination) { - freeColClient.getSoundController() - .playSound("sound.event.illegalMove"); + sound("sound.event.illegalMove"); gui.showInformationMessage(unit, StringTemplate .template("move.noAccessWater") .addStringTemplate("%unit%", @@ -1093,8 +1154,7 @@ public final class InGameController implements NetworkConstants { break; case MOVE_NO_ATTACK_MARINE: if (interactive || clearDestination) { - freeColClient.getSoundController() - .playSound("sound.event.illegalMove"); + sound("sound.event.illegalMove"); gui.showInformationMessage(unit, StringTemplate .template("move.noAttackWater") .addStringTemplate("%unit%", @@ -1111,8 +1171,7 @@ public final class InGameController implements NetworkConstants { break; case MOVE_NO_TILE: if (interactive || clearDestination) { - freeColClient.getSoundController() - .playSound("sound.event.illegalMove"); + sound("sound.event.illegalMove"); gui.showInformationMessage(unit, StringTemplate .template("move.noTile") .addStringTemplate("%unit%", @@ -1121,8 +1180,7 @@ public final class InGameController implements NetworkConstants { break; default: if (interactive || clearDestination) { - freeColClient.getSoundController() - .playSound("sound.event.illegalMove"); + sound("sound.event.illegalMove"); } result = false; break; @@ -1141,7 +1199,6 @@ public final class InGameController implements NetworkConstants { * @return True if the unit has completed the path and can move further. */ private boolean movePath(Unit unit, PathNode path) { - // Traverse the path to the destination. for (; path != null; path = path.next) { if (unit.isAtLocation(path.getLocation())) continue; @@ -1235,7 +1292,7 @@ public final class InGameController implements NetworkConstants { askServer().attack(unit, direction); Colony col = target.getColony(); if (col != null && unit.getOwner().owns(col)) { - gui.showColonyPanel(col, unit); + colonyPanel(col, unit); } return false; } @@ -1279,42 +1336,13 @@ public final class InGameController implements NetworkConstants { final Player other = colony.getOwner(); if (other == player.getREFPlayer()) return false; - StringTemplate nation = other.getNationName(); - ModelMessage m = null; - TradeStatus status; + StringTemplate nation = other.getNationLabel(); while (dt != null) { - // Inform server of current agreement, exit if it did not - // require a response (i.e. was not a proposal). - status = dt.getStatus(); + // Inform server of current agreement. dt = askServer().diplomacy(game, unit, colony, dt); - if (status != TradeStatus.PROPOSE_TRADE) break; - - // Process the result of a proposal. - status = (dt == null) ? TradeStatus.REJECT_TRADE : dt.getStatus(); - m = null; - switch (status) { - case PROPOSE_TRADE: - break; - case ACCEPT_TRADE: - m = new ModelMessage(MessageType.FOREIGN_DIPLOMACY, - "diplomacy.offerAccepted", - colony) - .addStringTemplate("%nation%", nation); - dt = null; - break; - case REJECT_TRADE: - m = new ModelMessage(MessageType.FOREIGN_DIPLOMACY, - "diplomacy.offerRejected", - colony) - .addStringTemplate("%nation%", nation); - dt = null; - break; - default: - throw new RuntimeException("Bogus trade status" + status); - } - if (m != null) player.addModelMessage(m); - - // If it was a counter proposal, consider it. + // Returned dt will be null if we sent or the other player + // replied with an accept/reject. Otherwise consider + // counter proposal. if (dt != null) { dt = gui.showNegotiationDialog(unit, colony, dt, dt.getSendMessage(player, colony)); @@ -1341,20 +1369,13 @@ public final class InGameController implements NetworkConstants { } // Disembark selected units able to move. - final List disembarkable = new ArrayList<>(); unit.setStateToAllChildren(UnitState.ACTIVE); - for (Unit u : unit.getUnitList()) { - if (u.getMoveType(tile).isProgress()) { - disembarkable.add(u); - } - } - if (disembarkable.isEmpty()) { - // Did not find any unit that could disembark, fail. - return false; - } - + final List disembarkable = unit.getUnitList().stream() + .filter(u -> u.getMoveType(tile).isProgress()) + .collect(Collectors.toList()); + if (disembarkable.isEmpty()) return false; // Fail, did not find one if (disembarkable.size() == 1) { - if (gui.confirm(true, tile, + if (gui.confirm(tile, StringTemplate.key("disembark.text"), disembarkable.get(0), "ok", "cancel")) { moveDirection(disembarkable.get(0), direction, false); @@ -1371,9 +1392,9 @@ public final class InGameController implements NetworkConstants { // destination tile is known to be clear of other player // units or settlements, it may have a rumour or need // other special handling. - Unit u = gui.getChoice(true, unit.getTile(), + Unit u = gui.getChoice(unit.getTile(), Messages.message("disembark.text"), - gui.createUnitImageIcon(unit), + unit, "none", choices); if (u == null) { // Cancelled, done. @@ -1424,9 +1445,9 @@ public final class InGameController implements NetworkConstants { } else if (choices.size() == 1) { // Use the default } else { - carrier = gui.getChoice(true, unit.getTile(), + carrier = gui.getChoice(unit.getTile(), Messages.message("embark.text"), - gui.createUnitImageIcon(unit), + unit, "none", choices); if (carrier == null) return true; // User cancelled } @@ -1452,13 +1473,13 @@ public final class InGameController implements NetworkConstants { */ private boolean moveExplore(Unit unit, Direction direction) { Tile tile = unit.getTile().getNeighbourOrNull(direction); - if (!gui.confirm(true, unit.getTile(), + if (!gui.confirm(unit.getTile(), StringTemplate.key("exploreLostCityRumour.text"), unit, "exploreLostCityRumour.yes", "exploreLostCityRumour.no")) { return true; } if (tile.getLostCityRumour().getType()== LostCityRumour.RumourType.MOUNDS - && !gui.confirm(true, unit.getTile(), + && !gui.confirm(unit.getTile(), StringTemplate.key("exploreMoundsRumour.text"), unit, "exploreLostCityRumour.yes", "exploreLostCityRumour.no")) { askServer().declineMounds(unit, direction); @@ -1495,7 +1516,7 @@ public final class InGameController implements NetworkConstants { moveTo(unit, unit.getDestination()); return false; } else { - if (gui.confirm(true, oldTile, StringTemplate + if (gui.confirm(oldTile, StringTemplate .template("highseas.text") .addAmount("%number%", unit.getSailTurns()), unit, "highseas.yes", "highseas.no")) { @@ -1534,7 +1555,7 @@ public final class InGameController implements NetworkConstants { .addStringTemplate("%unit%", unit.getLabel(Unit.UnitLabelType.NATIONAL)) .addNamed("%skill%", skill)); - } else if (gui.confirm(true, unit.getTile(), StringTemplate + } else if (gui.confirm(unit.getTile(), StringTemplate .template("learnSkill.text") .addNamed("%skill%", skill), unit, "learnSkill.yes", "learnSkill.no")) { @@ -1560,24 +1581,27 @@ public final class InGameController implements NetworkConstants { * @return True if the unit can move further. */ private boolean moveMove(Unit unit, Direction direction) { - // If we are in a colony, or Europe, load sentries. + final ClientOptions options = freeColClient.getClientOptions(); if (unit.canCarryUnits() && unit.hasSpaceLeft() - && (unit.getColony() != null || unit.isInEurope())) { - boolean boarded = false; - for (Unit sentry : unit.getLocation().getUnitList()) { - if (sentry.getState() == UnitState.SENTRY) { - if (unit.canAdd(sentry)) { - boarded |= boardShip(sentry, unit); - logger.finest("Unit " + unit - + " loaded sentry " + sentry); - } else { - logger.finest("Unit " + sentry - + " is too big to board " + unit); + && options.getBoolean(ClientOptions.AUTOLOAD_SENTRIES)) { + // Autoload sentries if selected + List waiting = (unit.getColony() != null) + ? unit.getTile().getUnitList() + : Collections.emptyList(); + for (Unit u : waiting) { + if (u.getState() != UnitState.SENTRY + || !unit.couldCarry(u)) continue; + try { + askEmbark(u, unit); + } finally { + if (u.getLocation() != unit) { + u.setState(UnitState.SKIPPED); } + continue; } } // Boarding consumed this unit's moves. - if (boarded && unit.getMovesLeft() <= 0) return false; + if (unit.getMovesLeft() <= 0) return false; } // Ask the server @@ -1594,7 +1618,6 @@ public final class InGameController implements NetworkConstants { // Perform a short pause on an active unit's last move if // the option is enabled. - final ClientOptions options = freeColClient.getClientOptions(); if (unit.getMovesLeft() <= 0 && options.getBoolean(ClientOptions.UNIT_LAST_MOVE_DELAY)) { gui.paintImmediatelyCanvasInItsBounds(); @@ -1604,35 +1627,18 @@ public final class InGameController implements NetworkConstants { } // Update the active unit and GUI. - if (unit.isDisposed() || checkCashInTreasureTrain(unit)) return false; - if (tile.getColony() != null && unit.isCarrier()) { - final Colony colony = tile.getColony(); - if (unit.getTradeRoute() == null - && (unit.getDestination() == null - || unit.getDestination().getTile() == tile.getTile())) { - gui.showColonyPanel(colony, unit); - } - // Autoload sentries if selected - if (options.getBoolean(ClientOptions.AUTOLOAD_SENTRIES)) { - for (Unit u : tile.getUnitList()) { - if (u.getState() != UnitState.SENTRY) continue; - if (unit.couldCarry(u)) { - try { - askServer().embark(u, unit, null); - } finally { - if (u.getLocation() != unit) { - u.setState(UnitState.SKIPPED); - } - continue; - } - } + boolean ret = !unit.isDisposed() && !checkCashInTreasureTrain(unit); + if (ret) { + if (tile.getColony() != null && unit.isCarrier()) { + final Colony colony = tile.getColony(); + if (unit.getTradeRoute() == null + && Map.isSameLocation(tile, unit.getDestination())) { + colonyPanel(colony, unit); } } + ret = unit.getMovesLeft() > 0; } - if (unit.getMovesLeft() <= 0) return false; - displayModelMessages(false); - if (!gui.onScreen(tile)) gui.setSelectedTile(tile, false); - return true; + return ret; } /** @@ -1729,7 +1735,7 @@ public final class InGameController implements NetworkConstants { } else if ("nothing".equals(result)) { gui.showInformationMessage(settlement, StringTemplate .template("scoutSettlement.speakNothing") - .addStringTemplate("%nation%", player.getNationName())); + .addStringTemplate("%nation%", player.getNationLabel())); } else { logger.warning("Invalid result from askScoutSpeak: " + result); } @@ -1805,7 +1811,7 @@ public final class InGameController implements NetworkConstants { StringTemplate baseTemplate = StringTemplate .template("tradeProposition.welcome") .addStringTemplate("%nation%", - settlement.getOwner().getNationName()) + settlement.getOwner().getNationLabel()) .addName("%settlement%", settlement.getName()); StringTemplate template = baseTemplate; boolean[] results = askServer() @@ -1920,9 +1926,9 @@ public final class InGameController implements NetworkConstants { String label = Messages.message(g.getLabel(true)); choices.add(new ChoiceItem<>(label, g)); } - goods = gui.getChoice(true, unit.getTile(), + goods = gui.getChoice(unit.getTile(), Messages.message("buyProposition.text"), - gui.createSettlementImageIcon(settlement), + settlement, "nothing", choices); if (goods == null) break; // Trade aborted by the player @@ -1941,12 +1947,9 @@ public final class InGameController implements NetworkConstants { if (act == null) break; // User cancelled switch (act) { case BUY: // Accept price, make purchase - if (askServer().buyFromSettlement(unit, - settlement, goods, gold)) { - updateControls(); // Assume success - return null; - } - return abortTrade; + return (askServer().buyFromSettlement(unit, + settlement, goods, gold)) ? null + : abortTrade; case HAGGLE: // Try to negotiate a lower price gold = gold * 9 / 10; break; @@ -1977,9 +1980,9 @@ public final class InGameController implements NetworkConstants { String label = Messages.message(g.getLabel(true)); choices.add(new ChoiceItem<>(label, g)); } - goods = gui.getChoice(true, unit.getTile(), + goods = gui.getChoice(unit.getTile(), Messages.message("sellProposition.text"), - gui.createSettlementImageIcon(settlement), + settlement, "nothing", choices); if (goods == null) break; // Trade aborted by the player @@ -1997,12 +2000,9 @@ public final class InGameController implements NetworkConstants { if (act == null) break; // Cancelled switch (act) { case SELL: // Accepted price, make the sale - if (askServer().sellToSettlement(unit, settlement, - goods, gold)) { - updateControls(); // Assume success - return null; - } - return abortTrade; + return (askServer().sellToSettlement(unit, settlement, + goods, gold)) ? null + : abortTrade; case HAGGLE: // Ask for more money gold = (gold * 11) / 10; break; @@ -2034,15 +2034,14 @@ public final class InGameController implements NetworkConstants { String label = Messages.message(g.getLabel(true)); choices.add(new ChoiceItem<>(label, g)); } - Goods goods = gui.getChoice(true, unit.getTile(), + Goods goods = gui.getChoice(unit.getTile(), Messages.message("gift.text"), - gui.createSettlementImageIcon(settlement), + settlement, "cancel", choices); - if (goods != null - && askServer().deliverGiftToSettlement(unit, settlement, goods)) { - return null; - } - return abortTrade; + return (goods != null + && askServer().deliverGiftToSettlement(unit, settlement, goods)) + ? null + : abortTrade; } /** @@ -2103,21 +2102,19 @@ public final class InGameController implements NetworkConstants { if (askServer().missionary(unit, direction, act == MissionaryAction.DENOUNCE_HERESY) && settlement.hasMissionary(player)) { - freeColClient.getSoundController() - .playSound("sound.event.missionEstablished"); + sound("sound.event.missionEstablished"); player.invalidateCanSeeTiles(); - displayModelMessages(false, false); } break; case INCITE_INDIANS: List> choices = new ArrayList<>(); for (Player p : freeColClient.getGame().getLiveEuropeanPlayers(player)) { - String label = Messages.message(p.getNationName()); + String label = Messages.message(p.getCountryLabel()); choices.add(new ChoiceItem<>(label, p)); } - Player enemy = gui.getChoice(true, unit.getTile(), + Player enemy = gui.getChoice(unit.getTile(), Messages.message("missionarySettlement.inciteQuestion"), - gui.createUnitImageIcon(unit), + unit, "missionarySettlement.cancel", choices); if (enemy == null) return true; int gold = askServer().incite(unit, direction, enemy, -1); @@ -2128,16 +2125,12 @@ public final class InGameController implements NetworkConstants { .template("missionarySettlement.inciteGoldFail") .add("%player%", enemy.getName()) .addAmount("%amount%", gold)); - } else { - if (gui.confirm(true, unit.getTile(), StringTemplate - .template("missionarySettlement.inciteConfirm") - .add("%player%", enemy.getName()) - .addAmount("%amount%", gold), - unit, "yes", "no")) { - if (askServer().incite(unit, direction, enemy, gold) >= 0) { - updateControls(); - } - } + } else if (gui.confirm(unit.getTile(), StringTemplate + .template("missionarySettlement.inciteConfirm") + .add("%player%", enemy.getName()) + .addAmount("%amount%", gold), + unit, "yes", "no")) { + askServer().incite(unit, direction, enemy, gold); } break; default: @@ -2456,7 +2449,7 @@ public final class InGameController implements NetworkConstants { .addStringTemplate("%colony%", locName) .addAmount("%amount%", toUnload - atStop) .addNamed("%goods%", goods); - if (!gui.confirm(true, unit.getTile(), template, + if (!gui.confirm(unit.getTile(), template, unit, "yes", "no")) amount = atStop; break; case ClientOptions.UNLOAD_OVERFLOW_RESPONSE_NEVER: @@ -2535,13 +2528,17 @@ public final class InGameController implements NetworkConstants { } - // All the routines from here on are user commands. That is they + // Routines from here on are mostly user commands. That is they // are called directly as a result of keyboard, menu, mouse or - // panel/dialog actions. They should all be annotated as such to + // panel/dialog actions. Some though are called indirectly after + // a call to the server routes information back through the + // InGameInputHandler. They should all be annotated as such to // confirm where they can come from. // - // They also all return a success/failure indication, except if - // the game is stopped. + // User command all return a success/failure indication, except if + // the game is stopped. IGIH-initiated routines do not need to. + // + // Successfully executed commands should update the GUI. /** * Abandon a colony with no units. @@ -2554,20 +2551,69 @@ public final class InGameController implements NetworkConstants { public boolean abandonColony(Colony colony) { final Player player = freeColClient.getMyPlayer(); if (!requireOurTurn() || colony == null - || !player.owns(colony) || colony.getUnitCount() > 0) return false; + || !player.owns(colony) || colony.getUnitCount() > 0) + return false; // Proceed to abandon - Tile tile = colony.getTile(); + final Tile tile = colony.getTile(); boolean ret = askServer().abandonColony(colony) && !tile.hasSettlement(); if (ret) { player.invalidateCanSeeTiles(); - gui.setActiveUnit(null); - gui.setSelectedTile(tile, false); + updateGUI(null); } return ret; } + /** + * Animate an attack. + * + * Called from IGIH.animateAttack. + * + * @param attacker The attacking Unit. + * @param defender The defending Unit. + * @param attackerTile The Tile the attack originates from. + * @param defenderTile The Tile the defence takes place on. + * @param success True if the attack succeeds. + */ + public void animateAttack(Unit attacker, Unit defender, + Tile attackerTile, Tile defenderTile, + boolean success) { + // Note: we used to focus the map on the unit even when + // animation is off as long as the center-active-unit option + // was set. However IR#115 requested that if animation is off + // that we display nothing so as to speed up the other player + // moves as much as possible. + if (freeColClient.getAnimationSpeed(attacker.getOwner()) > 0) { + gui.animateUnitAttack(attacker, defender, + attackerTile, defenderTile, success); + } + gui.refresh(); + } + + /** + * Animate a move. + * + * Called from IGIH.animateMove. + * + * @param unit The Unit that moves. + * @param oldTile The Tile the move begins at. + * @param newTile The Tile the move ends at. + */ + public void animateMove(Unit unit, Tile oldTile, Tile newTile) { + // Note: we used to focus the map on the unit even when + // animation is off as long as the center-active-unit option + // was set. However IR#115 requested that if animation is off + // that we display nothing so as to speed up the other player + // moves as much as possible. + if (freeColClient.getAnimationSpeed(unit.getOwner()) > 0) { + gui.animateUnitMove(unit, oldTile, newTile); + } else if (freeColClient.getMyPlayer().owns(unit)) { + gui.requireFocus(newTile); + } + gui.refresh(); + } + /** * Assigns a student to a teacher. * @@ -2589,13 +2635,16 @@ public final class InGameController implements NetworkConstants { || !student.canBeStudent(teacher) || teacher.getColony() == null || student.getColony() != teacher.getColony() - || !teacher.getColony().canTrain(teacher)) { + || !teacher.getColony().canTrain(teacher)) return false; - } UnitWas unitWas = new UnitWas(student); - boolean ret = askServer().assignTeacher(student, teacher); - unitWas.fireChanges(); + boolean ret = askServer().assignTeacher(student, teacher) + && student.getTeacher() == teacher; + if (ret) { + unitWas.fireChanges(); + updateGUI(null); + } return ret; } @@ -2614,9 +2663,10 @@ public final class InGameController implements NetworkConstants { UnitWas unitWas = new UnitWas(unit); boolean ret = askAssignTradeRoute(unit, tradeRoute); - unitWas.fireChanges(); - updateControls(); - updateActiveUnit(null); + if (ret) { + unitWas.fireChanges(); + updateGUI(null); + } return ret; } @@ -2633,26 +2683,12 @@ public final class InGameController implements NetworkConstants { public boolean boardShip(Unit unit, Unit carrier) { if (!requireOurTurn() || unit == null || unit.isCarrier() || carrier == null || !carrier.canCarryUnits() - || !Map.isSameLocation(unit.getLocation(), carrier.getLocation()) - ) return false; + || !unit.isAtLocation(carrier.getLocation())) return false; - // Proceed to board - ColonyWas colonyWas = (unit.getColony() != null) - ? new ColonyWas(unit.getColony()) : null; - EuropeWas europeWas = (unit.isInEurope()) - ? new EuropeWas(unit.getOwner().getEurope()) : null; - UnitWas unitWas = new UnitWas(unit); - boolean ret = askServer().embark(unit, carrier, null) - && unit.getLocation() == carrier; + boolean ret = askEmbark(unit, carrier); if (ret) { - freeColClient.getSoundController() - .playSound("sound.event.loadCargo"); + updateGUI(null); } - unitWas.fireChanges(); - if (colonyWas != null) colonyWas.fireChanges(); - if (europeWas != null) europeWas.fireChanges(); - updateControls(); - updateActiveUnit(null); return ret; } @@ -2669,7 +2705,7 @@ public final class InGameController implements NetworkConstants { // Check unit, which must be on the map and able to build. if (unit == null) return false; - Tile tile = unit.getTile(); + final Tile tile = unit.getTile(); if (tile == null) return false; if (!unit.canBuildColony()) { gui.showInformationMessage(unit, StringTemplate @@ -2679,10 +2715,11 @@ public final class InGameController implements NetworkConstants { } // Join existing colony if present - Colony colony = tile.getColony(); + final Colony colony = tile.getColony(); if (colony != null) { askServer().joinColony(unit, colony); - gui.showColonyPanel(colony, unit); + updateGUI(null); + colonyPanel(colony, unit); return false; } @@ -2703,7 +2740,7 @@ public final class InGameController implements NetworkConstants { .getBoolean(ClientOptions.SHOW_COLONY_WARNINGS)) { StringTemplate warnings = tile.getBuildColonyWarnings(unit); if (!warnings.getReplacements().isEmpty() - && !gui.confirm(true, tile, warnings, + && !gui.confirm(tile, warnings, unit, "buildColony.yes", "buildColony.no")) { return false; } @@ -2717,25 +2754,25 @@ public final class InGameController implements NetworkConstants { // Only native owners that we can steal, buy from, or use a // bonus center tile exception should be possible by this point. UnitWas unitWas = new UnitWas(unit); - boolean ret = (tile.getOwner() == null - || player.owns(tile) - || player.canClaimToFoundSettlement(tile)) - && askClaimTile(player, tile, unit, player.getLandPrice(tile)); - - ret = ret && askServer().buildColony(name, unit) - && tile.hasSettlement(); + boolean ret = player.owns(tile); + if (!ret) { + ret = askClaimTile(player, tile, unit, player.getLandPrice(tile)); + if (!ret) NameCache.putSettlementName(player, name); + } if (ret) { - player.invalidateCanSeeTiles(); - gui.setActiveUnit(null); - gui.setSelectedTile(tile, false); - freeColClient.getSoundController() - .playSound("sound.event.buildingComplete"); - // Check units present for treasure cash-in as they are now - // at a colony. - for (Unit u : tile.getUnitList()) checkCashInTreasureTrain(u); + ret = askServer().buildColony(name, unit) + && tile.hasSettlement(); + if (ret) { + sound("sound.event.buildingComplete"); + player.invalidateCanSeeTiles(); + unitWas.fireChanges(); + // Check units present for treasure cash-in as they are now + // at a colony. + for (Unit u : tile.getUnitList()) checkCashInTreasureTrain(u); + colonyPanel((Colony)tile.getSettlement(), unit); + } + updateGUI(null); } - unitWas.fireChanges(); - updateControls(); return ret; } @@ -2756,21 +2793,32 @@ public final class InGameController implements NetworkConstants { || !carrier.isInEurope() || !freeColClient.getMyPlayer().owns(carrier)) return false; - Europe europe = carrier.getOwner().getEurope(); + final Europe europe = carrier.getOwner().getEurope(); EuropeWas europeWas = new EuropeWas(europe); UnitWas unitWas = new UnitWas(carrier); boolean ret = askLoadGoods(europe, type, amount, carrier); if (ret) { - freeColClient.getSoundController() - .playSound("sound.event.loadCargo"); - displayModelMessages(false, false); + sound("sound.event.loadCargo"); + europeWas.fireChanges(); + unitWas.fireChanges(); + updateGUI(null); } - europeWas.fireChanges(); - unitWas.fireChanges(); - updateControls(); return ret; } + /** + * Chat with another player. + * + * Called from IGIH.chat. + * + * @param player The Player to chat with. + * @param message What to say. + * @param pri If true, the message is private. + */ + public void chat(Player player, String message, boolean pri) { + gui.displayChatMessage(player, message, pri); + } + /** * Changes the state of this Unit. * @@ -2781,8 +2829,9 @@ public final class InGameController implements NetworkConstants { * @return True if the state was changed. */ public boolean changeState(Unit unit, UnitState state) { - if (!requireOurTurn() || unit == null - || !unit.checkSetState(state)) return false; + if (!requireOurTurn() || unit == null) return false; + if (unit.getState() == state) return true; + if (!unit.checkSetState(state)) return false; // Check if this is a hostile fortification, and give the player // a chance to confirm. @@ -2793,19 +2842,19 @@ public final class InGameController implements NetworkConstants { if (tile != null && tile.getOwningSettlement() != null) { Player enemy = tile.getOwningSettlement().getOwner(); if (player != enemy - && player.getStance(enemy) != Stance.ALLIANCE) { - if (!gui.confirmHostileAction(unit, tile)) - return false; // Aborted - } + && player.getStance(enemy) != Stance.ALLIANCE + && !gui.confirmHostileAction(unit, tile)) + return false; // Aborted } } UnitWas unitWas = new UnitWas(unit); boolean ret = askServer().changeState(unit, state) && unit.getState() == state; - unitWas.fireChanges(); - updateControls(); - updateActiveUnit(null); + if (ret) { + unitWas.fireChanges(); + updateGUI(null); + } return ret; } @@ -2819,7 +2868,7 @@ public final class InGameController implements NetworkConstants { * @return True if the improvement was changed. */ public boolean changeWorkImprovementType(Unit unit, - TileImprovementType improvementType) { + TileImprovementType improvementType) { if (!requireOurTurn() || unit == null || improvementType == null || !unit.hasTile() || !unit.checkSetState(UnitState.IMPROVING) @@ -2827,19 +2876,20 @@ public final class InGameController implements NetworkConstants { // May need to claim the tile first final Player player = freeColClient.getMyPlayer(); + final Tile tile = unit.getTile(); UnitWas unitWas = new UnitWas(unit); - boolean ret = true; - Tile tile = unit.getTile(); - if (!player.owns(tile)) { - if (!askClaimTile(player, tile, unit, - player.getLandPrice(tile))) ret = false; + boolean ret = player.owns(tile) + || askClaimTile(player, tile, unit, player.getLandPrice(tile)); + if (ret) { + ret = askServer() + .changeWorkImprovementType(unit, improvementType) + && unit.getWorkImprovement() != null + && unit.getWorkImprovement().getType() == improvementType; + if (ret) { + unitWas.fireChanges(); + } + updateGUI(null); } - - ret = ret && askServer().changeWorkImprovementType(unit, - improvementType); - unitWas.fireChanges(); - updateControls(); - updateActiveUnit(tile); return ret; } @@ -2858,9 +2908,10 @@ public final class InGameController implements NetworkConstants { UnitWas unitWas = new UnitWas(unit); boolean ret = askServer().changeWorkType(unit, workType) && unit.getWorkType() == workType; - unitWas.fireChanges(); - updateControls(); - updateActiveUnit(null); + if (ret) { + unitWas.fireChanges(); + updateGUI(null); + } return ret; } @@ -2875,11 +2926,10 @@ public final class InGameController implements NetworkConstants { */ public boolean checkCashInTreasureTrain(Unit unit) { if (!requireOurTurn() || unit == null - || !unit.canCarryTreasure() || !unit.canCashInTreasureTrain()) { + || !unit.canCarryTreasure() || !unit.canCashInTreasureTrain()) return false; // Fail quickly if just not a candidate. - } - Tile tile = unit.getTile(); + final Tile tile = unit.getTile(); final Europe europe = unit.getOwner().getEurope(); if (europe == null || unit.isInEurope()) { ;// No need to check for transport. @@ -2894,7 +2944,7 @@ public final class InGameController implements NetworkConstants { template = StringTemplate.template("cashInTreasureTrain.pay") .addAmount("%fee%", percent); } - if (!gui.confirm(true, unit.getTile(), template, unit, + if (!gui.confirm(unit.getTile(), template, unit, "accept", "reject")) return false; } @@ -2902,12 +2952,10 @@ public final class InGameController implements NetworkConstants { boolean ret = askServer().cashInTreasureTrain(unit) && unit.isDisposed(); if (ret) { - freeColClient.getSoundController() - .playSound("sound.event.cashInTreasureTrain"); + sound("sound.event.cashInTreasureTrain"); + unitWas.fireChanges(); + updateGUI(tile); } - unitWas.fireChanges(); - updateControls(); - updateActiveUnit(tile); return ret; } @@ -2929,6 +2977,19 @@ public final class InGameController implements NetworkConstants { return askServer().chooseFoundingFather(ffs, ff); } + /** + * Choose a founding father from an offered list. + * + * Called from IGIH.chooseFoundingFather. + * + * @param ffs A list of FoundingFathers to choose from. + */ + public void chooseFoundingFather(List ffs) { + if (ffs == null) return; + gui.showChooseFoundingFatherDialog(ffs, + (FoundingFather ff) -> chooseFoundingFather(ffs, ff)); + } + /** * Claim a tile. * @@ -2943,7 +3004,7 @@ public final class InGameController implements NetworkConstants { || claimant == null) return false; final Player player = freeColClient.getMyPlayer(); - int price = ((claimant instanceof Settlement) + final int price = ((claimant instanceof Settlement) ? player.canClaimForSettlement(tile) : player.canClaimForImprovement(tile)) ? 0 @@ -2951,8 +3012,10 @@ public final class InGameController implements NetworkConstants { UnitWas unitWas = (claimant instanceof Unit) ? new UnitWas((Unit)claimant) : null; boolean ret = askClaimTile(player, tile, claimant, price); - if (unitWas != null) unitWas.fireChanges(); - updateControls(); + if (ret) { + if (unitWas != null) unitWas.fireChanges(); + updateGUI(null); + } return ret; } @@ -2960,7 +3023,7 @@ public final class InGameController implements NetworkConstants { * Clears the goto orders of the given unit by setting its destination * to null. * - * Called from MapViewer.setSelectedTile + * Called from CanvasMouseListener * * @param unit The Unit to clear the destination for. * @return True if the unit has no destination. @@ -2970,8 +3033,10 @@ public final class InGameController implements NetworkConstants { UnitWas unitWas = new UnitWas(unit); boolean ret = askClearGotoOrders(unit); - unitWas.fireChanges(); - updateControls(); + if (ret) { + unitWas.fireChanges(); + updateGUI(null); + } return ret; } @@ -2988,7 +3053,7 @@ public final class InGameController implements NetworkConstants { if (!requireOurTurn() || unit == null) return false; if (unit.getState() == UnitState.IMPROVING - && !gui.confirm(true, unit.getTile(), StringTemplate + && !gui.confirm(unit.getTile(), StringTemplate .template("clearOrders.text") .addAmount("%turns%", unit.getWorkTurnsLeft()), unit, "ok", "cancel")) { @@ -2999,8 +3064,10 @@ public final class InGameController implements NetworkConstants { boolean ret = askClearGotoOrders(unit) && (unit.getState() == UnitState.ACTIVE || askServer().changeState(unit, UnitState.ACTIVE)); - unitWas.fireChanges(); - updateControls(); + if (ret) { + unitWas.fireChanges(); + updateGUI(null); + } return ret; } @@ -3026,8 +3093,8 @@ public final class InGameController implements NetworkConstants { return false; } - Tile tile = (gui.isShowingSubPanel()) ? null : unit.getTile(); - if (!gui.confirm(true, tile, StringTemplate + final Tile tile = (gui.isShowingSubPanel()) ? null : unit.getTile(); + if (!gui.confirm(tile, StringTemplate .template("clearSpeciality.areYouSure") .addStringTemplate("%oldUnit%", unit.getLabel(Unit.UnitLabelType.NATIONAL)) @@ -3042,12 +3109,22 @@ public final class InGameController implements NetworkConstants { UnitWas unitWas = new UnitWas(unit); boolean ret = askServer().clearSpeciality(unit) && unit.getType() == newType; - unitWas.fireChanges(); - updateControls(); - updateActiveUnit(null); + if (ret) { + unitWas.fireChanges(); + updateGUI(null); + } return ret; } + /** + * Close any open GUI menus. + * + * Called from IGIH.closeMenus. + */ + public void closeMenus() { + gui.closeMenus(); + } + /** * Declares independence for the home country. * @@ -3057,7 +3134,11 @@ public final class InGameController implements NetworkConstants { */ public boolean declareIndependence() { if (!requireOurTurn()) return false; + final Player player = freeColClient.getMyPlayer(); + if (player.getNewLandName() == null) { + return false; // Can only happen in debug mode. + } // Check for adequate support. StringTemplate declare = player.checkDeclareIndependence(); @@ -3065,10 +3146,6 @@ public final class InGameController implements NetworkConstants { gui.showInformationMessage(declare); return false; } - if (player.getNewLandName() == null) { - // Can only happen in debug mode. - return false; - } // Confirm intention, and collect nation+country names. List names = gui.confirmDeclaration(); @@ -3080,13 +3157,12 @@ public final class InGameController implements NetworkConstants { } // Ask server. - String nationName = names.get(0); - String countryName = names.get(1); - boolean ret = askServer().declareIndependence(nationName, countryName) + boolean ret = askServer().declareIndependence(names.get(0), names.get(1)) && player.isRebel(); - if (ret) gui.showDeclarationPanel(); - updateControls(); - displayModelMessages(false, false); + if (ret) { + gui.showDeclarationPanel(); + updateGUI(null); + } return ret; } @@ -3106,7 +3182,7 @@ public final class InGameController implements NetworkConstants { DiplomaticTrade agreement) { final Player player = freeColClient.getMyPlayer(); final Player otherPlayer = agreement.getOtherPlayer(player); - StringTemplate t, nation = otherPlayer.getNationName(); + StringTemplate t, nation = otherPlayer.getNationLabel(); switch (agreement.getStatus()) { case ACCEPT_TRADE: @@ -3120,9 +3196,12 @@ public final class InGameController implements NetworkConstants { visibilityChange = true; } if (visibilityChange) player.invalidateCanSeeTiles();//+vis(player) - t = StringTemplate.template("diplomacy.offerAccepted") - .addStringTemplate("%nation%", nation); - gui.showInformationMessage(t); + ModelMessage mm + = new ModelMessage(ModelMessage.MessageType.FOREIGN_DIPLOMACY, + "diplomacy.offerAccepted", otherPlayer) + .addStringTemplate("%nation%", nation); + player.addModelMessage(mm); + updateGUI(null); break; case REJECT_TRADE: t = StringTemplate.template("diplomacy.offerRejected") @@ -3159,16 +3238,16 @@ public final class InGameController implements NetworkConstants { if (unit.getColony() != null && !gui.confirmLeaveColony(unit)) return false; - - Tile tile = (gui.isShowingSubPanel()) ? null : unit.getTile(); - if (!gui.confirm(true, tile, StringTemplate.key("disbandUnit.text"), + final Tile tile = (gui.isShowingSubPanel()) ? null : unit.getTile(); + if (!gui.confirm(tile, StringTemplate.key("disbandUnit.text"), unit, "disbandUnit.yes", "cancel")) return false; // Try to disband - boolean ret = askServer().disbandUnit(unit); - updateControls(); - updateActiveUnit(null); + boolean ret = askServer().disbandUnit(unit) && unit.isDisposed(); + if (ret) { + updateGUI(tile); + } return ret; } @@ -3204,48 +3283,22 @@ public final class InGameController implements NetworkConstants { /** * Emigrate a unit from Europe. * - * Called from GUI.showEmigrationDialog + * Called from GUI.showEmigrationDialog. * * @param player The Player that owns the unit. * @param slot The slot to emigrate from, [0..RECRUIT_COUNT]. - * @return True if a unit emigrated. + * @param n The number of remaining units known to be eligible to migrate. + * @param foY True if this migration is due to a fountain of youth event. */ - public boolean emigrate(Player player, int slot) { + public void emigrate(Player player, int slot, int n, boolean foY) { if (player == null || !player.isColonial() - || !MigrationType.validMigrantSlot(slot)) return false; + || !MigrationType.validMigrantSlot(slot)) return; - return askEmigrate(player.getEurope(), slot) != null; - } - - /** - * Loop through selecting (or not when all are the same) a new unit - * to emigrate from Europe. Only to be called if the player is allowed - * to select the unit type (i.e. FoY or has Brewster). - * - * Called from GUI.showEmigrationDialog - * - * @param player The Player that owns the unit. - * @param n The number of units known to be eligible to emigrate. - * @param fountainOfYouth True if this migration if due to a FoY. - */ - public void emigrationLoop(Player player, int n, boolean fountainOfYouth) { - final Europe europe = player.getEurope(); - if (europe == null) return; - - for (;;) { - if (n == 0 && player.checkEmigrate()) n = 1; - if (n <= 0) return; - if (!allSame(europe.getRecruitables())) break; - Unit u = askEmigrate(europe, - Europe.MigrationType.getDefaultSlot()); - if (u != null) { - player.addModelMessage(player.getEmigrationMessage(u)); - } - n--; + if (askEmigrate(player.getEurope(), slot) != null) { + emigration(player, n, foY); } - gui.showEmigrationDialog(player, n, fountainOfYouth); } - + /** * End the turn command. * @@ -3316,14 +3369,30 @@ public final class InGameController implements NetworkConstants { UnitWas unitWas = new UnitWas(unit); boolean ret = askServer().equipUnitForRole(unit, role, roleCount) && unit.getRole() == role; - if (colonyWas != null) colonyWas.fireChanges(); - if (europeWas != null) europeWas.fireChanges(); - if (marketWas != null) marketWas.fireChanges(req); - unitWas.fireChanges(); - updateControls(); + if (ret) { + if (colonyWas != null) colonyWas.fireChanges(); + if (europeWas != null) europeWas.fireChanges(); + if (marketWas != null) marketWas.fireChanges(req); + unitWas.fireChanges(); + updateGUI(null); + } return ret; } + /** + * Display an error. + * + * Called from IGIH.error. + * + * @param messageId The i18n-keyname of the error message to display. + * @param message An alternative (possibly non-i18n) message to + * display if the resource specified by messageId + * is unavailable. + */ + public void error(String messageId, String message) { + gui.showErrorMessage(messageId, message); + } + /** * Execute goto orders command. * @@ -3355,18 +3424,45 @@ public final class InGameController implements NetworkConstants { if (player == null || player == null || player == other || tile == null) return false; - return askServer().firstContact(player, other, tile, result); + boolean ret = askServer().firstContact(player, other, tile, result); + if (ret) { + updateGUI(null); + } + return ret; } /** - * Retrieves client statistics. + * A player makes first contact with a native player. * - * Called from StatisticsPanel + * Called from IGIH.firstContact. * - * @return A Map containing the client statistics. + * @param player The Player making contact. + * @param other The native Player being contacted. + * @param tile An optional Tile to offer the player if + * they have made a first landing. + * @param n The number of settlements claimed by the native player. */ - public java.util.Map getClientStatistics() { - return freeColClient.getGame().getStatistics(); + public void firstContact(Player player, Player other, Tile tile, int n) { + gui.showFirstContactDialog(player, other, tile, n, + (Boolean b) -> firstContact(player, other, tile, b)); + } + + /** + * Handle a fountain of youth event. + * + * Called from IGIH.fountainOfYouth. + * + * @param n The number of migrants available for selection. + */ + public void fountainOfYouth(int n) { + Player player = freeColClient.getMyPlayer(); + final boolean fountainOfYouth = true; + gui.showEmigrationDialog(player, fountainOfYouth, + (Integer value) -> { // Value is a valid slot + emigrate(player, + Europe.MigrationType.convertToMigrantSlot(value), + n-1, fountainOfYouth); + }); } /** @@ -3395,12 +3491,11 @@ public final class InGameController implements NetworkConstants { public TradeRoute getNewTradeRoute(Player player) { if (player == null) return null; - int n = player.getTradeRoutes().size(); - if (askServer().getNewTradeRoute() - && player.getTradeRoutes().size() == n + 1) { - return player.getTradeRoutes().get(n); - } - return null; + final int n = player.getTradeRoutes().size(); + return (askServer().getNewTradeRoute() + && player.getTradeRoutes().size() == n + 1) + ? player.getTradeRoutes().get(n) + : null; } /** @@ -3445,10 +3540,9 @@ public final class InGameController implements NetworkConstants { boolean ret = askSetDestination(unit, tile); if (ret) { moveToDestination(unit, null); + unitWas.fireChanges(); + updateGUI(null); } - unitWas.fireChanges(); - updateControls(); - updateActiveUnit(null); return ret; } @@ -3466,6 +3560,7 @@ public final class InGameController implements NetworkConstants { String key; if (message == null || (key = message.getIgnoredMessageKey()) == null) return false; + if (flag) { final Turn turn = freeColClient.getGame().getTurn(); if (!continueIgnoreMessage(key, turn)) { @@ -3497,11 +3592,11 @@ public final class InGameController implements NetworkConstants { .getInteger(ClientOptions.INDIAN_DEMAND_RESPONSE); boolean accepted; ModelMessage m = null; - String nation = Messages.message(unit.getOwner().getNationName()); + String nation = Messages.message(unit.getOwner().getNationLabel()); if (type == null) { switch (opt) { case ClientOptions.INDIAN_DEMAND_RESPONSE_ASK: - accepted = gui.confirm(true, colony.getTile(), StringTemplate + accepted = gui.confirm(colony.getTile(), StringTemplate .template("indianDemand.gold.text") .addName("%nation%", nation) .addName("%colony%", colony.getName()) @@ -3531,14 +3626,14 @@ public final class InGameController implements NetworkConstants { switch (opt) { case ClientOptions.INDIAN_DEMAND_RESPONSE_ASK: if (type.isFoodType()) { - accepted = gui.confirm(true, colony.getTile(), + accepted = gui.confirm(colony.getTile(), StringTemplate.template("indianDemand.food.text") .addName("%nation%", nation) .addName("%colony%", colony.getName()) .addAmount("%amount%", amount), unit, "indianDemand.food.yes", "indianDemand.food.no"); } else { - accepted = gui.confirm(true, colony.getTile(), + accepted = gui.confirm(colony.getTile(), StringTemplate.template("indianDemand.other.text") .addName("%nation%", nation) .addName("%colony%", colony.getName()) @@ -3587,7 +3682,7 @@ public final class InGameController implements NetworkConstants { } if (m != null) { player.addModelMessage(m); - displayModelMessages(false, false); + displayModelMessages(false); } return accepted; } @@ -3612,10 +3707,9 @@ public final class InGameController implements NetworkConstants { && unit.getLocation() != carrier; if (ret) { checkCashInTreasureTrain(unit); + unitWas.fireChanges(); + updateGUI(null); } - unitWas.fireChanges(); - updateControls(); - updateActiveUnit(null); return ret; } @@ -3646,16 +3740,16 @@ public final class InGameController implements NetworkConstants { if (colony == null) return false; colonyWas = new ColonyWas(colony); } + boolean ret = askLoadGoods(goods.getLocation(), goods.getType(), goods.getAmount(), carrier); if (ret) { - freeColClient.getSoundController() - .playSound("sound.event.loadCargo"); + sound("sound.event.loadCargo"); + if (colonyWas != null) colonyWas.fireChanges(); + if (sourceWas != null) sourceWas.fireChanges(); + carrierWas.fireChanges(); + updateGUI(null); } - if (colonyWas != null) colonyWas.fireChanges(); - if (sourceWas != null) sourceWas.fireChanges(); - carrierWas.fireChanges(); - updateControls(); return ret; } @@ -3676,7 +3770,7 @@ public final class InGameController implements NetworkConstants { turnReportMessages.clear(); gui.setActiveUnit(null); gui.removeInGameComponents(); - FreeColDirectories.setSavegameFile(file); + FreeColDirectories.setSavegameFile(file.getPath()); freeColClient.getConnectController().startSavedGame(file, null); } @@ -3696,11 +3790,27 @@ public final class InGameController implements NetworkConstants { UnitWas unitWas = new UnitWas(unit); boolean ret = askServer().loot(unit, defenderId, goods); - unitWas.fireChanges(); - updateControls(); + if (ret) { + unitWas.fireChanges(); + updateGUI(null); + } return ret; } + /** + * Loot some cargo. + * + * Called from IGIH.lootCargo. + * + * @param unit The Unit that is looting. + * @param goods A list of Goods to choose from. + * @param defenderId The identifier of the defender unit (may have sunk). + */ + public void loot(Unit unit, List goods, String defenderId) { + gui.showCaptureGoodsDialog(unit, goods, + (List gl) -> lootCargo(unit, gl, defenderId)); + } + /** * Accept or reject a monarch action. * @@ -3713,14 +3823,34 @@ public final class InGameController implements NetworkConstants { public boolean monarchAction(MonarchAction action, boolean accept) { if (action == null) return false; + boolean ret = false; switch (action) { case RAISE_TAX_ACT: case RAISE_TAX_WAR: case MONARCH_MERCENARIES: case HESSIAN_MERCENARIES: - return askServer().answerMonarch(action, accept); + ret = askServer().answerMonarch(action, accept); + break; default: break; } - return false; + if (ret) { + updateGUI(null); + } + return ret; + } + + /** + * Do a monarch interaction. + * + * Called from IGIH.monarchAction. + * + * @param action The MonarchAction to perform. + * @param template A StringTemplate describing the action. + * @param monarchKey A key for the monarch involved. + */ + public void monarch(MonarchAction action, StringTemplate template, + String monarchKey) { + gui.showMonarchDialog(action, template, monarchKey, + (Boolean b) -> monarchAction(action, b)); } /** @@ -3740,27 +3870,25 @@ public final class InGameController implements NetworkConstants { // Sanity check current state. if (destination instanceof Europe) { if (unit.isInEurope()) { - freeColClient.getSoundController() - .playSound("sound.event.illegalMove"); + sound("sound.event.illegalMove"); return false; } } else if (destination instanceof Map) { if (unit.hasTile() && unit.getTile().getMap() == destination) { - freeColClient.getSoundController() - .playSound("sound.event.illegalMove"); + sound("sound.event.illegalMove"); return false; } } else if (destination instanceof Settlement) { if (unit.hasTile()) { - freeColClient.getSoundController() - .playSound("sound.event.illegalMove"); + sound("sound.event.illegalMove"); return false; } } else { return false; } - // Autoload emigrants? + // Autoload? + boolean update = false; if (freeColClient.getClientOptions() .getBoolean(ClientOptions.AUTOLOAD_EMIGRANTS) && unit.isInEurope()) { @@ -3768,16 +3896,18 @@ public final class InGameController implements NetworkConstants { if (!u.isNaval() && u.getState() == UnitState.SENTRY && unit.canAdd(u)) { - boardShip(u, unit); + if (askEmbark(u, unit)) update = true; } } } UnitWas unitWas = new UnitWas(unit); boolean ret = askServer().moveTo(unit, destination); - unitWas.fireChanges(); - updateControls(); - updateActiveUnit(null); + if (ret) { + unitWas.fireChanges(); + update = true; + } + if (update) updateGUI(null); return ret; } @@ -3794,18 +3924,29 @@ public final class InGameController implements NetworkConstants { */ public boolean moveUnit(Unit unit, Direction direction) { if (!requireOurTurn() || unit == null - || direction == null) return false; + || direction == null || !unit.hasTile()) return false; + if (!askClearGotoOrders(unit)) return false; + + final int unitCount = unit.getUnitCount(), + goodsCount = unit.getGoodsList().size(); + final Tile oldTile = unit.getTile(); UnitWas unitWas = new UnitWas(unit); ColonyWas colonyWas = (unit.getColony() == null) ? null : new ColonyWas(unit.getColony()); unit.setState(UnitState.ACTIVE); - boolean ret = askClearGotoOrders(unit) - && moveDirection(unit, direction, true); - unitWas.fireChanges(); - if (colonyWas != null) colonyWas.fireChanges(); - updateControls(); - updateActiveUnit(null); + moveDirection(unit, direction, true); + boolean ret = unit.getTile() != oldTile + || unitWas.fireChanges(); + if (ret) { + if (colonyWas != null) colonyWas.fireChanges(); + updateGUI(null); + if (!unit.couldMove() && unit.hasTile()) { + // Show colony panel if unit out of moves + Colony colony = unit.getTile().getColony(); + if (colony != null) colonyPanel(colony, unit); + } + } return ret; } @@ -3820,13 +3961,13 @@ public final class InGameController implements NetworkConstants { public boolean moveTileCursor(Direction direction) { if (direction == null) return false; - Tile tile = gui.getSelectedTile(); + final Tile tile = gui.getSelectedTile(); if (tile == null) return false; - Tile newTile = tile.getNeighbourOrNull(direction); + final Tile newTile = tile.getNeighbourOrNull(direction); if (newTile == null) return false; - gui.setSelectedTile(newTile, false); + gui.setSelectedTile(newTile); return true; } @@ -3853,7 +3994,7 @@ public final class InGameController implements NetworkConstants { null); // Add tutorial message. - String key = FreeColActionUI.getHumanKeyStrokeText(freeColClient + final String key = FreeColActionUI.getHumanKeyStrokeText(freeColClient .getActionManager().getFreeColAction("buildColonyAction") .getAccelerator()); player.addModelMessage(new ModelMessage(ModelMessage.MessageType.TUTORIAL, @@ -3861,14 +4002,14 @@ public final class InGameController implements NetworkConstants { .addName("%colonyKey%", key) .add("%colonyMenuItem%", "buildColonyAction.name") .add("%ordersMenuItem%", "menuBar.orders")); - displayModelMessages(false, false); + displayModelMessages(false); return true; } /** * The player names a new region. * - * Called from IGIH.newRegionName, GUI.showNameNewRegionDialog + * Called from newRegionName, GUI.showNameNewRegionDialog * * @param tile The Tile within the region. * @param unit The Unit that has discovered the region. @@ -3886,16 +4027,25 @@ public final class InGameController implements NetworkConstants { /** * Ask the player to name the new land. * + * Called from IGIH.newLandName. + * * @param defaultName The default name to use. * @param unit The Unit that has landed. */ public void newLandName(String defaultName, Unit unit) { - gui.showNameNewLandDialog("newLand.text", defaultName, unit); + gui.showNamingDialog( + StringTemplate.key("newLand.text"), defaultName, unit, + (String name) -> { + if (name == null || name.isEmpty()) name = defaultName; + nameNewLand(unit, name); + }); } /** * Ask the player to name a new region. * + * Called from IGIH.newRegionName. + * * @param region The Region to name. * @param defaultName The default name to use. * @param tile The Tile the unit landed at. @@ -3910,10 +4060,14 @@ public final class InGameController implements NetworkConstants { } nameNewRegion(tile, unit, region, defaultName); } else { - gui.showNameNewRegionDialog(StringTemplate - .template("nameRegion.text") - .addStringTemplate("%type%", region.getLabel()), - defaultName, unit, tile, region); + gui.showNamingDialog( + StringTemplate.template("nameRegion.text") + .addStringTemplate("%type%", region.getLabel()), + defaultName, unit, + (String name) -> { + if (name == null || name.isEmpty()) name = defaultName; + nameNewRegion(tile, unit, region, name); + }); } } @@ -3939,12 +4093,9 @@ public final class InGameController implements NetworkConstants { final boolean alert = freeColClient.getClientOptions() .getBoolean(ClientOptions.AUDIO_ALERTS); - if (alert) { - freeColClient.getSoundController() - .playSound("sound.event.alertSound"); - } + if (alert) sound("sound.event.alertSound"); - Turn currTurn = game.getTurn(); + final Turn currTurn = game.getTurn(); if (currTurn.isFirstSeasonTurn()) { player.addModelMessage(new ModelMessage(MessageType.WARNING, "twoTurnsPerYear", player) @@ -3964,7 +4115,7 @@ public final class InGameController implements NetworkConstants { public boolean nextActiveUnit() { if (!requireOurTurn()) return false; - updateActiveUnit(null); + updateGUI(null); return true; } @@ -4003,14 +4154,14 @@ public final class InGameController implements NetworkConstants { return false; } - boolean ret = gui.confirm(true, null, StringTemplate - .template("payArrears.text") - .addAmount("%amount%", arrears), - gui.createGoodsImageIcon(type), - "ok", "cancel") - && askServer().payArrears(type) - && player.canTrade(type); - updateControls(); + StringTemplate t = StringTemplate.template("payArrears.text") + .addAmount("%amount%", arrears); + if (!gui.confirm(null, t, type, "ok", "cancel")) return false; + + boolean ret = askServer().payArrears(type) && player.canTrade(type); + if (ret) { + updateGUI(null); + } return ret; } @@ -4037,20 +4188,18 @@ public final class InGameController implements NetworkConstants { return false; } - int price = colony.getPriceForBuilding(); - if (!gui.confirm(true, null, StringTemplate - .template("payForBuilding.text") - .addAmount("%amount%", price), - gui.createSettlementImageIcon(colony), - "yes", "no")) { - return false; - } + final int price = colony.getPriceForBuilding(); + StringTemplate t = StringTemplate.template("payForBuilding.text") + .addAmount("%amount%", price); + if (!gui.confirm(null, t, colony, "yes", "no")) return false; ColonyWas colonyWas = new ColonyWas(colony); boolean ret = askServer().payForBuilding(colony) && colony.getPriceForBuilding() == 0; - colonyWas.fireChanges(); - updateControls(); + if (ret) { + colonyWas.fireChanges(); + updateGUI(null); + } return ret; } @@ -4073,9 +4222,11 @@ public final class InGameController implements NetworkConstants { UnitWas unitWas = new UnitWas(unit); boolean ret = askServer().putOutsideColony(unit) && unit.getLocation() == colony.getTile(); - colonyWas.fireChanges(); - unitWas.fireChanges(); - updateControls(); + if (ret) { + colonyWas.fireChanges(); + unitWas.fireChanges(); + updateGUI(null); + } return ret; } @@ -4121,11 +4272,54 @@ public final class InGameController implements NetworkConstants { if (newUnit != null) { player.setNextActiveUnit(newUnit); gui.setActiveUnit(newUnit); - updateControls(); + updateGUI(null); } return newUnit != null; } + /** + * Remove game objects. + * + * Called from IGIH.remove(). + * + * @param objects A list of FreeColGameObjects to remove. + */ + public void remove(List objects, + FreeColGameObject divert) { + final Player player = freeColClient.getMyPlayer(); + boolean visibilityChange = false; + for (FreeColGameObject fcgo : objects) { + if (divert != null) player.divertModelMessages(fcgo, divert); + + if (fcgo instanceof Settlement) { + Settlement settlement = (Settlement)fcgo; + if (settlement != null && settlement.getOwner() != null) { + settlement.getOwner().removeSettlement(settlement); + } + visibilityChange = true;//-vis(player) + + } else if (fcgo instanceof Unit) { + // Deselect the object if it is the current active unit. + Unit u = (Unit)fcgo; + if (u == gui.getActiveUnit()) gui.setActiveUnit(null); + + // Temporary hack until we have real containers. + if (u != null && u.getOwner() != null) { + u.getOwner().removeUnit(u); + } + visibilityChange = true;//-vis(player) + } + + // Do just the low level dispose that removes + // reference to this object in the client. The other + // updates should have done the rest. + fcgo.disposeResources(); + } + if (visibilityChange) player.invalidateCanSeeTiles();//+vis(player) + + gui.refresh(); + } + /** * Renames a Nameable. * @@ -4144,7 +4338,7 @@ public final class InGameController implements NetworkConstants { String name = null; if (object instanceof Colony) { Colony colony = (Colony) object; - name = gui.getInput(true, colony.getTile(), + name = gui.getInput(colony.getTile(), StringTemplate.key("renameColony.text"), colony.getName(), "rename", "cancel"); if (name == null) { // User cancelled @@ -4163,7 +4357,7 @@ public final class InGameController implements NetworkConstants { } } else if (object instanceof Unit) { Unit unit = (Unit) object; - name = gui.getInput(true, unit.getTile(), + name = gui.getInput(unit.getTile(), StringTemplate.key("renameUnit.text"), unit.getName(), "rename", "cancel"); if (name == null) return false; // User cancelled @@ -4193,14 +4387,13 @@ public final class InGameController implements NetworkConstants { File file = gui.showSaveDialog(FreeColDirectories.getSaveDirectory(), fileName); if (file == null) return false; - final boolean confirm = freeColClient.getClientOptions() .getBoolean(ClientOptions.CONFIRM_SAVE_OVERWRITE); if (!confirm || !file.exists() || gui.confirm("saveConfirmationDialog.areYouSure.text", "ok", "cancel")) { - FreeColDirectories.setSaveDirectory(file.getParentFile()); + FreeColDirectories.setSavegameFile(file.getPath()); return saveGame(file); } return false; @@ -4239,10 +4432,9 @@ public final class InGameController implements NetworkConstants { moveToDestination(unit, null); } } + unitWas.fireChanges(); + updateGUI(null); } - unitWas.fireChanges(); - updateControls(); - updateActiveUnit(null); return ret; } @@ -4265,16 +4457,13 @@ public final class InGameController implements NetworkConstants { Europe europe = player.getEurope(); EuropeWas europeWas = new EuropeWas(europe); UnitWas unitWas = new UnitWas(carrier); - boolean ret = askUnloadGoods(goods.getType(), goods.getAmount(), - carrier); + boolean ret = askUnloadGoods(goods.getType(), goods.getAmount(), carrier); if (ret) { - freeColClient.getSoundController() - .playSound("sound.event.sellCargo"); - displayModelMessages(false, false); + sound("sound.event.sellCargo"); + europeWas.fireChanges(); + unitWas.fireChanges(); + updateGUI(null); } - europeWas.fireChanges(); - unitWas.fireChanges(); - updateControls(); return ret; } @@ -4308,7 +4497,10 @@ public final class InGameController implements NetworkConstants { ColonyWas colonyWas = new ColonyWas(colony); boolean ret = askServer().setBuildQueue(colony, buildQueue); - colonyWas.fireChanges(); + if (ret) { + colonyWas.fireChanges(); + updateGUI(null); + } return ret; } @@ -4329,6 +4521,7 @@ public final class InGameController implements NetworkConstants { final Game game = freeColClient.getGame(); game.setCurrentPlayer(player); + if (freeColClient.getMyPlayer().equals(player)) { if (FreeColDebugger.isInDebugMode(FreeColDebugger.DebugMode.DESYNC) && DebugUtils.checkDesyncAction(freeColClient)) { @@ -4336,49 +4529,35 @@ public final class InGameController implements NetworkConstants { return false; } + // Save the game (if it isn't newly loaded) + if (freeColClient.getFreeColServer() != null + && game.getTurn().getNumber() > 0) autoSaveGame(); + // Get turn report out quickly before more message display occurs. player.removeDisplayedModelMessages(); displayModelMessages(true, true); player.invalidateCanSeeTiles(); - // Save the game (if it isn't newly loaded) - if (freeColClient.getFreeColServer() != null - && game.getTurn().getNumber() > 0) autoSaveGame(); - // Check for emigration. Europe europe = player.getEurope(); if (player.hasAbility(Ability.SELECT_RECRUIT)) { - emigrationLoop(player, 0, false); + emigration(player, 0, false); } else { while (player.checkEmigrate()) { askEmigrate(europe, - Europe.MigrationType.getUnspecificSlot()); + Europe.MigrationType.getUnspecificSlot()); } } - try { - List settlements = player.getSettlements(); - Tile defTile = ((settlements.isEmpty()) - ? player.getEntryLocation().getTile() - : settlements.get(0).getTile()).getSafeTile(null, null); - player.resetIterators(); - updateActiveUnit(defTile); - } catch (Exception e) { - // We end up here if there is a crash in things like the - // turn report. These were hard to track down because we - // used to fail silently. We now complain louder. - logger.log(Level.WARNING, "Client new turn failure for " - + player, e); + // Wake up human! + if (!freeColClient.isSinglePlayer()) { + sound("sound.anthem." + player.getNationId()); } - // GUI management. - if (!freeColClient.isSinglePlayer()) { - freeColClient.getSoundController() - .playSound("sound.anthem." + player.getNationId()); - } + player.resetIterators(); + updateGUI(player.getFallbackTile()); } - updateControls(); return true; } @@ -4429,7 +4608,6 @@ public final class InGameController implements NetworkConstants { if (player != null) { player.refilterModelMessages(freeColClient.getClientOptions()); } - updateControls(); } /** @@ -4457,7 +4635,7 @@ public final class InGameController implements NetworkConstants { */ public boolean setInDebugMode() { FreeColDebugger.enableDebugMode(FreeColDebugger.DebugMode.MENUS); - updateControls(); + updateGUI(null); return true; } @@ -4483,8 +4661,7 @@ public final class InGameController implements NetworkConstants { return false; } if (player == first && old == Stance.UNCONTACTED) { - freeColClient.getSoundController() - .playSound("sound.event.meet." + second.getNationId()); + sound("sound.event.meet." + second.getNationId()); } return true; } @@ -4504,23 +4681,18 @@ public final class InGameController implements NetworkConstants { } /** - * Skip the active unit, note no server interaction. + * Spy on a colony. * - * Called from SkipUnitAction + * Called from IGIH.spyResult. * - * @param unit The Unit to skip. - * @return True if the active unit is not null. + * @param tile The Tile to find the colony on. + * @param recover A Runnable to restore the normal + * player view of the tile when the spying colony panel is closed. */ - public boolean skipUnit(Unit unit) { - if (!requireOurTurn() || unit == null) return false; - - if (unit.getState() == UnitState.SKIPPED) return true; - - unit.setState(UnitState.SKIPPED); - updateActiveUnit(null); - return true; + public void spyColony(Tile tile, Runnable recover) { + gui.showSpyColonyPanel(tile, recover); } - + /** * Trains a unit of a specified type in Europe. * @@ -4533,23 +4705,21 @@ public final class InGameController implements NetworkConstants { if (!requireOurTurn() || unitType == null) return false; final Player player = freeColClient.getMyPlayer(); - Europe europe = player.getEurope(); + final Europe europe = player.getEurope(); if (!player.checkGold(europe.getUnitPrice(unitType))) { gui.showInformationMessage("info.notEnoughGold"); return false; } EuropeWas europeWas = new EuropeWas(europe); - boolean ret = false; - if (askServer().trainUnitInEurope(unitType)) { - Unit newUnit = europeWas.getNewUnit(); + Unit newUnit = null; + boolean ret = askServer().trainUnitInEurope(unitType) + && (newUnit = europeWas.getNewUnit()) != null; + if (ret) { europeWas.fireChanges(); - if (newUnit != null) { - player.setNextActiveUnit(newUnit); - gui.setActiveUnit(newUnit); - ret = true; - } - updateControls(); + player.setNextActiveUnit(newUnit); + gui.setActiveUnit(newUnit); + updateGUI(null); } return ret; } @@ -4559,7 +4729,7 @@ public final class InGameController implements NetworkConstants { * * Called from UnloadAction, UnitLabel * - * @param unit The Unit that is dumping. + * @param unit The Unit that is dumping. * @return True if the unit unloaded. */ public boolean unload(Unit unit) { @@ -4567,7 +4737,6 @@ public final class InGameController implements NetworkConstants { || !unit.isCarrier()) return false; boolean ret = true; - boolean inEurope = unit.isInEurope(); Colony colony = unit.getColony(); if (colony != null) { // In colony, unload units and goods. for (Unit u : unit.getUnitList()) { @@ -4584,7 +4753,10 @@ public final class InGameController implements NetworkConstants { } } if (unit.hasGoodsCargo()) { // Goods left here must be dumped. - gui.showDumpCargoDialog(unit); + gui.showDumpCargoDialog(unit, + (List goodsList) -> { + for (Goods g : goodsList) unloadCargo(g, true); + }); return false; } } else { // Dump goods, units dislike jumping overboard @@ -4603,7 +4775,7 @@ public final class InGameController implements NetworkConstants { * Called from CargoPanel, ColonyPanel, EuropePanel.MarketPanel, * GUI.showDumpCargoDialog, QuickActionMenu, unload() * - * @param goods The Goods to unload. + * @param goods The Goods to unload. * @param dump If true, dump the goods. * @return True if the unload succeeds. */ @@ -4613,26 +4785,24 @@ public final class InGameController implements NetworkConstants { || !(goods.getLocation() instanceof Unit)) return false; // Find the carrier - Unit carrier = (Unit)goods.getLocation(); + final Unit carrier = (Unit)goods.getLocation(); // Use Europe-specific routine if needed if (carrier.isInEurope()) return sellGoods(goods); // Check for a colony - Colony colony = carrier.getColony(); + final Colony colony = carrier.getColony(); // Unload ColonyWas colonyWas = (colony == null) ? null : new ColonyWas(colony); UnitWas unitWas = new UnitWas(carrier); - boolean ret = askUnloadGoods(goods.getType(), goods.getAmount(), - carrier); - if (ret && !dump) { - freeColClient.getSoundController() - .playSound("sound.event.unloadCargo"); + boolean ret = askUnloadGoods(goods.getType(), goods.getAmount(), carrier); + if (ret) { + if (!dump) sound("sound.event.unloadCargo"); + if (colonyWas != null) colonyWas.fireChanges(); + unitWas.fireChanges(); + updateGUI(null); } - if (colonyWas != null) colonyWas.fireChanges(); - unitWas.fireChanges(); - updateControls(); return ret; } @@ -4650,16 +4820,29 @@ public final class InGameController implements NetworkConstants { return askServer().updateTradeRoute(route); } + /** + * The player has won, show the high scores and victory dialog. + * + * Called from IGIH.gameEnded. + * + * @param score If "true", a new high score was reached. + */ + public void victory(String score) { + displayHighScores("true".equalsIgnoreCase(score)); + gui.showVictoryDialog((Boolean result) -> victory(result)); + } + /** * The player has won! * * Called from GUI.showVictoryDialog * + * @param quit If true, leave this game and start a new one. * @return True. */ public boolean victory(Boolean quit) { if (quit) { - freeColClient.quit(); + freeColClient.newGame(false); } else { askServer().continuePlaying(); } @@ -4674,8 +4857,11 @@ public final class InGameController implements NetworkConstants { * @return True, this can not fail. */ public boolean waitUnit() { + if (!requireOurTurn()) return false; + + // Defeat the normal check for whether the current unit can move. gui.setActiveUnit(null); - updateActiveUnit(null); + updateGUI(null); return true; } @@ -4713,9 +4899,11 @@ public final class InGameController implements NetworkConstants { UnitWas unitWas = new UnitWas(unit); boolean ret = askServer().work(unit, workLocation) && unit.getLocation() == workLocation; - colonyWas.fireChanges(); - unitWas.fireChanges(); - updateControls(); + if (ret) { + colonyWas.fireChanges(); + unitWas.fireChanges(); + updateGUI(null); + } return ret; } } diff --git a/src/net/sf/freecol/client/control/InGameInputHandler.java b/src/net/sf/freecol/client/control/InGameInputHandler.java index 76c3e254e..3f95b68a4 100644 --- a/src/net/sf/freecol/client/control/InGameInputHandler.java +++ b/src/net/sf/freecol/client/control/InGameInputHandler.java @@ -24,12 +24,8 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import javax.swing.SwingUtilities; - -import net.sf.freecol.client.ClientOptions; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.common.debug.FreeColDebugger; -import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.Ability; import net.sf.freecol.common.model.Colony; import net.sf.freecol.common.model.DiplomaticTrade; @@ -48,7 +44,6 @@ import net.sf.freecol.common.model.Stance; import net.sf.freecol.common.model.Region; import net.sf.freecol.common.model.Settlement; import net.sf.freecol.common.model.Specification; -import net.sf.freecol.common.model.StringTemplate; import net.sf.freecol.common.model.Tile; import net.sf.freecol.common.model.TradeRoute; import net.sf.freecol.common.model.Unit; @@ -69,12 +64,11 @@ import org.w3c.dom.NodeList; /** - * Handles the network messages that arrives while in the game. + * Handle the network messages that arrives while in the game. * - * Usually delegate to the real handlers in InGameController, making - * sure anything non-trivial that touches the GUI is doing so inside - * the EDT. Usually this is done with SwingUtilities.invokeLater, but - * some messages demand a response which requires invokeAndWait. + * Delegate to the real handlers in InGameController which are allowed + * to touch the GUI. Call IGC through invokeLater except for the messages + * that demand a response, which requires invokeAndWait. * * Note that the EDT often calls the controller, which queries the * server, which results in handling the reply here, still within the @@ -84,47 +78,23 @@ import org.w3c.dom.NodeList; * * ...except for the special case of the animations. These have to be * done in series but are sometimes in the EDT (our unit moves) and - * sometimes not (other nation unit moves). Hence the hack in the - * local invokeAndWait wrapper. + * sometimes not (other nation unit moves). Hence the hack + * GUI.invokeNowOrWait. */ public final class InGameInputHandler extends InputHandler { private static final Logger logger = Logger.getLogger(InGameInputHandler.class.getName()); // A bunch of predefined non-closure runnables. - private final Runnable closeMenusRunnable = new Runnable() { - @Override - public void run() { - getGUI().closeMenus(); - } - }; - private final Runnable deselectActiveUnitRunnable = new Runnable() { - @Override - public void run() { - getGUI().setActiveUnit(null); - } - }; - private final Runnable displayModelMessagesRunnable = new Runnable() { - @Override - public void run() { - igc().displayModelMessages(false); - } - }; - private final Runnable reconnectRunnable = new Runnable() { - @Override - public void run() { - igc().reconnect(); - } - }; - private final Runnable updateMenuBarRunnable = new Runnable() { - @Override - public void run() { - getGUI().updateMenuBar(); - } - }; - - /** The unit last appearing in an animation. */ - private Unit lastAnimatedUnit = null; + private final Runnable closeMenusRunnable = () -> { + igc().closeMenus(); + }; + private final Runnable displayModelMessagesRunnable = () -> { + igc().displayModelMessages(false); + }; + private final Runnable reconnectRunnable = () -> { + igc().reconnect(); + }; /** @@ -147,45 +117,30 @@ public final class InGameInputHandler extends InputHandler { } /** - * Wrapper for SwingUtilities.invokeAndWait. This has to handle the - * case where we are already in the EDT. + * Shorthand to run in the EDT and wait. * - * @param runnable A Runnable to run. + * @param runnable The Runnable to run. */ private void invokeAndWait(Runnable runnable) { - if (SwingUtilities.isEventDispatchThread()) { - runnable.run(); - } else { - try { - SwingUtilities.invokeAndWait(runnable); - } catch (Exception e) {} - } + getFreeColClient().getGUI().invokeNowOrWait(runnable); } - + /** - * Refresh the canvas. + * Shorthand to run in the EDT eventually. * - * @param focus If true, request the focus. + * @param runnable The Runnable to run. */ - private void refreshCanvas(final boolean focus) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - getGUI().refresh(); - - if (focus && !getGUI().isShowingSubPanel()) { - getGUI().requestFocusInWindow(); - } - } - }); + private void invokeLater(Runnable runnable) { + getFreeColClient().getGUI().invokeNowOrLater(runnable); } - + /** * Get the integer value of an element attribute. * * @param element The Element to query. * @param attrib The attribute to use. - * @return The integer value of the attribute, or MIN_INT on failure. + * @return The integer value of the attribute, or + * Integer.MIN_VALUE on failure. */ private static int getIntegerAttribute(Element element, String attrib) { int n; @@ -219,6 +174,7 @@ public final class InGameInputHandler extends InputHandler { * Sometimes units appear which the client does not know about, * and are passed in as the children of the parent element. * Worse, if their location is a Unit, that unit has to be passed in too. + * Pull a unit out of the children by id. * * @param game The Game to add the unit to. * @param element The Element to find a unit in. @@ -232,7 +188,7 @@ public final class InGameInputHandler extends InputHandler { if (e != null) { u = new Unit(game, e); if (u.getLocation() == null) { - throw new IllegalStateException("Null location: " + u); + throw new RuntimeException("Null location: " + u); } } return u; @@ -252,7 +208,7 @@ public final class InGameInputHandler extends InputHandler { Element reply; String type = element.getTagName(); - logger.log(Level.FINEST, "Received message: " + type); + logger.log(Level.FINEST, "Received: " + type); switch (type) { case "disconnect": reply = disconnect(element); break; // Inherited @@ -325,7 +281,7 @@ public final class InGameInputHandler extends InputHandler { final FreeColClient fcc = getFreeColClient(); if (Boolean.TRUE.toString().equals(element.getAttribute("flush")) && fcc.currentPlayerIsMyPlayer()) { - SwingUtilities.invokeLater(displayModelMessagesRunnable); + invokeLater(displayModelMessagesRunnable); } return reply; } @@ -355,7 +311,8 @@ public final class InGameInputHandler extends InputHandler { final String tag = e.getTagName(); if (FoundingFather.getXMLElementTagName().equals(tag)) { - FoundingFather father = spec.getFoundingFather(FreeColObject.readId(e)); + FoundingFather father + = spec.getFoundingFather(FreeColObject.readId(e)); if (father != null) player.addFather(father); player.invalidateCanSeeTiles();// Might be coronado? @@ -379,7 +336,7 @@ public final class InGameInputHandler extends InputHandler { } /** - * Handles an "addPlayer"-message. + * Handle an "addPlayer"-message. * * @param element The element (root element in a DOM-parsed XML * tree) that holds all the information. @@ -402,7 +359,7 @@ public final class InGameInputHandler extends InputHandler { } /** - * Handles an "animateAttack"-message. This only performs animation, if + * Handle an "animateAttack"-message. This only performs animation, if * required. It does not actually perform any attacks. * * @param element An element (root element in a DOM-parsed XML @@ -412,8 +369,7 @@ public final class InGameInputHandler extends InputHandler { * @return Null. */ private Element animateAttack(Element element) { - FreeColClient freeColClient = getFreeColClient(); - if (freeColClient.isHeadless()) return null; + final FreeColClient freeColClient = getFreeColClient(); final Game game = getGame(); final Player player = freeColClient.getMyPlayer(); String str; @@ -465,26 +421,15 @@ public final class InGameInputHandler extends InputHandler { = Boolean.parseBoolean(element.getAttribute("success")); // All is well, do the animation. - // Use lastAnimatedUnit as a filter to avoid excessive refocussing. - final boolean focus = lastAnimatedUnit != attacker; - lastAnimatedUnit = attacker; - invokeAndWait(new Runnable() { - @Override - public void run() { - if (focus || !getGUI().onScreen(attackerTile) - || !getGUI().onScreen(defenderTile)) { - getGUI().setFocusImmediately(attackerTile); - } - getGUI().animateUnitAttack(attacker, defender, - attackerTile, defenderTile, success); - refreshCanvas(false); - } + invokeAndWait(() -> { + igc().animateAttack(attacker, defender, + attackerTile, defenderTile, success); }); return null; } /** - * Handles an "animateMove"-message. This only performs + * Handle an "animateMove"-message. This only performs * animation, if required. It does not actually change unit * positions, which happens in an "update". * @@ -495,8 +440,7 @@ public final class InGameInputHandler extends InputHandler { * @return Null. */ private Element animateMove(Element element) { - FreeColClient freeColClient = getFreeColClient(); - if (freeColClient.isHeadless()) return null; + final FreeColClient freeColClient = getFreeColClient(); final Game game = getGame(); final Player player = freeColClient.getMyPlayer(); @@ -544,37 +488,12 @@ public final class InGameInputHandler extends InputHandler { return null; } - final boolean focus = unit != lastAnimatedUnit; - lastAnimatedUnit = unit; - invokeAndWait(new Runnable() { - @Override - public void run() { - if (getGUI().getAnimationSpeed(unit) > 0) { - // All is well, queue the animation. Use - // lastAnimatedUnit as a filter to avoid - // excessive refocussing. - if (focus || !getGUI().onScreen(oldTile)) { - getGUI().setFocusImmediately(oldTile); - } - getGUI().animateUnitMove(unit, oldTile, newTile); - refreshCanvas(false); - } else { - // Not animating, but if the centering - // option is enabled at least refocus so - // we can see the move happen. - if (!getGUI().onScreen(oldTile) - && getFreeColClient().getClientOptions() - .getBoolean(ClientOptions.ALWAYS_CENTER)) { - getGUI().setFocus(oldTile); - } - } - } - }); + invokeAndWait(() -> { igc().animateMove(unit, oldTile, newTile); }); return null; } /** - * Handles a "chat"-message. + * Handle a "chat"-message. * * @param element The element (root element in a DOM-parsed XML * tree) that holds all the information. @@ -584,19 +503,15 @@ public final class InGameInputHandler extends InputHandler { final Game game = getGame(); final ChatMessage chatMessage = new ChatMessage(game, element); - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - getGUI().displayChatMessage(chatMessage.getPlayer(game), - chatMessage.getMessage(), - chatMessage.isPrivate()); - } - }); + invokeLater(() -> { + igc().chat(chatMessage.getPlayer(game), + chatMessage.getMessage(), chatMessage.isPrivate()); + }); return null; } /** - * Handles an "chooseFoundingFather"-request. + * Handle an "chooseFoundingFather"-request. * * @param element The element (root element in a DOM-parsed XML * tree) that holds all the information. @@ -607,7 +522,7 @@ public final class InGameInputHandler extends InputHandler { = new ChooseFoundingFatherMessage(getGame(), element); final List ffs = message.getFathers(); - getGUI().showChooseFoundingFatherDialog(ffs); + invokeLater(() -> { igc().chooseFoundingFather(ffs); }); return null; } @@ -627,7 +542,7 @@ public final class InGameInputHandler extends InputHandler { } /** - * Handles a "diplomacy"-request. If the message informs of an + * Handle a "diplomacy"-request. If the message informs of an * acceptance or rejection then display the result and return * null. If the message is a proposal, then ask the user about * it and return the response with appropriate response set. @@ -654,14 +569,9 @@ public final class InGameInputHandler extends InputHandler { return null; } - invokeAndWait(new Runnable() { - @Override - public void run() { - message.setAgreement(igc().diplomacy(our, other, - agreement)); - } + invokeAndWait(() -> { + message.setAgreement(igc().diplomacy(our, other, agreement)); }); - SwingUtilities.invokeLater(updateMenuBarRunnable); return (message.getAgreement() == null) ? null : message.toXMLElement(); } @@ -696,7 +606,7 @@ public final class InGameInputHandler extends InputHandler { } /** - * Handles an "error"-message. + * Handle an "error"-message. * * @param element The element (root element in a DOM-parsed XML * tree) that holds all the information. @@ -706,12 +616,7 @@ public final class InGameInputHandler extends InputHandler { final String messageId = element.getAttribute("messageID"); final String message = element.getAttribute("message"); - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - getGUI().showErrorMessage(messageId, message); - } - }); + invokeLater(() -> { igc().error(messageId, message); }); return null; } @@ -786,9 +691,9 @@ public final class InGameInputHandler extends InputHandler { logger.warning("firstContact with bad tile: " + tile); return null; } + final int n = message.getSettlementCount(); - getGUI().showFirstContactDialog(player, other, tile, - message.getSettlementCount()); + invokeLater(() -> { igc().firstContact(player, other, tile, n); }); return null; } @@ -800,19 +705,19 @@ public final class InGameInputHandler extends InputHandler { * @return Null. */ private Element fountainOfYouth(Element element) { - int n = getIntegerAttribute(element, "migrants"); - if (n > 0) { - getGUI().showEmigrationDialog(getFreeColClient().getMyPlayer(), - n, true); - } else { + final int n = getIntegerAttribute(element, "migrants"); + if (n <= 0) { logger.warning("Invalid migrants attribute: " + element.getAttribute("migrants")); + return null; } + + invokeLater(() -> { igc().fountainOfYouth(n); }); return null; } /** - * Handles a "gameEnded"-message. + * Handle a "gameEnded"-message. * * @param element The element (root element in a DOM-parsed XML * tree) that holds all the information. @@ -824,23 +729,20 @@ public final class InGameInputHandler extends InputHandler { final Player winner = getGame().getFreeColGameObject(element.getAttribute("winner"), Player.class); - final boolean highScore - = "true".equalsIgnoreCase(element.getAttribute("highScore")); + if (winner == null) { + logger.warning("Invalid player for gameEnded"); + return null; + } + final String highScore = element.getAttribute("highScore"); if (winner == freeColClient.getMyPlayer()) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - igc().displayHighScores(highScore); - } - }); - getGUI().showVictoryDialog(); + invokeLater(() -> { igc().victory(highScore); }); } return null; } /** - * Handles an "indianDemand"-request. + * Handle an "indianDemand"-request. * * @param element The element (root element in a DOM-parsed XML * tree) that holds all the information. @@ -852,14 +754,12 @@ public final class InGameInputHandler extends InputHandler { final Player player = getFreeColClient().getMyPlayer(); final IndianDemandMessage message = new IndianDemandMessage(game, element); - final Unit unit = message.getUnit(game); if (unit == null) { logger.warning("IndianDemand with null unit: " + element.getAttribute("unit")); return null; } - final Colony colony = message.getColony(game); if (colony == null) { logger.warning("IndianDemand with null colony: " @@ -869,13 +769,9 @@ public final class InGameInputHandler extends InputHandler { throw new IllegalArgumentException("Demand to anothers colony"); } - invokeAndWait(new Runnable() { - @Override - public void run() { - boolean accepted = igc().indianDemand(unit, colony, - message.getType(game), message.getAmount()); - message.setResult(accepted); - } + invokeAndWait(() -> { + message.setResult(igc().indianDemand(unit, colony, + message.getType(game), message.getAmount())); }); return message.toXMLElement(); } @@ -895,12 +791,12 @@ public final class InGameInputHandler extends InputHandler { final List goods = message.getGoods(); if (unit == null || goods == null) return null; - getGUI().showCaptureGoodsDialog(unit, goods, defenderId); + invokeLater(() -> { igc().loot(unit, goods, defenderId); }); return null; } /** - * Handles a "monarchAction"-request. + * Handle a "monarchAction"-request. * * @param element The element (root element in a DOM-parsed XML * tree) that holds all the information. @@ -911,8 +807,10 @@ public final class InGameInputHandler extends InputHandler { final MonarchActionMessage message = new MonarchActionMessage(game, element); - getGUI().showMonarchDialog(message.getAction(), message.getTemplate(), - message.getMonarchKey()); + invokeLater(() -> { + igc().monarch(message.getAction(), message.getTemplate(), + message.getMonarchKey()); + }); return null; } @@ -954,7 +852,7 @@ public final class InGameInputHandler extends InputHandler { if (unit == null || defaultName == null || !unit.hasTile()) return null; - igc().newLandName(defaultName, unit); + invokeLater(() -> { igc().newLandName(defaultName, unit); }); return null; } @@ -974,12 +872,14 @@ public final class InGameInputHandler extends InputHandler { final String defaultName = message.getNewRegionName(); if (defaultName == null || region == null) return null; - igc().newRegionName(region, defaultName, tile, unit); + invokeLater(() -> { + igc().newRegionName(region, defaultName, tile, unit); + }); return null; } /** - * Handles a "newTurn"-message. + * Handle a "newTurn"-message. * * @param element The element (root element in a DOM-parsed XML tree) * that holds all the information. @@ -987,23 +887,17 @@ public final class InGameInputHandler extends InputHandler { */ private Element newTurn(Element element) { final int n = getIntegerAttribute(element, "turn"); + if (n < 0) { + logger.warning("Invalid turn for newTurn"); + return null; + } - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - igc().newTurn(n); - } - }); - - igc().setCurrentPlayer(null); - refreshCanvas(false); - - SwingUtilities.invokeLater(updateMenuBarRunnable); + invokeLater(() -> { igc().newTurn(n); }); return null; } /** - * Handles an "reconnect"-message. + * Handle an "reconnect"-message. * * @param element The element (root element in a DOM-parsed XML * tree) that holds all the information. @@ -1012,12 +906,12 @@ public final class InGameInputHandler extends InputHandler { private Element reconnect(@SuppressWarnings("unused") Element element) { logger.finest("Entered reconnect."); - SwingUtilities.invokeLater(reconnectRunnable); + invokeLater(reconnectRunnable); return null; } /** - * Handles a "remove"-message. + * Handle a "remove"-message. * * @param element The element (root element in a DOM-parsed XML * tree) that holds all the information. @@ -1025,11 +919,9 @@ public final class InGameInputHandler extends InputHandler { */ private Element remove(Element element) { final Game game = getGame(); - String ds = element.getAttribute("divert"); - FreeColGameObject divert = game.getFreeColGameObject(ds); - Player player = getFreeColClient().getMyPlayer(); - boolean visibilityChange = false; - + final FreeColGameObject divert + = game.getFreeColGameObject(element.getAttribute("divert")); + final List objects = new ArrayList<>(); NodeList nodeList = element.getChildNodes(); for (int i = 0; i < nodeList.getLength(); i++) { Element e = (Element)nodeList.item(i); @@ -1042,42 +934,17 @@ public final class InGameInputHandler extends InputHandler { // freeColGameObjects, before this remove is processed. continue; } - if (divert != null) { - player.divertModelMessages(fcgo, divert); - } - if (fcgo instanceof Settlement) { - Settlement settlement = (Settlement)fcgo; - if (settlement != null && settlement.getOwner() != null) { - settlement.getOwner().removeSettlement(settlement); - } - visibilityChange = true;//-vis(player) - - } else if (fcgo instanceof Unit) { - // Deselect the object if it is the current active unit. - Unit u = (Unit)fcgo; - if (u == getGUI().getActiveUnit()) { - invokeAndWait(deselectActiveUnitRunnable); - } - // Temporary hack until we have real containers. - if (u != null && u.getOwner() != null) { - u.getOwner().removeUnit(u); - } - visibilityChange = true;//-vis(player) - } - - // Do just the low level dispose that removes - // reference to this object in the client. The other - // updates should have done the rest. - fcgo.disposeResources(); + objects.add(fcgo); } - if (visibilityChange) player.invalidateCanSeeTiles();//+vis(player) - refreshCanvas(false); + if (!objects.isEmpty()) { + invokeLater(() -> { igc().remove(objects, divert); }); + } return null; } /** - * Handles a "setAI"-message. + * Handle a "setAI"-message. * * @param element The element (root element in a DOM-parsed XML * tree) that holds all the information. @@ -1093,25 +960,27 @@ public final class InGameInputHandler extends InputHandler { } /** - * Handles a "setCurrentPlayer"-message. + * Handle a "setCurrentPlayer"-message. * * @param element The element (root element in a DOM-parsed XML * tree) that holds all the information. * @return Null. */ private Element setCurrentPlayer(Element element) { - Player player + final Player player = getGame().getFreeColGameObject(element.getAttribute("player"), Player.class); - - igc().setCurrentPlayer(player); + if (player == null) { + logger.warning("Invalid player for setCurrentPlayer"); + return null; + } - refreshCanvas(true); + igc().setCurrentPlayer(player); // It is safe to call this one directly return null; } /** - * Handles a "setDead"-message. + * Handle a "setDead"-message. * * @param element The element (root element in a DOM-parsed XML * tree) that holds all the information. @@ -1120,18 +989,17 @@ public final class InGameInputHandler extends InputHandler { private Element setDead(Element element) { final Player player = getGame() .getFreeColGameObject(element.getAttribute("player"),Player.class); + if (player == null) { + logger.warning("Invalid player for setDead"); + return null; + } - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - igc().setDead(player); - } - }); + invokeLater(() -> { igc().setDead(player); }); return null; } /** - * Handles a "setStance"-request. + * Handle a "setStance"-request. * * @param element The element (root element in a DOM-parsed XML * tree) that holds all the information. @@ -1141,22 +1009,29 @@ public final class InGameInputHandler extends InputHandler { final Game game = getGame(); final Stance stance = Enum.valueOf(Stance.class, element.getAttribute("stance")); + if (stance == null) { + logger.warning("Invalid stance for setStance"); + return null; + } final Player p1 = game .getFreeColGameObject(element.getAttribute("first"), Player.class); + if (p1 == null) { + logger.warning("Invalid player1 for setStance"); + return null; + } final Player p2 = game .getFreeColGameObject(element.getAttribute("second"),Player.class); + if (p2 == null) { + logger.warning("Invalid player2 for setStance"); + return null; + } - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - igc().setStance(stance, p1, p2); - } - }); + invokeLater(() -> { igc().setStance(stance, p1, p2); }); return null; } /** - * Handles a "spyResult" message. + * Handle a "spyResult" message. * * @param element The element (root element in a DOM-parsed XML * tree) that holds all the information. @@ -1190,23 +1065,17 @@ public final class InGameInputHandler extends InputHandler { // is closed. final Element fullElement = (Element)nodeList.item(0); final Element normalElement = (Element)nodeList.item(1); - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - tile.readFromXMLElement(fullElement); - getGUI().showSpyColonyPanel(tile, new Runnable() { - @Override - public void run() { - tile.readFromXMLElement(normalElement); - } - }); - } + tile.readFromXMLElement(fullElement); + invokeLater(() -> { + igc().spyColony(tile, () -> { + tile.readFromXMLElement(normalElement); + }); }); return null; } /** - * Handles an "update"-message. + * Handle an "update"-message. * * @param element The element (root element in a DOM-parsed XML * tree) that holds all the information. @@ -1234,7 +1103,6 @@ public final class InGameInputHandler extends InputHandler { } if (visibilityChange) player.invalidateCanSeeTiles();//+vis(player) - refreshCanvas(false); return null; } } diff --git a/src/net/sf/freecol/client/control/InputHandler.java b/src/net/sf/freecol/client/control/InputHandler.java index 63c341522..da1b4aa77 100644 --- a/src/net/sf/freecol/client/control/InputHandler.java +++ b/src/net/sf/freecol/client/control/InputHandler.java @@ -101,15 +101,12 @@ public abstract class InputHandler implements MessageHandler { */ protected Element disconnect(Element element) { // Updating the GUI should always be done in the EDT: - javax.swing.SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - if (getGUI().containsInGameComponents()) { - if (freeColClient.getFreeColServer() == null) { - getGUI().returnToTitle(); - } else { - getGUI().removeInGameComponents(); - } + javax.swing.SwingUtilities.invokeLater(() -> { + if (getGUI().containsInGameComponents()) { + if (freeColClient.getFreeColServer() == null) { + getGUI().returnToTitle(); + } else { + getGUI().removeInGameComponents(); } } }); diff --git a/src/net/sf/freecol/client/control/MapEditorController.java b/src/net/sf/freecol/client/control/MapEditorController.java index a87b40017..4142d64e1 100644 --- a/src/net/sf/freecol/client/control/MapEditorController.java +++ b/src/net/sf/freecol/client/control/MapEditorController.java @@ -31,7 +31,6 @@ import javax.xml.stream.XMLStreamException; import net.sf.freecol.FreeCol; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.gui.GUI; -import net.sf.freecol.client.gui.panel.MapEditorTransformPanel.MapTransform; import net.sf.freecol.common.FreeColException; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.io.FreeColDirectories; @@ -43,13 +42,12 @@ import net.sf.freecol.common.model.Player; import net.sf.freecol.common.model.Specification; import net.sf.freecol.common.model.StringTemplate; import net.sf.freecol.common.model.Tile; -import net.sf.freecol.common.networking.NoRouteToServerException; import net.sf.freecol.common.option.MapGeneratorOptions; import net.sf.freecol.common.option.OptionGroup; import net.sf.freecol.common.util.LogBuilder; import net.sf.freecol.server.FreeColServer; -import net.sf.freecol.server.model.ServerPlayer; import net.sf.freecol.server.generator.MapGenerator; +import net.sf.freecol.server.model.ServerPlayer; /** @@ -65,11 +63,21 @@ public final class MapEditorController { private final GUI gui; + public interface IMapTransform { + + /** + * Applies this transformation to the given tile. + * @param t The Tile to be transformed, + */ + public abstract void transform(Tile t); + + } + /** * The transform that should be applied to a Tile * that is clicked on the map. */ - private MapTransform currentMapTransform = null; + private IMapTransform currentMapTransform = null; /** @@ -107,9 +115,6 @@ public final class MapEditorController { freeColClient.setInGame(true); gui.changeViewMode(GUI.VIEW_TERRAIN_MODE); gui.startMapEditorGUI(); - } catch (NoRouteToServerException e) { - gui.showErrorMessage("server.noRouteToServer"); - return; } catch (IOException e) { gui.showErrorMessage("server.initialize"); return; @@ -132,7 +137,7 @@ public final class MapEditorController { * @param mt The transform that should be applied to a * Tile that is clicked on the map. */ - public void setMapTransform(MapTransform mt) { + public void setMapTransform(IMapTransform mt) { currentMapTransform = mt; gui.updateMapControls(); } @@ -142,7 +147,7 @@ public final class MapEditorController { * @return The transform that should be applied to a * Tile that is clicked on the map. */ - public MapTransform getMapTransform() { + public IMapTransform getMapTransform() { return currentMapTransform; } @@ -177,7 +182,7 @@ public final class MapEditorController { .createMap(new LogBuilder(-1)); requireNativeNations(game); gui.setFocus(game.getMap().getTile(1,1)); - freeColClient.updateActions(); + gui.updateMenuBar(); gui.refresh(); } @@ -211,19 +216,13 @@ public final class MapEditorController { BufferedImage thumb = gui.createMiniMapThumbNail(); freeColClient.getFreeColServer() .saveMapEditorGame(file, thumb); - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - gui.closeStatusPanel(); - gui.requestFocusInWindow(); - } + SwingUtilities.invokeLater(() -> { + gui.closeStatusPanel(); + gui.requestFocusInWindow(); }); } catch (IOException e) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - gui.showErrorMessage(FreeCol.badSave(file)); - } + SwingUtilities.invokeLater(() -> { + gui.showErrorMessage(FreeCol.badSave(file)); }); } } @@ -248,7 +247,7 @@ public final class MapEditorController { public void requireNativeNations(Game game) { final Specification spec = game.getSpecification(); for (Nation n : spec.getIndianNations()) { - Player p = game.getPlayer(n.getId()); + Player p = game.getPlayerByNation(n); if (p == null) { p = new ServerPlayer(game, false, n, null, null); game.addPlayer(p); @@ -282,54 +281,43 @@ public final class MapEditorController { gui.showStatusPanel(Messages.message("status.loadingGame")); - Runnable loadGameJob = new Runnable() { - @Override - public void run() { - FreeColServer freeColServer - = freeColClient.getFreeColServer(); - try { - Specification spec = getDefaultSpecification(); - Game game = FreeColServer.readGame(new FreeColSavegameFile(theFile), - spec, freeColServer); - freeColClient.setGame(game); - requireNativeNations(game); - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - gui.closeStatusPanel(); - gui.setFocus(freeColClient.getGame() - .getMap().getTile(1,1)); - freeColClient.updateActions(); - gui.refresh(); - } - }); - } catch (FreeColException e) { - reloadMainPanel(); - SwingUtilities.invokeLater(new ErrorJob(StringTemplate.name(e.getMessage()))); - } catch (FileNotFoundException e) { - reloadMainPanel(); - SwingUtilities.invokeLater(new ErrorJob(StringTemplate.key("server.fileNotFound"))); - } catch (IOException e) { - reloadMainPanel(); - SwingUtilities.invokeLater(new ErrorJob(StringTemplate.key("server.initialize"))); - } catch (XMLStreamException e) { - reloadMainPanel(); - SwingUtilities.invokeLater(new ErrorJob(FreeCol.badLoad(theFile))); - } - } - }; + Runnable loadGameJob = () -> { + FreeColServer freeColServer = freeColClient.getFreeColServer(); + try { + Specification spec = getDefaultSpecification(); + Game game = FreeColServer.readGame(new FreeColSavegameFile(theFile), + spec, freeColServer); + freeColClient.setGame(game); + requireNativeNations(game); + SwingUtilities.invokeLater(() -> { + gui.closeStatusPanel(); + gui.setFocus(freeColClient.getGame().getMap().getTile(1,1)); + gui.updateMenuBar(); + gui.refresh(); + }); + } catch (FreeColException e) { + reloadMainPanel(); + SwingUtilities.invokeLater(new ErrorJob(StringTemplate.name(e.getMessage()))); + } catch (FileNotFoundException e) { + reloadMainPanel(); + SwingUtilities.invokeLater(new ErrorJob(StringTemplate.key("server.fileNotFound"))); + } catch (IOException e) { + reloadMainPanel(); + SwingUtilities.invokeLater(new ErrorJob(StringTemplate.key("server.initialize"))); + } catch (XMLStreamException e) { + reloadMainPanel(); + SwingUtilities.invokeLater(new ErrorJob(FreeCol.badLoad(theFile))); + } + }; freeColClient.setWork(loadGameJob); } private void reloadMainPanel () { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - gui.closeMainPanel(); - gui.showMainPanel(null); - freeColClient.getSoundController() - .playSound("sound.intro.general"); - } + SwingUtilities.invokeLater(() -> { + gui.closeMainPanel(); + gui.showMainPanel(null); + freeColClient.getSoundController() + .playSound("sound.intro.general"); }); } } diff --git a/src/net/sf/freecol/client/control/PreGameController.java b/src/net/sf/freecol/client/control/PreGameController.java index 9cdb7594b..6a36aa630 100644 --- a/src/net/sf/freecol/client/control/PreGameController.java +++ b/src/net/sf/freecol/client/control/PreGameController.java @@ -28,7 +28,6 @@ import net.sf.freecol.client.gui.GUI; import net.sf.freecol.common.debug.FreeColDebugger; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.GameOptions; -import net.sf.freecol.common.model.Direction; import net.sf.freecol.common.model.Nation; import net.sf.freecol.common.model.NationOptions.NationState; import net.sf.freecol.common.model.NationType; diff --git a/src/net/sf/freecol/client/control/PreGameInputHandler.java b/src/net/sf/freecol/client/control/PreGameInputHandler.java index bcf10a7cf..1e9e309d2 100644 --- a/src/net/sf/freecol/client/control/PreGameInputHandler.java +++ b/src/net/sf/freecol/client/control/PreGameInputHandler.java @@ -283,12 +283,9 @@ public final class PreGameInputHandler extends InputHandler { } catch (Exception ex) {} } - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - getFreeColClient().getPreGameController() - .startGame(); - } + SwingUtilities.invokeLater(() -> { + getFreeColClient().getPreGameController() + .startGame(); }); } }.start(); @@ -339,7 +336,6 @@ public final class PreGameInputHandler extends InputHandler { Game game = fcc.getGame(); game.readFromXMLElement((Element)children.item(0)); fcc.addSpecificationActions(game.getSpecification()); - fcc.updateActions(); } else { logger.warning("Child node expected: " + element.getTagName()); } diff --git a/src/net/sf/freecol/client/gui/AbstractCanvasListener.java b/src/net/sf/freecol/client/gui/AbstractCanvasListener.java index 68ed1db8e..07bf9a8a3 100644 --- a/src/net/sf/freecol/client/gui/AbstractCanvasListener.java +++ b/src/net/sf/freecol/client/gui/AbstractCanvasListener.java @@ -41,8 +41,7 @@ public class AbstractCanvasListener { /** The enclosing client. */ protected final FreeColClient freeColClient; - /** The map viewer to scroll. */ - protected final MapViewer mapViewer; + protected final Canvas canvas; /** The scroll thread itself. */ protected ScrollThread scrollThread = null; @@ -53,9 +52,9 @@ public class AbstractCanvasListener { * * @param freeColClient The FreeColClient for the game. */ - public AbstractCanvasListener(FreeColClient freeColClient, MapViewer mapViewer) { + public AbstractCanvasListener(FreeColClient freeColClient, Canvas canvas) { this.freeColClient = freeColClient; - this.mapViewer = mapViewer; + this.canvas = canvas; this.scrollThread = null; } @@ -107,7 +106,7 @@ public class AbstractCanvasListener { */ private void scroll(int x, int y, int scrollSpace) { Direction direction; - Dimension size = mapViewer.getSize(); + Dimension size = canvas.getSize(); if (x < scrollSpace && y < scrollSpace) { // Upper-Left direction = Direction.NW; } else if (x >= size.width - scrollSpace @@ -134,7 +133,7 @@ public class AbstractCanvasListener { if (direction == null) { stopScrollIfScrollIsActive(); } else if (scrollThread == null || scrollThread.isInterrupted()) { - scrollThread = new ScrollThread(mapViewer); + scrollThread = new ScrollThread(canvas); scrollThread.setDirection(direction); scrollThread.start(); } else { diff --git a/src/net/sf/freecol/client/gui/Canvas.java b/src/net/sf/freecol/client/gui/Canvas.java index 2b13fa73e..8563d6cfa 100644 --- a/src/net/sf/freecol/client/gui/Canvas.java +++ b/src/net/sf/freecol/client/gui/Canvas.java @@ -25,15 +25,12 @@ import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; -import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.Image; import java.awt.Point; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.event.ActionListener; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; import java.awt.event.KeyListener; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; @@ -41,10 +38,12 @@ import java.awt.font.TextLayout; import java.awt.geom.Rectangle2D; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.stream.Collectors; import javax.swing.ImageIcon; import javax.swing.JComponent; @@ -57,22 +56,20 @@ import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.border.EmptyBorder; import javax.swing.filechooser.FileFilter; +import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.plaf.basic.BasicInternalFrameUI; import net.sf.freecol.FreeCol; import net.sf.freecol.client.ClientOptions; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.gui.action.FreeColAction; -import net.sf.freecol.client.gui.menu.FreeColMenuBar; -import net.sf.freecol.client.gui.menu.InGameMenuBar; -import net.sf.freecol.client.gui.menu.MapEditorMenuBar; import net.sf.freecol.client.gui.panel.*; import net.sf.freecol.client.gui.panel.LabourData.UnitData; import net.sf.freecol.common.ServerInfo; import net.sf.freecol.common.i18n.Messages; -import net.sf.freecol.common.io.FreeColFileFilter; import net.sf.freecol.common.model.Colony; import net.sf.freecol.common.model.DiplomaticTrade; +import net.sf.freecol.common.model.Direction; import net.sf.freecol.common.model.FoundingFather; import net.sf.freecol.common.model.FreeColGameObject; import net.sf.freecol.common.model.FreeColObject; @@ -179,7 +176,7 @@ public final class Canvas extends JDesktopPane { private final FreeColClient freeColClient; /** The parent GUI. */ - private final GUI gui; + private final SwingGUI gui; private final GraphicsDevice graphicsDevice; @@ -188,8 +185,6 @@ public final class Canvas extends JDesktopPane { private boolean windowed; - private Rectangle windowBounds; - private MainPanel mainPanel; private final StartGamePanel startGamePanel; @@ -202,6 +197,8 @@ public final class Canvas extends JDesktopPane { private final MapViewer mapViewer; + private Point gotoDragPoint; + private GrayLayer greyLayer; private final ServerListPanel serverListPanel; @@ -225,22 +222,24 @@ public final class Canvas extends JDesktopPane { * * @param freeColClient The FreeColClient for the game. * @param graphicsDevice The used graphics device. + * @param gui The gui. * @param desiredSize The desired size of the frame. * @param mapViewer The object responsible of drawing the map onto * this component. */ Canvas(final FreeColClient freeColClient, - final GraphicsDevice graphicsDevice, - final Dimension desiredSize, - MapViewer mapViewer) { + final GraphicsDevice graphicsDevice, + final SwingGUI gui, + final Dimension desiredSize, + MapViewer mapViewer) { this.freeColClient = freeColClient; - this.gui = freeColClient.getGUI(); + this.gui = gui; this.graphicsDevice = graphicsDevice; chatDisplay = new ChatDisplay(); this.mapViewer = mapViewer; // Determine if windowed mode should be used and set the window size. - windowBounds = null; + Rectangle windowBounds = null; if (desiredSize == null) { if(graphicsDevice.isFullScreenSupported()) { windowed = false; @@ -274,7 +273,8 @@ public final class Canvas extends JDesktopPane { setFocusTraversalKeysEnabled(false); createKeyBindings(); - changeWindowedMode(windowed); + createFrame(null, windowBounds); + mapViewer.startCursorBlinking(); logger.info("Canvas created."); } @@ -284,36 +284,30 @@ public final class Canvas extends JDesktopPane { /** * Change the windowed mode. - * - * @param windowed Use true for windowed mode - * and false for fullscreen mode. */ - void changeWindowedMode(boolean windowed) { + void changeWindowedMode() { // Clean up the old frame JMenuBar menuBar = null; + Rectangle windowBounds = null; if (frame != null) { menuBar = frame.getJMenuBar(); - if (this.windowed) { + if (windowed) { windowBounds = frame.getBounds(); } frame.setVisible(false); frame.dispose(); } - this.windowed = windowed; + windowed = !windowed; + createFrame(menuBar, windowBounds); + } + + private void createFrame(JMenuBar menuBar, Rectangle windowBounds) { + // FIXME: Check this: // User might have moved window to new screen in a // multi-screen setup, so make this.gd point to the current screen. frame = new FreeColFrame(freeColClient, graphicsDevice, menuBar, this, windowed, windowBounds); - if (windowed) { - frame.addComponentListener(new ComponentAdapter() { - @Override - public void componentResized(ComponentEvent e) { - logger.info("Window size changes to " + getSize()); - } - }); - } - updateSizes(); frame.setVisible(true); } @@ -327,11 +321,11 @@ public final class Canvas extends JDesktopPane { // We may need to reset the zoom value to the default value gui.resetMapZoom(); - frame.setJMenuBar(new MapEditorMenuBar(freeColClient, mapViewer)); + frame.setMapEditorMenuBar(); showMapEditorTransformPanel(); CanvasMapEditorMouseListener listener - = new CanvasMapEditorMouseListener(freeColClient, this, mapViewer); + = new CanvasMapEditorMouseListener(freeColClient, this); addMouseListener(listener); addMouseMotionListener(listener); } @@ -340,10 +334,8 @@ public final class Canvas extends JDesktopPane { * Quit the GUI. All that is required is to exit the full screen. */ void quit() throws Exception { - if (frame != null) { - GraphicsConfiguration GraphicsConf = frame.getGraphicsConfiguration(); - GraphicsDevice gd = GraphicsConf.getDevice(); - if (!windowed) gd.setFullScreenWindow(null); + if (frame != null && !windowed) { + frame.exitFullScreen(); } } @@ -352,9 +344,7 @@ public final class Canvas extends JDesktopPane { */ void initializeInGame() { if (frame == null) return; - - frame.setJMenuBar(new InGameMenuBar(freeColClient, mapViewer)); - frame.paintAll(getGraphics()); + frame.setInGameMenuBar(); } /** @@ -362,19 +352,90 @@ public final class Canvas extends JDesktopPane { */ void resetMenuBar() { if (frame == null) return; - JMenuBar menuBar = frame.getJMenuBar(); - if (menuBar != null) { - ((FreeColMenuBar)menuBar).reset(); - } + frame.resetMenuBar(); } /** * Update the menu bar. */ void updateMenuBar() { - if (frame != null && frame.getJMenuBar() != null) { - ((FreeColMenuBar)frame.getJMenuBar()).update(); - } + if (frame == null) return; + frame.updateMenuBar(); + } + + /** + * Scroll the map in the given direction. + * + * @param direction The Direction to scroll in. + * @return True if scrolling occurred. + */ + boolean scrollMap(Direction direction) { + return mapViewer.scrollMap(direction); + } + + /** + * Converts the given screen coordinates to Map coordinates. + * It checks to see to which Tile the given pixel 'belongs'. + * + * @param x The x-coordinate in pixels. + * @param y The y-coordinate in pixels. + * @return The Tile that is located at the given position on the screen. + */ + Tile convertToMapTile(int x, int y) { + return mapViewer.convertToMapTile(x, y); + } + + /** + * Get the view mode. + * + * @return The view mode. + */ + public int getViewMode() { + return mapViewer.getViewMode(); + } + + /** + * Gets the active unit. + * + * @return The Unit. + */ + Unit getActiveUnit() { + return mapViewer.getActiveUnit(); + } + + /** + * Set the current active unit path. + * + * @param path The current PathNode. + */ + void setCurrentPath(PathNode path) { + mapViewer.setCurrentPath(path); + } + + /** + * Sets the path of the active unit to display it. + */ + void updateCurrentPathForActiveUnit() { + mapViewer.updateCurrentPathForActiveUnit(); + } + + /** + * Gets the point at which the map was clicked for a drag. + * + * @return The Point where the mouse was initially clicked. + */ + Point getDragPoint() { + return gotoDragPoint; + } + + /** + * Sets the point at which the map was clicked for a drag. + * + * @param x The mouse's x position. + * @param y The mouse's y position. + */ + void setDragPoint(int x, int y) { + gotoDragPoint = new Point(x, y); } /** @@ -547,7 +608,7 @@ public final class Canvas extends JDesktopPane { private Point chooseLocation(Component comp, int width, int height, PopupPosition popupPosition) { Point p = null; - if ((comp instanceof FreeColPanel || comp instanceof FreeColDialog) + if ((comp instanceof FreeColPanel) && (p = getSavedPosition(comp)) != null) { // Sanity check stuff coming out of client options. if (p.getX() < 0 @@ -621,15 +682,9 @@ public final class Canvas extends JDesktopPane { Point p = new Point(x, y); todo.add(p); - List allComponents = new ArrayList<>(); - for (Component c : this.getComponents()) { - if (c instanceof GrayLayer || !c.isValid()) { - // GrayLayer always intersects and blocks early - // dialogs like FF-selection - continue; - } - allComponents.add(c); - } + List allComponents = Arrays.stream(this.getComponents()) + .filter(c -> !(c instanceof GrayLayer) && c.isValid()) + .collect(Collectors.toList()); for (FreeColDialog fcd : dialogs) allComponents.add(fcd); // Find the position with the least overlap @@ -731,13 +786,13 @@ public final class Canvas extends JDesktopPane { } /** - * Given a tile to be made visible, determine a position to popup + * Make a tile visible, then determine corresponding position to popup * a panel. * * @param tile A Tile to be made visible. * @return A PopupPosition for a panel to be displayed. */ - private PopupPosition getPopupPosition(Tile tile) { + private PopupPosition setOffsetFocus(Tile tile) { if (tile == null) return PopupPosition.CENTERED; int where = mapViewer.setOffsetFocus(tile); return (where > 0) ? PopupPosition.CENTERED_LEFT @@ -795,6 +850,21 @@ public final class Canvas extends JDesktopPane { } } + /** + * Initialize the file filters to filter for saved games. + * + * @return File filters for the FreeCol save game extension. + */ + private FileFilter[] getFileFilters() { + if (fileFilters == null) { + String s = Messages.message("filter.savedGames"); + fileFilters = new FileFilter[] { + new FileNameExtensionFilter(s, FreeCol.FREECOL_SAVE_EXTENSION) + }; + } + return fileFilters; + } + /** * A component is closing. Some components need position and size * to be saved. @@ -893,6 +963,7 @@ public final class Canvas extends JDesktopPane { * for the presence of other dialogs. */ private void restartBlinking() { + if (mapViewer.getViewMode() != GUI.MOVE_UNITS_MODE) return; for (FreeColDialog f : dialogs) { if (f.isModal()) return; } @@ -903,7 +974,6 @@ public final class Canvas extends JDesktopPane { * Stop blinking on the map. */ private void stopBlinking() { - if (gui.getViewMode() != GUI.MOVE_UNITS_MODE) return; mapViewer.stopBlinking(); } @@ -935,7 +1005,7 @@ public final class Canvas extends JDesktopPane { */ private void showFreeColPanel(FreeColPanel panel, Tile tile, boolean resizable) { - showSubPanel(panel, getPopupPosition(tile), resizable); + showSubPanel(panel, setOffsetFocus(tile), resizable); } /** @@ -986,8 +1056,7 @@ public final class Canvas extends JDesktopPane { */ public void add(Component comp, Integer i) { addToCanvas(comp, i); - updateMenuBar(); - freeColClient.updateActions(); + gui.updateMenuBar(); } /** @@ -1095,12 +1164,9 @@ public final class Canvas extends JDesktopPane { T ret = type.cast(c2); if (ret != null) { final JInternalFrame jif = (JInternalFrame)c1; - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - jif.toFront(); - jif.repaint(); - } + SwingUtilities.invokeLater(() -> { + jif.toFront(); + jif.repaint(); }); return ret; } @@ -1288,16 +1354,14 @@ public final class Canvas extends JDesktopPane { // inGame. (Retrieve value of GUI::inGame.) If GUI thinks // we're still in the game then log an error because at this // point the GUI should have been informed. - closeMenus(); removeInGameComponents(); showMainPanel(null); repaint(); } void setupMouseListeners() { - addMouseListener(new CanvasMouseListener(freeColClient, this, - mapViewer)); - addMouseMotionListener(new CanvasMouseMotionListener(freeColClient, this, mapViewer)); + addMouseListener(new CanvasMouseListener(freeColClient, this)); + addMouseMotionListener(new CanvasMouseMotionListener(freeColClient, this)); } /** @@ -1407,10 +1471,8 @@ public final class Canvas extends JDesktopPane { @Override public void remove(Component comp) { removeFromCanvas(comp); - final boolean takeFocus = (comp != statusPanel); - updateMenuBar(); - freeColClient.updateActions(); - if (takeFocus && !isShowingSubPanel()) { + gui.updateMenuBar(); + if (comp != statusPanel && !isShowingSubPanel()) { requestFocus(); } } @@ -1444,9 +1506,8 @@ public final class Canvas extends JDesktopPane { // Dialog display /** - * Displays a dialog with text and a choice of options. + * Displays a modal dialog with text and a choice of options. * - * @param modal True if this dialog should be modal. * @param tile An optional Tile to make visible (not * under the dialog!) * @param obj An object that explains the choice for the user. @@ -1457,19 +1518,17 @@ public final class Canvas extends JDesktopPane { * @return The corresponding member of the values array to the selected * option. */ - T showChoiceDialog(boolean modal, Tile tile, Object obj, - ImageIcon icon, String cancelKey, - List> choices) { + T showChoiceDialog(Tile tile, Object obj, ImageIcon icon, + String cancelKey, List> choices) { FreeColChoiceDialog fcd - = new FreeColChoiceDialog<>(freeColClient, frame, modal, obj, icon, + = new FreeColChoiceDialog<>(freeColClient, frame, true, obj, icon, cancelKey, choices); return showFreeColDialog(fcd, tile); } /** - * Displays a dialog with a text and a ok/cancel option. + * Displays a modal dialog with a text and a ok/cancel option. * - * @param modal True if this dialog should be modal. * @param tile An optional Tile to make visible (not * under the dialog!) * @param obj An object that explains the choice for the user. @@ -1478,19 +1537,17 @@ public final class Canvas extends JDesktopPane { * @param cancelKey The text displayed on the "cancel"-button. * @return True if the user clicked the "ok"-button. */ - boolean showConfirmDialog(boolean modal, Tile tile, - Object obj, ImageIcon icon, - String okKey, String cancelKey) { + boolean showConfirmDialog(Tile tile, Object obj, ImageIcon icon, + String okKey, String cancelKey) { FreeColConfirmDialog fcd - = new FreeColConfirmDialog(freeColClient, frame, modal, obj, icon, + = new FreeColConfirmDialog(freeColClient, frame, true, obj, icon, okKey, cancelKey); return showFreeColDialog(fcd, tile); } /** - * Displays a dialog with a text field and a ok/cancel option. + * Displays a modal dialog with a text field and a ok/cancel option. * - * @param modal True if this dialog should be modal. * @param tile An optional tile to make visible (not under the dialog). * @param template A StringTemplate that explains the * action to the user. @@ -1499,11 +1556,11 @@ public final class Canvas extends JDesktopPane { * @param cancelKey A key displayed on the optional "cancel"-button. * @return The text the user entered, or null if cancelled. */ - String showInputDialog(boolean modal, Tile tile, - StringTemplate template, String defaultValue, - String okKey, String cancelKey) { + String showInputDialog(Tile tile, StringTemplate template, + String defaultValue, + String okKey, String cancelKey) { FreeColStringInputDialog fcd - = new FreeColStringInputDialog(freeColClient, frame, modal, + = new FreeColStringInputDialog(freeColClient, frame, true, Messages.message(template), defaultValue, okKey, cancelKey); return showFreeColDialog(fcd, tile); @@ -1518,9 +1575,25 @@ public final class Canvas extends JDesktopPane { */ private void viewFreeColDialog(final FreeColDialog freeColDialog, Tile tile) { - freeColDialog.setLocation(chooseLocation(freeColDialog, - freeColDialog.getWidth(), freeColDialog.getHeight(), - getPopupPosition(tile))); + PopupPosition pp = setOffsetFocus(tile); + + // TODO: Remove compatibility code when all non-modal dialogs + // have been converted into panels. + if(!freeColDialog.isModal()) { + int canvasWidth = getWidth(); + int dialogWidth = freeColDialog.getWidth(); + if(dialogWidth*2 <= canvasWidth) { + Point location = freeColDialog.getLocation(); + if(pp == PopupPosition.CENTERED_LEFT) { + freeColDialog.setLocation(location.x - canvasWidth/4, + location.y); + } else if(pp == PopupPosition.CENTERED_RIGHT) { + freeColDialog.setLocation(location.x + canvasWidth/4, + location.y); + } + } + } + dialogAdd(freeColDialog); if (freeColDialog.isModal()) stopBlinking(); freeColDialog.requestFocus(); @@ -1577,7 +1650,7 @@ public final class Canvas extends JDesktopPane { * @param handler A DialogHandler for the dialog response. */ void showCaptureGoodsDialog(Unit unit, List gl, - DialogHandler> handler) { + DialogHandler> handler) { SwingUtilities.invokeLater( new DialogCallback<>( new CaptureGoodsDialog(freeColClient, frame, unit, gl), @@ -1602,7 +1675,7 @@ public final class Canvas extends JDesktopPane { * @param handler A DialogHandler for the dialog response. */ void showChooseFoundingFatherDialog(List ffs, - DialogHandler handler) { + DialogHandler handler) { SwingUtilities.invokeLater( new DialogCallback<>( new ChooseFoundingFatherDialog(freeColClient, frame, ffs), @@ -1622,12 +1695,6 @@ public final class Canvas extends JDesktopPane { group = showFreeColDialog(dialog, null); } finally { clientOptionsDialogShowing = false; - if (group != null) { - freeColClient.updateActions(); - resetMenuBar(); - // Immediately redraw the minimap if that was updated. - gui.updateMapControls(); - } } return group; } @@ -1718,30 +1785,18 @@ public final class Canvas extends JDesktopPane { PopupPosition.CENTERED, false); } - /** - * Display the difficulty dialog. - * - * @return The resulting OptionGroup. - */ - OptionGroup showDifficultyDialog() { - Game game = freeColClient.getGame(); - Specification spec = game.getSpecification(); - return showFreeColDialog(new DifficultyDialog(freeColClient, frame, spec, - spec.getDifficultyOptionGroup(), false), - null); - } - /** * Display the difficulty dialog for a given group. * * @param spec The enclosing Specification. * @param group The OptionGroup containing the difficulty. + * @param editable If the options should be editable. * @return The resulting OptionGroup. */ OptionGroup showDifficultyDialog(Specification spec, - OptionGroup group) { - return showFreeColDialog(new DifficultyDialog(freeColClient, frame, spec, - group, group.isEditable()), + OptionGroup group, boolean editable) { + return showFreeColDialog(new DifficultyDialog(freeColClient, frame, + spec, group, editable), null); } @@ -1751,8 +1806,7 @@ public final class Canvas extends JDesktopPane { * @param unit The Unit that is dumping. * @param handler A DialogHandler for the dialog response. */ - void showDumpCargoDialog(Unit unit, - DialogHandler> handler) { + void showDumpCargoDialog(Unit unit, DialogHandler> handler) { SwingUtilities.invokeLater( new DialogCallback<>( new DumpCargoDialog(freeColClient, frame, unit), @@ -1790,7 +1844,7 @@ public final class Canvas extends JDesktopPane { * @param handler A DialogHandler for the dialog response. */ void showEmigrationDialog(Player player, boolean fountainOfYouth, - DialogHandler handler) { + DialogHandler handler) { SwingUtilities.invokeLater( new DialogCallback<>( new EmigrationDialog(freeColClient, frame, player.getEurope(), @@ -1848,13 +1902,8 @@ public final class Canvas extends JDesktopPane { if (freeColClient.getGame() == null) return; EuropePanel panel = getExistingFreeColPanel(EuropePanel.class); if (panel == null) { - panel = new EuropePanel(freeColClient, this); - panel.addClosingCallback(new Runnable() { - @Override - public void run() { - removeEuropeanSubpanels(); - } - }); + panel = new EuropePanel(freeColClient, (getHeight() > 780)); + panel.addClosingCallback(() -> { removeEuropeanSubpanels(); }); showSubPanel(panel, true); } } @@ -1892,8 +1941,8 @@ public final class Canvas extends JDesktopPane { * @param handler A DialogHandler for the dialog response. */ void showFirstContactDialog(Player player, Player other, - Tile tile, int settlementCount, - DialogHandler handler) { + Tile tile, int settlementCount, + DialogHandler handler) { SwingUtilities.invokeLater( new DialogCallback<>( new FirstContactDialog(freeColClient, frame, player, other, tile, @@ -1950,6 +1999,28 @@ public final class Canvas extends JDesktopPane { showFreeColPanel(panel, indianSettlement.getTile(), true); } + /** + * Make image icon from an image. + * Use only if you know having null is possible! + * + * @param image The Image to create an icon for. + * @return The ImageIcon. + */ + private static ImageIcon createImageIcon(Image image) { + return (image==null) ? null : new ImageIcon(image); + } + + /** + * Make image icon from an object. + * + * @param display The FreeColObject to find an icon for. + * @return The ImageIcon found. + */ + private ImageIcon createObjectImageIcon(FreeColObject display) { + return (display == null) ? null + : createImageIcon(gui.getImageLibrary().getObjectImage(display, 2f)); + } + /** * Shows a message with some information and an "OK"-button. * @@ -1961,7 +2032,7 @@ public final class Canvas extends JDesktopPane { ImageIcon icon = null; Tile tile = null; if(displayObject != null) { - icon = gui.createObjectImageIcon(displayObject); + icon = createObjectImageIcon(displayObject); tile = (displayObject instanceof Location) ? ((Location)displayObject).getTile() : null; @@ -1990,32 +2061,15 @@ public final class Canvas extends JDesktopPane { * Displays a dialog where the user may choose a file. * * @param directory The directory containing the files. + * @param filters The file filters which the user can select in the dialog. * @return The selected File. */ - File showLoadDialog(File directory) { - if (fileFilters == null) { - fileFilters = new FileFilter[] { - FreeColFileFilter.freeColSaveDirectoryFilter, - }; - } - return showFreeColDialog(new LoadDialog(freeColClient, frame, directory, - fileFilters), - null); - } - - /** - * Displays a dialog where the user may choose a file. - * - * @param directory The directory containing the files. - * @param fileFilters The file filters which the user can select in the - * dialog. - * @return The selected File. - */ - File showLoadDialog(File directory, FileFilter[] fileFilters) { + File showLoadDialog(File directory, FileFilter[] filters) { + if (filters == null) filters = getFileFilters(); File response = null; for (;;) { response = showFreeColDialog(new LoadDialog(freeColClient, frame, - directory, fileFilters), + directory, filters), null); if (response == null || response.isFile()) break; showErrorMessage("error.noSuchFile"); @@ -2055,7 +2109,7 @@ public final class Canvas extends JDesktopPane { */ void showMainPanel(String userMsg) { closeMenus(); - frame.setJMenuBar(null); + frame.removeMenuBar(); mainPanel = new MainPanel(freeColClient); addCentered(mainPanel, JLayeredPane.DEFAULT_LAYER); if (userMsg != null) gui.showInformationMessage(userMsg); @@ -2110,7 +2164,7 @@ public final class Canvas extends JDesktopPane { ModelMessage m = messages.get(i); texts[i] = Messages.message(m); fcos[i] = game.getMessageSource(m); - icons[i] = gui.createObjectImageIcon(game.getMessageDisplay(m)); + icons[i] = createObjectImageIcon(game.getMessageDisplay(m)); if (tile == null && fcos[i] instanceof Location) { tile = ((Location)fcos[i]).getTile(); } @@ -2131,8 +2185,8 @@ public final class Canvas extends JDesktopPane { * @param handler A DialogHandler for the dialog response. */ void showMonarchDialog(MonarchAction action, - StringTemplate template, String monarchKey, - DialogHandler handler) { + StringTemplate template, String monarchKey, + DialogHandler handler) { SwingUtilities.invokeLater( new DialogCallback<>( new MonarchDialog(freeColClient, frame, action, template, monarchKey), @@ -2140,36 +2194,16 @@ public final class Canvas extends JDesktopPane { } /** - * Display a dialog to set a new land name. - * - * @param key A key for the message to explain the dialog. - * @param defaultName The default name for the new land. - * @param unit The Unit discovering the new land. - * @param handler A DialogHandler for the dialog response. - */ - void showNameNewLandDialog(String key, String defaultName, - Unit unit, - DialogHandler handler) { - SwingUtilities.invokeLater( - new DialogCallback<>( - new FreeColStringInputDialog(freeColClient, frame, false, - Messages.message(key), - defaultName, "ok", null), - unit.getTile(), handler)); - } - - /** - * Display a dialog to set a new region name. + * Display a dialog to set a new name for something. * * @param template A StringTemplate for the message * to explain the dialog. - * @param defaultName The default name for the new region. - * @param unit The Unit discovering the new region. + * @param defaultName The default name. + * @param unit The Unit discovering it. * @param handler A DialogHandler for the dialog response. */ - void showNameNewRegionDialog(StringTemplate template, - String defaultName, Unit unit, - DialogHandler handler) { + void showNamingDialog(StringTemplate template, String defaultName, + Unit unit, DialogHandler handler) { SwingUtilities.invokeLater( new DialogCallback<>( new FreeColStringInputDialog(freeColClient, frame, false, @@ -2203,14 +2237,7 @@ public final class Canvas extends JDesktopPane { } /** - * Display the NewPanel. - */ - void showNewPanel() { - showSubPanel(new NewPanel(freeColClient), false); - } - - /** - * Display the NewPanel for a given specification. + * Display the NewPanel for a given optional specification. * * @param specification The Specification to use. */ @@ -2312,35 +2339,15 @@ public final class Canvas extends JDesktopPane { * * @param directory The directory containing the files in which * the user may overwrite. + * @param filters The available file filters in the dialog. * @param defaultName Default filename for the savegame. * @return The selected File. */ - File showSaveDialog(File directory, String defaultName) { - if (fileFilters == null) { - fileFilters = new FileFilter[] { - FreeColFileFilter.freeColSaveDirectoryFilter, - }; - } - return showSaveDialog(directory, fileFilters, defaultName, - FreeCol.FREECOL_SAVE_EXTENSION); - } - - /** - * Displays a dialog where the user may choose a filename. - * - * @param directory The directory containing the files in which - * the user may overwrite. - * @param fileFilters The available file filters in the dialog. - * @param defaultName Default filename for the savegame. - * @param extension This extension will be added to the specified - * filename (if not added by the user). - * @return The selected File. - */ - File showSaveDialog(File directory, FileFilter[] fileFilters, - String defaultName, String extension) { + public File showSaveDialog(File directory, FileFilter[] filters, + String defaultName) { + if (filters == null) filters = getFileFilters(); return showFreeColDialog(new SaveDialog(freeColClient, frame, directory, - fileFilters, defaultName, - extension), + filters, defaultName), null); } @@ -2496,7 +2503,7 @@ public final class Canvas extends JDesktopPane { void showTilePopup(Tile tile, int x, int y) { if (tile == null) return; - TilePopup tp = new TilePopup(freeColClient, mapViewer, tile); + TilePopup tp = new TilePopup(freeColClient, this, tile); if (tp.hasItem()) { tp.show(this, x, y); tp.repaint(); @@ -2606,9 +2613,9 @@ public final class Canvas extends JDesktopPane { } catch (Exception e) { compact = false; } - ReportPanel r - = getExistingFreeColPanel((compact) ? ReportCompactColonyPanel.class - : ReportClassicColonyPanel.class); + ReportPanel r = (compact) + ? getExistingFreeColPanel(ReportCompactColonyPanel.class) + : getExistingFreeColPanel(ReportClassicColonyPanel.class); if (r == null) { showSubPanel((compact) ? new ReportCompactColonyPanel(freeColClient) diff --git a/src/net/sf/freecol/client/gui/CanvasMapEditorMouseListener.java b/src/net/sf/freecol/client/gui/CanvasMapEditorMouseListener.java index 2282600fb..4a3ed2b12 100644 --- a/src/net/sf/freecol/client/gui/CanvasMapEditorMouseListener.java +++ b/src/net/sf/freecol/client/gui/CanvasMapEditorMouseListener.java @@ -32,8 +32,8 @@ import javax.swing.JComponent; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.control.MapEditorController; -import net.sf.freecol.client.gui.panel.RiverStyleDialog; import net.sf.freecol.client.gui.panel.MapEditorTransformPanel.TileTypeTransform; +import net.sf.freecol.client.gui.panel.RiverStyleDialog; import net.sf.freecol.common.model.Map; import net.sf.freecol.common.model.Tile; import net.sf.freecol.common.model.TileImprovement; @@ -48,8 +48,6 @@ public final class CanvasMapEditorMouseListener extends AbstractCanvasListener private static final Logger logger = Logger.getLogger(CanvasMapEditorMouseListener.class.getName()); - private final Canvas canvas; - private Point endPoint; private Point startPoint; @@ -59,10 +57,8 @@ public final class CanvasMapEditorMouseListener extends AbstractCanvasListener * * @param canvas The component this object gets created for. */ - public CanvasMapEditorMouseListener(FreeColClient freeColClient, Canvas canvas, MapViewer mapViewer) { - super(freeColClient, mapViewer); - - this.canvas = canvas; + public CanvasMapEditorMouseListener(FreeColClient freeColClient, Canvas canvas) { + super(freeColClient, canvas); } @@ -93,10 +89,9 @@ public final class CanvasMapEditorMouseListener extends AbstractCanvasListener */ private void drawBox(JComponent component, Point startPoint, Point endPoint) { - final MapEditorController controller; if (startPoint == null || endPoint == null || startPoint.distance(endPoint) == 0 - || (controller = freeColClient.getMapEditorController()) == null) + || freeColClient.getMapEditorController() == null) return; Graphics2D graphics = (Graphics2D)component.getGraphics(); @@ -120,7 +115,7 @@ public final class CanvasMapEditorMouseListener extends AbstractCanvasListener try { if (e.getClickCount() > 1) { - mapViewer.convertToMapTile(e.getX(), e.getY()); + canvas.convertToMapTile(e.getX(), e.getY()); } else { canvas.requestFocus(); } @@ -138,8 +133,8 @@ public final class CanvasMapEditorMouseListener extends AbstractCanvasListener try { if (e.getButton() == MouseEvent.BUTTON1) { - Tile tile = mapViewer.convertToMapTile(e.getX(), e.getY()); - if (tile != null) getGUI().setSelectedTile(tile, false); + Tile tile = canvas.convertToMapTile(e.getX(), e.getY()); + if (tile != null) getGUI().setSelectedTile(tile); startPoint = endPoint = null; } else if (e.getButton() == MouseEvent.BUTTON2) { @@ -150,7 +145,7 @@ public final class CanvasMapEditorMouseListener extends AbstractCanvasListener } else if (e.getButton() == MouseEvent.BUTTON3 || e.isPopupTrigger()) { startPoint = e.getPoint(); - Tile tile = mapViewer.convertToMapTile(e.getX(), e.getY()); + Tile tile = canvas.convertToMapTile(e.getX(), e.getY()); if (tile != null) { if (tile.hasRiver()) { TileImprovement river = tile.getRiver(); @@ -167,7 +162,7 @@ public final class CanvasMapEditorMouseListener extends AbstractCanvasListener canvas.showEditSettlementDialog(tile.getIndianSettlement()); } } else { - getGUI().setSelectedTile(null, false); + getGUI().setSelectedTile(null); } } } catch (Exception ex) { @@ -191,9 +186,9 @@ public final class CanvasMapEditorMouseListener extends AbstractCanvasListener endPoint = e.getPoint(); if (startPoint == null) startPoint = endPoint; drawBox(component, startPoint, endPoint); - Tile start = mapViewer.convertToMapTile(startPoint.x, startPoint.y); + Tile start = canvas.convertToMapTile(startPoint.x, startPoint.y); Tile end = (startPoint == endPoint) ? start - : mapViewer.convertToMapTile(endPoint.x, endPoint.y); + : canvas.convertToMapTile(endPoint.x, endPoint.y); // edit 2 more conditions in if statement. we need to // check for coordinator of X and Y if (x,y) outside of diff --git a/src/net/sf/freecol/client/gui/CanvasMouseListener.java b/src/net/sf/freecol/client/gui/CanvasMouseListener.java index b471742d0..0772ead8c 100644 --- a/src/net/sf/freecol/client/gui/CanvasMouseListener.java +++ b/src/net/sf/freecol/client/gui/CanvasMouseListener.java @@ -49,8 +49,6 @@ public final class CanvasMouseListener implements ActionListener, MouseListener private final Canvas canvas; - private final MapViewer mapViewer; - private final Timer doubleClickTimer = new Timer(doubleClickDelay,this); private int centerX, centerY; @@ -61,14 +59,10 @@ public final class CanvasMouseListener implements ActionListener, MouseListener * * @param freeColClient The enclosing FreeColClient. * @param canvas The component this object gets created for. - * @param mapViewer The GUI that holds information such as screen - * resolution. */ - public CanvasMouseListener(FreeColClient freeColClient, Canvas canvas, - MapViewer mapViewer) { + public CanvasMouseListener(FreeColClient freeColClient, Canvas canvas) { this.freeColClient = freeColClient; this.canvas = canvas; - this.mapViewer = mapViewer; } /** @@ -80,7 +74,7 @@ public final class CanvasMouseListener implements ActionListener, MouseListener public void mouseClicked(MouseEvent e) { try { if (e.getClickCount() > 1) { - Tile tile = mapViewer.convertToMapTile(e.getX(), e.getY()); + Tile tile = canvas.convertToMapTile(e.getX(), e.getY()); Colony colony = tile.getColony(); if (colony != null) { if (FreeColDebugger.isInDebugMode(FreeColDebugger.DebugMode.MENUS)) { @@ -128,19 +122,19 @@ public final class CanvasMouseListener implements ActionListener, MouseListener int me = e.getButton(); if (e.isPopupTrigger()) me = MouseEvent.BUTTON3; - Tile tile = mapViewer.convertToMapTile(e.getX(), e.getY()); + Tile tile = canvas.convertToMapTile(e.getX(), e.getY()); switch (me) { case MouseEvent.BUTTON1: // Record initial click point for purposes of dragging - mapViewer.setDragPoint(e.getX(), e.getY()); + canvas.setDragPoint(e.getX(), e.getY()); if (canvas.isGotoStarted()) { PathNode path = canvas.getGotoPath(); if (path != null) { canvas.stopGoto(); // Move the unit freeColClient.getInGameController() - .goToTile(mapViewer.getActiveUnit(), + .goToTile(canvas.getActiveUnit(), path.getLastNode().getTile()); } } else if (doubleClickTimer.isRunning()) { @@ -154,7 +148,7 @@ public final class CanvasMouseListener implements ActionListener, MouseListener break; case MouseEvent.BUTTON2: if (tile != null) { - Unit unit = mapViewer.getActiveUnit(); + Unit unit = canvas.getActiveUnit(); if (unit != null && unit.getTile() != tile) { PathNode dragPath = unit.findPath(tile); canvas.startGoto(); @@ -185,7 +179,7 @@ public final class CanvasMouseListener implements ActionListener, MouseListener canvas.stopGoto(); freeColClient.getInGameController() - .goToTile(mapViewer.getActiveUnit(), + .goToTile(canvas.getActiveUnit(), temp.getLastNode().getTile()); } else if (canvas.isGotoStarted()) { @@ -203,9 +197,22 @@ public final class CanvasMouseListener implements ActionListener, MouseListener * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { doubleClickTimer.stop(); - mapViewer.setSelectedTile(mapViewer.convertToMapTile(centerX, centerY), - true); + Tile tile=canvas.convertToMapTile(centerX, centerY); + if(canvas.getViewMode() == GUI.MOVE_UNITS_MODE) { + // Clear goto order when active unit is on the tile + Unit unit=canvas.getActiveUnit(); + if(unit != null && unit.getTile() == tile) { + freeColClient.getInGameController().clearGotoOrders(unit); + canvas.updateCurrentPathForActiveUnit(); + } else { + if (tile != null && tile.hasSettlement()) { + freeColClient.getGUI().showSettlement(tile.getSettlement()); + return; + } + } + } + freeColClient.getGUI().setSelectedTile(tile); } } diff --git a/src/net/sf/freecol/client/gui/CanvasMouseMotionListener.java b/src/net/sf/freecol/client/gui/CanvasMouseMotionListener.java index 17da95866..ff1718b4d 100644 --- a/src/net/sf/freecol/client/gui/CanvasMouseMotionListener.java +++ b/src/net/sf/freecol/client/gui/CanvasMouseMotionListener.java @@ -19,6 +19,7 @@ package net.sf.freecol.client.gui; +import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.util.logging.Logger; @@ -40,8 +41,6 @@ public final class CanvasMouseMotionListener extends AbstractCanvasListener /** Number of pixels that must be moved before a goto is enabled. */ private static final int DRAG_THRESHOLD = 16; - private Canvas canvas; - /** * Temporary variable for checking if we need to recalculate the * path when dragging units. @@ -54,9 +53,8 @@ public final class CanvasMouseMotionListener extends AbstractCanvasListener * * @param freeColClient The FreeColClient for the game. */ - public CanvasMouseMotionListener(FreeColClient freeColClient, Canvas canvas, MapViewer mapViewer) { - super(freeColClient, mapViewer); - this.canvas = canvas; + public CanvasMouseMotionListener(FreeColClient freeColClient, Canvas canvas) { + super(freeColClient, canvas); } @@ -72,15 +70,15 @@ public final class CanvasMouseMotionListener extends AbstractCanvasListener } if (canvas.isGotoStarted()) { - if (mapViewer.getActiveUnit() == null) { + if (canvas.getActiveUnit() == null) { canvas.stopGoto(); } - Tile tile = mapViewer.convertToMapTile(e.getX(), e.getY()); + Tile tile = canvas.convertToMapTile(e.getX(), e.getY()); if (tile != null) { if (lastTile != tile) { - Unit active = mapViewer.getActiveUnit(); + Unit active = canvas.getActiveUnit(); lastTile = tile; if (active != null && active.getTile() != tile) { PathNode dragPath = active.findPath(tile); @@ -103,13 +101,13 @@ public final class CanvasMouseMotionListener extends AbstractCanvasListener performDragScrollIfActive(e); - Tile tile = mapViewer.convertToMapTile(e.getX(), e.getY()); + Tile tile = canvas.convertToMapTile(e.getX(), e.getY()); if (tile != null && ((e.getModifiers() & MouseEvent.BUTTON1_MASK) == MouseEvent.BUTTON1_MASK)) { // only perform the goto for the left mouse button if (canvas.isGotoStarted()) { - Unit active = mapViewer.getActiveUnit(); + Unit active = canvas.getActiveUnit(); if (active == null) { canvas.stopGoto(); } else if (lastTile != tile) { @@ -119,8 +117,9 @@ public final class CanvasMouseMotionListener extends AbstractCanvasListener } } else { // Only start a goto if the drag is 16 pixels or more - int deltaX = Math.abs(e.getX() - mapViewer.getDragPoint().x); - int deltaY = Math.abs(e.getY() - mapViewer.getDragPoint().y); + Point dragPoint = canvas.getDragPoint(); + int deltaX = Math.abs(e.getX() - dragPoint.x); + int deltaY = Math.abs(e.getY() - dragPoint.y); if (deltaX >= DRAG_THRESHOLD || deltaY >= DRAG_THRESHOLD) { canvas.startGoto(); } diff --git a/src/net/sf/freecol/client/gui/ChatDisplay.java b/src/net/sf/freecol/client/gui/ChatDisplay.java index fbf0e86f4..32d1dc77f 100644 --- a/src/net/sf/freecol/client/gui/ChatDisplay.java +++ b/src/net/sf/freecol/client/gui/ChatDisplay.java @@ -93,7 +93,7 @@ public class ChatDisplay { if (getMessageCount() > 0) { // Don't edit the list of messages while I'm drawing them. Font font = FontLibrary.createFont(FontLibrary.FontType.NORMAL, - FontLibrary.FontSize.TINY, lib.getScalingFactor()); + FontLibrary.FontSize.TINY, lib.getScaleFactor()); GUIMessage message = getMessage(0); Image si = lib.getStringImage( g, message.getMessage(), message.getColor(), font); diff --git a/src/net/sf/freecol/client/gui/panel/ChoiceItem.java b/src/net/sf/freecol/client/gui/ChoiceItem.java similarity index 99% rename from src/net/sf/freecol/client/gui/panel/ChoiceItem.java rename to src/net/sf/freecol/client/gui/ChoiceItem.java index e09628f6f..725232dbc 100644 --- a/src/net/sf/freecol/client/gui/panel/ChoiceItem.java +++ b/src/net/sf/freecol/client/gui/ChoiceItem.java @@ -17,7 +17,7 @@ * along with FreeCol. If not, see . */ -package net.sf.freecol.client.gui.panel; +package net.sf.freecol.client.gui; import javax.swing.ImageIcon; diff --git a/src/net/sf/freecol/client/gui/panel/DialogHandler.java b/src/net/sf/freecol/client/gui/DialogHandler.java similarity index 81% rename from src/net/sf/freecol/client/gui/panel/DialogHandler.java rename to src/net/sf/freecol/client/gui/DialogHandler.java index d9a4a9837..370a17bde 100644 --- a/src/net/sf/freecol/client/gui/panel/DialogHandler.java +++ b/src/net/sf/freecol/client/gui/DialogHandler.java @@ -17,14 +17,14 @@ * along with FreeCol. If not, see . */ -package net.sf.freecol.client.gui.panel; +package net.sf.freecol.client.gui; /** - * The base class for non-modal dialog handlers. + * The interface for non-modal dialog handlers. */ -public abstract class DialogHandler { +public interface DialogHandler { - public abstract void handle(T response); + void handle(T response); }; diff --git a/src/net/sf/freecol/client/gui/FontLibrary.java b/src/net/sf/freecol/client/gui/FontLibrary.java index 163dfe273..ab055c5b0 100644 --- a/src/net/sf/freecol/client/gui/FontLibrary.java +++ b/src/net/sf/freecol/client/gui/FontLibrary.java @@ -137,6 +137,18 @@ public class FontLibrary { return createFont(fontType, fontSize, style, scaleFactor); } + public Font createCompatibleScaledFont(String string, FontType fontType, + FontSize fontSize) { + return createCompatibleFont(string, fontType, fontSize, Font.PLAIN, + scaleFactor); + } + + public Font createCompatibleScaledFont(String string, FontType fontType, + FontSize fontSize, int style) { + return createCompatibleFont(string, fontType, fontSize, style, + scaleFactor); + } + public static Font createFont(FontType fontType, FontSize fontSize) { return createFont(fontType, fontSize, Font.PLAIN, 1f); } @@ -163,6 +175,23 @@ public class FontLibrary { return createFont(fontType, fontSize, Font.PLAIN, scaleFactor); } + public static Font createCompatibleFont(String string, FontType fontType, + FontSize fontSize) { + return createCompatibleFont(string, fontType, fontSize, Font.PLAIN, 1f); + } + + public static Font createCompatibleFont(String string, FontType fontType, + FontSize fontSize, int style) { + return createCompatibleFont(string, fontType, fontSize, style, 1f); + } + + public static Font createCompatibleFont(String string, FontType fontType, + FontSize fontSize, + float scaleFactor) { + return createCompatibleFont(string, fontType, fontSize, Font.PLAIN, + scaleFactor); + } + /** * Create a scaled Font where the scale factor is provided * explicitly in the parameter. @@ -179,19 +208,54 @@ public class FontLibrary { */ public static Font createFont(FontType fontType, FontSize fontSize, int style, float scaleFactor) { - String fontName; - switch(fontType) { - default: - logger.warning("Unknown FontType"); - case NORMAL: - fontName = (mainFont != null) ? null : "normal"; - break; - case SIMPLE: - fontName = "simple"; - break; - case HEADER: - fontName = "header"; + float scaledSize = calcScaledSize(fontSize, scaleFactor); + String fontKey = getFontKey(fontType); + Font font = (fontKey == null) + ? mainFont + : ResourceManager.getFont(fontKey); + font = font.deriveFont(style, scaledSize); + return font; + } + + /** + * Create a scaled Font which can display all characters + * inside the given text string. + * This is mostly necessary for the header font. Thats because the currently + * used ShadowedBlack is missing support for CJK and others. Even some + * special glyphs for European languages like the triple-dot are missing. + * + * @param string The text to find a compatible font for. + * @param fontType How the font should look like. + * @param fontSize Its relative size. + * @param style The font style for choosing plain, bold or italic. + * @param scaleFactor The applied scale factor. + * @return The created Font. + */ + public static Font createCompatibleFont(String string, FontType fontType, + FontSize fontSize, + int style, float scaleFactor) { + // TODO: Consider testing the normal font for compatibility and try + // some or all other available fonts for complete/longest match: + // header/simple->main->normal->simple/header->emergency + float scaledSize = calcScaledSize(fontSize, scaleFactor); + String fontKey = getFontKey(fontType); + Font font = null; + if(fontType != FontType.NORMAL) { + font = ResourceManager.getFont(fontKey); + if(font.canDisplayUpTo(string) != -1) + font = null; } + if(font == null) { + fontKey = getFontKey(FontType.NORMAL); + font = (fontKey == null) + ? mainFont + : ResourceManager.getFont(fontKey); + } + font = font.deriveFont(style, scaledSize); + return font; + } + + private static float calcScaledSize(FontSize fontSize, float scaleFactor) { float pixelSize; switch(fontSize) { default: @@ -211,12 +275,24 @@ public class FontLibrary { case BIG: pixelSize = 48f; } - float scaledSize = pixelSize * scaleFactor; - Font font = (fontName == null) - ? mainFont - : ResourceManager.getFont("font." + fontName); - font = font.deriveFont(style, scaledSize); - return font; + return pixelSize * scaleFactor; + } + + private static String getFontKey(FontType fontType) { + String fontName; + switch(fontType) { + default: + logger.warning("Unknown FontType"); + case NORMAL: + fontName = (mainFont != null) ? null : "font.normal"; + break; + case SIMPLE: + fontName = "font.simple"; + break; + case HEADER: + fontName = "font.header"; + } + return fontName; } } diff --git a/src/net/sf/freecol/client/gui/FreeColFrame.java b/src/net/sf/freecol/client/gui/FreeColFrame.java index 05faf10b6..95f2d622c 100644 --- a/src/net/sf/freecol/client/gui/FreeColFrame.java +++ b/src/net/sf/freecol/client/gui/FreeColFrame.java @@ -20,10 +20,13 @@ package net.sf.freecol.client.gui; import java.awt.Dimension; +import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.Insets; import java.awt.Rectangle; import java.awt.Toolkit; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; import java.util.logging.Level; import java.util.logging.Logger; @@ -32,11 +35,15 @@ import javax.swing.JMenuBar; import net.sf.freecol.FreeCol; import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.menu.FreeColMenuBar; +import net.sf.freecol.client.gui.menu.InGameMenuBar; +import net.sf.freecol.client.gui.menu.MapEditorMenuBar; +import net.sf.freecol.client.gui.menu.MenuMouseMotionListener; import net.sf.freecol.common.resources.ResourceManager; /** - * The base frame for FreeCol panels. + * The base frame for FreeCol. */ public class FreeColFrame extends JFrame { @@ -45,6 +52,9 @@ public class FreeColFrame extends JFrame { /** The FreeCol client controlling the frame. */ protected final FreeColClient freeColClient; + /** The Canvas contained inside the frame. */ + protected final Canvas canvas; + /** * Create a new main frame. @@ -62,6 +72,7 @@ public class FreeColFrame extends JFrame { super(getFrameName(), gd.getDefaultConfiguration()); this.freeColClient = freeColClient; + this.canvas = canvas; setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); if(windowed) { setResizable(true); @@ -73,7 +84,7 @@ public class FreeColFrame extends JFrame { addWindowListener(windowed ? new WindowedFrameListener(freeColClient) : new FullScreenFrameListener(freeColClient, this)); - setCanvas(canvas); + setCanvas(); setIconImage(ResourceManager.getImage("image.miscicon.FrameIcon")); pack(); // necessary for getInsets @@ -88,15 +99,60 @@ public class FreeColFrame extends JFrame { if (windowed) { Insets screenInsets = Toolkit.getDefaultToolkit() .getScreenInsets(gd.getDefaultConfiguration()); - bounds = new Rectangle(0, 0, - bounds.width - (bounds.x+screenInsets.left+screenInsets.right), - bounds.height - (bounds.y+screenInsets.top+screenInsets.bottom)); + bounds = new Rectangle( + bounds.x + screenInsets.left, + bounds.y + screenInsets.top, + bounds.width - screenInsets.right, + bounds.height - screenInsets.bottom); } } setBounds(bounds); logger.info("Frame created in size " + bounds.width + "x" + bounds.height); + if (windowed) { + addComponentListener(new ComponentAdapter() { + @Override + public void componentResized(ComponentEvent e) { + logger.info("Window size changes to " + getSize()); + } + }); + } } + public void exitFullScreen() { + GraphicsConfiguration GraphicsConf = getGraphicsConfiguration(); + GraphicsDevice gd = GraphicsConf.getDevice(); + gd.setFullScreenWindow(null); + } + + public void setInGameMenuBar() { + setJMenuBar(new InGameMenuBar(freeColClient, + new MenuMouseMotionListener(freeColClient, canvas))); + validate(); + } + + public void setMapEditorMenuBar() { + setJMenuBar(new MapEditorMenuBar(freeColClient, + new MenuMouseMotionListener(freeColClient, canvas))); + } + + public void removeMenuBar() { + setJMenuBar(null); + validate(); + } + + public void resetMenuBar() { + JMenuBar menuBar = getJMenuBar(); + if (menuBar != null) { + ((FreeColMenuBar)menuBar).reset(); + } + } + + public void updateMenuBar() { + JMenuBar menuBar = getJMenuBar(); + if (menuBar != null) { + ((FreeColMenuBar)menuBar).update(); + } + } /** * Get the standard name for the main frame. @@ -110,10 +166,8 @@ public class FreeColFrame extends JFrame { /** * Set the canvas for this frame. - * - * @param canvas The Canvas to use. */ - private void setCanvas(Canvas canvas) { + private void setCanvas() { // This crashes deep in the Java libraries when changing full screen // mode during the opening video // Java version: 1.7.0_45 diff --git a/src/net/sf/freecol/client/gui/GUI.java b/src/net/sf/freecol/client/gui/GUI.java index 0c7a3f6d4..b3cf083b6 100644 --- a/src/net/sf/freecol/client/gui/GUI.java +++ b/src/net/sf/freecol/client/gui/GUI.java @@ -19,41 +19,28 @@ package net.sf.freecol.client.gui; -import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.Point; import java.awt.Rectangle; -import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.File; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Map; +import java.util.logging.Level; import java.util.logging.Logger; -import javax.swing.ImageIcon; -import javax.swing.JLabel; -import javax.swing.filechooser.FileFilter; +import javax.swing.SwingUtilities; import net.sf.freecol.client.ClientOptions; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.control.InGameController; import net.sf.freecol.client.control.InGameController.*; -import net.sf.freecol.client.gui.panel.ChoiceItem; -import net.sf.freecol.client.gui.panel.ColonyPanel; -import net.sf.freecol.client.gui.panel.ColorChooserPanel; -import net.sf.freecol.client.gui.panel.FreeColDialog; -import net.sf.freecol.client.gui.panel.LabourData.UnitData; -import net.sf.freecol.client.gui.panel.LoadingSavegameDialog; import net.sf.freecol.client.gui.panel.MiniMap; import net.sf.freecol.client.gui.panel.Parameters; -import net.sf.freecol.client.gui.panel.TradeRoutePanel; -import net.sf.freecol.client.gui.panel.Utility; import net.sf.freecol.common.FreeColException; -import net.sf.freecol.common.ServerInfo; import net.sf.freecol.common.debug.FreeColDebugger; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.io.FreeColDirectories; @@ -74,9 +61,9 @@ import net.sf.freecol.common.model.IndianSettlement; import net.sf.freecol.common.model.Location; import net.sf.freecol.common.model.ModelMessage; import net.sf.freecol.common.model.Monarch.MonarchAction; +import net.sf.freecol.common.model.Nation; import net.sf.freecol.common.model.NationSummary; import net.sf.freecol.common.model.Player; -import net.sf.freecol.common.model.Region; import net.sf.freecol.common.model.Settlement; import net.sf.freecol.common.model.Specification; import net.sf.freecol.common.model.Stance; @@ -84,9 +71,7 @@ import net.sf.freecol.common.model.StringTemplate; import net.sf.freecol.common.model.Tension; import net.sf.freecol.common.model.Tile; import net.sf.freecol.common.model.TradeRoute; -import net.sf.freecol.common.model.TypeCountMap; import net.sf.freecol.common.model.Unit; -import net.sf.freecol.common.model.UnitType; import net.sf.freecol.common.option.Option; import net.sf.freecol.common.option.OptionGroup; import net.sf.freecol.common.resources.ResourceManager; @@ -133,18 +118,10 @@ public class GUI { return freeColClient.getInGameController(); } - public Canvas getCanvas() { - return null; - } - public ImageLibrary getImageLibrary() { return imageLibrary; } - public MapViewer getColonyTileMapViewer() { - return null; - } - public boolean isWindowed() { return true; } @@ -183,9 +160,9 @@ public class GUI { /** * Display the splash screen. * - * @param splashFilename The name of the file to find the image in. + * @param splashStream A stream to find the image in. */ - public void displaySplashScreen(final String splashFilename) { + public void displaySplashScreen(final InputStream splashStream) { } /** @@ -213,11 +190,8 @@ public class GUI { /** * Change the windowed mode. - * - * @param windowed Use true for windowed mode - * and false for fullscreen mode. */ - public void changeWindowedMode(boolean windowed) { + public void changeWindowedMode() { } /** @@ -241,43 +215,13 @@ public class GUI { public void clearGotoPath() { } - /** - * Make image icon from an image. - * Use only if you know having null is possible! - * - * @param image The Image to create an icon for. - * @return The ImageIcon. - */ - public static ImageIcon createImageIcon(Image image) { - return (image==null) ? null : new ImageIcon(image); - } - - public ImageIcon createUnitImageIcon(Unit unit) { - return new ImageIcon(imageLibrary.getUnitImage(unit)); - } - - public ImageIcon createSettlementImageIcon(Settlement settlement) { - return new ImageIcon(imageLibrary.getSettlementImage(settlement)); - } - - public ImageIcon createGoodsImageIcon(GoodsType goodsType) { - return new ImageIcon(imageLibrary.getIconImage(goodsType)); - } - - /** - * Make image icon from an object. - * - * @param display The FreeColObject to find an icon for. - * @return The ImageIcon found. - */ - protected ImageIcon createObjectImageIcon(FreeColObject display) { - return (display == null) ? null - : createImageIcon(imageLibrary.getObjectImage(display, 2f)); - } - /** * Create a thumbnail for the minimap. * + * FIXME: Delete all code inside this method and replace it with + * sensible code directly drawing in necessary size, + * without creating a throwaway GUI panel, drawing in wrong + * size and immediately resizing. * @return The created image. */ public BufferedImage createMiniMapThumbNail() { @@ -293,8 +237,6 @@ public class GUI { miniMap.paintMap(g1); g1.dispose(); - // FIXME: this can probably done more efficiently by applying - // a suitable AffineTransform to the Graphics2D int scaledWidth = Math.min((int)((64 * width) / (float)height), 128); BufferedImage scaledImage = new BufferedImage(scaledWidth, 64, BufferedImage.TYPE_INT_ARGB); @@ -323,14 +265,6 @@ public class GUI { public void refresh() { } - /** - * Refreshes the screen at the specified Tile. - * - * @param tile The Tile to refresh. - */ - public void refreshTile(Tile tile) { - } - /** * Reset the menu bar. */ @@ -361,8 +295,10 @@ public class GUI { * Set the active unit. * * @param unit The Unit to activate. + * @return true if the focus was set. */ - public void setActiveUnit(Unit unit) { + public boolean setActiveUnit(Unit unit) { + return false; } /** @@ -375,18 +311,15 @@ public class GUI { // Animation handling /** - * Common utility routine to retrieve animation speed. + * Require the given tile to be in the onScreen()-area. * - * @param unit The Unit to be animated. - * @return The animation speed. + * @param tile The Tile to check. + * @return True if the focus was set. */ - public int getAnimationSpeed(Unit unit) { - String key = (freeColClient.getMyPlayer() == unit.getOwner()) - ? ClientOptions.MOVE_ANIMATION_SPEED - : ClientOptions.ENEMY_MOVE_ANIMATION_SPEED; - return freeColClient.getClientOptions().getInteger(key); + public boolean requireFocus(Tile tile) { + return false; } - + /** * Animate a unit attack. * @@ -427,9 +360,6 @@ public class GUI { public void updateMapControls() { } - public void updateMapControlsInCanvas() { - } - public void zoomInMapControls() { } @@ -454,7 +384,7 @@ public class GUI { // Dialogs that return values /** - * Simple confirmation dialog. + * Simple modal confirmation dialog. * * @param textKey A string to use as the message key. * @param okKey A key for the "ok" button. @@ -466,51 +396,42 @@ public class GUI { } /** - * General confirmation dialog. + * General modal confirmation dialog. * - * @param modal Is this a modal dialog? * @param tile An optional Tile to expose. * @param template The StringTemplate explaining the choice. * @param okKey A key for the "ok" button. * @param cancelKey A key for the "cancel" button. * @return True if the "ok" button was selected. */ - public boolean confirm(boolean modal, Tile tile, - StringTemplate template, + public boolean confirm(Tile tile, StringTemplate template, String okKey, String cancelKey) { return false; } /** - * General confirmation dialog. + * General modal confirmation dialog. * - * @param modal Is this a modal dialog? * @param tile An optional Tile to expose. * @param template The StringTemplate explaining the choice. - * @param obj An optional unit to make an icon for the dialog from. + * @param unit An optional unit to make an icon for the dialog from. * @param okKey A key for the "ok" button. * @param cancelKey A key for the "cancel" button. * @return True if the "ok" button was selected. */ - public boolean confirm(boolean modal, Tile tile, - StringTemplate template, Unit obj, + public boolean confirm(Tile tile, StringTemplate template, Unit unit, String okKey, String cancelKey) { return false; } - /** - * General confirmation dialog. - * - * @param modal Is this a modal dialog? - * @param tile An optional Tile to expose. - * @param template The StringTemplate explaining the choice. - * @param icon An optional icon for the dialog. - * @param okKey A key for the "ok" button. - * @param cancelKey A key for the "cancel" button. - * @return True if the "ok" button was selected. - */ - public boolean confirm(boolean modal, Tile tile, - StringTemplate template, ImageIcon icon, + public boolean confirm(Tile tile, StringTemplate template, + Settlement settlement, + String okKey, String cancelKey) { + return false; + } + + public boolean confirm(Tile tile, StringTemplate template, + GoodsType goodsType, String okKey, String cancelKey) { return false; } @@ -548,7 +469,7 @@ public class GUI { .addNamed("%building%", school) : null; return template == null - || confirm(true, unit.getTile(), template, unit, + || confirm(unit.getTile(), template, unit, "abandonEducation.yes", "abandonEducation.no"); } @@ -567,7 +488,7 @@ public class GUI { .addStringTemplate("%unit%", unit.getLabel(Unit.UnitLabelType.NATIONAL)) .addName("%route%", tr.getName()); - return confirm(true, unit.getTile(), template, unit, "yes", "no"); + return confirm(unit.getTile(), template, unit, "yes", "no"); } /** @@ -602,14 +523,14 @@ public class GUI { int gold = ns.getGold(); if (gold == 0) { t = StringTemplate.template("confirmTribute.broke") - .addStringTemplate("%nation%", other.getNationName()); + .addStringTemplate("%nation%", other.getNationLabel()); showInformationMessage(t); return -1; } int fin = (gold <= 100) ? 0 : (gold <= 1000) ? 1 : 2; t = StringTemplate.template("confirmTribute.european") - .addStringTemplate("%nation%", other.getNationName()) + .addStringTemplate("%nation%", other.getNationLabel()) .addStringTemplate("%danger%", StringTemplate.template("danger." + levels[mil])) .addStringTemplate("%finance%", @@ -666,9 +587,9 @@ public class GUI { messageId = "confirmHostile.peace"; break; } - return confirm(true, attacker.getTile(), StringTemplate + return confirm(attacker.getTile(), StringTemplate .template(messageId) - .addStringTemplate("%nation%", enemy.getNationName()), + .addStringTemplate("%nation%", enemy.getNationLabel()), attacker, "confirmHostile.yes", "cancel"); } @@ -710,9 +631,9 @@ public class GUI { : (is.getAlarm(player).getLevel() == Tension.Level.HAPPY) ? "confirmTribute.happy" : "confirmTribute.normal"; - return (confirm(true, is.getTile(), StringTemplate.template(messageId) + return (confirm(is.getTile(), StringTemplate.template(messageId) .addName("%settlement%", is.getName()) - .addStringTemplate("%nation%", other.getNationName()), + .addStringTemplate("%nation%", other.getNationLabel()), attacker, "confirmTribute.yes", "confirmTribute.no")) ? 1 : -1; } @@ -763,10 +684,9 @@ public class GUI { choices.add(new ChoiceItem<>(Messages.message("armedUnitSettlement.attack"), ArmedUnitSettlementAction.SETTLEMENT_ATTACK)); - return getChoice(true, settlement.getTile(), - Utility.localizedTextArea(settlement.getAlarmLevelLabel(player)), - new ImageIcon(imageLibrary.getSettlementImage(settlement)), - "cancel", choices); + return getChoice(settlement.getTile(), + settlement.getAlarmLevelLabel(player), + settlement, "cancel", choices); } /** @@ -792,9 +712,8 @@ public class GUI { choices.add(new ChoiceItem<>(Messages.message("boycottedGoods.dumpGoods"), BoycottAction.DUMP_CARGO)); - return getChoice(true, null, Utility.localizedTextArea(template), - new ImageIcon(imageLibrary.getIconImage(goods.getType())), - "cancel", choices); + return getChoice(null, template, + goods.getType(), "cancel", choices); } /** @@ -810,7 +729,7 @@ public class GUI { public BuyAction getBuyChoice(Unit unit, Settlement settlement, Goods goods, int gold, boolean canBuy) { StringTemplate template = StringTemplate.template("buy.text") - .addStringTemplate("%nation%", settlement.getOwner().getNationName()) + .addStringTemplate("%nation%", settlement.getOwner().getNationLabel()) .addStringTemplate("%goods%", goods.getLabel(true)) .addAmount("%gold%", gold); @@ -820,9 +739,8 @@ public class GUI { choices.add(new ChoiceItem<>(Messages.message("buy.moreGold"), BuyAction.HAGGLE)); - return getChoice(true, unit.getTile(), Utility.localizedTextArea(template), - new ImageIcon(imageLibrary.getIconImage(goods.getType())), - "cancel", choices); + return getChoice(unit.getTile(), template, + goods.getType(), "cancel", choices); } /** @@ -840,7 +758,7 @@ public class GUI { StringTemplate template; if (owner.hasContacted(player)) { template = StringTemplate.template("indianLand.text") - .addStringTemplate("%player%", owner.getNationName()); + .addStringTemplate("%player%", owner.getNationLabel()); StringTemplate pay = StringTemplate.template("indianLand.pay") .addAmount("%amount%", price); choices.add(new ChoiceItem<>(Messages.message(pay), @@ -853,9 +771,8 @@ public class GUI { choices.add(new ChoiceItem<>(Messages.message("indianLand.take"), ClaimAction.STEAL)); - return getChoice(true, tile, Utility.localizedTextArea(template), - new ImageIcon(imageLibrary.getMiscIconImage(owner.getNation())), - "indianLand.cancel", choices); + return getChoice(tile, template, + owner.getNation(), "indianLand.cancel", choices); } /** @@ -890,11 +807,8 @@ public class GUI { } if (choices.isEmpty()) return null; - return getChoice(true, settlement.getTile(), - Utility.localizedTextArea(template), - new ImageIcon( - imageLibrary.getSettlementImage(settlement)), - "cancel", choices); + return getChoice(settlement.getTile(), template, + settlement, "cancel", choices); } /** @@ -932,11 +846,8 @@ public class GUI { choices.add(new ChoiceItem<>(Messages.message("missionarySettlement.incite"), MissionaryAction.INCITE_INDIANS)); - return getChoice(true, unit.getTile(), - Utility.localizedTextArea(template), - new ImageIcon( - imageLibrary.getSettlementImage(settlement)), - "cancel", choices); + return getChoice(unit.getTile(), template, + settlement, "cancel", choices); } /** @@ -948,7 +859,7 @@ public class GUI { */ public String getNewColonyName(Player player, Tile tile) { String suggested = player.getSettlementName(null); - String name = getInput(true, tile, StringTemplate + String name = getInput(tile, StringTemplate .template("nameColony.text"), suggested, "accept", "cancel"); if (name == null) { @@ -991,11 +902,8 @@ public class GUI { choices.add(new ChoiceItem<>(Messages.message("scoutColony.attack"), ScoutColonyAction.FOREIGN_COLONY_ATTACK)); - return getChoice(true, unit.getTile(), - Utility.localizedTextArea(template), - new ImageIcon( - imageLibrary.getSettlementImage(colony)), - "cancel", choices); + return getChoice(unit.getTile(), template, + colony, "cancel", choices); } /** @@ -1016,7 +924,7 @@ public class GUI { .addName("\n\n") .addStringTemplate(StringTemplate .template("scoutSettlement.greetings") - .addStringTemplate("%nation%", owner.getNationName()) + .addStringTemplate("%nation%", owner.getNationLabel()) .addName("%settlement%", settlement.getName()) .addName("%number%", numberString) .add("%settlementType%", @@ -1053,11 +961,8 @@ public class GUI { choices.add(new ChoiceItem<>(Messages.message("scoutSettlement.attack"), ScoutIndianSettlementAction.INDIAN_SETTLEMENT_ATTACK)); - return getChoice(true, settlement.getTile(), - Utility.localizedTextArea(template), - new ImageIcon( - imageLibrary.getSettlementImage(settlement)), - "cancel", choices); + return getChoice(settlement.getTile(), template, + settlement, "cancel", choices); } /** @@ -1073,7 +978,7 @@ public class GUI { Goods goods, int gold) { StringTemplate goodsTemplate = goods.getLabel(true); StringTemplate template = StringTemplate.template("sell.text") - .addStringTemplate("%nation%", settlement.getOwner().getNationName()) + .addStringTemplate("%nation%", settlement.getOwner().getNationLabel()) .addStringTemplate("%goods%", goodsTemplate) .addAmount("%gold%", gold); @@ -1087,35 +992,49 @@ public class GUI { .addStringTemplate("%goods%", goodsTemplate)), SellAction.GIFT)); - return getChoice(true, unit.getTile(), - Utility.localizedTextArea(template), - new ImageIcon(imageLibrary.getIconImage(goods.getType())), - "cancel", choices); + return getChoice(unit.getTile(), template, + goods.getType(), "cancel", choices); } /** - * General choice dialog. + * General modal choice dialog. * - * @param modal Is this a modal dialog? * @param tile An optional Tile to expose. * @param explain An object explaining the choice. - * @param icon An optional icon for the dialog. * @param cancelKey A key for the "cancel" button. * @param choices A list a ChoiceItems to choose from. * @return The selected value of the selected ChoiceItem, * or null if cancelled. */ - public T getChoice(boolean modal, Tile tile, Object explain, - ImageIcon icon, + public T getChoice(Tile tile, Object explain, + String cancelKey, List> choices) { + return null; + } + + public T getChoice(Tile tile, Object explain, Unit unit, + String cancelKey, List> choices) { + return null; + } + + public T getChoice(Tile tile, Object explain, Settlement settlement, + String cancelKey, List> choices) { + return null; + } + + public T getChoice(Tile tile, Object explain, GoodsType goodsType, + String cancelKey, List> choices) { + return null; + } + + public T getChoice(Tile tile, Object explain, Nation nation, String cancelKey, List> choices) { return null; } /** - * General input dialog. + * General modal string input dialog. * - * @param modal Is this a modal dialog? * @param tile An optional Tile to expose. * @param template A StringTemplate explaining the choice. * @param defaultValue The default value to show initially. @@ -1123,8 +1042,9 @@ public class GUI { * @param cancelKey A key for the "cancel" button. * @return The chosen value. */ - public String getInput(boolean modal, Tile tile, StringTemplate template, - String defaultValue, String okKey, String cancelKey) { + public String getInput(Tile tile, StringTemplate template, + String defaultValue, + String okKey, String cancelKey) { return null; } @@ -1141,13 +1061,7 @@ public class GUI { return false; } - public void dialogRemove(FreeColDialog fcd) { - } - - public void displayObject(FreeColObject fco) { - } - - public LoadingSavegameDialog getLoadingSavegameDialog() { + public LoadingSavegameInfo getLoadingSavegameInfo() { return null; } @@ -1172,15 +1086,9 @@ public class GUI { public void refreshPlayersTable() { } - public void removeFromCanvas(Component component) { - } - public void removeInGameComponents() { } - public void removeTradeRoutePanel(TradeRoutePanel panel) { - } - public void requestFocusForSubPanel() { } @@ -1188,36 +1096,24 @@ public class GUI { return false; } - public void restoreSavedSize(Component comp, int w, int h) { - } - - public void restoreSavedSize(Component comp, Dimension size) { - } - public void returnToTitle() { } public void showAboutPanel() { } - public void showBuildQueuePanel(Colony colony) { - } - - public void showBuildQueuePanel(Colony colony, Runnable callBack) { - } - public void showCaptureGoodsDialog(final Unit unit, List gl, - final String defenderId) { + DialogHandler> handler) { } public void showChatPanel() { } - public void showChooseFoundingFatherDialog(final List ffs) { + public void showChooseFoundingFatherDialog(final List ffs, + DialogHandler handler) { } - public OptionGroup showClientOptionsDialog() { - return null; + public void showClientOptionsDialog() { } /** @@ -1242,23 +1138,15 @@ public class GUI { protected void showForeignColony(Settlement settlement) { } - public ColonyPanel showColonyPanel(Colony colony, Unit unit) { - return null; + public void showColonyPanel(Colony colony, Unit unit) { } public void showColopediaPanel(String nodeId) { } - public ColorChooserPanel showColorChooserPanel(ActionListener al) { - return null; - } - public void showCompactLabourReport() { } - public void showCompactLabourReport(UnitData unitData) { - } - public void showDeclarationPanel() { } @@ -1266,23 +1154,21 @@ public class GUI { return null; } - public OptionGroup showDifficultyDialog(Specification spec, - OptionGroup group) { - return null; - } - - public void showDumpCargoDialog(Unit unit) { + public void showDumpCargoDialog(Unit unit, + DialogHandler> handler) { } public boolean showEditOptionDialog(Option option) { return false; } - public void showEmigrationDialog(final Player player, final int n, - final boolean fountainOfYouth) { + public void showEmigrationDialog(final Player player, + final boolean fountainOfYouth, + DialogHandler handler) { } - public void showEndTurnDialog(final List units) { + public void showEndTurnDialog(final List units, + DialogHandler handler) { } public void showErrorMessage(StringTemplate template) { @@ -1360,10 +1246,6 @@ public class GUI { return null; } - public File showLoadDialog(File directory, FileFilter[] fileFilters) { - return null; - } - final public File showLoadSaveFileDialog() { File file = showLoadDialog(FreeColDirectories.getSaveDirectory()); if (file != null && !file.isFile()) { @@ -1396,21 +1278,19 @@ public class GUI { } public void showMonarchDialog(final MonarchAction action, - StringTemplate template, String monarchKey) { + StringTemplate template, String monarchKey, + DialogHandler handler) { } - public void showNameNewLandDialog(String key, final String defaultName, - final Unit unit) { - } - - public void showNameNewRegionDialog(StringTemplate template, - final String defaultName, - final Unit unit, final Tile tile, - final Region region) { + public void showNamingDialog(StringTemplate template, + final String defaultName, + final Unit unit, + DialogHandler handler) { } public void showFirstContactDialog(final Player player, final Player other, - final Tile tile, int settlementCount) { + final Tile tile, int settlementCount, + DialogHandler handler) { } public DiplomaticTrade showNegotiationDialog(FreeColGameObject our, @@ -1438,12 +1318,6 @@ public class GUI { return false; } - public void showPurchasePanel() { - } - - public void showRecruitPanel() { - } - public void showReportCargoPanel() { } @@ -1468,11 +1342,6 @@ public class GUI { public void showReportIndianPanel() { } - public void showReportLabourDetailPanel(UnitType unitType, - Map> data, - TypeCountMap unitCount, List colonies) { - } - public void showReportLabourPanel() { } @@ -1501,11 +1370,6 @@ public class GUI { return null; } - public File showSaveDialog(File directory, FileFilter[] fileFilters, - String defaultName, String extension) { - return null; - } - public Dimension showScaleMapSizeDialog() { return null; } @@ -1524,9 +1388,6 @@ public class GUI { return null; } - public void showServerListPanel(List serverList) { - } - public void showStartGamePanel(Game game, Player player, boolean singlePlayerMode) { } @@ -1537,33 +1398,13 @@ public class GUI { public void showStatusPanel(String message) { } - public void showTilePanel(Tile tile) { - } - public void showTilePopUpAtSelectedTile() { } public void showTradeRoutePanel(Unit unit) { } - public void showTradeRouteInputPanel(TradeRoute newRoute, - Runnable callBack) { - } - - public void showTrainPanel() { - } - - public void showVictoryDialog() { - } - - public boolean showWarehouseDialog(Colony colony) { - return false; - } - - public void showWorkProductionPanel(Unit unit) { - } - - public void updateEuropeanSubpanels() { + public void showVictoryDialog(DialogHandler handler) { } public void updateGameOptions() { @@ -1578,15 +1419,6 @@ public class GUI { public void changeViewMode(int newViewMode) { } - public Point calculateUnitLabelPositionInTile(JLabel unitLabel, Point tileP) { - return null; - } - - public void executeWithUnitOutForAnimation(final Unit unit, - final Tile sourceTile, - final OutForAnimationCallback r) { - } - public Unit getActiveUnit() { return null; } @@ -1595,45 +1427,18 @@ public class GUI { return null; } - public float getMapScale() { - return 1.0f; - } - public Tile getSelectedTile() { return null; } - public Rectangle getTileBounds(Tile tile) { - return null; - } - - public Point getTilePosition(Tile tile) { - return null; - } - - public double getTileWidthHeightRatio() { - return ImageLibrary.TILE_SIZE.width / (double)ImageLibrary.TILE_SIZE.height; - } - public int getViewMode() { return -1; } - public boolean onScreen(Tile tileToCheck) { - return true; // Lets pretend. - } - - public void restartBlinking() { - } - public void setFocus(Tile tileToFocus) { } - public void setFocusImmediately(Tile tileToFocus) { - } - - public boolean setSelectedTile(Tile newTileToSelect, - boolean clearGoToOrders) { + public boolean setSelectedTile(Tile newTileToSelect) { return true; // Pretending again. } @@ -1675,4 +1480,38 @@ public class GUI { return freeColClient.getSoundController().getSoundMixerLabelText(); } + // invoke method forwarding + + /** + * Wrapper for SwingUtilities.invokeLater that handles the case + * where we are already in the EDT. + * + * @param runnable A Runnable to run. + */ + public void invokeNowOrLater(Runnable runnable) { + if (SwingUtilities.isEventDispatchThread()) { + runnable.run(); + } else { + SwingUtilities.invokeLater(runnable); + } + } + + /** + * Wrapper for SwingUtilities.invokeAndWait that handles the case + * where we are already in the EDT. + * + * @param runnable A Runnable to run. + */ + public void invokeNowOrWait(Runnable runnable) { + if (SwingUtilities.isEventDispatchThread()) { + runnable.run(); + } else { + try { + SwingUtilities.invokeAndWait(runnable); + } catch (InterruptedException | InvocationTargetException ex) { + logger.log(Level.WARNING, "Client GUI interaction", ex); + } + } + } + } diff --git a/src/net/sf/freecol/client/gui/ImageLibrary.java b/src/net/sf/freecol/client/gui/ImageLibrary.java index a1c4883bb..337782fb8 100644 --- a/src/net/sf/freecol/client/gui/ImageLibrary.java +++ b/src/net/sf/freecol/client/gui/ImageLibrary.java @@ -32,12 +32,13 @@ import java.awt.RenderingHints; import java.awt.TexturePaint; import java.awt.image.BufferedImage; import java.awt.image.RescaleOp; -import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.stream.Collectors; import javax.swing.JComponent; @@ -79,12 +80,12 @@ public final class ImageLibrary { /** * Canonical sizes of images GUI elements and map are expecting - * in some cases already and current image files have. - * ATM this is just for documentation. - * Currently, most images result in a size of image size times scaling - * factor times requested size. If these canonical sizes would get used - * in the equation, the game could tolerate changing sizes in the files, - * without GUI elements sized wrongly, parts cut off or moved unexpectedly. + * and current image files have. + * ICON_SIZE, TILE_SIZE, TILE_OVERLAY_SIZE and TILE_FOREST_SIZE constants + * are used in this way already, allowing them to tolerate changing sizes + * in the files. + * Most other images are currently still shown in a size of image size + * times scaling factor times requested size. */ public static final Dimension ICON_SIZE = new Dimension(32, 32), BUILDING_SIZE = new Dimension(128, 96), @@ -143,11 +144,13 @@ public final class ImageLibrary { /** - * The scaling factor used when creating this + * The scale factor used when creating this * ImageLibrary. The value 1 is used if * this object is not a result of a scaling operation. */ - private final float scalingFactor; + private final float scaleFactor; + + final Dimension tileSize, tileOverlaySize, tileForestSize; private final HashMap stringImageCache; @@ -168,11 +171,14 @@ public final class ImageLibrary { * but this gets multiplied for tiny 0.25(rarely, candidate for removal), * smaller 0.5, small 0.75 and normal 1.0 image retrieval methods. * - * @param scalingFactor The factor used when scaling. 2 is twice + * @param scaleFactor The factor used when scaling. 2 is twice * the size of the original images and 0.5 is half. */ - public ImageLibrary(float scalingFactor) { - this.scalingFactor = scalingFactor; + public ImageLibrary(float scaleFactor) { + this.scaleFactor = scaleFactor; + tileSize = scaleDimension(TILE_SIZE, scaleFactor); + tileOverlaySize = scaleDimension(TILE_OVERLAY_SIZE, scaleFactor); + tileForestSize = scaleDimension(TILE_FOREST_SIZE, scaleFactor); stringImageCache = new HashMap<>(); } @@ -183,8 +189,17 @@ public final class ImageLibrary { * this object. * @return The scaling factor of this ImageLibrary. */ - public float getScalingFactor() { - return scalingFactor; + public float getScaleFactor() { + return scaleFactor; + } + + public Dimension scaleDimension(Dimension size) { + return scaleDimension(size, scaleFactor); + } + + public static Dimension scaleDimension(Dimension size, float scaleFactor) { + return new Dimension(Math.round(size.width*scaleFactor), + Math.round(size.height*scaleFactor)); } /** @@ -246,7 +261,7 @@ public final class ImageLibrary { public BufferedImage getBeachCornerImage(int index, int x, int y) { return ResourceManager.getImage("image.tile.model.tile.beach.corner" + index + ".r" + ((isEven(x, y)) ? "0" : "1"), - scalingFactor); + tileSize); } /** @@ -260,7 +275,7 @@ public final class ImageLibrary { public BufferedImage getBeachEdgeImage(int index, int x, int y) { return ResourceManager.getImage("image.tile.model.tile.beach.edge" + index + ".r"+ ((isEven(x, y)) ? "0" : "1"), - scalingFactor); + tileSize); } /** @@ -278,8 +293,8 @@ public final class ImageLibrary { int x, int y) { String key = (type == null) ? "model.tile.unexplored" : type.getId(); return ResourceManager.getImage("image.tile." + key + ".border." + direction - + ".r" + ((isEven(x, y)) ? "0" : "1") - , scalingFactor); + + ".r" + ((isEven(x, y)) ? "0" : "1"), + tileSize); } /** @@ -289,18 +304,22 @@ public final class ImageLibrary { * @return The image at the given index. */ public BufferedImage getForestImage(TileType type) { - return getForestImage(type, scalingFactor); + return getForestImage(type, tileForestSize); } - public BufferedImage getForestImage(TileType type, TileImprovementStyle riverStyle) { - return getForestImage(type, riverStyle, scalingFactor); + public static BufferedImage getForestImage(TileType type, Dimension size) { + return ResourceManager.getImage("image.tileforest." + type.getId(), + size); } - public static BufferedImage getForestImage(TileType type, float scale) { - return ResourceManager.getImage("image.tileforest." + type.getId(), scale); + public BufferedImage getForestImage(TileType type, + TileImprovementStyle riverStyle) { + return getForestImage(type, riverStyle, tileForestSize); } - public static BufferedImage getForestImage(TileType type, TileImprovementStyle riverStyle, float scale) { + public static BufferedImage getForestImage(TileType type, + TileImprovementStyle riverStyle, + Dimension size) { if (riverStyle != null) { String key = "image.tileforest." + type.getId() + ".s" + riverStyle.getMask(); // @compat 0.10.6 @@ -312,9 +331,9 @@ public final class ImageLibrary { // Consider keeping the fallback, as its safer to have one. if (ResourceManager.hasImageResource(key)) // end @compat - return ResourceManager.getImage(key, scale); + return ResourceManager.getImage(key, size); } - return ResourceManager.getImage("image.tileforest." + type.getId(), scale); + return ResourceManager.getImage("image.tileforest." + type.getId(), size); } /** @@ -333,7 +352,7 @@ public final class ImageLibrary { public BufferedImage getSmallBuildableImage(BuildableType buildable, Player player) { // FIXME: distinguish national unit types - float scale = scalingFactor * 0.75f; + float scale = scaleFactor * 0.75f; BufferedImage image = (buildable instanceof BuildingType) ? ImageLibrary.getBuildingImage( (BuildingType) buildable, player, scale) @@ -350,18 +369,18 @@ public final class ImageLibrary { public BufferedImage getSmallBuildingImage(Building building) { return getBuildingImage(building.getType(), building.getOwner(), - scalingFactor * 0.75f); + scaleFactor * 0.75f); } public BufferedImage getBuildingImage(Building building) { return getBuildingImage(building.getType(), building.getOwner(), - scalingFactor); + scaleFactor); } public static BufferedImage getBuildingImage(BuildingType buildingType, Player player, float scale) { String key = "image.buildingicon." + buildingType.getId() - + "." + player.getNationNameKey(); + + "." + player.getNationResourceKey(); if (!ResourceManager.hasImageResource(key)) { key = "image.buildingicon." + buildingType.getId(); } @@ -381,33 +400,30 @@ public final class ImageLibrary { } public BufferedImage getSmallerIconImage(FreeColGameObjectType type) { - return getMiscImage("image.icon." + type.getId(), new Dimension( - Math.round(scalingFactor * (ICON_SIZE.width * 0.5f)), - Math.round(scalingFactor * (ICON_SIZE.height * 0.5f)))); + return getMiscImage("image.icon." + type.getId(), + scaleDimension(ICON_SIZE, scaleFactor * 0.5f)); } public BufferedImage getSmallIconImage(FreeColGameObjectType type) { - return getMiscImage("image.icon." + type.getId(), new Dimension( - Math.round(scalingFactor * (ICON_SIZE.width * 0.75f)), - Math.round(scalingFactor * (ICON_SIZE.height * 0.75f)))); + return getMiscImage("image.icon." + type.getId(), + scaleDimension(ICON_SIZE, scaleFactor * 0.75f)); } public BufferedImage getIconImage(FreeColGameObjectType type) { - return getMiscImage("image.icon." + type.getId(), new Dimension( - Math.round(scalingFactor * ICON_SIZE.width), - Math.round(scalingFactor * ICON_SIZE.height))); + return getMiscImage("image.icon." + type.getId(), + scaleDimension(ICON_SIZE, scaleFactor)); } public BufferedImage getSmallerMiscIconImage(FreeColGameObjectType type) { - return getMiscIconImage(type, scalingFactor * 0.5f); + return getMiscIconImage(type, scaleFactor * 0.5f); } public BufferedImage getSmallMiscIconImage(FreeColGameObjectType type) { - return getMiscIconImage(type, scalingFactor * 0.75f); + return getMiscIconImage(type, scaleFactor * 0.75f); } public BufferedImage getMiscIconImage(FreeColGameObjectType type) { - return getMiscIconImage(type, scalingFactor); + return getMiscIconImage(type, scaleFactor); } public static BufferedImage getMiscIconImage(FreeColGameObjectType type, float scale) { @@ -425,7 +441,7 @@ public final class ImageLibrary { * @return The image. */ public BufferedImage getMiscImage(String id) { - return getMiscImage(id, scalingFactor); + return getMiscImage(id, scaleFactor); } public static BufferedImage getMiscImage(String id, float scale) { @@ -446,10 +462,8 @@ public final class ImageLibrary { */ public BufferedImage getObjectImage(FreeColObject display, float scale) { try { - final float combinedScale = scalingFactor * scale; - final Dimension size = new Dimension( - Math.round(combinedScale*ICON_SIZE.width), - Math.round(combinedScale*ICON_SIZE.height)); + final float combinedScale = scaleFactor * scale; + final Dimension size = scaleDimension(ICON_SIZE, combinedScale); BufferedImage image; if (display instanceof Goods) { display = ((Goods)display).getType(); @@ -510,7 +524,7 @@ public final class ImageLibrary { * @return A pseudo-random terrain image. */ public BufferedImage getOverlayImage(Tile tile) { - return getOverlayImage(tile.getType(), tile.getId(), scalingFactor); + return getOverlayImage(tile.getType(), tile.getId(), tileOverlaySize); } /** @@ -519,13 +533,14 @@ public final class ImageLibrary { * * @param type The type of the terrain-image to return. * @param id A string used to get a random image. - * @param scale The scale of the image to return. + * @param size The size of the image to return. * @return The terrain-image at the given index. */ - public static BufferedImage getOverlayImage(TileType type, String id, float scale) { + public static BufferedImage getOverlayImage(TileType type, String id, + Dimension size) { String prefix = "image.tileoverlay." + type.getId(); - ArrayList keys = ResourceManager.getImageKeys(prefix); - return getRandomizedImage(keys, id, scale); + List keys = ResourceManager.getImageKeys(prefix); + return getRandomizedImage(keys, id, size); } public static Set createOverlayCache() { @@ -533,33 +548,32 @@ public final class ImageLibrary { } public BufferedImage getOverlayImage(Tile tile, Set overlayCache) { - return getOverlayImage(tile.getType(), tile.getId(), scalingFactor, + return getOverlayImage(tile.getType(), tile.getId(), tileOverlaySize, overlayCache); } - public static BufferedImage getOverlayImage(TileType type, String id, float scale, - Set overlayCache) { - String prefix = "image.tileoverlay." + type.getId() + ".r"; - ArrayList keys = new ArrayList<>(); - for (String key : overlayCache) { - if (key.startsWith(prefix)) { - keys.add(key); - } - } - return getRandomizedImage(keys, id, scale); + public static BufferedImage getOverlayImage(TileType type, String id, + Dimension size, + Set overlayCache) { + final String prefix = "image.tileoverlay." + type.getId() + ".r"; + final List keys = overlayCache.stream() + .filter(k -> k.startsWith(prefix)) + .collect(Collectors.toList()); + return getRandomizedImage(keys, id, size); } - private static BufferedImage getRandomizedImage(ArrayList keys, String id, float scale) { + private static BufferedImage getRandomizedImage(List keys, + String id, Dimension size) { int count = keys.size(); switch(count) { case 0: return null; case 1: - return ResourceManager.getImage(keys.get(0), scale); + return ResourceManager.getImage(keys.get(0), size); default: Collections.sort(keys); return ResourceManager.getImage( - keys.get(Math.abs(id.hashCode() % count)), scale); + keys.get(Math.abs(id.hashCode() % count)), size); } } @@ -614,29 +628,19 @@ public final class ImageLibrary { * @return The image with the given style. */ public BufferedImage getRiverImage(TileImprovementStyle style) { - return getRiverImage(style, scalingFactor); + return getRiverImage(style.getString(), tileSize); } /** * Returns the river image with the given style. * - * @param style a TileImprovementStyle value - * @param scale a double value + * @param style the style code + * @param size the image size * @return The image with the given style. */ - public static BufferedImage getRiverImage(TileImprovementStyle style, float scale) { - return getRiverImage(style.getString(), scale); - } - - /** - * Returns the river image with the given style. - * - * @param style a String value - * @param scale a double value - * @return The image with the given style. - */ - public static BufferedImage getRiverImage(String style, float scale) { - return ResourceManager.getImage("image.tile.model.improvement.river.s" + style, scale); + public static BufferedImage getRiverImage(String style, Dimension size) { + return ResourceManager.getImage( + "image.tile.model.improvement.river.s" + style, size); } /** @@ -654,11 +658,11 @@ public final class ImageLibrary { int x, int y) { String key = "image.tile.model.tile.delta." + direction + (magnitude == 1 ? ".small" : ".large"); - return ResourceManager.getImage(key, scalingFactor); + return ResourceManager.getImage(key, tileSize); } public BufferedImage getSmallSettlementImage(Settlement settlement) { - return getSettlementImage(settlement, scalingFactor * 0.75f); + return getSettlementImage(settlement, scaleFactor * 0.75f); } /** @@ -668,7 +672,7 @@ public final class ImageLibrary { * @return The graphics that will represent the given settlement. */ public BufferedImage getSettlementImage(Settlement settlement) { - return getSettlementImage(settlement, scalingFactor); + return getSettlementImage(settlement, scaleFactor); } /** @@ -694,7 +698,7 @@ public final class ImageLibrary { * @return The graphics that will represent the given settlement. */ public BufferedImage getSettlementImage(SettlementType settlementType) { - return getSettlementImage(settlementType, scalingFactor); + return getSettlementImage(settlementType, scaleFactor); } public static BufferedImage getSettlementImage(SettlementType settlementType, @@ -703,19 +707,6 @@ public final class ImageLibrary { scale); } - /** - * Get a tile size for displaying the colony tiles. - * - * @param tile The Tile to get the size for. - * @return The tile size. - */ - public Dimension calculateTileSize(Tile tile) { - final TileType tileType = tile.getType(); - final BufferedImage image = getTerrainImage(tileType, - tile.getX(), tile.getY()); - return new Dimension(image.getWidth(), image.getHeight()); - } - /** * Returns the terrain-image for the given type. * @@ -727,38 +718,39 @@ public final class ImageLibrary { * @return The terrain-image at the given index. */ public BufferedImage getTerrainImage(TileType type, int x, int y) { - return getTerrainImage(type, x, y, scalingFactor); + return getTerrainImage(type, x, y, tileSize); } - public static BufferedImage getTerrainImage(TileType type, int x, int y, float scale) { + public static BufferedImage getTerrainImage(TileType type, int x, int y, + Dimension size) { String key = (type == null) ? "model.tile.unexplored" : type.getId(); return ResourceManager.getImage("image.tile." + key + ".center.r" - + (isEven(x, y) ? "0" : "1"), scale); + + (isEven(x, y) ? "0" : "1"), size); } public BufferedImage getSmallerUnitImage(Unit unit) { return getUnitImage(unit.getType(), unit.getRole().getId(), - unit.hasNativeEthnicity(), false, scalingFactor * 0.5f); + unit.hasNativeEthnicity(), false, scaleFactor * 0.5f); } public BufferedImage getSmallUnitImage(Unit unit) { return getUnitImage(unit.getType(), unit.getRole().getId(), - unit.hasNativeEthnicity(), false, scalingFactor * 0.75f); + unit.hasNativeEthnicity(), false, scaleFactor * 0.75f); } public BufferedImage getSmallUnitImage(Unit unit, boolean grayscale) { return getUnitImage(unit.getType(), unit.getRole().getId(), - unit.hasNativeEthnicity(), grayscale, scalingFactor * 0.75f); + unit.hasNativeEthnicity(), grayscale, scaleFactor * 0.75f); } public BufferedImage getUnitImage(Unit unit) { return getUnitImage(unit.getType(), unit.getRole().getId(), - unit.hasNativeEthnicity(), false, scalingFactor); + unit.hasNativeEthnicity(), false, scaleFactor); } public BufferedImage getUnitImage(Unit unit, boolean grayscale) { return getUnitImage(unit.getType(), unit.getRole().getId(), - unit.hasNativeEthnicity(), grayscale, scalingFactor); + unit.hasNativeEthnicity(), grayscale, scaleFactor); } public static BufferedImage getUnitImage(Unit unit, float scale) { @@ -768,38 +760,38 @@ public final class ImageLibrary { public BufferedImage getTinyUnitImage(UnitType unitType) { return getUnitImage(unitType, unitType.getDisplayRoleId(), - false, false, scalingFactor * 0.25f); + false, false, scaleFactor * 0.25f); } public BufferedImage getTinyUnitImage(UnitType unitType, boolean grayscale) { return getUnitImage(unitType, unitType.getDisplayRoleId(), - false, grayscale, scalingFactor * 0.25f); + false, grayscale, scaleFactor * 0.25f); } public BufferedImage getSmallerUnitImage(UnitType unitType) { return getUnitImage(unitType, unitType.getDisplayRoleId(), - false, false, scalingFactor * 0.5f); + false, false, scaleFactor * 0.5f); } public BufferedImage getSmallUnitImage(UnitType unitType) { return getUnitImage(unitType, unitType.getDisplayRoleId(), - false, false, scalingFactor * 0.75f); + false, false, scaleFactor * 0.75f); } public BufferedImage getSmallUnitImage(UnitType unitType, boolean grayscale) { return getUnitImage(unitType, unitType.getDisplayRoleId(), - false, grayscale, scalingFactor * 0.75f); + false, grayscale, scaleFactor * 0.75f); } public BufferedImage getSmallUnitImage(UnitType unitType, String roleId, boolean grayscale) { return getUnitImage(unitType, roleId, - false, grayscale, scalingFactor * 0.75f); + false, grayscale, scaleFactor * 0.75f); } public BufferedImage getUnitImage(UnitType unitType) { return getUnitImage(unitType, unitType.getDisplayRoleId(), - false, false, scalingFactor); + false, false, scaleFactor); } public static BufferedImage getUnitImage(UnitType unitType, float scale) { @@ -890,10 +882,7 @@ public final class ImageLibrary { JComponent c, Insets insets) { int width = c.getWidth(); int height = c.getHeight(); - BufferedImage image = ResourceManager.hasImageResource(resource) - ? ResourceManager.getImage(resource) : null; - int dx, dy, xmin, ymin; - + int xmin, ymin; if (insets == null) { xmin = 0; ymin = 0; @@ -903,11 +892,13 @@ public final class ImageLibrary { width -= insets.left + insets.right; height -= insets.top + insets.bottom; } - if (image != null && (dx = image.getWidth()) > 0 - && (dy = image.getHeight()) > 0) { - int xmax, ymax; - xmax = xmin + width; - ymax = ymin + height; + + if (ResourceManager.hasImageResource(resource)) { + BufferedImage image = ResourceManager.getImage(resource); + int dx = image.getWidth(); + int dy = image.getHeight(); + int xmax = xmin + width; + int ymax = ymin + height; for (int x = xmin; x < xmax; x += dx) { for (int y = ymin; y < ymax; y += dy) { g.drawImage(image, x, y, null); @@ -1020,9 +1011,9 @@ public final class ImageLibrary { private BufferedImage createChip(Graphics2D g, String text, Color border, Color background, Color foreground) { Font font = FontLibrary.createFont(FontLibrary.FontType.SIMPLE, - FontLibrary.FontSize.TINY, Font.BOLD, scalingFactor); + FontLibrary.FontSize.TINY, Font.BOLD, scaleFactor); FontMetrics fm = g.getFontMetrics(font); - int padding = (int)(6 * scalingFactor); + int padding = (int)(6 * scaleFactor); BufferedImage bi = new BufferedImage(fm.stringWidth(text) + padding, fm.getMaxAscent() + fm.getMaxDescent() + padding, BufferedImage.TYPE_INT_ARGB); @@ -1057,9 +1048,9 @@ public final class ImageLibrary { double amount, Color fill, Color foreground) { Font font = FontLibrary.createFont(FontLibrary.FontType.SIMPLE, - FontLibrary.FontSize.TINY, Font.BOLD, scalingFactor); + FontLibrary.FontSize.TINY, Font.BOLD, scaleFactor); FontMetrics fm = g.getFontMetrics(font); - int padding = (int)(6 * scalingFactor); + int padding = (int)(6 * scaleFactor); BufferedImage bi = new BufferedImage(fm.stringWidth(text) + padding, fm.getMaxAscent() + fm.getMaxDescent() + padding, BufferedImage.TYPE_INT_ARGB); diff --git a/src/net/sf/freecol/client/gui/LoadingSavegameInfo.java b/src/net/sf/freecol/client/gui/LoadingSavegameInfo.java new file mode 100644 index 000000000..7beb3f8ff --- /dev/null +++ b/src/net/sf/freecol/client/gui/LoadingSavegameInfo.java @@ -0,0 +1,64 @@ +/** + * Copyright (C) 2002-2015 The FreeCol Team + * + * This file is part of FreeCol. + * + * FreeCol is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * FreeCol is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with FreeCol. If not, see . + */ + +package net.sf.freecol.client.gui; + +/** + * Used for transferring data for the savegame to be loaded. +*/ +public class LoadingSavegameInfo { + + private final boolean singlePlayer; + private final int port; + private final String serverName; + + public LoadingSavegameInfo(boolean singlePlayer, int port, String serverName) { + this.singlePlayer=singlePlayer; + this.port=port; + this.serverName=serverName; + } + + /** + * Is a single player game selected? + * + * @return True if single player is selected. + */ + public boolean isSinglePlayer() { + return singlePlayer; + } + + /** + * Get the selected port number. + * + * @return The port number. + */ + public int getPort() { + return port; + } + + /** + * Get the specified server name. + * + * @return The server name. + */ + public String getServerName() { + return serverName; + } + +} diff --git a/src/net/sf/freecol/client/gui/MapViewer.java b/src/net/sf/freecol/client/gui/MapViewer.java index 183856961..b5dedd737 100644 --- a/src/net/sf/freecol/client/gui/MapViewer.java +++ b/src/net/sf/freecol/client/gui/MapViewer.java @@ -19,20 +19,16 @@ package net.sf.freecol.client.gui; -import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; -import java.awt.Composite; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics2D; -import java.awt.Image; import java.awt.Point; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Stroke; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.font.TextLayout; import java.awt.geom.AffineTransform; import java.awt.geom.Ellipse2D; @@ -40,13 +36,11 @@ import java.awt.geom.GeneralPath; import java.awt.geom.Point2D; import java.awt.geom.RoundRectangle2D; import java.awt.image.BufferedImage; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; import java.util.EnumMap; import java.util.HashMap; import java.util.List; import java.util.Set; +import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.ImageIcon; @@ -55,42 +49,34 @@ import javax.swing.JLayeredPane; import net.sf.freecol.client.ClientOptions; import net.sf.freecol.client.FreeColClient; -import net.sf.freecol.common.debug.DebugUtils; import net.sf.freecol.common.debug.FreeColDebugger; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.Ability; import net.sf.freecol.common.model.BuildableType; import net.sf.freecol.common.model.Colony; -import net.sf.freecol.common.model.ColonyTile; -import net.sf.freecol.common.model.Game; -import net.sf.freecol.common.model.GameOptions; -import net.sf.freecol.common.model.IndianSettlement; -import net.sf.freecol.common.model.LostCityRumour; -import net.sf.freecol.common.model.Map; import net.sf.freecol.common.model.Direction; +import net.sf.freecol.common.model.FreeColGameObject; +import net.sf.freecol.common.model.Game; +import net.sf.freecol.common.model.IndianSettlement; +import net.sf.freecol.common.model.Map; import net.sf.freecol.common.model.PathNode; import net.sf.freecol.common.model.Player; import net.sf.freecol.common.model.Region; -import net.sf.freecol.common.model.Resource; import net.sf.freecol.common.model.Settlement; import net.sf.freecol.common.model.Tile; -import net.sf.freecol.common.model.TileImprovement; -import net.sf.freecol.common.model.TileItem; -import net.sf.freecol.common.model.TileType; import net.sf.freecol.common.model.Turn; import net.sf.freecol.common.model.Unit; -import net.sf.freecol.common.resources.ResourceManager; -import net.sf.freecol.common.util.Utils; import static net.sf.freecol.common.util.StringUtils.*; /** + * MapViewer is a private helper class of Canvas and SwingGUI. + * * This class is responsible for drawing the map/background on the * Canvas. - * * In addition, the graphical state of the map (focus, active unit..) - * is also a responsibility of this class. + * is currently handled by this class. */ public final class MapViewer { @@ -98,7 +84,6 @@ public final class MapViewer { private static enum BorderType { COUNTRY, REGION } - private static class TextSpecification { public final String text; @@ -110,67 +95,24 @@ public final class MapViewer { } } - private static class SortableImage implements Comparable { - - public final Image image; - public final int index; - - public SortableImage(Image image, int index) { - this.image = image; - this.index = index; - } - - // Implement Comparable - - @Override - public int compareTo(SortableImage other) { - return other.index - this.index; - } - - // Override Object - - /** - * {@inheritDoc} - */ - @Override - public boolean equals(Object other) { - if (other instanceof SortableImage) { - return this.compareTo((SortableImage)other) == 0; - } - return super.equals(other); - } - - /** - * {@inheritDoc} - */ - @Override - public int hashCode() { - int hash = super.hashCode(); - hash = 37 * hash + Utils.hashCode(image); - return 37 * hash + index; - } - } private final FreeColClient freeColClient; - private final GUI gui; + private final SwingGUI gui; private Dimension size; /** Scaled ImageLibrary only used for map painting. */ private ImageLibrary lib; - private RoadPainter rp; + private final TileViewer tv; private TerrainCursor cursor; - private volatile boolean blinkingMarqueeEnabled; private Tile selectedTile; private Tile focus = null; private Unit activeUnit; - private Unit savedActiveUnit; - /** The view mode in use. */ private int viewMode = 0; @@ -180,7 +122,6 @@ public final class MapViewer { /** A path for a current goto order. */ private PathNode gotoPath = null; private boolean gotoStarted = false; - private Point gotoDragPoint; // Helper variables for displaying the map. private int tileHeight, tileWidth, halfHeight, halfWidth, @@ -221,19 +162,11 @@ public final class MapViewer { // The height offset to paint a Unit at (in pixels). private static final int UNIT_OFFSET = 20, - STATE_OFFSET_X = 25, - STATE_OFFSET_Y = 10, OTHER_UNITS_OFFSET_X = -5, // Relative to the state indicator. OTHER_UNITS_OFFSET_Y = 1, OTHER_UNITS_WIDTH = 3, MAX_OTHER_UNITS = 10; - public static final int OVERLAY_INDEX = 100; - public static final int FOREST_INDEX = 200; - - private GeneralPath gridPath = null; - private final GeneralPath fog = new GeneralPath(); - private final java.util.Map unitsOutForAnimation; private final java.util.Map unitsOutForAnimationLabels; @@ -256,19 +189,28 @@ public final class MapViewer { */ MapViewer(FreeColClient freeColClient) { this.freeColClient = freeColClient; - this.gui = freeColClient.getGUI(); + this.gui = (SwingGUI)freeColClient.getGUI(); this.size = null; + tv = new TileViewer(freeColClient); setImageLibraryAndUpdateData(new ImageLibrary()); cursor = null; - blinkingMarqueeEnabled = false; unitsOutForAnimation = new HashMap<>(); unitsOutForAnimationLabels = new HashMap<>(); } + /** + * Gets the contained ImageLibrary. + * + * @return The image library; + */ + ImageLibrary getImageLibrary() { + return lib; + } + /** * Get the view mode. * @@ -295,51 +237,20 @@ public final class MapViewer { logger.fine("Changed to " + ((newViewMode == GUI.MOVE_UNITS_MODE) ? "Move Units" : "View Terrain") + " mode"); viewMode = newViewMode; + if(viewMode == GUI.MOVE_UNITS_MODE) + restartBlinking(); + else + stopBlinking(); + if(activeUnit != null) { + Tile tile = activeUnit.getTile(); + if(isTileVisible(tile)) + gui.refreshTile(tile); + if(selectedTile != tile && isTileVisible(selectedTile)) + gui.refreshTile(selectedTile); + } else if(isTileVisible(selectedTile)) + gui.refreshTile(selectedTile); + gui.updateMapControls(); } - - switch (viewMode) { - case GUI.MOVE_UNITS_MODE: - if (getActiveUnit() == null) setActiveUnit(savedActiveUnit); - savedActiveUnit = null; - break; - case GUI.VIEW_TERRAIN_MODE: - savedActiveUnit = activeUnit; - setActiveUnit(null); - break; - default: - break; - } - } - - - /** - * Get the current active unit path. - * - * @return The current PathNode. - */ - PathNode getCurrentPath() { - return this.currentPath; - } - - /** - * Set the current active unit path. - * - * @param path The current PathNode. - */ - void setCurrentPath(PathNode path) { - this.currentPath = path; - } - - /** - * Sets the path of the active unit to display it. - */ - void updateCurrentPathForActiveUnit() { - setCurrentPath((activeUnit == null - || activeUnit.getDestination() == null - || Map.isSameLocation(activeUnit.getLocation(), - activeUnit.getDestination())) - ? null - : activeUnit.findPath(activeUnit.getDestination())); } /** @@ -347,7 +258,7 @@ public final class MapViewer { */ void centerActiveUnit() { if (activeUnit != null && activeUnit.getTile() != null) { - setFocus(activeUnit.getTile()); + gui.setFocus(activeUnit.getTile()); } } @@ -460,215 +371,6 @@ public final class MapViewer { } - - private int calculateHeightForTileWithOverlayAndForest( - TileType tileType, int height, Image overlayImage) { - int compoundHeight = height; - if (tileType != null) { - int tmpHeight; - if (overlayImage != null) { - tmpHeight = overlayImage.getHeight(null); - if(tmpHeight > compoundHeight) - compoundHeight = tmpHeight; - } - if (tileType.isForested()) { - tmpHeight = lib.getForestImage(tileType).getHeight(null); - if(tmpHeight > compoundHeight) - compoundHeight = tmpHeight; - } - } - return compoundHeight; - } - - /** - * Displays the given Tile onto the given Graphics2D object at the - * location specified by the coordinates. Draws the terrain and - * improvements. Doesn't draw settlements, lost city rumours, fog - * of war, optional values neither units. - * - * The same as calling displayTile(g, map, tile, x, y, true);. - * - * @param tile The Tile to draw. - * @return The image. - */ - public BufferedImage createTileImageWithBeachBorderAndItems(Tile tile) { - final TileType tileType = tile.getType(); - final Image terrain = lib.getTerrainImage( - tileType, tile.getX(), tile.getY()); - Image overlayImage = lib.getOverlayImage(tile); - final int width = terrain.getWidth(null); - final int height = terrain.getHeight(null); - final int compoundHeight = calculateHeightForTileWithOverlayAndForest( - tileType, height, overlayImage); - BufferedImage image = new BufferedImage( - width, compoundHeight, BufferedImage.TYPE_INT_ARGB); - Graphics2D g = image.createGraphics(); - g.translate(0, compoundHeight - height); - displayTileWithBeachAndBorder(g, lib, tile, true); - displayTileItems(g, tile, overlayImage); - g.dispose(); - return image; - } - - /** - * Returns the scaled terrain-image for a terrain type (and position 0, 0). - * - * @param type The type of the terrain-image to return. - * @param scale The scale of the terrain image to return. - * @return The terrain-image - */ - public static Image createTileImageWithOverlayAndForest(TileType type, float scale) { - Image terrainImage = ImageLibrary.getTerrainImage(type, 0, 0, scale); - Image overlayImage = ImageLibrary.getOverlayImage(type, type.getId(), scale); - Image forestImage = type.isForested() ? ImageLibrary.getForestImage(type, scale) : null; - if (overlayImage == null && forestImage == null) { - return terrainImage; - } else { - int width = terrainImage.getWidth(null); - int height = terrainImage.getHeight(null); - if (overlayImage != null) { - height = Math.max(height, overlayImage.getHeight(null)); - } - if (forestImage != null) { - height = Math.max(height, forestImage.getHeight(null)); - } - BufferedImage compositeImage = new BufferedImage(width, height, - BufferedImage.TYPE_INT_ARGB); - Graphics2D g = compositeImage.createGraphics(); - g.drawImage(terrainImage, 0, height - terrainImage.getHeight(null), null); - if (overlayImage != null) { - g.drawImage(overlayImage, 0, height - overlayImage.getHeight(null), null); - } - if (forestImage != null) { - g.drawImage(forestImage, 0, height - forestImage.getHeight(null), null); - } - g.dispose(); - return compositeImage; - } - } - - /** - * Create a BufferedImage and draw a Tile on it. - * The visualization of the Tile also includes information - * from the corresponding ColonyTile of the given - * Colony. - * - * @param tile The Tile to draw. - * @param colony The Colony to create the visualization - * of the Tile for. This object is also used to - * get the ColonyTile for the given Tile. - * @return The image. - */ - public BufferedImage createColonyTileImage(Tile tile, Colony colony) { - final TileType tileType = tile.getType(); - final Image terrain = lib.getTerrainImage( - tileType, tile.getX(), tile.getY()); - final int width = terrain.getWidth(null); - final int height = terrain.getHeight(null); - Image overlayImage = lib.getOverlayImage(tile); - final int compoundHeight = calculateHeightForTileWithOverlayAndForest( - tileType, height, overlayImage); - BufferedImage image = new BufferedImage( - width, compoundHeight, BufferedImage.TYPE_INT_ARGB); - Graphics2D g = image.createGraphics(); - g.translate(0, compoundHeight - height); - displayColonyTile(g, tile, colony, overlayImage); - g.dispose(); - return image; - } - - /** - * Displays the 3x3 tiles for the TilesPanel in ColonyPanel. - * - * @param g The Graphics2D object on which to draw - * the Tile. - * @param tiles The array containing the Tile objects to draw. - * @param colony The Colony to create the visualization - * of the Tile objects for. - */ - public void displayColonyTiles(Graphics2D g, Tile[][] tiles, Colony colony) { - Set overlayCache = ImageLibrary.createOverlayCache(); - final Tile tile = colony.getTile(); - Dimension tileSize = lib.calculateTileSize(tile); - for (int x = 0; x < 3; x++) { - for (int y = 0; y < 3; y++) { - if (tiles[x][y] != null) { - int xx = (((2 - x) + y) * tileSize.width) / 2; - int yy = ((x + y) * tileSize.height) / 2; - g.translate(xx, yy); - Image overlayImage = lib.getOverlayImage(tiles[x][y], overlayCache); - displayColonyTile(g, tiles[x][y], colony, overlayImage); - g.translate(-xx, -yy); - } - } - } - } - - /** - * Displays the given Tile onto the given - * Graphics2D object at the location specified - * by the coordinates. The visualization of the Tile - * also includes information from the corresponding - * ColonyTile from the given Colony. - * - * @param g The Graphics2D object on which to draw - * the Tile. - * @param tile The Tile to draw. - * @param colony The Colony to create the visualization - * of the Tile for. This object is also used to - * get the ColonyTile for the given Tile. - * @param overlayImage The Image for the tile overlay. - */ - private void displayColonyTile(Graphics2D g, Tile tile, Colony colony, - Image overlayImage) { - boolean tileCannotBeWorked = false; - Unit unit = null; - int price = 0; - if (colony != null) { - ColonyTile colonyTile = colony.getColonyTile(tile); - unit = colonyTile.getOccupyingUnit(); - price = colony.getOwner().getLandPrice(tile); - switch (colonyTile.getNoWorkReason()) { - case NONE: case COLONY_CENTER: case CLAIM_REQUIRED: - break; - default: - tileCannotBeWorked = true; - } - } - - displayTileWithBeachAndBorder(g, lib, tile, false); - if (tile != null && tile.isExplored()) { - displayTileItems(g, tile, overlayImage); - displaySettlementWithChipsOrPopulationNumber(freeColClient, lib, - g, tile, tileWidth, tileHeight, false); - displayFogOfWar(freeColClient, fog, g, tile); - displayOptionalTileTextAndRegionBorder(g, tile); - } - - if (tileCannotBeWorked) { - g.drawImage(lib.getMiscImage(ImageLibrary.TILE_TAKEN), - 0, 0, null); - } - - if (price > 0 && tile != null && !tile.hasSettlement()) { - Image image = lib.getMiscImage(ImageLibrary.TILE_OWNED_BY_INDIANS); - displayCenteredImage(g, image, tileWidth, tileHeight); - } - - if (unit != null) { - BufferedImage image = lib.getSmallerUnitImage(unit); - g.drawImage(image, - tileWidth/4 - image.getWidth() / 2, - halfHeight - image.getHeight() / 2, null); - // Draw an occupation and nation indicator. - Player owner = freeColClient.getMyPlayer(); - String text = Messages.message(unit.getOccupationLabel(owner, false)); - g.drawImage(lib.getOccupationIndicatorChip(g, unit, text), - (int)(STATE_OFFSET_X * lib.getScalingFactor()), - 0, null); - } - } - /** * Run some code with the given unit made invisible. You can nest * several of these method calls in order to hide multiple @@ -680,8 +382,8 @@ public final class MapViewer { * @param r The code to be executed. */ void executeWithUnitOutForAnimation(final Unit unit, - final Tile sourceTile, - final OutForAnimationCallback r) { + final Tile sourceTile, + final OutForAnimationCallback r) { final JLabel unitLabel = enterUnitOutForAnimation(unit, sourceTile); try { r.executeWithUnitOutForAnimation(unitLabel); @@ -690,92 +392,76 @@ public final class MapViewer { } } - /** - * Force the next screen repaint to reposition the tiles on the window. - */ - void forceReposition() { - bottomRow = -1; + private JLabel enterUnitOutForAnimation(final Unit unit, + final Tile sourceTile) { + Integer i = unitsOutForAnimation.get(unit); + if (i == null) { + final JLabel unitLabel = createUnitLabel(unit); + + i = 1; + unitLabel.setLocation(calculateUnitLabelPositionInTile( + unitLabel.getWidth(), unitLabel.getHeight(), + calculateTilePosition(sourceTile))); + unitsOutForAnimationLabels.put(unit, unitLabel); + gui.getCanvas().add(unitLabel, JLayeredPane.DEFAULT_LAYER); + } else { + i++; + } + unitsOutForAnimation.put(unit, i); + return unitsOutForAnimationLabels.get(unit); + } + + private void releaseUnitOutForAnimation(final Unit unit) { + Integer i = unitsOutForAnimation.get(unit); + if (i == null) { + throw new IllegalStateException("Tried to release unit that was not out for animation"); + } + if (i == 1) { + unitsOutForAnimation.remove(unit); + gui.getCanvas().removeFromCanvas(unitsOutForAnimationLabels.remove(unit)); + } else { + i--; + unitsOutForAnimation.put(unit, i); + } } /** - * Gets the active unit. + * Returns true if the given Unit is being animated. * - * @return The Unit. - * @see #setActiveUnit + * @param unit an Unit + * @return a boolean */ - Unit getActiveUnit() { - return activeUnit; - } - - TerrainCursor getCursor() { - return cursor; + private boolean isOutForAnimation(final Unit unit) { + return unitsOutForAnimation.containsKey(unit); } /** - * Gets the point at which the map was clicked for a drag. + * Draw the unit's image and occupation indicator in one JLabel object. * - * @return The Point where the mouse was initially clicked. + * @param unit The unit to be drawn + * @return A JLabel object with the unit's image. */ - Point getDragPoint() { - return gotoDragPoint; - } + private JLabel createUnitLabel(Unit unit) { + final BufferedImage unitImg = lib.getUnitImage(unit); + final int width = halfWidth + unitImg.getWidth()/2; + final int height = unitImg.getHeight(); - /** - * Gets the focus of the map. That is the center tile of the displayed - * map. - * - * @return The center tile of the displayed map - * @see #setFocus(Tile) - */ - Tile getFocus() { - return focus; - } + BufferedImage img = new BufferedImage(width, height, + BufferedImage.TYPE_INT_ARGB); + Graphics2D g = img.createGraphics(); - /** - * Gets the path to be drawn on the map. - * - * @return The path that should be drawn on the map or - * null if no path should be drawn. - */ - PathNode getGotoPath() { - return gotoPath; - } + final int unitX = (width - unitImg.getWidth()) / 2; + g.drawImage(unitImg, unitX, 0, null); - /** - * Gets the contained ImageLibrary. - * - * @return The image library; - */ - public ImageLibrary getImageLibrary() { - return lib; - } + Player player = freeColClient.getMyPlayer(); + String text = Messages.message(unit.getOccupationLabel(player, false)); + g.drawImage(lib.getOccupationIndicatorChip(g, unit, text), 0, 0, null); - /** - * Get the current scale of the map. - * - * @return The current map scale. - */ - public float getMapScale() { - return lib.getScalingFactor(); - } + final JLabel label = new JLabel(new ImageIcon(img)); + label.setSize(width, height); - /** - * Get the size of this GUI. - * - * @return The size of this GUI. - */ - Dimension getSize() { - return size; - } - - /** - * Gets the selected tile. - * - * @return The Tile selected. - * @see #setSelectedTile(Tile, boolean) - */ - Tile getSelectedTile() { - return selectedTile; + g.dispose(); + return label; } /** @@ -821,45 +507,32 @@ public final class MapViewer { return new Point(x, y); } - /** - * Get the ratio of width/height of tiles on the map. - * - * @return The ratio. - */ - double getTileWidthHeightRatio() { - return tileWidth / (double)tileHeight; + int getTileWidth() { + return tileWidth; } /** * Gets the position where a unitLabel located at tile should be drawn. * - * @param unitLabel The unit label with the unit's image and - * occupation indicator drawn. + * @param labelWidth The width of the unit label. + * @param labelHeight The width of the unit label. * @param tileP The position of the Tile on the screen. * @return The position where to put the label, null if tileP is null. */ - Point calculateUnitLabelPositionInTile(JLabel unitLabel, Point tileP) { + Point calculateUnitLabelPositionInTile(int labelWidth,int labelHeight, + Point tileP) { if (tileP != null) { int labelX = tileP.x + tileWidth - / 2 - unitLabel.getWidth() / 2; + / 2 - labelWidth / 2; int labelY = tileP.y + tileHeight - / 2 - unitLabel.getHeight() / 2 - - (int) (UNIT_OFFSET * lib.getScalingFactor()); + / 2 - labelHeight / 2 + - (int) (UNIT_OFFSET * lib.getScaleFactor()); return new Point(labelX, labelY); } else { return null; } } - /** - * Checks if there is currently a goto operation on the mapboard. - * - * @return True if a goto operation is in progress. - */ - boolean isGotoStarted() { - return gotoStarted; - } - /** * Checks if the Tile/Units at the given coordinates are displayed * on the screen (or, if the map is already displayed and the focus @@ -879,92 +552,38 @@ public final class MapViewer { && (tileToCheck.getX() + 2 < rightColumn || alignedRight); } + /** + * Starts the unit-selection-cursor blinking animation. + */ + void startCursorBlinking() { + cursor = new TerrainCursor(); + cursor.addActionListener((ActionEvent ae) -> { + Unit unit = activeUnit; + if (unit != null) { + Tile tile = unit.getTile(); + if (isTileVisible(tile)) gui.refreshTile(tile); + } + }); + cursor.startBlinking(); + } + + void stopBlinking() { + cursor.stopBlinking(); + } + void restartBlinking() { - blinkingMarqueeEnabled = true; + cursor.startBlinking(); } /** - * Scroll the map in the given direction. + * Gets the focus of the map. That is the center tile of the displayed + * map. * - * @param direction The Direction to scroll in. - * @return True if scrolling occurred. + * @return The center tile of the displayed map + * @see #setFocus(Tile) */ - boolean scrollMap(Direction direction) { - Tile t = getFocus(); - if (t == null) return false; - int fx = t.getX(), fy = t.getY(); - if ((t = t.getNeighbourOrNull(direction)) == null) return false; - int tx = t.getX(), ty = t.getY(); - int x, y; - - // When already close to an edge, resist moving the focus closer, - // but if moving away immediately jump out of the `nearTo' area. - if (isMapNearTop(ty) && isMapNearTop(fy)) { - y = (ty <= fy) ? fy : topRows; - } else if (isMapNearBottom(ty) && isMapNearBottom(fy)) { - y = (ty >= fy) ? fy : freeColClient.getGame().getMap().getWidth() - - bottomRows; - } else { - y = ty; - } - if (isMapNearLeft(tx, ty) && isMapNearLeft(fx, fy)) { - x = (tx <= fx) ? fx : getLeftColumns(ty); - } else if (isMapNearRight(tx, ty) && isMapNearRight(fx, fy)) { - x = (tx >= fx) ? fx : freeColClient.getGame().getMap().getWidth() - - getRightColumns(ty); - } else { - x = tx; - } - - if (x == fx && y == fy) return false; - setFocus(freeColClient.getGame().getMap().getTile(x,y)); - return true; - } - - /** - * Sets the active unit. - * - * Invokes {@link #setSelectedTile(Tile, boolean)} if the selected - * tile is another tile than where the activeUnit is located. - * - * @param activeUnit The new active Unit. - * @return True if the focus was set. - * @see #setSelectedTile(Tile, boolean) - */ - boolean setActiveUnit(Unit activeUnit) { - // Don't select a unit with zero moves left. -sjm - // The user might what to check the status of a unit - SG - Tile tile = (activeUnit == null) ? null : activeUnit.getTile(); - this.activeUnit = activeUnit; - - // The user activated a unit - if (getViewMode() == GUI.VIEW_TERRAIN_MODE && activeUnit != null) { - changeViewMode(GUI.MOVE_UNITS_MODE); - } - - if (activeUnit == null || tile == null) { - gui.getCanvas().stopGoto(); - freeColClient.updateActions(); - } else { - updateCurrentPathForActiveUnit(); - if (!setSelectedTile(tile, false) - || freeColClient.getClientOptions() - .getBoolean(ClientOptions.JUMP_TO_ACTIVE_UNIT)) { - setFocus(tile); - return true; - } - } - return false; - } - - /** - * Sets the point at which the map was clicked for a drag. - * - * @param x The mouse's x position. - * @param y The mouse's y position. - */ - void setDragPoint(int x, int y) { - gotoDragPoint = new Point(x, y); + Tile getFocus() { + return focus; } /** @@ -976,33 +595,6 @@ public final class MapViewer { */ void setFocus(Tile focus) { this.focus = focus; - - gui.refresh(); - } - - /** - * Sets the focus of the map and repaints the screen immediately. - * - * @param focus The Position of the center tile of the - * displayed map. - * @see #getFocus - */ - void setFocusImmediately(Tile focus) { - this.focus = focus; - - forceReposition(); - } - - /** - * Sets the path to be drawn on the map. - * - * Dont use this directly, call the method in canvas! - * - * @param gotoPath The path that should be drawn on the map - * or null if no path should be drawn. - */ - void setGotoPath(PathNode gotoPath) { - this.gotoPath = gotoPath; forceReposition(); } @@ -1024,7 +616,7 @@ public final class MapViewer { final int tx = tile.getX(), ty = tile.getY(), width = rightColumn - leftColumn; int moveX = -1; - setFocus(tile); + gui.setFocus(tile); positionMap(tile); if (leftColumn <= 0) { // At left edge already if (tx <= width / 4) { @@ -1050,1556 +642,21 @@ public final class MapViewer { } if (moveX >= 0) { Tile other = map.getTile(moveX, ty); - setFocus(other); + gui.setFocus(other); positionMap(other); } return where; } /** - * Selects the tile at the specified position. There are three - * possible cases: - * - *
    - *
  1. If there is a {@link Colony} on the {@link Tile} the - * {@link Canvas#showColonyPanel} will be invoked. - *
  2. If the tile contains a unit that can become active, then - * that unit will be set as the active unit, and clear their - * goto orders if clearGoToOrders is true - *
  3. If the two conditions above do not match, then the - * selectedTile will become the map focus. - *
- * - * If a unit is active and is located on the selected tile, - * then nothing (except perhaps a map reposition) will happen. - * - * @param newTile The Tile, the tile to be selected - * @param clearGoToOrders Use true to clear goto - * orders of the unit which is activated - * @return True if the focus was set. - * @see #getSelectedTile - * @see #setActiveUnit - * @see #setFocus(Tile) + * Force the next screen repaint to reposition the tiles on the window. */ - boolean setSelectedTile(Tile newTile, boolean clearGoToOrders) { - Tile oldTile = this.selectedTile; - boolean ret = false; - selectedTile = newTile; - - if (getViewMode() == GUI.MOVE_UNITS_MODE) { - if (isNoActiveUnitAt(newTile)) { - if (newTile != null && newTile.hasSettlement()) { - gui.showSettlement(newTile.getSettlement()); - return false; - } - - // else, just select a unit on the selected tile - Unit unitInFront = findUnitInFront(newTile); - if (unitInFront != null) { - ret = setActiveUnit(unitInFront); - updateCurrentPathForActiveUnit(); - } else { - setFocus(newTile); - ret = true; - } - } else { - // Clear goto order when unit is already active - if (clearGoToOrders) { - freeColClient.getInGameController().clearGotoOrders(activeUnit); - updateCurrentPathForActiveUnit(); - } - } - } - - freeColClient.updateActions(); - gui.updateMenuBar(); - - gui.updateMapControls(); - - // Check for refocus - if (!onScreen(newTile) - || freeColClient.getClientOptions().getBoolean(ClientOptions.ALWAYS_CENTER)) { - setFocus(newTile); - ret = true; - } else { - if (oldTile != null) { - gui.refreshTile(oldTile); - } - - if (newTile != null) { - gui.refreshTile(newTile); - } - } - return ret; + void forceReposition() { + bottomRow = -1; } - void setSize(Dimension size) { - this.size = size; - updateMapDisplayVariables(); - } - - /** - * Starts the unit-selection-cursor blinking animation. - */ - void startCursorBlinking() { - blinkingMarqueeEnabled = true; - - ActionListener taskPerformer = new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - if (!blinkingMarqueeEnabled) return; - Unit unit = getActiveUnit(); - if (unit != null) { - Tile tile = unit.getTile(); - if (isTileVisible(tile)) { - gui.refreshTile(tile); - } - } - } - }; - - cursor = new net.sf.freecol.client.gui.TerrainCursor(); - cursor.addActionListener(taskPerformer); - cursor.startBlinking(); - } - - /** - * Starts a goto operation on the mapboard. - * - * Dont use this directly, call the method in canvas! - */ - void startGoto() { - gotoStarted = true; - setGotoPath(null); - } - - void stopBlinking() { - blinkingMarqueeEnabled = false; - } - - /** - * Stops any ongoing goto operation on the mapboard. - * - * Dont use this directly, call the method in canvas! - */ - void stopGoto() { - setGotoPath(null); - updateCurrentPathForActiveUnit(); - gotoStarted = false; - } - - /** - * Reset the scale of the map to the default. - */ - void resetMapScale() { - setImageLibraryAndUpdateData(new ImageLibrary()); - updateMapDisplayVariables(); - } - - boolean isAtMaxMapScale() { - return lib.getScalingFactor() == MAP_SCALE_MAX; - } - - boolean isAtMinMapScale() { - return lib.getScalingFactor() == MAP_SCALE_MIN; - } - - void increaseMapScale() { - float newScale = lib.getScalingFactor() + MAP_SCALE_STEP; - if (newScale >= MAP_SCALE_MAX) - newScale = MAP_SCALE_MAX; - setImageLibraryAndUpdateData(new ImageLibrary(newScale)); - updateMapDisplayVariables(); - } - - void decreaseMapScale() { - float newScale = lib.getScalingFactor() - MAP_SCALE_STEP; - if (newScale <= MAP_SCALE_MIN) - newScale = MAP_SCALE_MIN; - setImageLibraryAndUpdateData(new ImageLibrary(newScale)); - updateMapDisplayVariables(); - } - - /** - * Centers the given Image on the tile. - * - * @param g a Graphics2D - * @param image an Image - */ - private static void displayCenteredImage(Graphics2D g, Image image, - int tileWidth, int tileHeight) { - g.drawImage(image, - (tileWidth - image.getWidth(null))/2, - (tileHeight - image.getHeight(null))/2, - null); - } - - /** - * Draws the pentagram indicating a native capital. - */ - private static BufferedImage createCapitalLabel(int extent, int padding, - Color backgroundColor) { - // create path - double deg2rad = Math.PI/180.0; - double angle = -90.0 * deg2rad; - double offset = extent * 0.5; - double size1 = (extent - padding - padding) * 0.5; - - GeneralPath path = new GeneralPath(); - path.moveTo(Math.cos(angle) * size1 + offset, Math.sin(angle) * size1 + offset); - for (int i = 0; i < 4; i++) { - angle += 144 * deg2rad; - path.lineTo(Math.cos(angle) * size1 + offset, Math.sin(angle) * size1 + offset); - } - path.closePath(); - - // draw everything - BufferedImage bi = new BufferedImage(extent, extent, BufferedImage.TYPE_INT_ARGB); - Graphics2D g = bi.createGraphics(); - g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g.setColor(backgroundColor); - g.fill(new RoundRectangle2D.Float(0, 0, extent, extent, padding, padding)); - g.setColor(Color.BLACK); - g.setStroke(new BasicStroke(2.4f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); - g.draw(path); - g.setColor(Color.WHITE); - g.fill(path); - g.dispose(); - return bi; - } - - - /** - * Creates an BufferedImage that shows the given text centred on a - * translucent rounded rectangle with the given color. - * - * @param g a Graphics2D - * @param text a String - * @param font a Font - * @param backgroundColor a Color - * @return an BufferedImage - */ - private BufferedImage createLabel(Graphics2D g, String text, Font font, - Color backgroundColor) { - TextSpecification[] specs = new TextSpecification[1]; - specs[0] = new TextSpecification(text, font); - return createLabel(g, specs, backgroundColor); - } - - /** - * Creates an BufferedImage that shows the given text centred on a - * translucent rounded rectangle with the given color. - * - * @param g a Graphics2D - * @param textSpecs a TextSpecification array - * @param backgroundColor a Color - * @return a BufferedImage - */ - private BufferedImage createLabel(Graphics2D g, TextSpecification[] textSpecs, - Color backgroundColor) { - int hPadding = 15; - int vPadding = 10; - int linePadding = 5; - int width = 0; - int height = vPadding; - int i; - - TextSpecification spec; - TextLayout[] labels = new TextLayout[textSpecs.length]; - TextLayout label; - - for (i = 0; i < textSpecs.length; i++) { - spec = textSpecs[i]; - label = new TextLayout(spec.text, spec.font, g.getFontRenderContext()); - labels[i] = label; - Rectangle textRectangle = label.getPixelBounds(null, 0, 0); - width = Math.max(width, textRectangle.width + hPadding); - if (i > 0) height += linePadding; - height += (int) (label.getAscent() + label.getDescent()); - } - - int radius = Math.min(hPadding, vPadding); - - BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); - Graphics2D g2 = bi.createGraphics(); - g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); - - g2.setColor(backgroundColor); - g2.fill(new RoundRectangle2D.Float(0, 0, width, height, radius, radius)); - g2.setColor(ImageLibrary.getForegroundColor(backgroundColor)); - float y = vPadding / 2; - for (i = 0; i < labels.length; i++) { - Rectangle textRectangle = labels[i].getPixelBounds(null, 0, 0); - float x = (width - textRectangle.width) / 2; - y += labels[i].getAscent(); - labels[i].draw(g2, x, y); - y += labels[i].getDescent() + linePadding; - } - g2.dispose(); - return bi; - } - - /** - * Draws a cross indicating a religious mission is present in the - * native village. - */ - private static BufferedImage createReligiousMissionLabel(int extent, - int padding, Color backgroundColor, boolean expertMissionary) { - // create path - double offset = extent * 0.5; - double size1 = extent - padding - padding; - double bar = size1 / 3.0; - double inset = 0.0; - double kludge = 0.0; - - GeneralPath circle = new GeneralPath(); - GeneralPath cross = new GeneralPath(); - if (expertMissionary) { - // this is meant to represent the eucharist (the -1, +1 thing is a nasty kludge) - circle.append(new Ellipse2D.Double(padding-1, padding-1, size1+1, size1+1), false); - inset = 4.0; - bar = (size1 - inset - inset) / 3.0; - // more nasty -1, +1 kludges - kludge = 1.0; - } - offset -= 1.0; - cross.moveTo(offset, padding + inset - kludge); - cross.lineTo(offset, extent - padding - inset); - cross.moveTo(offset - bar, padding + bar + inset); - cross.lineTo(offset + bar + 1, padding + bar + inset); - - // draw everything - BufferedImage bi = new BufferedImage(extent, extent, BufferedImage.TYPE_INT_ARGB); - Graphics2D g = bi.createGraphics(); - g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g.setColor(backgroundColor); - g.fill(new RoundRectangle2D.Float(0, 0, extent, extent, padding, padding)); - g.setColor(ImageLibrary.getForegroundColor(backgroundColor)); - if (expertMissionary) { - g.setStroke(new BasicStroke(2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); - g.draw(circle); - g.setStroke(new BasicStroke(1.6f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); - } else { - g.setStroke(new BasicStroke(2.4f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); - } - g.draw(cross); - g.dispose(); - return bi; - } - - /** - * Displays the given Tile onto the given Graphics2D object at the - * location specified by the coordinates. Only base terrain will be drawn. - * - * @param g The Graphics2D object on which to draw the Tile. - * @param library The ImageLibrary to use. - * @param tile The Tile to draw. - * @param drawUnexploredBorders If true; draws border between explored and - * unexplored terrain. - */ - private static void displayTileWithBeachAndBorder(Graphics2D g, - ImageLibrary library, - Tile tile, - boolean drawUnexploredBorders) { - if (tile != null) { - int x = tile.getX(); - int y = tile.getY(); - // ATTENTION: we assume that all base tiles have the same size - g.drawImage(library.getTerrainImage(tile.getType(), x, y), - 0, 0, null); - if (tile.isExplored()) { - if (!tile.isLand() && tile.getStyle() > 0) { - int edgeStyle = tile.getStyle() >> 4; - if (edgeStyle > 0) { - g.drawImage(library.getBeachEdgeImage(edgeStyle, x, y), - 0, 0, null); - } - int cornerStyle = tile.getStyle() & 15; - if (cornerStyle > 0) { - g.drawImage(library.getBeachCornerImage(cornerStyle, x, y), - 0, 0, null); - } - } - - List imageBorders = new ArrayList<>(8); - SortableImage si; - for (Direction direction : Direction.values()) { - Tile borderingTile = tile.getNeighbourOrNull(direction); - if (borderingTile != null) { - - if (!drawUnexploredBorders && !borderingTile.isExplored() && - (direction == Direction.SE || direction == Direction.S || - direction == Direction.SW)) { - continue; - } - - if (tile.getType() == borderingTile.getType()) { - // Equal tiles, no need to draw border - } else if (tile.isLand() && !borderingTile.isLand()) { - // The beach borders are drawn on the side of water tiles only - } else if (!tile.isLand() && borderingTile.isLand() && borderingTile.isExplored()) { - // If there is a Coast image (eg. beach) defined, use it, otherwise skip - // Draw the grass from the neighboring tile, spilling over on the side of this tile - si = new SortableImage(library.getBorderImage(borderingTile.getType(), direction, x, y), - borderingTile.getType().getIndex()); - imageBorders.add(si); - TileImprovement river = borderingTile.getRiver(); - if (river != null && river.isConnectedTo(direction.getReverseDirection())) { - si = new SortableImage(library.getRiverMouthImage(direction, borderingTile - .getRiver().getMagnitude(), x, y), - -1); - imageBorders.add(si); - } - } else if (borderingTile.isExplored()) { - if (library.getTerrainImage(tile.getType(), 0, 0) - .equals(library.getTerrainImage(borderingTile.getType(), 0, 0))) { - // Do not draw limit between tile that share same graphics (ocean & great river) - } else if (borderingTile.getType().getIndex() < tile.getType().getIndex()) { - // Draw land terrain with bordering land type, or ocean/high seas limit - si = new SortableImage(library.getBorderImage(borderingTile.getType(), direction, - x, y), borderingTile.getType().getIndex()); - imageBorders.add(si); - } - } - } - } - Collections.sort(imageBorders); - for (SortableImage sorted : imageBorders) { - g.drawImage(sorted.image, 0, 0, null); - } - } - } - } - - /** - * Displays the given Tile onto the given Graphics2D object at the - * location specified by the coordinates. Fog of war will be - * drawn. - * - * @param g The Graphics2D object on which to draw - * the Tile. - * @param tile The Tile to draw. - */ - private static void displayFogOfWar(FreeColClient freeColClient, - GeneralPath fog, Graphics2D g, Tile tile) { - if (freeColClient.getGame() != null - && freeColClient.getGame().getSpecification() - .getBoolean(GameOptions.FOG_OF_WAR) - && freeColClient.getMyPlayer() != null - && !freeColClient.getMyPlayer().canSee(tile)) { - g.setColor(Color.BLACK); - Composite oldComposite = g.getComposite(); - g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, - 0.2f)); - g.fill(fog); - g.setComposite(oldComposite); - } - } - - - /** - * Display a path. - * - * @param g The Graphics2D to display on. - * @param path The PathNode to display. - */ - private void displayPath(Graphics2D g, PathNode path) { - final Font font = FontLibrary.createFont(FontLibrary.FontType.NORMAL, - FontLibrary.FontSize.TINY, lib.getScalingFactor()); - final boolean debug = FreeColDebugger - .isInDebugMode(FreeColDebugger.DebugMode.PATHS); - - for (PathNode p = path; p != null; p = p.next) { - Tile tile = p.getTile(); - if (tile == null) continue; - Point point = calculateTilePosition(tile); - if (point == null) continue; - - Image image = (p.isOnCarrier()) - ? ImageLibrary.getPathImage(ImageLibrary.PathType.NAVAL) - : (activeUnit != null) - ? ImageLibrary.getPathImage(activeUnit) - : null; - - Image turns = (p.getTurns() <= 0) ? null - : lib.getStringImage(g, Integer.toString(p.getTurns()), - Color.WHITE, font); - g.setColor((turns == null) ? Color.GREEN : Color.RED); - - if (debug) { // More detailed display - if (activeUnit != null) { - image = ImageLibrary.getPathNextTurnImage(activeUnit); - } - turns = lib.getStringImage(g, Integer.toString(p.getTurns()) - + "/" + Integer.toString(p.getMovesLeft()), - Color.WHITE, font); - } - - g.translate(point.x, point.y); - if (image == null) { - g.fillOval(halfWidth, halfHeight, 10, 10); - g.setColor(Color.BLACK); - g.drawOval(halfWidth, halfHeight, 10, 10); - } else { - displayCenteredImage(g, image, tileWidth, tileHeight); - if (turns != null) - displayCenteredImage(g, turns, tileWidth, tileHeight); - } - g.translate(-point.x, -point.y); - } - } - - /** - * Displays the Map onto the given Graphics2D object. The Tile at - * location (x, y) is displayed in the center. - * - * @param g The Graphics2D object on which to draw the Map. - */ - void displayMap(Graphics2D g) { - final ClientOptions options = freeColClient.getClientOptions(); - final Player player = freeColClient.getMyPlayer(); - AffineTransform originTransform = g.getTransform(); - Rectangle clipBounds = g.getClipBounds(); - Map map = freeColClient.getGame().getMap(); - FontLibrary fontLibrary = new FontLibrary(lib.getScalingFactor()); - - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - - /* - PART 1 - ====== - Position the map if it is not positioned yet. - */ - - repositionMapIfNeeded(); - - /* - PART 1a - ======= - Determine which tiles need to be redrawn. - */ - int firstRow = (clipBounds.y - topRowY) / (halfHeight) - 1; - int clipTopY = topRowY + firstRow * (halfHeight); - firstRow = topRow + firstRow; - - int firstColumn = (clipBounds.x - leftColumnX) / tileWidth - 1; - int clipLeftX = leftColumnX + firstColumn * tileWidth; - firstColumn = leftColumn + firstColumn; - - int lastRow = (clipBounds.y + clipBounds.height - topRowY) - / (halfHeight); - lastRow = topRow + lastRow; - - int lastColumn = (clipBounds.x + clipBounds.width - leftColumnX) - / tileWidth; - lastColumn = leftColumn + lastColumn; - - /* - PART 1b - ======= - Create a GeneralPath to draw the grid with, if needed. - */ - if (options.getBoolean(ClientOptions.DISPLAY_GRID)) { - gridPath = new GeneralPath(); - gridPath.moveTo(0, 0); - int nextX = halfWidth; - int nextY = -halfHeight; - - for (int i = 0; i <= ((lastColumn - firstColumn) * 2 + 1); i++) { - gridPath.lineTo(nextX, nextY); - nextX += halfWidth; - nextY = (nextY == 0 ? -halfHeight : 0); - } - } - - /* - PART 2 - ====== - Display the Tiles and the Units. - */ - - g.setColor(Color.black); - g.fillRect(clipBounds.x, clipBounds.y, - clipBounds.width, clipBounds.height); - - /* - PART 2a - ======= - Display the base Tiles - */ - g.translate(clipLeftX, clipTopY); - AffineTransform baseTransform = g.getTransform(); - AffineTransform rowTransform = null; - - // Row per row; start with the top modified row - for (int row = firstRow; row <= lastRow; row++) { - rowTransform = g.getTransform(); - if ((row & 1) == 1) { - g.translate(halfWidth, 0); - } - - // Column per column; start at the left side to display the tiles. - for (int column = firstColumn; column <= lastColumn; column++) { - Tile tile = map.getTile(column, row); - displayTileWithBeachAndBorder(g, lib, tile, true); - g.translate(tileWidth, 0); - } - g.setTransform(rowTransform); - g.translate(0, halfHeight); - } - g.setTransform(baseTransform); - - /* - PART 2b - ======= - Display the Tile overlays and Units - */ - - List units = new ArrayList<>(); - List unitTransforms = new ArrayList<>(); - List settlements = new ArrayList<>(); - List settlementTransforms = new ArrayList<>(); - Set overlayCache = ImageLibrary.createOverlayCache(); - - int colonyLabels = options.getInteger(ClientOptions.COLONY_LABELS); - boolean withNumbers = colonyLabels == ClientOptions.COLONY_LABELS_CLASSIC; - // Row per row; start with the top modified row - for (int row = firstRow; row <= lastRow; row++) { - rowTransform = g.getTransform(); - if ((row & 1) == 1) { - g.translate(halfWidth, 0); - } - - if (options.getBoolean(ClientOptions.DISPLAY_GRID)) { - // Display the grid. - g.translate(0, halfHeight); - g.setStroke(gridStroke); - g.setColor(Color.BLACK); - g.draw(gridPath); - g.translate(0, -halfHeight); - } - - // Column per column; start at the left side to display the tiles. - for (int column = firstColumn; column <= lastColumn; column++) { - Tile tile = map.getTile(column, row); - - // paint full borders - displayTerritorialBorders(g, tile, BorderType.COUNTRY, true); - // Display the Tile overlays: - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_OFF); - if (tile != null && tile.isExplored()) { - for (Direction direction : Direction.values()) { - Tile borderingTile = tile.getNeighbourOrNull(direction); - if (borderingTile != null && !borderingTile.isExplored()) { - g.drawImage(lib.getBorderImage( - null, direction, tile.getX(), tile.getY()), - 0, 0, null); - } - } - Image overlayImage = lib.getOverlayImage(tile, overlayCache); - displayTileItems(g, tile, overlayImage); - displaySettlementWithChipsOrPopulationNumber(freeColClient, - lib, g, tile, tileWidth, tileHeight, withNumbers); - displayFogOfWar(freeColClient, fog, g, tile); - displayOptionalTileTextAndRegionBorder(g, tile); - } - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - // paint transparent borders - displayTerritorialBorders(g, tile, BorderType.COUNTRY, false); - - if (shouldDisplayTileCursor(tile)) { - displayCursor(g); - } - // check for units - if (tile != null) { - Unit unitInFront = findUnitInFront(tile); - if (unitInFront != null && !isOutForAnimation(unitInFront)) { - units.add(unitInFront); - unitTransforms.add(g.getTransform()); - } - // check for settlements - Settlement settlement = tile.getSettlement(); - if (settlement != null) { - settlements.add(settlement); - settlementTransforms.add(g.getTransform()); - } - } - g.translate(tileWidth, 0); - } - - g.setTransform(rowTransform); - g.translate(0, halfHeight); - } - g.setTransform(baseTransform); - - /* - PART 2c - ======= - Display units - */ - if (!units.isEmpty()) { - g.setColor(Color.BLACK); - Image darkness = null; - for (int index = 0; index < units.size(); index++) { - final Unit unit = units.get(index); - g.setTransform(unitTransforms.get(index)); - if (unit.isUndead()) { - if(darkness == null) { - // Rescale dark halo only in rare case its needed! - darkness = lib.getMiscImage(ImageLibrary.DARKNESS); - } - // display darkness - displayCenteredImage(g, darkness, tileWidth, tileHeight); - } - displayUnit(g, unit); - } - g.setTransform(baseTransform); - } - - /* - PART 3 - ====== - Display the colony names. - */ - if (!settlements.isEmpty() - && colonyLabels != ClientOptions.COLONY_LABELS_NONE) { - for (int index = 0; index < settlements.size(); index++) { - final Settlement settlement = settlements.get(index); - if (settlement.isDisposed()) { - logger.warning("Settlement display race detected: " - + settlement.getName()); - continue; - } - String name - = Messages.message(settlement.getLocationLabelFor(player)); - if (name == null) continue; - Color backgroundColor = settlement.getOwner().getNationColor(); - if (backgroundColor == null) backgroundColor = Color.WHITE; - Font font = fontLibrary.createScaledFont(FontLibrary.FontType.NORMAL, FontLibrary.FontSize.SMALLER, Font.BOLD); - Font italicFont = fontLibrary.createScaledFont(FontLibrary.FontType.NORMAL, FontLibrary.FontSize.SMALLER, Font.BOLD | Font.ITALIC); - Font productionFont = fontLibrary.createScaledFont(FontLibrary.FontType.NORMAL, FontLibrary.FontSize.TINY, Font.BOLD); - // int yOffset = lib.getSettlementImage(settlement).getHeight(null) + 1; - int yOffset = tileHeight; - g.setTransform(settlementTransforms.get(index)); - switch (colonyLabels) { - case ClientOptions.COLONY_LABELS_CLASSIC: - Image img = lib.getStringImage(g, name, backgroundColor, font); - g.drawImage(img, (tileWidth - img.getWidth(null))/2 + 1, - yOffset, null); - break; - case ClientOptions.COLONY_LABELS_MODERN: - default: - backgroundColor = new Color(backgroundColor.getRed(), - backgroundColor.getGreen(), - backgroundColor.getBlue(), 128); - TextSpecification[] specs = new TextSpecification[1]; - if (settlement instanceof Colony - && settlement.getOwner() == player) { - Colony colony = (Colony) settlement; - BuildableType buildable = colony.getCurrentlyBuilding(); - if (buildable != null) { - specs = new TextSpecification[2]; - String t = Messages.getName(buildable) - + " " + Turn.getTurnsText(colony.getTurnsToComplete(buildable)); - specs[1] = new TextSpecification(t, productionFont); - } - } - specs[0] = new TextSpecification(name, font); - - Image nameImage = createLabel(g, specs, backgroundColor); - if (nameImage != null) { - int spacing = 3; - Image leftImage = null; - Image rightImage = null; - if (settlement instanceof Colony) { - Colony colony = (Colony)settlement; - String string = Integer.toString(colony.getDisplayUnitCount()); - leftImage = createLabel(g, string, - ((colony.getPreferredSizeChange() > 0) ? italicFont : font), - backgroundColor); - if (player.owns(settlement)) { - int bonusProduction = colony.getProductionBonus(); - if (bonusProduction != 0) { - String bonus = (bonusProduction > 0) - ? "+" + bonusProduction - : Integer.toString(bonusProduction); - rightImage = createLabel(g, bonus, font, - backgroundColor); - } - } - } else if (settlement instanceof IndianSettlement) { - IndianSettlement is = (IndianSettlement) settlement; - if (is.getType().isCapital()) { - leftImage = createCapitalLabel(nameImage.getHeight(null), 5, backgroundColor); - } - - Unit missionary = is.getMissionary(); - if (missionary != null) { - boolean expert = missionary.hasAbility(Ability.EXPERT_MISSIONARY); - backgroundColor = missionary.getOwner().getNationColor(); - backgroundColor = new Color(backgroundColor.getRed(), backgroundColor.getGreen(), backgroundColor.getBlue(), 128); - rightImage = createReligiousMissionLabel(nameImage.getHeight(null), 5, backgroundColor, expert); - } - } - - int width = (int)((nameImage.getWidth(null) - * lib.getScalingFactor()) - + ((leftImage != null) - ? (leftImage.getWidth(null) - * lib.getScalingFactor()) + spacing - : 0) - + ((rightImage != null) - ? (rightImage.getWidth(null) - * lib.getScalingFactor()) + spacing - : 0)); - int labelOffset = (tileWidth - width)/2; - yOffset -= (nameImage.getHeight(null) - * lib.getScalingFactor())/2; - if (leftImage != null) { - g.drawImage(leftImage, labelOffset, yOffset, null); - labelOffset += (leftImage.getWidth(null) - * lib.getScalingFactor()) + spacing; - } - g.drawImage(nameImage, labelOffset, yOffset, null); - if (rightImage != null) { - labelOffset += (nameImage.getWidth(null) - * lib.getScalingFactor()) + spacing; - g.drawImage(rightImage, labelOffset, yOffset, null); - } - break; - } - } - } - } - g.setTransform(originTransform); - - /* - PART 4 - ====== - Display goto path - */ - if (currentPath != null) { - displayPath(g, currentPath); - } - if (gotoPath != null) { - displayPath(g, gotoPath); - } - - } - - /** - * Displays the given Tile onto the given Graphics2D object at the - * location specified by the coordinates. Show tile names, - * coordinates and colony values. - * - * @param g The Graphics2D object on which to draw the Tile. - * @param tile The Tile to draw. - */ - private void displayOptionalTileTextAndRegionBorder(Graphics2D g, Tile tile) { - String text = null; - int op = freeColClient.getClientOptions() - .getInteger(ClientOptions.DISPLAY_TILE_TEXT); - switch (op) { - case ClientOptions.DISPLAY_TILE_TEXT_NAMES: - text = Messages.getName(tile); - break; - case ClientOptions.DISPLAY_TILE_TEXT_OWNERS: - if (tile.getOwner() != null) { - text = Messages.message(tile.getOwner().getNationName()); - } - break; - case ClientOptions.DISPLAY_TILE_TEXT_REGIONS: - if (tile.getRegion() != null) { - if (FreeColDebugger.isInDebugMode(FreeColDebugger.DebugMode.MENUS) - && tile.getRegion().getName() == null) { - text = tile.getRegion().getSuffix(); - } else { - text = Messages.message(tile.getRegion().getLabel()); - } - } - displayTerritorialBorders(g, tile, BorderType.REGION, true); - break; - case ClientOptions.DISPLAY_TILE_TEXT_EMPTY: - break; - default: - logger.warning("displayTileText option " + op + " out of range"); - break; - } - - g.setColor(Color.BLACK); - g.setFont(FontLibrary.createFont(FontLibrary.FontType.NORMAL, - FontLibrary.FontSize.TINY, lib.getScalingFactor())); - if (text != null) { - int b = getBreakingPoint(text); - if (b == -1) { - g.drawString(text, - (tileWidth - g.getFontMetrics().stringWidth(text)) / 2, - (tileHeight - g.getFontMetrics().getAscent()) / 2); - } else { - g.drawString(text.substring(0, b), - (tileWidth - g.getFontMetrics().stringWidth(text.substring(0, b)))/2, - halfHeight - (g.getFontMetrics().getAscent()*2)/3); - g.drawString(text.substring(b+1), - (tileWidth - g.getFontMetrics().stringWidth(text.substring(b+1)))/2, - halfHeight + (g.getFontMetrics().getAscent()*2)/3); - } - } - - if (FreeColDebugger.debugDisplayCoordinates()) { - String posString = tile.getX() + ", " + tile.getY(); - if (tile.getHighSeasCount() >= 0) { - posString += "/" + Integer.toString(tile.getHighSeasCount()); - } - g.drawString(posString, - (tileWidth - g.getFontMetrics().stringWidth(posString)) / 2, - (tileHeight - g.getFontMetrics().getAscent()) / 2); - } - String value = DebugUtils.getColonyValue(tile); - if (value != null) { - g.drawString(value, - (tileWidth - g.getFontMetrics().stringWidth(value)) / 2, - (tileHeight - g.getFontMetrics().getAscent()) / 2); - } - } - - /** - * Displays the given Tile onto the given Graphics2D object at the - * location specified by the coordinates. Settlements and Lost - * City Rumours will be shown. - * - * @param g The Graphics2D object on which to draw the Tile. - * @param tile The Tile to draw. - * @param withNumber Whether to display the number of units present. - */ - private static void displaySettlementWithChipsOrPopulationNumber( - FreeColClient freeColClient, ImageLibrary lib, Graphics2D g, - Tile tile, int tileWidth, int tileHeight, boolean withNumber) { - final Player player = freeColClient.getMyPlayer(); - final Settlement settlement = tile.getSettlement(); - - if (settlement != null) { - if (settlement instanceof Colony) { - Colony colony = (Colony)settlement; - - // Draw image of colony in center of the tile. - Image colonyImage = lib.getSettlementImage(settlement); - displayCenteredImage(g, colonyImage, tileWidth, tileHeight); - - if (withNumber) { - String populationString = Integer.toString( - colony.getDisplayUnitCount()); - int bonus = colony.getProductionBonus(); - Color theColor = ResourceManager.getColor( - "color.map.productionBonus." + bonus); - // if government admits even more units, use - // italic and bigger number icon - Font font = (colony.getPreferredSizeChange() > 0) - ? FontLibrary.createFont(FontLibrary.FontType.SIMPLE, - FontLibrary.FontSize.SMALLER, Font.BOLD | Font.ITALIC, - lib.getScalingFactor()) - : FontLibrary.createFont(FontLibrary.FontType.SIMPLE, - FontLibrary.FontSize.TINY, Font.BOLD, - lib.getScalingFactor()); - Image stringImage = lib.getStringImage(g, - populationString, theColor, font); - displayCenteredImage(g, stringImage, tileWidth, tileHeight); - } - - } else if (settlement instanceof IndianSettlement) { - IndianSettlement is = (IndianSettlement)settlement; - Image settlementImage = lib.getSettlementImage(settlement); - - // Draw image of indian settlement in center of the tile. - displayCenteredImage(g, settlementImage, tileWidth, tileHeight); - - Image chip; - float xOffset = STATE_OFFSET_X * lib.getScalingFactor(); - float yOffset = STATE_OFFSET_Y * lib.getScalingFactor(); - final int colonyLabels = freeColClient.getClientOptions() - .getInteger(ClientOptions.COLONY_LABELS); - if (colonyLabels != ClientOptions.COLONY_LABELS_MODERN) { - // Draw the settlement chip - chip = lib.getIndianSettlementChip(g, is); - g.drawImage(chip, (int)xOffset, (int)yOffset, null); - xOffset += chip.getWidth(null) + 2; - - // Draw the mission chip if needed. - Unit missionary = is.getMissionary(); - if (missionary != null) { - boolean expert - = missionary.hasAbility(Ability.EXPERT_MISSIONARY); - g.drawImage(lib.getMissionChip(g, missionary.getOwner(), - expert), - (int)xOffset, (int)yOffset, null); - xOffset += chip.getWidth(null) + 2; - } - } - - // Draw the alarm chip if needed. - if ((chip = lib.getAlarmChip(g, is, player)) != null) { - g.drawImage(chip, (int)xOffset, (int)yOffset, null); - } - } else { - logger.warning("Bogus settlement: " + settlement); - } - } - } - - /** - * Displays the given Tile onto the given Graphics2D object at the - * location specified by the coordinates. Addtions and - * improvements to Tile will be drawn. - * - * @param g The Graphics2D object on which to draw the Tile. - * @param tile The Tile to draw. - * @param overlayImage The Image for the tile overlay. - */ - private void displayTileItems(Graphics2D g, Tile tile, Image overlayImage) { - // ATTENTION: we assume that only overlays and forests - // might be taller than a tile. - if (!tile.isExplored()) { - g.drawImage(lib.getTerrainImage(null, tile.getX(), tile.getY()), 0, 0, null); - } else { - // layer additions and improvements according to zIndex - List tileItems = (tile.getTileItemContainer() != null) - ? tile.getTileItemContainer().getTileItems() - : new ArrayList(); - int startIndex = 0; - for (int index = startIndex; index < tileItems.size(); index++) { - if (tileItems.get(index).getZIndex() < OVERLAY_INDEX) { - displayTileItem(g, tile, tileItems.get(index)); - startIndex = index + 1; - } else { - startIndex = index; - break; - } - } - // Tile Overlays (eg. hills and mountains) - if (overlayImage != null) { - g.drawImage(overlayImage, 0, (tileHeight - overlayImage.getHeight(null)), null); - } - for (int index = startIndex; index < tileItems.size(); index++) { - if (tileItems.get(index).getZIndex() < FOREST_INDEX) { - displayTileItem(g, tile, tileItems.get(index)); - startIndex = index + 1; - } else { - startIndex = index; - break; - } - } - // Forest - if (tile.isForested()) { - Image forestImage = lib.getForestImage(tile.getType(), tile.getRiverStyle()); - g.drawImage(forestImage, 0, (tileHeight - forestImage.getHeight(null)), null); - } - - // draw all remaining items - for (TileItem ti : tileItems.subList(startIndex, tileItems.size())) { - displayTileItem(g, tile, ti); - } - } - } - - /** - * Displays the given Unit onto the given Graphics2D object at the - * location specified by the coordinates. - * - * @param g The Graphics2D object on which to draw the Unit. - * @param unit The Unit to draw. - */ - private void displayUnit(Graphics2D g, Unit unit) { - final Player player = freeColClient.getMyPlayer(); - - // Draw the 'selected unit' image if needed. - //if ((unit == getActiveUnit()) && cursor) { - if (shouldDisplayUnitCursor(unit)) displayCursor(g); - - // Draw the unit. - // If unit is sentry, draw in grayscale - boolean fade = (unit.getState() == Unit.UnitState.SENTRY) - || (unit.hasTile() - && player != null && !player.canSee(unit.getTile())); - Image image = lib.getUnitImage(unit, fade); - Point p = calculateUnitImagePositionInTile(image); - g.drawImage(image, p.x, p.y, null); - - // Draw an occupation and nation indicator. - String text = Messages.message(unit.getOccupationLabel(player, false)); - g.drawImage(lib.getOccupationIndicatorChip(g, unit, text), - (int)(STATE_OFFSET_X * lib.getScalingFactor()), 0, - null); - - // Draw one small line for each additional unit (like in civ3). - int unitsOnTile = 0; - if (unit.hasTile()) { - // When a unit is moving from tile to tile, it is - // removed from the source tile. So the unit stack - // indicator cannot be drawn during the movement see - // UnitMoveAnimation.animate() for details - unitsOnTile = unit.getTile().getTotalUnitCount(); - } - if (unitsOnTile > 1) { - g.setColor(Color.WHITE); - int unitLinesY = OTHER_UNITS_OFFSET_Y; - int x1 = (int)((STATE_OFFSET_X + OTHER_UNITS_OFFSET_X) - * lib.getScalingFactor()); - int x2 = (int)((STATE_OFFSET_X + OTHER_UNITS_OFFSET_X - + OTHER_UNITS_WIDTH) * lib.getScalingFactor()); - for (int i = 0; i < unitsOnTile && i < MAX_OTHER_UNITS; i++) { - g.drawLine(x1, unitLinesY, x2, unitLinesY); - unitLinesY += 2; - } - } - - // FOR DEBUGGING - net.sf.freecol.server.ai.AIUnit au; - if (FreeColDebugger.isInDebugMode(FreeColDebugger.DebugMode.MENUS) - && player != null - && !player.owns(unit) - && unit.getOwner().isAI() - && freeColClient.getFreeColServer() != null - && (au = freeColClient.getFreeColServer().getAIMain() - .getAIUnit(unit)) != null) { - if (FreeColDebugger.debugShowMission()) { - g.setColor(Color.WHITE); - g.drawString((!au.hasMission()) ? "No mission" - : lastPart(au.getMission().getClass().toString(), "."), - 0, 0); - } - if (FreeColDebugger.debugShowMissionInfo() && au.hasMission()) { - g.setColor(Color.WHITE); - g.drawString(au.getMission().toString(), 0, 25); - } - } - } - - private void displayCursor(Graphics2D g) { - Image cursorImage = lib.getMiscImage(ImageLibrary.UNIT_SELECT); - g.drawImage(cursorImage, 0, 0, null); - } - - /** - * Draws the given TileItem on the given Tile. - */ - private void displayTileItem(Graphics2D g, Tile tile, TileItem item) { - if (item instanceof Resource) { - displayResourceTileItem(g, lib, (Resource) item, tileWidth, tileHeight); - } else if (item instanceof LostCityRumour) { - displayLostCityRumour(g, lib, tileWidth, tileHeight); - } else { - displayTileImprovement(g, lib, rp, tile, (TileImprovement)item); - } - } - - private static void displayResourceTileItem(Graphics2D g, ImageLibrary lib, - Resource item, - int tileWidth, int tileHeight) { - Image bonusImage = lib.getMiscImage("image.tileitem." + item.getType().getId()); - displayCenteredImage(g, bonusImage, tileWidth, tileHeight); - } - - private static void displayLostCityRumour(Graphics2D g, ImageLibrary lib, - int tileWidth, int tileHeight) { - displayCenteredImage(g, lib.getMiscImage(ImageLibrary.LOST_CITY_RUMOUR), - tileWidth, tileHeight); - } - - private static void displayTileImprovement(Graphics2D g, ImageLibrary lib, - RoadPainter rp, - Tile tile, TileImprovement ti) { - if (ti.isComplete()) { - if (ti.isRoad()) { - rp.displayRoad(g, tile); - } else if (ti.isRiver() - && ti.getMagnitude() < TileImprovement.FJORD_RIVER) { - // @compat 0.10.5 - // America_large had some bogus rivers in 0.10.5 - if (ti.getStyle() != null) - // end @compat 0.10.5 - g.drawImage(lib.getRiverImage(ti.getStyle()), 0, 0, null); - } else { - String key = "image.tile." + ti.getType().getId(); - if (ResourceManager.hasImageResource(key)) { - // Has its own Overlay Image in Misc, use it - Image overlay = ResourceManager.getImage(key, - lib.getScalingFactor()); - g.drawImage(overlay, 0, 0, null); - } - } - } - } - - private JLabel enterUnitOutForAnimation(final Unit unit, - final Tile sourceTile) { - Integer i = unitsOutForAnimation.get(unit); - if (i == null) { - final JLabel unitLabel = createUnitLabel(unit); - - i = 1; - unitLabel.setLocation(calculateUnitLabelPositionInTile(unitLabel, - calculateTilePosition(sourceTile))); - unitsOutForAnimationLabels.put(unit, unitLabel); - gui.getCanvas().add(unitLabel, JLayeredPane.DEFAULT_LAYER); - } else { - i++; - } - unitsOutForAnimation.put(unit, i); - return unitsOutForAnimationLabels.get(unit); - } - - /** - * Returns the amount of columns that are to the left of the Tile - * that is displayed in the center of the Map. - * - * @return The amount of columns that are to the left of the Tile - * that is displayed in the center of the Map. - */ - private int getLeftColumns() { - return getLeftColumns(focus.getY()); - } - - /** - * Returns the amount of columns that are to the left of the Tile - * with the given y-coordinate. - * - * @param y The y-coordinate of the Tile in question. - * @return The amount of columns that are to the left of the Tile - * with the given y-coordinate. - */ - private int getLeftColumns(int y) { - int leftColumns = leftSpace / tileWidth + 1; - - if ((y & 1) == 0) { - if ((leftSpace % tileWidth) > 32) { - leftColumns++; - } - } else { - if ((leftSpace % tileWidth) == 0) { - leftColumns--; - } - } - - return leftColumns; - } - - /** - * Returns the amount of columns that are to the right of the Tile - * that is displayed in the center of the Map. - * - * @return The amount of columns that are to the right of the Tile - * that is displayed in the center of the Map. - */ - private int getRightColumns() { - return getRightColumns(focus.getY()); - } - - /** - * Returns the amount of columns that are to the right of the Tile - * with the given y-coordinate. - * - * @param y The y-coordinate of the Tile in question. - * @return The amount of columns that are to the right of the Tile - * with the given y-coordinate. - */ - private int getRightColumns(int y) { - int rightColumns = rightSpace / tileWidth + 1; - - if ((y & 1) == 0) { - if ((rightSpace % tileWidth) == 0) { - rightColumns--; - } - } else { - if ((rightSpace % tileWidth) > 32) { - rightColumns++; - } - } - - return rightColumns; - } - - /** - * Gets the coordinates to draw a unit in a given tile. - * - * @param unitImage The unit's image - * @return The coordinates where the unit should be drawn onscreen - */ - private Point calculateUnitImagePositionInTile(Image unitImage) { - int unitX = (tileWidth - unitImage.getWidth(null)) / 2; - int unitY = (tileHeight - unitImage.getHeight(null)) / 2 - - (int) (UNIT_OFFSET * lib.getScalingFactor()); - - return new Point(unitX, unitY); - } - - /** - * Gets the unit that should be displayed on the given tile. - * - * @param unitTile The Tile to check. - * @return The Unit to display or null if none found. - */ - private Unit findUnitInFront(Tile unitTile) { - Unit result; - - if (unitTile == null || unitTile.isEmpty()) { - result = null; - - } else if (activeUnit != null && activeUnit.getTile() == unitTile) { - result = activeUnit; - - } else if (unitTile.hasSettlement()) { - result = null; - - } else if (activeUnit != null && activeUnit.isOffensiveUnit()) { - result = unitTile.getDefendingUnit(activeUnit); - - } else { - // Find the unit with the most moves left, preferring - // active units. - List units = unitTile.getUnitList(); - result = units.remove(0); - int best = result.getMovesLeft(); - boolean carrier, - active = result.getState() == Unit.UnitState.ACTIVE; - for (Unit u : units) { - carrier = false; - if (active) { - if (u.getState() == Unit.UnitState.ACTIVE) { - if (best < u.getMovesLeft()) { - best = u.getMovesLeft(); - result = u; - } - } else { - carrier = !u.isEmpty(); - } - } else if (u.getState() == Unit.UnitState.ACTIVE) { - active = true; - best = u.getMovesLeft(); - result = u; - } else { - if (best < u.getMovesLeft()) { - best = u.getMovesLeft(); - result = u; - } - carrier = !u.isEmpty(); - } - if (carrier) { - // Check for active units on carriers. Usually the - // carrier takes precedence. - for (Unit c : u.getUnitList()) { - if (active) { - if (best < c.getMovesLeft()) { - best = c.getMovesLeft(); - result = c; - } - } else if (c.getState() == Unit.UnitState.ACTIVE) { - active = true; - best = c.getMovesLeft(); - result = c; - } - } - } - } - } - return result; - } - - /** - * Draw the unit's image and occupation indicator in one JLabel object. - * - * @param unit The unit to be drawn - * @return A JLabel object with the unit's image. - */ - private JLabel createUnitLabel(Unit unit) { - final Image unitImg = lib.getUnitImage(unit); - final int width = halfWidth + unitImg.getWidth(null)/2; - final int height = unitImg.getHeight(null); - - BufferedImage img = new BufferedImage(width, height, - BufferedImage.TYPE_INT_ARGB); - Graphics2D g = img.createGraphics(); - - final int unitX = (width - unitImg.getWidth(null)) / 2; - g.drawImage(unitImg, unitX, 0, null); - - Player player = freeColClient.getMyPlayer(); - String text = Messages.message(unit.getOccupationLabel(player, false)); - g.drawImage(lib.getOccupationIndicatorChip(g, unit, text), 0, 0, null); - - final JLabel label = new JLabel(new ImageIcon(img)); - label.setSize(width, height); - - g.dispose(); - return label; - } - - /** - * Is a y-coordinate near the bottom? - * - * @param y The y-coordinate. - * @return True if near the bottom. - */ - private boolean isMapNearBottom(int y) { - return y >= freeColClient.getGame().getMap().getHeight() - bottomRows; - } - - /** - * Is an x,y coordinate near the left? - * - * @param x The x-coordinate. - * @param y The y-coordinate. - * @return True if near the left. - */ - private boolean isMapNearLeft(int x, int y) { - return x < getLeftColumns(y); - } - - /** - * Is an x,y coordinate near the right? - * - * @param x The x-coordinate. - * @param y The y-coordinate. - * @return True if near the right. - */ - private boolean isMapNearRight(int x, int y) { - return x >= freeColClient.getGame().getMap().getWidth() - - getRightColumns(y); - } - - /** - * Is a y-coordinate near the top? - * - * @param y The y-coordinate. - * @return True if near the top. - */ - private boolean isMapNearTop(int y) { - return y < topRows; - } - - /** - * Returns true if the given Unit is being animated. - * - * @param unit an Unit - * @return a boolean - */ - private boolean isOutForAnimation(final Unit unit) { - return unitsOutForAnimation.containsKey(unit); - } - - private boolean isTileVisible(Tile tile) { - if (tile == null) return false; - return tile.getY() >= topRow && tile.getY() <= bottomRow - && tile.getX() >= leftColumn && tile.getX() <= rightColumn; - } - - private boolean isNoActiveUnitAt(Tile tile) { - return activeUnit == null || activeUnit.getTile() != tile; - } - - /** - * Draws the borders of a territory on the given Tile. The - * territory is either a country or a region. - * - * @param g a Graphics2D - * @param tile a Tile - * @param type a BorderType - * @param opaque a boolean - */ - private void displayTerritorialBorders(Graphics2D g, Tile tile, BorderType type, boolean opaque) { - if (tile == null || - (type == BorderType.COUNTRY - && !freeColClient.getClientOptions().getBoolean(ClientOptions.DISPLAY_BORDERS))) { - return; - } - Player owner = tile.getOwner(); - Region region = tile.getRegion(); - if ((type == BorderType.COUNTRY && owner != null) - || (type == BorderType.REGION && region != null)) { - Stroke oldStroke = g.getStroke(); - g.setStroke(borderStroke); - Color oldColor = g.getColor(); - Color newColor = Color.WHITE; - if (type == BorderType.COUNTRY) { - Color c = owner.getNationColor(); - if (c != null) { - newColor = new Color(c.getRed(), c.getGreen(), c.getBlue(), - (opaque) ? 255 : 100); - } - } - g.setColor(newColor); - GeneralPath path = new GeneralPath(GeneralPath.WIND_EVEN_ODD); - path.moveTo(borderPoints.get(Direction.longSides.get(0)).x, - borderPoints.get(Direction.longSides.get(0)).y); - for (Direction d : Direction.longSides) { - Tile otherTile = tile.getNeighbourOrNull(d); - Direction next = d.getNextDirection(); - Direction next2 = next.getNextDirection(); - if (otherTile == null - || (type == BorderType.COUNTRY && !owner.owns(otherTile)) - || (type == BorderType.REGION && otherTile.getRegion() != region)) { - Tile tile1 = tile.getNeighbourOrNull(next); - Tile tile2 = tile.getNeighbourOrNull(next2); - if (tile2 == null - || (type == BorderType.COUNTRY && !owner.owns(tile2)) - || (type == BorderType.REGION && tile2.getRegion() != region)) { - // small corner - path.lineTo(borderPoints.get(next).x, - borderPoints.get(next).y); - path.quadTo(controlPoints.get(next).x, - controlPoints.get(next).y, - borderPoints.get(next2).x, - borderPoints.get(next2).y); - } else { - int dx = 0, dy = 0; - switch(d) { - case NW: dx = halfWidth; dy = -halfHeight; break; - case NE: dx = halfWidth; dy = halfHeight; break; - case SE: dx = -halfWidth; dy = halfHeight; break; - case SW: dx = -halfWidth; dy = -halfHeight; break; - default: break; - } - if (tile1 != null - && ((type == BorderType.COUNTRY && owner.owns(tile1)) - || (type == BorderType.REGION && tile1.getRegion() == region))) { - // short straight line - path.lineTo(borderPoints.get(next).x, - borderPoints.get(next).y); - // big corner - Direction previous = d.getPreviousDirection(); - Direction previous2 = previous.getPreviousDirection(); - int ddx = 0, ddy = 0; - switch(d) { - case NW: ddy = -tileHeight; break; - case NE: ddx = tileWidth; break; - case SE: ddy = tileHeight; break; - case SW: ddx = -tileWidth; break; - default: break; - } - path.quadTo(controlPoints.get(previous).x + dx, - controlPoints.get(previous).y + dy, - borderPoints.get(previous2).x + ddx, - borderPoints.get(previous2).y + ddy); - } else { - // straight line - path.lineTo(borderPoints.get(d).x + dx, - borderPoints.get(d).y + dy); - } - } - } else { - path.moveTo(borderPoints.get(next2).x, - borderPoints.get(next2).y); - } - } - g.draw(path); - g.setColor(oldColor); - g.setStroke(oldStroke); - } + private void repositionMapIfNeeded() { + if (bottomRow < 0 && focus != null) positionMap(focus); } /** @@ -2700,22 +757,474 @@ public final class MapViewer { } } - private void releaseUnitOutForAnimation(final Unit unit) { - Integer i = unitsOutForAnimation.get(unit); - if (i == null) { - throw new IllegalStateException("Tried to release unit that was not out for animation"); - } - if (i == 1) { - unitsOutForAnimation.remove(unit); - gui.getCanvas().removeFromCanvas(unitsOutForAnimationLabels.remove(unit)); + /** + * Scroll the map in the given direction. + * + * @param direction The Direction to scroll in. + * @return True if scrolling occurred. + */ + boolean scrollMap(Direction direction) { + Tile t = focus; + if (t == null) return false; + int fx = t.getX(), fy = t.getY(); + if ((t = t.getNeighbourOrNull(direction)) == null) return false; + int tx = t.getX(), ty = t.getY(); + int x, y; + + // When already close to an edge, resist moving the focus closer, + // but if moving away immediately jump out of the `nearTo' area. + if (isMapNearTop(ty) && isMapNearTop(fy)) { + y = (ty <= fy) ? fy : topRows; + } else if (isMapNearBottom(ty) && isMapNearBottom(fy)) { + y = (ty >= fy) ? fy : freeColClient.getGame().getMap().getWidth() + - bottomRows; } else { - i--; - unitsOutForAnimation.put(unit, i); + y = ty; } + if (isMapNearLeft(tx, ty) && isMapNearLeft(fx, fy)) { + x = (tx <= fx) ? fx : getLeftColumns(ty); + } else if (isMapNearRight(tx, ty) && isMapNearRight(fx, fy)) { + x = (tx >= fx) ? fx : freeColClient.getGame().getMap().getWidth() + - getRightColumns(ty); + } else { + x = tx; + } + + if (x == fx && y == fy) return false; + gui.setFocus(freeColClient.getGame().getMap().getTile(x,y)); + return true; } - private void repositionMapIfNeeded() { - if (bottomRow < 0 && focus != null) positionMap(focus); + /** + * Is a y-coordinate near the bottom? + * + * @param y The y-coordinate. + * @return True if near the bottom. + */ + private boolean isMapNearBottom(int y) { + return y >= freeColClient.getGame().getMap().getHeight() - bottomRows; + } + + /** + * Is an x,y coordinate near the left? + * + * @param x The x-coordinate. + * @param y The y-coordinate. + * @return True if near the left. + */ + private boolean isMapNearLeft(int x, int y) { + return x < getLeftColumns(y); + } + + /** + * Is an x,y coordinate near the right? + * + * @param x The x-coordinate. + * @param y The y-coordinate. + * @return True if near the right. + */ + private boolean isMapNearRight(int x, int y) { + return x >= freeColClient.getGame().getMap().getWidth() + - getRightColumns(y); + } + + /** + * Returns the amount of columns that are to the left of the Tile + * that is displayed in the center of the Map. + * + * @return The amount of columns that are to the left of the Tile + * that is displayed in the center of the Map. + */ + private int getLeftColumns() { + return getLeftColumns(focus.getY()); + } + + /** + * Returns the amount of columns that are to the left of the Tile + * with the given y-coordinate. + * + * @param y The y-coordinate of the Tile in question. + * @return The amount of columns that are to the left of the Tile + * with the given y-coordinate. + */ + private int getLeftColumns(int y) { + int leftColumns = leftSpace / tileWidth + 1; + + if ((y & 1) == 0) { + if ((leftSpace % tileWidth) > 32) { + leftColumns++; + } + } else { + if ((leftSpace % tileWidth) == 0) { + leftColumns--; + } + } + + return leftColumns; + } + + /** + * Returns the amount of columns that are to the right of the Tile + * that is displayed in the center of the Map. + * + * @return The amount of columns that are to the right of the Tile + * that is displayed in the center of the Map. + */ + private int getRightColumns() { + return getRightColumns(focus.getY()); + } + + /** + * Returns the amount of columns that are to the right of the Tile + * with the given y-coordinate. + * + * @param y The y-coordinate of the Tile in question. + * @return The amount of columns that are to the right of the Tile + * with the given y-coordinate. + */ + private int getRightColumns(int y) { + int rightColumns = rightSpace / tileWidth + 1; + + if ((y & 1) == 0) { + if ((rightSpace % tileWidth) == 0) { + rightColumns--; + } + } else { + if ((rightSpace % tileWidth) > 32) { + rightColumns++; + } + } + + return rightColumns; + } + + /** + * Is a y-coordinate near the top? + * + * @param y The y-coordinate. + * @return True if near the top. + */ + private boolean isMapNearTop(int y) { + return y < topRows; + } + + private boolean isTileVisible(Tile tile) { + if (tile == null) return false; + return tile.getY() >= topRow && tile.getY() <= bottomRow + && tile.getX() >= leftColumn && tile.getX() <= rightColumn; + } + + /** + * Gets the selected tile. + * + * @return The Tile selected. + */ + Tile getSelectedTile() { + return selectedTile; + } + + /** + * Selects the tile at the specified position. There are two + * possible cases: + * + *
    + *
  1. If the tile contains a unit that can become active, then + * that unit will be set as the active unit. + *
  2. If not, the selectedTile will become the map focus. + *
+ * + * If a unit is active and is located on the selected tile, + * then nothing (except perhaps a map reposition) will happen. + * + * @param newTile The Tile, the tile to be selected + * @return True if the focus was set. + * @see #getSelectedTile + * @see #setActiveUnit + * @see #setFocus(Tile) + */ + boolean setSelectedTile(Tile newTile) { + Tile oldTile = this.selectedTile; + boolean ret = false; + selectedTile = newTile; + + if (viewMode == GUI.MOVE_UNITS_MODE) { + if (activeUnit == null || activeUnit.getTile() != newTile) { + // select a unit on the selected tile + Unit unitInFront = findUnitInFront(newTile); + if (unitInFront != null) { + ret = gui.setActiveUnit(unitInFront); + updateCurrentPathForActiveUnit(); + } else { + gui.setFocus(newTile); + ret = true; + } + } + } + + // Check for refocus + if (!onScreen(newTile) + || freeColClient.getClientOptions().getBoolean(ClientOptions.ALWAYS_CENTER)) { + gui.setFocus(newTile); + ret = true; + } else { + if (oldTile != null) { + gui.refreshTile(oldTile); + } + + if (newTile != null) { + gui.refreshTile(newTile); + } + } + return ret; + } + + /** + * Gets the unit that should be displayed on the given tile. + * + * @param unitTile The Tile to check. + * @return The Unit to display or null if none found. + */ + private Unit findUnitInFront(Tile unitTile) { + Unit result; + + if (unitTile == null || unitTile.isEmpty()) { + result = null; + + } else if (activeUnit != null && activeUnit.getTile() == unitTile) { + result = activeUnit; + + } else if (unitTile.hasSettlement()) { + result = null; + + } else if (activeUnit != null && activeUnit.isOffensiveUnit()) { + result = unitTile.getDefendingUnit(activeUnit); + + } else { + // Find the unit with the most moves left, preferring + // active units. + List units = unitTile.getUnitList(); + result = units.remove(0); + int best = result.getMovesLeft(); + boolean carrier, + active = result.getState() == Unit.UnitState.ACTIVE; + for (Unit u : units) { + carrier = false; + if (active) { + if (u.getState() == Unit.UnitState.ACTIVE) { + if (best < u.getMovesLeft()) { + best = u.getMovesLeft(); + result = u; + } + } else { + carrier = !u.isEmpty(); + } + } else if (u.getState() == Unit.UnitState.ACTIVE) { + active = true; + best = u.getMovesLeft(); + result = u; + } else { + if (best < u.getMovesLeft()) { + best = u.getMovesLeft(); + result = u; + } + carrier = !u.isEmpty(); + } + if (carrier) { + // Check for active units on carriers. Usually the + // carrier takes precedence. + for (Unit c : u.getUnitList()) { + if (active) { + if (best < c.getMovesLeft()) { + best = c.getMovesLeft(); + result = c; + } + } else if (c.getState() == Unit.UnitState.ACTIVE) { + active = true; + best = c.getMovesLeft(); + result = c; + } + } + } + } + } + return result; + } + + /** + * Gets the active unit. + * + * @return The Unit. + * @see #setActiveUnit + */ + Unit getActiveUnit() { + return activeUnit; + } + + /** + * Sets the active unit. + * + * @param activeUnit The new active Unit. + * @return True if the focus was set. + */ + boolean setActiveUnit(Unit activeUnit) { + // Don't select a unit with zero moves left. -sjm + // The user might what to check the status of a unit - SG + Tile tile = (activeUnit == null) ? null : activeUnit.getTile(); + this.activeUnit = activeUnit; + + // The user activated a unit + if (viewMode == GUI.VIEW_TERRAIN_MODE && activeUnit != null) { + changeViewMode(GUI.MOVE_UNITS_MODE); + } + + if (activeUnit == null || tile == null) { + gui.getCanvas().stopGoto(); + } else { + updateCurrentPathForActiveUnit(); + if (!gui.setSelectedTile(tile) + || freeColClient.getClientOptions() + .getBoolean(ClientOptions.JUMP_TO_ACTIVE_UNIT)) { + gui.setFocus(tile); + return true; + } + } + return false; + } + + /** + * Checks if there is currently a goto operation on the mapboard. + * + * @return True if a goto operation is in progress. + */ + boolean isGotoStarted() { + return gotoStarted; + } + + /** + * Starts a goto operation on the mapboard. + * + * Dont use this directly, call the method in canvas! + */ + void startGoto() { + gotoStarted = true; + setGotoPath(null); + } + + /** + * Stops any ongoing goto operation on the mapboard. + * + * Dont use this directly, call the method in canvas! + */ + void stopGoto() { + setGotoPath(null); + updateCurrentPathForActiveUnit(); + gotoStarted = false; + } + + /** + * Gets the path to be drawn on the map. + * + * @return The path that should be drawn on the map or + * null if no path should be drawn. + */ + PathNode getGotoPath() { + return gotoPath; + } + + /** + * Sets the path to be drawn on the map. + * + * Dont use this directly, call the method in canvas! + * + * @param gotoPath The path that should be drawn on the map + * or null if no path should be drawn. + */ + void setGotoPath(PathNode gotoPath) { + this.gotoPath = gotoPath; + forceReposition(); + } + + /** + * Sets the path of the active unit to display it. + */ + void updateCurrentPathForActiveUnit() { + PathNode path; + if (activeUnit == null + || activeUnit.getDestination() == null + || ((FreeColGameObject)activeUnit.getDestination()).isDisposed() + || Map.isSameLocation(activeUnit.getLocation(), + activeUnit.getDestination())) { + path = null; + } else { + try { + path = activeUnit.findPath(activeUnit.getDestination()); + } catch (Exception e) { + logger.log(Level.WARNING, "Path fail", e); + path = null; + activeUnit.setDestination(null); + } + } + setCurrentPath(path); + } + + /** + * Set the current active unit path. + * + * @param path The current PathNode. + */ + void setCurrentPath(PathNode path) { + this.currentPath = path; + } + + void setSize(Dimension size) { + this.size = size; + updateMapDisplayVariables(); + } + + /** + * Reset the scale of the map to the default. + */ + void resetMapScale() { + setImageLibraryAndUpdateData(new ImageLibrary()); + updateMapDisplayVariables(); + } + + boolean isAtMaxMapScale() { + return lib.getScaleFactor() == MAP_SCALE_MAX; + } + + boolean isAtMinMapScale() { + return lib.getScaleFactor() == MAP_SCALE_MIN; + } + + void increaseMapScale() { + float newScale = lib.getScaleFactor() + MAP_SCALE_STEP; + if (newScale >= MAP_SCALE_MAX) + newScale = MAP_SCALE_MAX; + setImageLibraryAndUpdateData(new ImageLibrary(newScale)); + updateMapDisplayVariables(); + } + + void decreaseMapScale() { + float newScale = lib.getScaleFactor() - MAP_SCALE_STEP; + if (newScale <= MAP_SCALE_MIN) + newScale = MAP_SCALE_MIN; + setImageLibraryAndUpdateData(new ImageLibrary(newScale)); + updateMapDisplayVariables(); + } + + private void updateMapDisplayVariables() { + // Calculate the amount of rows that will be drawn above the + // central Tile + topSpace = (size.height - tileHeight) / 2; + if ((topSpace % (halfHeight)) != 0) { + topRows = topSpace / (halfHeight) + 2; + } else { + topRows = topSpace / (halfHeight) + 1; + } + bottomRows = topRows; + leftSpace = (size.width - tileWidth) / 2; + rightSpace = leftSpace; } /** @@ -2726,12 +1235,12 @@ public final class MapViewer { */ private void setImageLibraryAndUpdateData(ImageLibrary lib) { this.lib = lib; - rp = new RoadPainter(lib); + tv.setImageLibraryAndUpdateData(lib); // ATTENTION: we assume that all base tiles have the same size - Image unexplored = lib.getTerrainImage(null, 0, 0); - tileHeight = unexplored.getHeight(null); + Dimension tileSize = lib.tileSize; + tileHeight = tileSize.height; + tileWidth = tileSize.width; halfHeight = tileHeight/2; - tileWidth = unexplored.getWidth(null); halfWidth = tileWidth/2; int dx = tileWidth/16; @@ -2760,38 +1269,815 @@ public final class MapViewer { borderPoints.put(Direction.W, new Point2D.Float(dx + ddx, halfHeight + ddy)); borderStroke = new BasicStroke(dy); - gridStroke = new BasicStroke(lib.getScalingFactor()); - - fog.reset(); - fog.moveTo(halfWidth, 0); - fog.lineTo(tileWidth, halfHeight); - fog.lineTo(halfWidth, tileHeight); - fog.lineTo(0, halfHeight); - fog.closePath(); + gridStroke = new BasicStroke(lib.getScaleFactor()); } - private void updateMapDisplayVariables() { - // Calculate the amount of rows that will be drawn above the - // central Tile - topSpace = (size.height - tileHeight) / 2; - if ((topSpace % (halfHeight)) != 0) { - topRows = topSpace / (halfHeight) + 2; - } else { - topRows = topSpace / (halfHeight) + 1; + /** + * Displays the Map. + * + * @param g The Graphics2D object on which to draw the Map. + */ + void displayMap(Graphics2D g) { + final ClientOptions options = freeColClient.getClientOptions(); + Game game = freeColClient.getGame(); + Map map = game.getMap(); + + // Remember transform + AffineTransform originTransform = g.getTransform(); + Rectangle clipBounds = g.getClipBounds(); + + // Position the map if it is not positioned yet + repositionMapIfNeeded(); + + // Determine which tiles need to be redrawn + int firstRow = (clipBounds.y - topRowY) / (halfHeight) - 1; + int clipTopY = topRowY + firstRow * (halfHeight); + firstRow = topRow + firstRow; + + int firstColumn = (clipBounds.x - leftColumnX) / tileWidth - 1; + int clipLeftX = leftColumnX + firstColumn * tileWidth; + firstColumn = leftColumn + firstColumn; + + int lastRow = (clipBounds.y + clipBounds.height - topRowY) + / (halfHeight); + lastRow = topRow + lastRow; + + int lastColumn = (clipBounds.x + clipBounds.width - leftColumnX) + / tileWidth; + lastColumn = leftColumn + lastColumn; + + // Clear background + g.setColor(Color.black); + g.fillRect(clipBounds.x, clipBounds.y, + clipBounds.width, clipBounds.height); + + // Set and remember transform for upper left corner + g.translate(clipLeftX, clipTopY); + AffineTransform baseTransform = g.getTransform(); + + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + + // Display the base Tiles + final int x0 = firstColumn; + final int y0 = firstRow; + map.forSubMap(x0, y0, lastColumn-firstColumn+1, lastRow-firstRow+1, + (Tile tile) -> { + final int x = tile.getX(); + final int y = tile.getY(); + final int xt = (x-x0) * tileWidth + (y&1) * halfWidth; + final int yt = (y-y0) * halfHeight; + g.translate(xt, yt); + + tv.displayTileWithBeachAndBorder(g, tile); + tv.displayUnknownTileBorder(g, tile); + + g.translate(-xt, -yt); + }); + + // Draw the grid, if needed + if (options.getBoolean(ClientOptions.DISPLAY_GRID)) { + // Generate a zigzag GeneralPath + GeneralPath gridPath = new GeneralPath(); + gridPath.moveTo(0, 0); + int nextX = halfWidth; + int nextY = -halfHeight; + for (int i = 0; i <= ((lastColumn - firstColumn) * 2 + 1); i++) { + gridPath.lineTo(nextX, nextY); + nextX += halfWidth; + nextY = (nextY == 0 ? -halfHeight : 0); + } + + // Display the grid + g.setStroke(gridStroke); + g.setColor(Color.BLACK); + for (int row = firstRow; row <= lastRow; row++) { + g.translate(0, halfHeight); + AffineTransform rowTransform = g.getTransform(); + if ((row & 1) == 1) { + g.translate(halfWidth, 0); + } + g.draw(gridPath); + g.setTransform(rowTransform); + } + g.setTransform(baseTransform); + } + + // Paint full region borders + if (options.getInteger(ClientOptions.DISPLAY_TILE_TEXT) == + ClientOptions.DISPLAY_TILE_TEXT_REGIONS) { + map.forSubMap(x0, y0-1, lastColumn-firstColumn+1, lastRow-firstRow+1+1, + (Tile tile) -> { + final int x = tile.getX(); + final int y = tile.getY(); + final int xt = (x-x0) * tileWidth + (y&1) * halfWidth; + final int yt = (y-y0) * halfHeight; + g.translate(xt, yt); + displayTerritorialBorders(g, tile, BorderType.REGION, true); + g.translate(-xt, -yt); + }); + } + + // Paint full country borders + if (options.getBoolean(ClientOptions.DISPLAY_BORDERS)) { + map.forSubMap(x0, y0-1, lastColumn-firstColumn+1, lastRow-firstRow+1+1, + (Tile tile) -> { + final int x = tile.getX(); + final int y = tile.getY(); + final int xt = (x-x0) * tileWidth + (y&1) * halfWidth; + final int yt = (y-y0) * halfHeight; + g.translate(xt, yt); + displayTerritorialBorders(g, tile, BorderType.COUNTRY, true); + g.translate(-xt, -yt); + }); + } + + // Display the Tile overlays + Set overlayCache = ImageLibrary.createOverlayCache(); + int colonyLabels = options.getInteger(ClientOptions.COLONY_LABELS); + boolean withNumbers = colonyLabels == ClientOptions.COLONY_LABELS_CLASSIC; + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_OFF); + map.forSubMap(x0, y0, lastColumn-firstColumn+1, lastRow-firstRow+1, + (Tile tile) -> { + if (!tile.isExplored()) + return; + + final int x = tile.getX(); + final int y = tile.getY(); + final int xt = (x-x0) * tileWidth + (y&1) * halfWidth; + final int yt = (y-y0) * halfHeight; + g.translate(xt, yt); + + BufferedImage overlayImage = lib.getOverlayImage(tile, overlayCache); + tv.displayTileItems(g, tile, overlayImage); + tv.displaySettlementWithChipsOrPopulationNumber( + g, tile, withNumbers); + tv.displayFogOfWar(g, tile); + tv.displayOptionalTileText(g, tile); + + g.translate(-xt, -yt); + }); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + + // Paint transparent region borders + if (options.getInteger(ClientOptions.DISPLAY_TILE_TEXT) == + ClientOptions.DISPLAY_TILE_TEXT_REGIONS) { + map.forSubMap(x0, y0-1, lastColumn-firstColumn+1, lastRow-firstRow+1+1, + (Tile tile) -> { + final int x = tile.getX(); + final int y = tile.getY(); + final int xt = (x-x0) * tileWidth + (y&1) * halfWidth; + final int yt = (y-y0) * halfHeight; + g.translate(xt, yt); + displayTerritorialBorders(g, tile, BorderType.REGION, false); + g.translate(-xt, -yt); + }); + } + + // Paint transparent country borders + if (options.getBoolean(ClientOptions.DISPLAY_BORDERS)) { + map.forSubMap(x0, y0-1, lastColumn-firstColumn+1, lastRow-firstRow+1+1, + (Tile tile) -> { + final int x = tile.getX(); + final int y = tile.getY(); + final int xt = (x-x0) * tileWidth + (y&1) * halfWidth; + final int yt = (y-y0) * halfHeight; + g.translate(xt, yt); + displayTerritorialBorders(g, tile, BorderType.COUNTRY, false); + g.translate(-xt, -yt); + }); + } + + // Display cursor for selected tile or active unit + Tile cursorTile = null; + switch (viewMode) { + case GUI.MOVE_UNITS_MODE: + if (activeUnit != null && + (cursor.isActive() || activeUnit.getMovesLeft() <= 0)) + cursorTile = activeUnit.getTile(); + break; + case GUI.VIEW_TERRAIN_MODE: + if (selectedTile != null) + cursorTile = selectedTile; + } + if (cursorTile != null) { + final int x = cursorTile.getX(); + final int y = cursorTile.getY(); + if(x >= x0 && y >= y0 && x <= lastColumn && y <= lastRow) { + final int xt = (x-x0) * tileWidth + (y&1) * halfWidth; + final int yt = (y-y0) * halfHeight; + g.translate(xt, yt); + displayCursor(g); + g.translate(-xt, -yt); + } + } + + // Display units + g.setColor(Color.BLACK); + if(!game.isInRevengeMode()) { + map.forSubMap(x0, y0, lastColumn-firstColumn+1, lastRow-firstRow+1, + (Tile tile) -> { + // check for units + Unit unit = findUnitInFront(tile); + if (unit == null || isOutForAnimation(unit)) + return; + + final int x = tile.getX(); + final int y = tile.getY(); + final int xt = (x-x0) * tileWidth + (y&1) * halfWidth; + final int yt = (y-y0) * halfHeight; + g.translate(xt, yt); + + displayUnit(g, unit); + + g.translate(-xt, -yt); + }); + } else { + /* Add extra rows and colums, as the dark halo is huge to enable + a very slow fade into transparency, see BR#2580 */ + map.forSubMap(x0-2, y0-4, lastColumn-firstColumn+1+4, lastRow-firstRow+1+8, + (Tile tile) -> { + // check for units + Unit unit = findUnitInFront(tile); + if (unit == null) + return; + + final int x = tile.getX(); + final int y = tile.getY(); + final int xt = (x-x0) * tileWidth + (y&1) * halfWidth; + final int yt = (y-y0) * halfHeight; + g.translate(xt, yt); + + if (unit.isUndead()) { + // Rescale dark halo only in rare case its needed! + BufferedImage darkness = lib.getMiscImage(ImageLibrary.DARKNESS); + tv.displayCenteredImage(g, darkness); + } + if (!isOutForAnimation(unit)) + displayUnit(g, unit); + + g.translate(-xt, -yt); + }); + } + + // Display the colony names, if needed + if (colonyLabels != ClientOptions.COLONY_LABELS_NONE) { + final Player player = freeColClient.getMyPlayer(); + FontLibrary fontLibrary = new FontLibrary(lib.getScaleFactor()); + Font font = fontLibrary.createScaledFont( + FontLibrary.FontType.NORMAL, FontLibrary.FontSize.SMALLER, + Font.BOLD); + Font italicFont = fontLibrary.createScaledFont( + FontLibrary.FontType.NORMAL, FontLibrary.FontSize.SMALLER, + Font.BOLD | Font.ITALIC); + Font productionFont = fontLibrary.createScaledFont( + FontLibrary.FontType.NORMAL, FontLibrary.FontSize.TINY, + Font.BOLD); + + /* For settlement names and territorial borders 1 extra row needs + to be drawn in north to prevent missing parts on partial redraws, + as they can reach below their tiles, see BR#2580 */ + map.forSubMap(x0, y0-1, lastColumn-firstColumn+1, lastRow-firstRow+1+1, + (Tile tile) -> { + Settlement settlement = tile.getSettlement(); + if(settlement == null) + return; + + final int x = tile.getX(); + final int y = tile.getY(); + final int xt = (x-x0) * tileWidth + (y&1) * halfWidth; + final int yt = (y-y0) * halfHeight; + g.translate(xt, yt); + + displaySettlementLabels(g, settlement, player, colonyLabels, + font, italicFont, productionFont); + + g.translate(-xt, -yt); + }); + } + + // Restore original transform to allow for more drawing + g.setTransform(originTransform); + + // Display goto path + if (currentPath != null) { + displayPath(g, currentPath); + } + if (gotoPath != null) { + displayPath(g, gotoPath); } - bottomRows = topRows; - leftSpace = (size.width - tileWidth) / 2; - rightSpace = leftSpace; } - private boolean shouldDisplayTileCursor(Tile tile) { - return viewMode == GUI.VIEW_TERRAIN_MODE - && tile != null && tile.equals(selectedTile); + private void displaySettlementLabels(Graphics2D g, Settlement settlement, + Player player, int colonyLabels, + Font font, Font italicFont, + Font productionFont) { + if (settlement.isDisposed()) { + logger.warning("Settlement display race detected: " + + settlement.getName()); + return; + } + String name = Messages.message(settlement.getLocationLabelFor(player)); + if (name == null) return; + + Color backgroundColor = settlement.getOwner().getNationColor(); + if (backgroundColor == null) backgroundColor = Color.WHITE; + // int yOffset = lib.getSettlementImage(settlement).getHeight() + 1; + int yOffset = tileHeight; + switch (colonyLabels) { + case ClientOptions.COLONY_LABELS_CLASSIC: + BufferedImage img = lib.getStringImage(g, name, backgroundColor, font); + g.drawImage(img, (tileWidth - img.getWidth())/2 + 1, + yOffset, null); + break; + + case ClientOptions.COLONY_LABELS_MODERN: + default: + backgroundColor = new Color(backgroundColor.getRed(), + backgroundColor.getGreen(), + backgroundColor.getBlue(), 128); + TextSpecification[] specs = new TextSpecification[1]; + if (settlement instanceof Colony + && settlement.getOwner() == player) { + Colony colony = (Colony) settlement; + BuildableType buildable = colony.getCurrentlyBuilding(); + if (buildable != null) { + specs = new TextSpecification[2]; + String t = Messages.getName(buildable) + " " + + Turn.getTurnsText(colony.getTurnsToComplete(buildable)); + specs[1] = new TextSpecification(t, productionFont); + } + } + specs[0] = new TextSpecification(name, font); + + BufferedImage nameImage = createLabel(g, specs, backgroundColor); + if (nameImage != null) { + int spacing = 3; + BufferedImage leftImage = null; + BufferedImage rightImage = null; + if (settlement instanceof Colony) { + Colony colony = (Colony)settlement; + String string = Integer.toString( + colony.getDisplayUnitCount()); + leftImage = createLabel(g, string, + ((colony.getPreferredSizeChange() > 0) + ? italicFont : font), + backgroundColor); + if (player.owns(settlement)) { + int bonusProduction = colony.getProductionBonus(); + if (bonusProduction != 0) { + String bonus = (bonusProduction > 0) + ? "+" + bonusProduction + : Integer.toString(bonusProduction); + rightImage = createLabel(g, bonus, font, + backgroundColor); + } + } + } else if (settlement instanceof IndianSettlement) { + IndianSettlement is = (IndianSettlement) settlement; + if (is.getType().isCapital()) { + leftImage = createCapitalLabel( + nameImage.getHeight(), 5, backgroundColor); + } + + Unit missionary = is.getMissionary(); + if (missionary != null) { + boolean expert = missionary.hasAbility( + Ability.EXPERT_MISSIONARY); + backgroundColor = missionary.getOwner() + .getNationColor(); + backgroundColor = new Color( + backgroundColor.getRed(), + backgroundColor.getGreen(), + backgroundColor.getBlue(), 128); + rightImage = createReligiousMissionLabel( + nameImage.getHeight(), 5, + backgroundColor, expert); + } + } + + int width = (int)((nameImage.getWidth() + * lib.getScaleFactor()) + + ((leftImage != null) + ? (leftImage.getWidth() + * lib.getScaleFactor()) + spacing + : 0) + + ((rightImage != null) + ? (rightImage.getWidth() + * lib.getScaleFactor()) + spacing + : 0)); + int labelOffset = (tileWidth - width)/2; + yOffset -= (nameImage.getHeight() + * lib.getScaleFactor())/2; + if (leftImage != null) { + g.drawImage(leftImage, labelOffset, yOffset, null); + labelOffset += (leftImage.getWidth() + * lib.getScaleFactor()) + spacing; + } + g.drawImage(nameImage, labelOffset, yOffset, null); + if (rightImage != null) { + labelOffset += (nameImage.getWidth() + * lib.getScaleFactor()) + spacing; + g.drawImage(rightImage, labelOffset, yOffset, null); + } + break; + } + } } - private boolean shouldDisplayUnitCursor(Unit unit) { - return viewMode == GUI.MOVE_UNITS_MODE - && unit == activeUnit - && (cursor.isActive() || unit.getMovesLeft() <= 0); + /** + * Draws the pentagram indicating a native capital. + */ + private static BufferedImage createCapitalLabel(int extent, int padding, + Color backgroundColor) { + // create path + double deg2rad = Math.PI/180.0; + double angle = -90.0 * deg2rad; + double offset = extent * 0.5; + double size1 = (extent - padding - padding) * 0.5; + + GeneralPath path = new GeneralPath(); + path.moveTo(Math.cos(angle) * size1 + offset, Math.sin(angle) * size1 + offset); + for (int i = 0; i < 4; i++) { + angle += 144 * deg2rad; + path.lineTo(Math.cos(angle) * size1 + offset, Math.sin(angle) * size1 + offset); + } + path.closePath(); + + // draw everything + BufferedImage bi = new BufferedImage(extent, extent, BufferedImage.TYPE_INT_ARGB); + Graphics2D g = bi.createGraphics(); + g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g.setColor(backgroundColor); + g.fill(new RoundRectangle2D.Float(0, 0, extent, extent, padding, padding)); + g.setColor(Color.BLACK); + g.setStroke(new BasicStroke(2.4f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); + g.draw(path); + g.setColor(Color.WHITE); + g.fill(path); + g.dispose(); + return bi; } + + /** + * Creates an BufferedImage that shows the given text centred on a + * translucent rounded rectangle with the given color. + * + * @param g a Graphics2D + * @param text a String + * @param font a Font + * @param backgroundColor a Color + * @return an BufferedImage + */ + private static BufferedImage createLabel(Graphics2D g, String text, + Font font, Color backgroundColor) { + TextSpecification[] specs = new TextSpecification[1]; + specs[0] = new TextSpecification(text, font); + return createLabel(g, specs, backgroundColor); + } + + /** + * Creates an BufferedImage that shows the given text centred on a + * translucent rounded rectangle with the given color. + * + * @param g a Graphics2D + * @param textSpecs a TextSpecification array + * @param backgroundColor a Color + * @return a BufferedImage + */ + private static BufferedImage createLabel(Graphics2D g, + TextSpecification[] textSpecs, + Color backgroundColor) { + int hPadding = 15; + int vPadding = 10; + int linePadding = 5; + int width = 0; + int height = vPadding; + int i; + + TextSpecification spec; + TextLayout[] labels = new TextLayout[textSpecs.length]; + TextLayout label; + + for (i = 0; i < textSpecs.length; i++) { + spec = textSpecs[i]; + label = new TextLayout(spec.text, spec.font, g.getFontRenderContext()); + labels[i] = label; + Rectangle textRectangle = label.getPixelBounds(null, 0, 0); + width = Math.max(width, textRectangle.width + hPadding); + if (i > 0) height += linePadding; + height += (int) (label.getAscent() + label.getDescent()); + } + + int radius = Math.min(hPadding, vPadding); + + BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + Graphics2D g2 = bi.createGraphics(); + g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); + + g2.setColor(backgroundColor); + g2.fill(new RoundRectangle2D.Float(0, 0, width, height, radius, radius)); + g2.setColor(ImageLibrary.getForegroundColor(backgroundColor)); + float y = vPadding / 2; + for (i = 0; i < labels.length; i++) { + Rectangle textRectangle = labels[i].getPixelBounds(null, 0, 0); + float x = (width - textRectangle.width) / 2; + y += labels[i].getAscent(); + labels[i].draw(g2, x, y); + y += labels[i].getDescent() + linePadding; + } + g2.dispose(); + return bi; + } + + /** + * Draws a cross indicating a religious mission is present in the + * native village. + */ + private static BufferedImage createReligiousMissionLabel(int extent, + int padding, Color backgroundColor, boolean expertMissionary) { + // create path + double offset = extent * 0.5; + double size1 = extent - padding - padding; + double bar = size1 / 3.0; + double inset = 0.0; + double kludge = 0.0; + + GeneralPath circle = new GeneralPath(); + GeneralPath cross = new GeneralPath(); + if (expertMissionary) { + // this is meant to represent the eucharist (the -1, +1 thing is a nasty kludge) + circle.append(new Ellipse2D.Double(padding-1, padding-1, size1+1, size1+1), false); + inset = 4.0; + bar = (size1 - inset - inset) / 3.0; + // more nasty -1, +1 kludges + kludge = 1.0; + } + offset -= 1.0; + cross.moveTo(offset, padding + inset - kludge); + cross.lineTo(offset, extent - padding - inset); + cross.moveTo(offset - bar, padding + bar + inset); + cross.lineTo(offset + bar + 1, padding + bar + inset); + + // draw everything + BufferedImage bi = new BufferedImage(extent, extent, BufferedImage.TYPE_INT_ARGB); + Graphics2D g = bi.createGraphics(); + g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g.setColor(backgroundColor); + g.fill(new RoundRectangle2D.Float(0, 0, extent, extent, padding, padding)); + g.setColor(ImageLibrary.getForegroundColor(backgroundColor)); + if (expertMissionary) { + g.setStroke(new BasicStroke(2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); + g.draw(circle); + g.setStroke(new BasicStroke(1.6f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); + } else { + g.setStroke(new BasicStroke(2.4f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); + } + g.draw(cross); + g.dispose(); + return bi; + } + + + /** + * Display a path. + * + * @param g The Graphics2D to display on. + * @param path The PathNode to display. + */ + private void displayPath(Graphics2D g, PathNode path) { + final Font font = FontLibrary.createFont(FontLibrary.FontType.NORMAL, + FontLibrary.FontSize.TINY, lib.getScaleFactor()); + final boolean debug = FreeColDebugger + .isInDebugMode(FreeColDebugger.DebugMode.PATHS); + + for (PathNode p = path; p != null; p = p.next) { + Tile tile = p.getTile(); + if (tile == null) continue; + Point point = calculateTilePosition(tile); + if (point == null) continue; + + BufferedImage image = (p.isOnCarrier()) + ? ImageLibrary.getPathImage(ImageLibrary.PathType.NAVAL) + : (activeUnit != null) + ? ImageLibrary.getPathImage(activeUnit) + : null; + + BufferedImage turns = (p.getTurns() <= 0) ? null + : lib.getStringImage(g, Integer.toString(p.getTurns()), + Color.WHITE, font); + g.setColor((turns == null) ? Color.GREEN : Color.RED); + + if (debug) { // More detailed display + if (activeUnit != null) { + image = ImageLibrary.getPathNextTurnImage(activeUnit); + } + turns = lib.getStringImage(g, Integer.toString(p.getTurns()) + + "/" + Integer.toString(p.getMovesLeft()), + Color.WHITE, font); + } + + g.translate(point.x, point.y); + if (image == null) { + g.fillOval(halfWidth, halfHeight, 10, 10); + g.setColor(Color.BLACK); + g.drawOval(halfWidth, halfHeight, 10, 10); + } else { + tv.displayCenteredImage(g, image); + if (turns != null) { + tv.displayCenteredImage(g, turns); + } + } + g.translate(-point.x, -point.y); + } + } + + /** + * Displays the given Unit onto the given Graphics2D object at the + * location specified by the coordinates. + * + * @param g The Graphics2D object on which to draw the Unit. + * @param unit The Unit to draw. + */ + private void displayUnit(Graphics2D g, Unit unit) { + final Player player = freeColClient.getMyPlayer(); + + // Draw the unit. + // If unit is sentry, draw in grayscale + boolean fade = (unit.getState() == Unit.UnitState.SENTRY) + || (unit.hasTile() + && player != null && !player.canSee(unit.getTile())); + BufferedImage image = lib.getUnitImage(unit, fade); + Point p = calculateUnitImagePositionInTile(image); + g.drawImage(image, p.x, p.y, null); + + // Draw an occupation and nation indicator. + String text = Messages.message(unit.getOccupationLabel(player, false)); + g.drawImage(lib.getOccupationIndicatorChip(g, unit, text), + (int)(TileViewer.STATE_OFFSET_X * lib.getScaleFactor()), 0, + null); + + // Draw one small line for each additional unit (like in civ3). + int unitsOnTile = 0; + if (unit.hasTile()) { + // When a unit is moving from tile to tile, it is + // removed from the source tile. So the unit stack + // indicator cannot be drawn during the movement see + // UnitMoveAnimation.animate() for details + unitsOnTile = unit.getTile().getTotalUnitCount(); + } + if (unitsOnTile > 1) { + g.setColor(Color.WHITE); + int unitLinesY = OTHER_UNITS_OFFSET_Y; + int x1 = (int)((TileViewer.STATE_OFFSET_X + OTHER_UNITS_OFFSET_X) + * lib.getScaleFactor()); + int x2 = (int)((TileViewer.STATE_OFFSET_X + OTHER_UNITS_OFFSET_X + + OTHER_UNITS_WIDTH) * lib.getScaleFactor()); + for (int i = 0; i < unitsOnTile && i < MAX_OTHER_UNITS; i++) { + g.drawLine(x1, unitLinesY, x2, unitLinesY); + unitLinesY += 2; + } + } + + // FOR DEBUGGING + net.sf.freecol.server.ai.AIUnit au; + if (FreeColDebugger.isInDebugMode(FreeColDebugger.DebugMode.MENUS) + && player != null + && !player.owns(unit) + && unit.getOwner().isAI() + && freeColClient.getFreeColServer() != null + && (au = freeColClient.getFreeColServer().getAIMain() + .getAIUnit(unit)) != null) { + if (FreeColDebugger.debugShowMission()) { + g.setColor(Color.WHITE); + g.drawString((!au.hasMission()) ? "No mission" + : lastPart(au.getMission().getClass().toString(), "."), + 0, 0); + } + if (FreeColDebugger.debugShowMissionInfo() && au.hasMission()) { + g.setColor(Color.WHITE); + g.drawString(au.getMission().toString(), 0, 25); + } + } + } + + /** + * Gets the coordinates to draw a unit in a given tile. + * + * @param unitImage The unit's image + * @return The coordinates where the unit should be drawn onscreen + */ + private Point calculateUnitImagePositionInTile(BufferedImage unitImage) { + int unitX = (tileWidth - unitImage.getWidth()) / 2; + int unitY = (tileHeight - unitImage.getHeight()) / 2 - + (int) (UNIT_OFFSET * lib.getScaleFactor()); + + return new Point(unitX, unitY); + } + + private void displayCursor(Graphics2D g) { + BufferedImage cursorImage = lib.getMiscImage(ImageLibrary.UNIT_SELECT); + g.drawImage(cursorImage, 0, 0, null); + } + + /** + * Draws the borders of a territory on the given Tile. The + * territory is either a country or a region. + * + * @param g a Graphics2D + * @param tile a Tile + * @param type a BorderType + * @param opaque a boolean + */ + private void displayTerritorialBorders(Graphics2D g, Tile tile, BorderType type, boolean opaque) { + Player owner = tile.getOwner(); + Region region = tile.getRegion(); + if ((type == BorderType.COUNTRY && owner != null) + || (type == BorderType.REGION && region != null)) { + Stroke oldStroke = g.getStroke(); + g.setStroke(borderStroke); + Color oldColor = g.getColor(); + Color c = null; + if (type == BorderType.COUNTRY) + c = owner.getNationColor(); + if (c == null) + c = Color.WHITE; + Color newColor = new Color(c.getRed(), c.getGreen(), c.getBlue(), + (opaque) ? 255 : 100); + g.setColor(newColor); + GeneralPath path = new GeneralPath(GeneralPath.WIND_EVEN_ODD); + path.moveTo(borderPoints.get(Direction.longSides.get(0)).x, + borderPoints.get(Direction.longSides.get(0)).y); + for (Direction d : Direction.longSides) { + Tile otherTile = tile.getNeighbourOrNull(d); + Direction next = d.getNextDirection(); + Direction next2 = next.getNextDirection(); + if (otherTile == null + || (type == BorderType.COUNTRY && !owner.owns(otherTile)) + || (type == BorderType.REGION && otherTile.getRegion() != region)) { + Tile tile1 = tile.getNeighbourOrNull(next); + Tile tile2 = tile.getNeighbourOrNull(next2); + if (tile2 == null + || (type == BorderType.COUNTRY && !owner.owns(tile2)) + || (type == BorderType.REGION && tile2.getRegion() != region)) { + // small corner + path.lineTo(borderPoints.get(next).x, + borderPoints.get(next).y); + path.quadTo(controlPoints.get(next).x, + controlPoints.get(next).y, + borderPoints.get(next2).x, + borderPoints.get(next2).y); + } else { + int dx = 0, dy = 0; + switch(d) { + case NW: dx = halfWidth; dy = -halfHeight; break; + case NE: dx = halfWidth; dy = halfHeight; break; + case SE: dx = -halfWidth; dy = halfHeight; break; + case SW: dx = -halfWidth; dy = -halfHeight; break; + default: break; + } + if (tile1 != null + && ((type == BorderType.COUNTRY && owner.owns(tile1)) + || (type == BorderType.REGION && tile1.getRegion() == region))) { + // short straight line + path.lineTo(borderPoints.get(next).x, + borderPoints.get(next).y); + // big corner + Direction previous = d.getPreviousDirection(); + Direction previous2 = previous.getPreviousDirection(); + int ddx = 0, ddy = 0; + switch(d) { + case NW: ddy = -tileHeight; break; + case NE: ddx = tileWidth; break; + case SE: ddy = tileHeight; break; + case SW: ddx = -tileWidth; break; + default: break; + } + path.quadTo(controlPoints.get(previous).x + dx, + controlPoints.get(previous).y + dy, + borderPoints.get(previous2).x + ddx, + borderPoints.get(previous2).y + ddy); + } else { + // straight line + path.lineTo(borderPoints.get(d).x + dx, + borderPoints.get(d).y + dy); + } + } + } else { + path.moveTo(borderPoints.get(next2).x, + borderPoints.get(next2).y); + } + } + g.draw(path); + g.setColor(oldColor); + g.setStroke(oldStroke); + } + } + } diff --git a/src/net/sf/freecol/client/gui/OutForAnimationCallback.java b/src/net/sf/freecol/client/gui/OutForAnimationCallback.java index 2abfde808..3dc72f17f 100644 --- a/src/net/sf/freecol/client/gui/OutForAnimationCallback.java +++ b/src/net/sf/freecol/client/gui/OutForAnimationCallback.java @@ -30,9 +30,9 @@ public interface OutForAnimationCallback { /** * The code to be executed when a unit is out for animation. + * * @param unitLabel A JLabel with an image of - * the unit provided as a parameter to - * {@link MapViewer#executeWithUnitOutForAnimation(net.sf.freecol.common.model.Unit, net.sf.freecol.common.model.Tile, OutForAnimationCallback)}. + * the unit to animate. */ - public void executeWithUnitOutForAnimation(JLabel unitLabel); + void executeWithUnitOutForAnimation(JLabel unitLabel); } diff --git a/src/net/sf/freecol/client/gui/RoadPainter.java b/src/net/sf/freecol/client/gui/RoadPainter.java index 1d4fc61ef..1ffdba487 100644 --- a/src/net/sf/freecol/client/gui/RoadPainter.java +++ b/src/net/sf/freecol/client/gui/RoadPainter.java @@ -21,8 +21,8 @@ package net.sf.freecol.client.gui; import java.awt.BasicStroke; import java.awt.Color; +import java.awt.Dimension; import java.awt.Graphics2D; -import java.awt.Image; import java.awt.RenderingHints; import java.awt.Stroke; import java.awt.geom.GeneralPath; @@ -31,8 +31,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.EnumMap; import java.util.List; +import java.util.stream.Collectors; import net.sf.freecol.common.model.Direction; +import net.sf.freecol.common.model.Map; import net.sf.freecol.common.model.Tile; import net.sf.freecol.common.model.TileImprovement; import net.sf.freecol.common.resources.ResourceManager; @@ -52,12 +54,10 @@ public final class RoadPainter { new EnumMap<>(Direction.class); private Stroke roadStroke = new BasicStroke(2); - public RoadPainter(ImageLibrary lib) { - // ATTENTION: we assume that all base tiles have the same size - Image unexplored = lib.getTerrainImage(null, 0, 0); - tileHeight = unexplored.getHeight(null); + public RoadPainter(Dimension tileSize) { + tileHeight = tileSize.height; + tileWidth = tileSize.width; halfHeight = tileHeight/2; - tileWidth = unexplored.getWidth(null); halfWidth = tileWidth/2; int dy = tileHeight/16; @@ -97,20 +97,23 @@ public final class RoadPainter { Color oldColor = g.getColor(); g.setColor(ResourceManager.getColor("color.map.road")); g.setStroke(roadStroke); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); GeneralPath path = new GeneralPath(); + Map map = tile.getMap(); + int x = tile.getX(); + int y = tile.getY(); List points = new ArrayList<>(8); - List directions = new ArrayList<>(8); - for (Direction direction : Direction.values()) { - Tile borderingTile = tile.getNeighbourOrNull(direction); - TileImprovement r; - if (borderingTile != null - && (r = borderingTile.getRoad()) != null - && r.isComplete()) { - points.add(corners.get(direction)); - directions.add(direction); - } - } + List directions = Direction.allDirections.stream() + .filter((Direction direction) -> { + Tile borderingTile = map.getTile(direction.step(x, y)); + TileImprovement r; + return (borderingTile != null + && (r = borderingTile.getRoad()) != null + && r.isComplete()); + }) + .peek((Direction direction) -> points.add(corners.get(direction))) + .collect(Collectors.toList()); switch(points.size()) { case 0: diff --git a/src/net/sf/freecol/client/gui/ScrollThread.java b/src/net/sf/freecol/client/gui/ScrollThread.java index 6e8069d3e..b885d50af 100644 --- a/src/net/sf/freecol/client/gui/ScrollThread.java +++ b/src/net/sf/freecol/client/gui/ScrollThread.java @@ -39,8 +39,8 @@ public class ScrollThread extends Thread { /** Delay between scroll steps. */ private static final int SCROLL_DELAY = 100; // ms - /** The map viewer to scroll. */ - private final MapViewer mapViewer; + /** The Canvas containing the map to scroll. */ + private final Canvas canvas; /** The direction to scroll in. */ private Direction direction = null; @@ -49,12 +49,11 @@ public class ScrollThread extends Thread { /** * The constructor to use. * - * @param mapViewer The GUI that holds information such as screen - * resolution. + * @param canvas The Canvas containing the map to scroll. */ - public ScrollThread(MapViewer mapViewer) { + public ScrollThread(Canvas canvas) { super(FreeCol.CLIENT_THREAD + "Mouse scroller"); - this.mapViewer = mapViewer; + this.canvas = canvas; } /** @@ -75,14 +74,9 @@ public class ScrollThread extends Thread { public void run() { while (direction != null) { try { - SwingUtilities.invokeAndWait(new Runnable() { - @Override - public void run() { - if (!mapViewer.scrollMap(direction)) { - direction = null; - } - } - }); + SwingUtilities.invokeAndWait(() -> { + if (!canvas.scrollMap(direction)) direction = null; + }); } catch (InvocationTargetException e) { logger.log(Level.WARNING, "Scroll thread caught error", e); break; diff --git a/src/net/sf/freecol/client/gui/SwingGUI.java b/src/net/sf/freecol/client/gui/SwingGUI.java index 14c27a3fb..772e5bce5 100644 --- a/src/net/sf/freecol/client/gui/SwingGUI.java +++ b/src/net/sf/freecol/client/gui/SwingGUI.java @@ -23,28 +23,29 @@ import java.awt.Component; import java.awt.Dimension; import java.awt.DisplayMode; import java.awt.Font; +import java.awt.Graphics2D; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.HeadlessException; -import java.awt.Image; import java.awt.MouseInfo; import java.awt.Point; import java.awt.Rectangle; -import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; +import java.awt.image.BufferedImage; import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; import java.io.File; +import java.io.InputStream; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.logging.Level; +import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JWindow; @@ -54,14 +55,11 @@ import javax.swing.filechooser.FileFilter; import net.sf.freecol.client.ClientOptions; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.gui.animation.Animations; -import net.sf.freecol.client.gui.panel.ChoiceItem; import net.sf.freecol.client.gui.panel.ColonyPanel; import net.sf.freecol.client.gui.panel.ColorChooserPanel; import net.sf.freecol.client.gui.panel.CornerMapControls; -import net.sf.freecol.client.gui.panel.DialogHandler; import net.sf.freecol.client.gui.panel.FreeColDialog; import net.sf.freecol.client.gui.panel.LabourData.UnitData; -import net.sf.freecol.client.gui.panel.LoadingSavegameDialog; import net.sf.freecol.client.gui.panel.MapControls; import net.sf.freecol.client.gui.panel.Parameters; import net.sf.freecol.client.gui.panel.TradeRoutePanel; @@ -86,12 +84,13 @@ import net.sf.freecol.common.model.IndianSettlement; import net.sf.freecol.common.model.Location; import net.sf.freecol.common.model.ModelMessage; import net.sf.freecol.common.model.Monarch.MonarchAction; +import net.sf.freecol.common.model.Nation; import net.sf.freecol.common.model.Player; -import net.sf.freecol.common.model.Region; import net.sf.freecol.common.model.Settlement; import net.sf.freecol.common.model.Specification; import net.sf.freecol.common.model.StringTemplate; import net.sf.freecol.common.model.Tile; +import net.sf.freecol.common.model.TileType; import net.sf.freecol.common.model.TradeRoute; import net.sf.freecol.common.model.TypeCountMap; import net.sf.freecol.common.model.Unit; @@ -116,14 +115,14 @@ public class SwingGUI extends GUI { private final GraphicsDevice graphicsDevice; /** - * This is the MapViewer instance used to paint the colony tiles + * This is the TileViewer instance used to paint the map tiles * in the ColonyPanel and other panels. It should not be scaled * along with the default MapViewer. */ - private MapViewer colonyTileMapViewer; + private TileViewer tileViewer; /** - * The MapViewer instance used to paint the main map. + * The MapViewer instance used by canvas to paint the main map. * This does need to be scaled. */ private MapViewer mapViewer; @@ -151,14 +150,12 @@ public class SwingGUI extends GUI { // Simple accessors - @Override public Canvas getCanvas() { return canvas; } - @Override - public MapViewer getColonyTileMapViewer() { - return colonyTileMapViewer; + public ImageLibrary getTileImageLibrary() { + return tileViewer.getImageLibrary(); } @Override @@ -178,7 +175,7 @@ public class SwingGUI extends GUI { FreeColLookAndFeel fclaf = new FreeColLookAndFeel(); FreeColLookAndFeel.install(fclaf); Font font = FontLibrary.createMainFont( - fontName, imageLibrary.getScalingFactor()); + fontName, imageLibrary.getScaleFactor()); FreeColLookAndFeel.installFont(font); Utility.initStyleContext(font); } @@ -204,7 +201,7 @@ public class SwingGUI extends GUI { canvas.initializeInGame(); enableMapControls(freeColClient.getClientOptions() .getBoolean(ClientOptions.DISPLAY_MAP_CONTROLS)); - setSelectedTile(tile, false); + setSelectedTile(tile); } /** @@ -218,15 +215,14 @@ public class SwingGUI extends GUI { /** * Display the splash screen. * - * @param splashFilename The name of the file to find the image in. + * @param splashStream A stream to read the splash image from. */ @Override - public void displaySplashScreen(final String splashFilename) { + public void displaySplashScreen(final InputStream splashStream) { splash = null; - if (splashFilename == null) - return; + if (splashStream == null) return; try { - Image im = Toolkit.getDefaultToolkit().getImage(splashFilename); + BufferedImage im = ImageIO.read(splashStream); splash = new JWindow(graphicsDevice.getDefaultConfiguration()); splash.getContentPane().add(new JLabel(new ImageIcon(im))); splash.pack(); @@ -309,7 +305,7 @@ public class SwingGUI extends GUI { } @Override - public void actionPerformed(ActionEvent e8) { + public void actionPerformed(ActionEvent ae8) { execute(); } @@ -327,7 +323,7 @@ public class SwingGUI extends GUI { if (t != null) { t.stop(); } - freeColClient.getSoundController().playSound("sound.intro.general"); + playSound("sound.intro.general"); showMainPanel(userMsg); } } @@ -401,55 +397,45 @@ public class SwingGUI extends GUI { logger.info(pmoffscreen + " overrides client option: " + pmoffscreenValue); } - usePixmaps.addPropertyChangeListener(new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent e) { - String newValue = e.getNewValue().toString(); - System.setProperty(pmoffscreen, newValue); - logger.info("Set " + pmoffscreen + " to: " + newValue); - } + usePixmaps.addPropertyChangeListener((PropertyChangeEvent e) -> { + String newValue = e.getNewValue().toString(); + System.setProperty(pmoffscreen, newValue); + logger.info("Set " + pmoffscreen + " to: " + newValue); }); this.mapViewer = new MapViewer(freeColClient); - this.canvas = new Canvas(freeColClient, graphicsDevice, + this.canvas = new Canvas(freeColClient, graphicsDevice, this, desiredWindowSize, mapViewer); - this.colonyTileMapViewer = new MapViewer(freeColClient); + this.tileViewer = new TileViewer(freeColClient); // Now that there is a canvas, prepare for language changes. LanguageOption o = (LanguageOption)freeColClient.getClientOptions() .getOption(ClientOptions.LANGUAGE); - o.addPropertyChangeListener(new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent e) { - Language language = (Language)e.getNewValue(); - logger.info("Set language to: " + language); - if (Messages.AUTOMATIC.equalsIgnoreCase(language.getKey())) { - showInformationMessage("info.autodetectLanguageSelected"); - } else { - Locale l = language.getLocale(); - Messages.loadMessageBundle(l); - Messages.loadModMessageBundle(l); - showInformationMessage(StringTemplate - .template("info.newLanguageSelected") - .addName("%language%", l.getDisplayName())); - } + o.addPropertyChangeListener((PropertyChangeEvent e) -> { + Language language = (Language)e.getNewValue(); + logger.info("Set language to: " + language); + if (Messages.AUTOMATIC.equalsIgnoreCase(language.getKey())) { + showInformationMessage("info.autodetectLanguageSelected"); + } else { + Locale l = language.getLocale(); + Messages.loadMessageBundle(l); + Messages.loadModMessageBundle(l); + showInformationMessage(StringTemplate + .template("info.newLanguageSelected") + .addName("%language%", l.getDisplayName())); } }); - mapViewer.startCursorBlinking(); logger.info("GUI created."); logger.info("Starting in Move Units View Mode"); } /** * Change the windowed mode. - * - * @param windowed Use true for windowed mode - * and false for fullscreen mode. */ @Override - public void changeWindowedMode(boolean windowed) { - canvas.changeWindowedMode(windowed); + public void changeWindowedMode() { + canvas.changeWindowedMode(); } /** @@ -484,7 +470,7 @@ public class SwingGUI extends GUI { // CanvasMouseMotionListener. Point pt = canvas.getMousePosition(); if (pt != null) { - Tile tile = mapViewer.convertToMapTile(pt.x, pt.y); + Tile tile = canvas.convertToMapTile(pt.x, pt.y); if (tile != null && unit.getTile() != tile) { canvas.setGotoPath(unit.findPath(tile)); } @@ -502,7 +488,6 @@ public class SwingGUI extends GUI { // Action should be disabled if there is no active unit, but make sure if (unit == null) return; canvas.stopGoto(); - refresh(); } /** @@ -535,7 +520,6 @@ public class SwingGUI extends GUI { * * @param tile The Tile to refresh. */ - @Override public void refreshTile(Tile tile) { if (tile.getX() >= 0 && tile.getY() >= 0) { canvas.repaint(mapViewer.calculateTileBounds(tile)); @@ -547,6 +531,7 @@ public class SwingGUI extends GUI { */ @Override public void resetMenuBar() { + freeColClient.updateActions(); canvas.resetMenuBar(); } @@ -585,28 +570,51 @@ public class SwingGUI extends GUI { * Set the active unit. * * @param unit The Unit to activate. + * @return True if the focus was set. */ @Override - public void setActiveUnit(Unit unit) { - mapViewer.setActiveUnit(unit); + public boolean setActiveUnit(Unit unit) { + boolean result = mapViewer.setActiveUnit(unit); updateMapControls(); + updateMenuBar(); if (unit != null && !freeColClient.getMyPlayer().owns(unit)) { canvas.refresh(); } - canvas.updateMenuBar(); + return result; } /** * Update the menu bar. + * + * Always update the actions first so that the enabled/disabled + * state is correct. */ @Override public void updateMenuBar() { + freeColClient.updateActions(); canvas.updateMenuBar(); } // Animation handling + /** + * Require the given tile to be in the onScreen()-area. + * + * @param tile The Tile to check. + * @return True if the focus was set. + */ + public boolean requireFocus(Tile tile) { + // Account for the ALWAYS_CENTER client option. + boolean required = freeColClient.getClientOptions() + .getBoolean(ClientOptions.ALWAYS_CENTER); + if ((required && tile != getFocus()) || !mapViewer.onScreen(tile)) { + setFocusImmediately(tile); + return true; + } + return false; + } + /** * Animate a unit attack. * @@ -620,7 +628,8 @@ public class SwingGUI extends GUI { public void animateUnitAttack(Unit attacker, Unit defender, Tile attackerTile, Tile defenderTile, boolean success) { - Animations.unitAttack(this, attacker, defender, + requireFocus(attackerTile); + Animations.unitAttack(freeColClient, attacker, defender, attackerTile, defenderTile, success); } @@ -633,7 +642,8 @@ public class SwingGUI extends GUI { */ @Override public void animateUnitMove(Unit unit, Tile srcTile, Tile dstTile) { - Animations.unitMove(this, unit, srcTile, dstTile); + requireFocus(srcTile); + Animations.unitMove(freeColClient, unit, srcTile, dstTile); } @@ -680,7 +690,6 @@ public class SwingGUI extends GUI { if (mapControls != null) mapControls.update(); } - @Override public void updateMapControlsInCanvas() { if (mapControls == null) return; mapControls.removeFromComponent(canvas); @@ -725,7 +734,7 @@ public class SwingGUI extends GUI { // Dialogs that return values /** - * Simple confirmation dialog. + * Simple modal confirmation dialog. * * @param textKey A string to use as the message key. * @param okKey A key for the "ok" button. @@ -734,15 +743,13 @@ public class SwingGUI extends GUI { */ @Override public boolean confirm(String textKey, String okKey, String cancelKey) { - return canvas.showConfirmDialog(true, null, - Messages.message(textKey), null, - okKey, cancelKey); + return canvas.showConfirmDialog(null, Messages.message(textKey), + null, okKey, cancelKey); } /** - * General confirmation dialog. + * General modal confirmation dialog. * - * @param modal Is this a modal dialog? * @param tile An optional Tile to expose. * @param template The StringTemplate explaining the choice. * @param okKey A key for the "ok" button. @@ -750,54 +757,49 @@ public class SwingGUI extends GUI { * @return True if the "ok" button was selected. */ @Override - public boolean confirm(boolean modal, Tile tile, - StringTemplate template, + public boolean confirm(Tile tile, StringTemplate template, String okKey, String cancelKey) { - return canvas.showConfirmDialog(modal, tile, - Utility.localizedTextArea(template), - null, okKey, cancelKey); + return canvas.showConfirmDialog(tile, + Utility.localizedTextArea(template), null, okKey, cancelKey); } /** - * General confirmation dialog. + * General modal confirmation dialog. * - * @param modal Is this a modal dialog? * @param tile An optional Tile to expose. * @param template The StringTemplate explaining the choice. - * @param obj An optional unit to make an icon for the dialog from. + * @param unit An optional unit to make an icon for the dialog from. * @param okKey A key for the "ok" button. * @param cancelKey A key for the "cancel" button. * @return True if the "ok" button was selected. */ @Override - public boolean confirm(boolean modal, Tile tile, - StringTemplate template, Unit obj, + public boolean confirm(Tile tile, StringTemplate template, Unit unit, String okKey, String cancelKey) { - return canvas.showConfirmDialog(modal, tile, - Utility.localizedTextArea(template), - (obj == null) ? null : new ImageIcon( - imageLibrary.getUnitImage(obj)), - okKey, cancelKey); + return canvas.showConfirmDialog(tile, + Utility.localizedTextArea(template), + new ImageIcon(imageLibrary.getUnitImage(unit)), + okKey, cancelKey); } - /** - * General confirmation dialog. - * - * @param modal Is this a modal dialog? - * @param tile An optional Tile to expose. - * @param template The StringTemplate explaining the choice. - * @param icon An optional icon for the dialog. - * @param okKey A key for the "ok" button. - * @param cancelKey A key for the "cancel" button. - * @return True if the "ok" button was selected. - */ @Override - public boolean confirm(boolean modal, Tile tile, - StringTemplate template, ImageIcon icon, + public boolean confirm(Tile tile, StringTemplate template, + Settlement settlement, String okKey, String cancelKey) { - return canvas.showConfirmDialog(modal, tile, - Utility.localizedTextArea(template), - icon, okKey, cancelKey); + return canvas.showConfirmDialog(tile, + Utility.localizedTextArea(template), + new ImageIcon(imageLibrary.getSettlementImage(settlement)), + okKey, cancelKey); + } + + @Override + public boolean confirm(Tile tile, StringTemplate template, + GoodsType goodsType, + String okKey, String cancelKey) { + return canvas.showConfirmDialog(tile, + Utility.localizedTextArea(template), + new ImageIcon(imageLibrary.getIconImage(goodsType)), + okKey, cancelKey); } /** @@ -811,29 +813,57 @@ public class SwingGUI extends GUI { } /** - * General choice dialog. + * General modal choice dialog. * - * @param modal Is this a modal dialog? * @param tile An optional Tile to expose. * @param explain An object explaining the choice. - * @param icon An optional icon for the dialog. * @param cancelKey A key for the "cancel" button. * @param choices A list a ChoiceItems to choose from. * @return The selected value of the selected ChoiceItem, * or null if cancelled. */ @Override - public T getChoice(boolean modal, Tile tile, Object explain, - ImageIcon icon, + public T getChoice(Tile tile, Object explain, String cancelKey, List> choices) { - return canvas.showChoiceDialog(modal, tile, explain, icon, - cancelKey, choices); + return canvas.showChoiceDialog(tile, explain, + null, cancelKey, choices); + } + + @Override + public T getChoice(Tile tile, Object explain, Unit unit, + String cancelKey, List> choices) { + return canvas.showChoiceDialog(tile, explain, + new ImageIcon(imageLibrary.getUnitImage(unit)), + cancelKey, choices); + } + + @Override + public T getChoice(Tile tile, Object explain, Settlement settlement, + String cancelKey, List> choices) { + return canvas.showChoiceDialog(tile, explain, + new ImageIcon(imageLibrary.getSettlementImage(settlement)), + cancelKey, choices); + } + + @Override + public T getChoice(Tile tile, Object explain, GoodsType goodsType, + String cancelKey, List> choices) { + return canvas.showChoiceDialog(tile, explain, + new ImageIcon(imageLibrary.getIconImage(goodsType)), + cancelKey, choices); + } + + @Override + public T getChoice(Tile tile, Object explain, Nation nation, + String cancelKey, List> choices) { + return canvas.showChoiceDialog(tile, explain, + new ImageIcon(imageLibrary.getMiscIconImage(nation)), + cancelKey, choices); } /** - * General input dialog. + * General modal string input dialog. * - * @param modal Is this a modal dialog? * @param tile An optional Tile to expose. * @param template A StringTemplate explaining the choice. * @param defaultValue The default value to show initially. @@ -842,9 +872,10 @@ public class SwingGUI extends GUI { * @return The chosen value. */ @Override - public String getInput(boolean modal, Tile tile, StringTemplate template, - String defaultValue, String okKey, String cancelKey) { - return canvas.showInputDialog(modal, tile, template, defaultValue, + public String getInput(Tile tile, StringTemplate template, + String defaultValue, + String okKey, String cancelKey) { + return canvas.showInputDialog(tile, template, defaultValue, okKey, cancelKey); } @@ -871,7 +902,6 @@ public class SwingGUI extends GUI { return canvas.containsInGameComponents(); } - @Override public void dialogRemove(FreeColDialog fcd) { canvas.dialogRemove(fcd); } @@ -883,7 +913,6 @@ public class SwingGUI extends GUI { * * @param fco The FreeColObject to display. */ - @Override public void displayObject(FreeColObject fco) { if (fco instanceof Colony) { canvas.showColonyPanel((Colony)fco, null); @@ -901,13 +930,13 @@ public class SwingGUI extends GUI { displayObject((FreeColObject)loc); } } else if (fco instanceof WorkLocation) { - displayObject(((WorkLocation)fco).getColony()); + canvas.showColonyPanel(((WorkLocation)fco).getColony(), null); } } @Override - public LoadingSavegameDialog getLoadingSavegameDialog() { - return canvas.getLoadingSavegameDialog(); + public LoadingSavegameInfo getLoadingSavegameInfo() { + return canvas.getLoadingSavegameDialog().getInfo(); } @Override @@ -940,7 +969,6 @@ public class SwingGUI extends GUI { canvas.refreshPlayersTable(); } - @Override public void removeFromCanvas(Component component) { canvas.remove(component); } @@ -950,7 +978,6 @@ public class SwingGUI extends GUI { canvas.removeInGameComponents(); } - @Override public void removeTradeRoutePanel(TradeRoutePanel panel) { canvas.removeTradeRoutePanel(panel); } @@ -965,12 +992,10 @@ public class SwingGUI extends GUI { return canvas.requestFocusInWindow(); } - @Override public void restoreSavedSize(Component comp, int w, int h) { canvas.restoreSavedSize(comp, new Dimension(w, h)); } - @Override public void restoreSavedSize(Component comp, Dimension size) { canvas.restoreSavedSize(comp, size); } @@ -978,7 +1003,7 @@ public class SwingGUI extends GUI { @Override public void returnToTitle() { canvas.returnToTitle(); - freeColClient.getSoundController().playSound("sound.intro.general"); + playSound("sound.intro.general"); } @Override @@ -986,26 +1011,18 @@ public class SwingGUI extends GUI { canvas.showAboutPanel(); } - @Override public void showBuildQueuePanel(Colony colony) { canvas.showBuildQueuePanel(colony); } - @Override public void showBuildQueuePanel(Colony colony, Runnable callBack) { canvas.showBuildQueuePanel(colony, callBack); } @Override public void showCaptureGoodsDialog(final Unit unit, List gl, - final String defenderId) { - canvas.showCaptureGoodsDialog(unit, gl, - new DialogHandler>() { - @Override - public void handle(List gl) { - igc().lootCargo(unit, gl, defenderId); - } - }); + DialogHandler> handler) { + canvas.showCaptureGoodsDialog(unit, gl, handler); } @Override @@ -1014,21 +1031,24 @@ public class SwingGUI extends GUI { } @Override - public void showChooseFoundingFatherDialog(final List ffs) { - canvas.showChooseFoundingFatherDialog(ffs, - new DialogHandler() { - @Override - public void handle(FoundingFather ff) { - igc().chooseFoundingFather(ffs, ff); - } - }); + public void showChooseFoundingFatherDialog(final List ffs, + DialogHandler handler) { + canvas.showChooseFoundingFatherDialog(ffs, handler); } @Override - public OptionGroup showClientOptionsDialog() { - OptionGroup group = canvas.showClientOptionsDialog(); + public void showClientOptionsDialog() { + OptionGroup group = null; + try { + group = canvas.showClientOptionsDialog(); + } finally { + if (group != null) { + resetMenuBar(); + // Immediately redraw the minimap if that was updated. + updateMapControls(); + } + } if (!freeColClient.isInGame()) showMainPanel(null); - return group; } @Override @@ -1037,7 +1057,11 @@ public class SwingGUI extends GUI { } @Override - public ColonyPanel showColonyPanel(Colony colony, Unit unit) { + public void showColonyPanel(Colony colony, Unit unit) { + canvas.showColonyPanel(colony, unit); + } + + public ColonyPanel showColonyPanel2(Colony colony, Unit unit) { return canvas.showColonyPanel(colony, unit); } @@ -1046,7 +1070,6 @@ public class SwingGUI extends GUI { canvas.showColopediaPanel(nodeId); } - @Override public ColorChooserPanel showColorChooserPanel(ActionListener al) { return canvas.showColorChooserPanel(al); } @@ -1056,7 +1079,6 @@ public class SwingGUI extends GUI { canvas.showCompactLabourReport(); } - @Override public void showCompactLabourReport(UnitData unitData) { canvas.showCompactLabourReport(unitData); } @@ -1066,26 +1088,28 @@ public class SwingGUI extends GUI { canvas.showDeclarationPanel(); } + /** + * Display a difficulty dialog allowing only viewing of game options. + * + * @return The resulting OptionGroup. + */ @Override public OptionGroup showDifficultyDialog() { - return canvas.showDifficultyDialog(); + Game game = freeColClient.getGame(); + Specification spec = game.getSpecification(); + return canvas.showDifficultyDialog(spec, + spec.getDifficultyOptionGroup(), false); } - @Override public OptionGroup showDifficultyDialog(Specification spec, OptionGroup group) { - return canvas.showDifficultyDialog(spec, group); + return canvas.showDifficultyDialog(spec, group, group.isEditable()); } @Override - public void showDumpCargoDialog(Unit unit) { - canvas.showDumpCargoDialog(unit, - new DialogHandler>() { - @Override - public void handle(List goodsList) { - for (Goods g : goodsList) igc().unloadCargo(g, true); - } - }); + public void showDumpCargoDialog(Unit unit, + DialogHandler> handler) { + canvas.showDumpCargoDialog(unit, handler); } @Override @@ -1094,31 +1118,16 @@ public class SwingGUI extends GUI { } @Override - public void showEmigrationDialog(final Player player, final int n, - final boolean fountainOfYouth) { - canvas.showEmigrationDialog(player, fountainOfYouth, - new DialogHandler() { - @Override - public void handle(Integer value) { - // Value should be a valid slot - igc().emigrate(player, - Europe.MigrationType.convertToMigrantSlot(value)); - igc().emigrationLoop(player, n-1, fountainOfYouth); - } - }); + public void showEmigrationDialog(final Player player, + final boolean fountainOfYouth, + DialogHandler handler) { + canvas.showEmigrationDialog(player, fountainOfYouth, handler); } @Override - public void showEndTurnDialog(final List units) { - canvas.showEndTurnDialog(units, - new DialogHandler() { - @Override - public void handle(Boolean value) { - if (value != null && value) { - igc().endTurn(false); - } - } - }); + public void showEndTurnDialog(final List units, + DialogHandler handler) { + canvas.showEndTurnDialog(units, handler); } @Override @@ -1227,10 +1236,9 @@ public class SwingGUI extends GUI { @Override public File showLoadDialog(File directory) { - return canvas.showLoadDialog(directory); + return canvas.showLoadDialog(directory, null); } - @Override public File showLoadDialog(File directory, FileFilter[] fileFilters) { return canvas.showLoadDialog(directory, fileFilters); } @@ -1268,55 +1276,25 @@ public class SwingGUI extends GUI { @Override public void showMonarchDialog(final MonarchAction action, - StringTemplate template, String monarchKey) { - canvas.showMonarchDialog(action, template, monarchKey, - new DialogHandler() { - @Override - public void handle(Boolean b) { - igc().monarchAction(action, b); - canvas.updateMenuBar(); - } - }); + StringTemplate template, String monarchKey, + DialogHandler handler) { + canvas.showMonarchDialog(action, template, monarchKey, handler); } @Override - public void showNameNewLandDialog(String key, final String defaultName, - final Unit unit) { - canvas.showNameNewLandDialog(key, defaultName, unit, - new DialogHandler() { - @Override - public void handle(String name) { - if (name == null || name.isEmpty()) name = defaultName; - igc().nameNewLand(unit, name); - } - }); - } - - @Override - public void showNameNewRegionDialog(StringTemplate template, - final String defaultName, - final Unit unit, final Tile tile, - final Region region) { - canvas.showNameNewRegionDialog(template, defaultName, unit, - new DialogHandler() { - @Override - public void handle(String name) { - if (name == null || name.isEmpty()) name = defaultName; - igc().nameNewRegion(tile, unit, region, name); - } - }); + public void showNamingDialog(StringTemplate template, + final String defaultName, + final Unit unit, + DialogHandler handler) { + canvas.showNamingDialog(template, defaultName, unit, handler); } @Override public void showFirstContactDialog(final Player player, final Player other, - final Tile tile, int settlementCount) { + final Tile tile, int settlementCount, + DialogHandler handler) { canvas.showFirstContactDialog(player, other, tile, settlementCount, - new DialogHandler() { - @Override - public void handle(Boolean b) { - igc().firstContact(player, other, tile, b); - } - }); + handler); } @Override @@ -1329,7 +1307,7 @@ public class SwingGUI extends GUI { @Override public void showNewPanel() { - canvas.showNewPanel(); + canvas.showNewPanel(null); } @Override @@ -1354,12 +1332,10 @@ public class SwingGUI extends GUI { return canvas.showPreCombatDialog(attacker, defender, tile); } - @Override public void showPurchasePanel() { canvas.showPurchasePanel(); } - @Override public void showRecruitPanel() { canvas.showRecruitPanel(); } @@ -1404,7 +1380,6 @@ public class SwingGUI extends GUI { canvas.showReportIndianPanel(); } - @Override public void showReportLabourDetailPanel(UnitType unitType, Map> data, TypeCountMap unitCount, List colonies) { @@ -1454,14 +1429,12 @@ public class SwingGUI extends GUI { @Override public File showSaveDialog(File directory, String defaultName) { - return canvas.showSaveDialog(directory, defaultName); + return canvas.showSaveDialog(directory, null, defaultName); } - @Override public File showSaveDialog(File directory, FileFilter[] fileFilters, - String defaultName, String extension) { - return canvas.showSaveDialog(directory, fileFilters, defaultName, - extension); + String defaultName) { + return canvas.showSaveDialog(directory, fileFilters, defaultName); } @Override @@ -1487,7 +1460,6 @@ public class SwingGUI extends GUI { return canvas.showSelectDestinationDialog(unit); } - @Override public void showServerListPanel(List serverList) { canvas.showServerListPanel(serverList); } @@ -1508,16 +1480,15 @@ public class SwingGUI extends GUI { canvas.showStatusPanel(message); } - @Override public void showTilePanel(Tile tile) { canvas.showTilePanel(tile); } @Override public void showTilePopUpAtSelectedTile() { - TerrainCursor cursor = mapViewer.getCursor(); - canvas.showTilePopup(mapViewer.getSelectedTile(), - cursor.getCanvasX(), cursor.getCanvasY()); + Tile tile = mapViewer.getSelectedTile(); + Point point = mapViewer.calculateTilePosition(tile); + canvas.showTilePopup(tile, point.x+mapViewer.getTileWidth(), point.y); } @Override @@ -1525,38 +1496,28 @@ public class SwingGUI extends GUI { canvas.showTradeRoutePanel(unit); } - @Override public void showTradeRouteInputPanel(TradeRoute newRoute, Runnable callBack) { canvas.showTradeRouteInputPanel(newRoute, callBack); } - @Override public void showTrainPanel() { canvas.showTrainPanel(); } @Override - public void showVictoryDialog() { - canvas.showVictoryDialog(new DialogHandler() { - @Override - public void handle(Boolean result) { - igc().victory(result); - } - }); + public void showVictoryDialog(DialogHandler handler) { + canvas.showVictoryDialog(handler); } - @Override public boolean showWarehouseDialog(Colony colony) { return canvas.showWarehouseDialog(colony); } - @Override public void showWorkProductionPanel(Unit unit) { canvas.showWorkProductionPanel(unit); } - @Override public void updateEuropeanSubpanels() { canvas.updateEuropeanSubpanels(); } @@ -1583,12 +1544,12 @@ public class SwingGUI extends GUI { mapViewer.changeViewMode(newViewMode); } - @Override - public Point calculateUnitLabelPositionInTile(JLabel unitLabel, Point tileP) { - return mapViewer.calculateUnitLabelPositionInTile(unitLabel, tileP); + public Point calculateUnitLabelPositionInTile(int labelWidth,int labelHeight, + Point tileP) { + return mapViewer.calculateUnitLabelPositionInTile( + labelWidth, labelHeight, tileP); } - @Override public void executeWithUnitOutForAnimation(final Unit unit, final Tile sourceTile, final OutForAnimationCallback r) { @@ -1605,9 +1566,8 @@ public class SwingGUI extends GUI { return mapViewer.getFocus(); } - @Override public float getMapScale() { - return mapViewer.getMapScale(); + return mapViewer.getImageLibrary().getScaleFactor(); } @Override @@ -1615,52 +1575,37 @@ public class SwingGUI extends GUI { return mapViewer.getSelectedTile(); } - @Override public Rectangle getTileBounds(Tile tile) { return mapViewer.calculateTileBounds(tile); } - @Override public Point getTilePosition(Tile tile) { return mapViewer.calculateTilePosition(tile); } - @Override - public double getTileWidthHeightRatio() { - return mapViewer.getTileWidthHeightRatio(); - } - @Override public int getViewMode() { return mapViewer.getViewMode(); } - @Override - public boolean onScreen(Tile tileToCheck) { - return mapViewer.onScreen(tileToCheck); - } - - @Override - public void restartBlinking() { - mapViewer.restartBlinking(); - } - @Override public void setFocus(Tile tileToFocus) { mapViewer.setFocus(tileToFocus); + canvas.refresh(); } - @Override public void setFocusImmediately(Tile tileToFocus) { - mapViewer.setFocusImmediately(tileToFocus); + mapViewer.setFocus(tileToFocus); Dimension size = canvas.getSize(); canvas.paintImmediately(0, 0, size.width, size.height); } @Override - public boolean setSelectedTile(Tile newTileToSelect, - boolean clearGoToOrders) { - return mapViewer.setSelectedTile(newTileToSelect, clearGoToOrders); + public boolean setSelectedTile(Tile newTileToSelect) { + boolean result = mapViewer.setSelectedTile(newTileToSelect); + updateMapControls(); + updateMenuBar(); + return result; } @Override @@ -1668,4 +1613,27 @@ public class SwingGUI extends GUI { mapViewer.toggleViewMode(); } + // Forwarding to tileViewer + + public static BufferedImage createTileImageWithOverlayAndForest( + TileType type, Dimension size) { + return TileViewer.createTileImageWithOverlayAndForest(type, size); + } + + public BufferedImage createTileImageWithBeachBorderAndItems(Tile tile) { + return tileViewer.createTileImageWithBeachBorderAndItems(tile); + } + + public BufferedImage createTileImage(Tile tile) { + return tileViewer.createTileImage(tile); + } + + public BufferedImage createColonyTileImage(Tile tile, Colony colony) { + return tileViewer.createColonyTileImage(tile, colony); + } + + public void displayColonyTiles(Graphics2D g, Tile[][] tiles, Colony colony) { + tileViewer.displayColonyTiles(g, tiles, colony); + } + } diff --git a/src/net/sf/freecol/client/gui/TerrainCursor.java b/src/net/sf/freecol/client/gui/TerrainCursor.java index c5ffce07f..9feece474 100644 --- a/src/net/sf/freecol/client/gui/TerrainCursor.java +++ b/src/net/sf/freecol/client/gui/TerrainCursor.java @@ -34,12 +34,10 @@ public class TerrainCursor implements ActionListener { public static final int OFF = 0; public static final int ON = 1; - private int canvasX; - private int canvasY; private final Timer blinkTimer; private boolean active; private final EventListenerList listenerList; - + /** * Creates a new TerrainCursor instance. @@ -53,7 +51,7 @@ public class TerrainCursor implements ActionListener { listenerList = new EventListenerList(); } - + /** * Returns whether this TerrainCursor is active. * @@ -62,7 +60,7 @@ public class TerrainCursor implements ActionListener { public boolean isActive() { return active; } - + /** * Sets the active state of the TerrainCursor. * @@ -71,43 +69,30 @@ public class TerrainCursor implements ActionListener { public void setActive(boolean newState) { active = newState; } - + public void startBlinking() { if (!blinkTimer.isRunning()) blinkTimer.start(); } - + public void stopBlinking() { if (blinkTimer.isRunning()) blinkTimer.stop(); } - public void setCanvasPos(int x,int y) { - canvasX = x; - canvasY = y; - } - - public int getCanvasX() { - return canvasX; - } - - public int getCanvasY() { - return canvasY; - } - public void addActionListener(ActionListener listener) { listenerList.add(ActionListener.class, listener); } - + public void removeActionListener(ActionListener listener) { listenerList.remove(ActionListener.class, listener); } - - public void fireActionEvent(ActionEvent event) { + + public void fireActionEvent(ActionEvent ae) { for (ActionListener al : listenerList.getListeners(ActionListener.class)) { - al.actionPerformed(event); + al.actionPerformed(ae); } } - + // Interface ActionListener @@ -115,7 +100,7 @@ public class TerrainCursor implements ActionListener { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { active = !active; int eventId = active? ON : OFF; ActionEvent blinkEvent = new ActionEvent(this,eventId,"blink"); diff --git a/src/net/sf/freecol/client/gui/TilePopup.java b/src/net/sf/freecol/client/gui/TilePopup.java index 6d1cf3f17..26ad0da06 100644 --- a/src/net/sf/freecol/client/gui/TilePopup.java +++ b/src/net/sf/freecol/client/gui/TilePopup.java @@ -23,10 +23,10 @@ import java.awt.Component; import java.awt.Container; import java.awt.Font; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.util.Collections; import java.util.List; import java.util.logging.Logger; +import java.util.stream.Collectors; import javax.swing.JMenu; import javax.swing.JMenuItem; @@ -69,8 +69,8 @@ public final class TilePopup extends JPopupMenu { public static final int UNIT_LINES_IN_OTHER_MENUS = 19; private final FreeColClient freeColClient; - private final GUI gui; - private final MapViewer mapViewer; + private final SwingGUI gui; + private final Canvas canvas; private boolean hasAnItem = false; @@ -78,15 +78,17 @@ public final class TilePopup extends JPopupMenu { * The constructor that will insert the MenuItems. * * @param freeColClient The FreeColClient for the game. + * @param canvas The Canvas. * @param tile The Tile to create a popup for. * The popup menu also appears near this Tile. */ - public TilePopup(final FreeColClient freeColClient, final MapViewer mapViewer, final Tile tile) { + public TilePopup(final FreeColClient freeColClient, final Canvas canvas, + final Tile tile) { super(Messages.message(tile.getSimpleLabel())); this.freeColClient = freeColClient; - this.gui = freeColClient.getGUI(); - this.mapViewer = mapViewer; + this.gui = (SwingGUI)freeColClient.getGUI(); + this.canvas = canvas; final Player player = freeColClient.getMyPlayer(); final Unit activeUnit = gui.getActiveUnit(); @@ -105,22 +107,15 @@ public final class TilePopup extends JPopupMenu { gotoMenuItem = Utility.localizedMenuItem("goToThisTile"); } if (gotoMenuItem != null) { - gotoMenuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - if (!freeColClient.currentPlayerIsMyPlayer()) { - return; - } - Tile currTile = activeUnit.getTile(); - // already at the destination? - if (currTile == tile) return; - freeColClient.getInGameController() - .goToTile(activeUnit, tile); - // if unit did not move, we should show - // the goto path - if (activeUnit.getTile() == currTile) { - mapViewer.updateCurrentPathForActiveUnit(); - } + gotoMenuItem.addActionListener((ActionEvent ae) -> { + if (!freeColClient.currentPlayerIsMyPlayer()) return; + Tile currTile = activeUnit.getTile(); + if (currTile == tile) return; // already at destination + freeColClient.getInGameController() + .goToTile(activeUnit, tile); + // if unit did not move, we should show the goto path + if (activeUnit.getTile() == currTile) { + canvas.updateCurrentPathForActiveUnit(); } }); add(gotoMenuItem); @@ -131,14 +126,9 @@ public final class TilePopup extends JPopupMenu { if (unitTile == tile && activeUnit.hasHighSeasMove()) { JMenuItem europeMenuItem = Utility.localizedMenuItem(StringTemplate .template("goToEurope")); - europeMenuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - if (!freeColClient.currentPlayerIsMyPlayer()) { - return; - } - igc.moveTo(activeUnit, player.getEurope()); - } + europeMenuItem.addActionListener((ActionEvent ae) -> { + if (!freeColClient.currentPlayerIsMyPlayer()) return; + igc.moveTo(activeUnit, player.getEurope()); }); add(europeMenuItem); hasAnItem = true; @@ -149,39 +139,24 @@ public final class TilePopup extends JPopupMenu { JMenuItem ji = null; if (activeUnit.checkSetState(UnitState.ACTIVE)) { ji = Utility.localizedMenuItem("activateUnit"); - ji.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - if (activeUnit.checkSetState(UnitState.ACTIVE)) { - igc.changeState(activeUnit, Unit.UnitState.ACTIVE); - } - } + ji.addActionListener((ActionEvent ae) -> { + igc.changeState(activeUnit, Unit.UnitState.ACTIVE); }); add(ji); hasAnItem = true; } if (activeUnit.checkSetState(UnitState.FORTIFYING)) { ji = Utility.localizedMenuItem("fortify"); - ji.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - if (activeUnit.checkSetState(UnitState.FORTIFYING)) { - igc.changeState(activeUnit, Unit.UnitState.FORTIFYING); - } - } + ji.addActionListener((ActionEvent ae) -> { + igc.changeState(activeUnit, Unit.UnitState.FORTIFYING); }); add(ji); hasAnItem = true; } if (activeUnit.checkSetState(UnitState.SKIPPED)) { ji = Utility.localizedMenuItem("skip"); - ji.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - if (activeUnit.checkSetState(UnitState.SKIPPED)) { - igc.changeState(activeUnit, Unit.UnitState.SKIPPED); - } - } + ji.addActionListener((ActionEvent ae) -> { + igc.changeState(activeUnit, Unit.UnitState.SKIPPED); }); add(ji); hasAnItem = true; @@ -189,11 +164,8 @@ public final class TilePopup extends JPopupMenu { if (activeUnit.canCarryTreasure() && activeUnit.canCashInTreasureTrain()) { ji = Utility.localizedMenuItem("cashInTreasureTrain"); - ji.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - igc.checkCashInTreasureTrain(activeUnit); - } + ji.addActionListener((ActionEvent ae) -> { + igc.checkCashInTreasureTrain(activeUnit); }); ji.setEnabled(true); add(ji); @@ -202,11 +174,8 @@ public final class TilePopup extends JPopupMenu { if (activeUnit.getDestination() != null) { ji = Utility.localizedMenuItem("clearOrders"); - ji.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - igc.clearOrders(activeUnit); - } + ji.addActionListener((ActionEvent ae) -> { + igc.clearOrders(activeUnit); }); add(ji); hasAnItem = true; @@ -232,11 +201,10 @@ public final class TilePopup extends JPopupMenu { int maxUnits = UNIT_LINES_IN_FIRST_MENU; Container currentMenu = this; boolean moreUnits = false; - List units = tile.getUnitList(); Unit firstUnit = tile.getFirstUnit(); - Collections.sort(units, ReportPanel.getUnitTypeComparator()); - for (final Unit currentUnit : units) { - + for (Unit u : tile.getUnitList().stream() + .sorted(Unit.typeRoleComparator) + .collect(Collectors.toList())) { if (lineCount > maxUnits) { JMenu more = Utility.localizedMenu("more"); more.setFont(more.getFont().deriveFont(Font.ITALIC)); @@ -247,26 +215,20 @@ public final class TilePopup extends JPopupMenu { lineCount = 0; maxUnits = UNIT_LINES_IN_OTHER_MENUS; } - - lineCount += addUnit(currentMenu, currentUnit, - !currentUnit.isDamaged(), false); + lineCount += addUnit(currentMenu, u, !u.isDamaged(), false); } if (tile.getUnitCount() > 1 && player.owns(firstUnit)) { if (moreUnits) addSeparator(); JMenuItem activateAllItem = Utility.localizedMenuItem(StringTemplate .template("activateAllUnits")); - activateAllItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - Unit lastUnit = null; - for (Unit unit : tile.getUnitList()) { - freeColClient.getInGameController() - .clearOrders(unit); - lastUnit = unit; - } - gui.setActiveUnit(lastUnit); + activateAllItem.addActionListener((ActionEvent ae) -> { + Unit lastUnit = null; + for (Unit unit : tile.getUnitList()) { + freeColClient.getInGameController().clearOrders(unit); + lastUnit = unit; } + gui.setActiveUnit(lastUnit); }); add(activateAllItem); } @@ -301,32 +263,23 @@ public final class TilePopup extends JPopupMenu { for (final Unit unit : tile.getUnitList()) { JMenuItem toMenuItem = new JMenuItem(unit.toString()); - toMenuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - DebugUtils.changeOwnership(freeColClient, unit); - } + toMenuItem.addActionListener((ActionEvent ae) -> { + DebugUtils.changeOwnership(freeColClient, unit); }); changeOwnership.add(toMenuItem); if (unit.isCarrier()) { JMenuItem menuItem = new JMenuItem(unit.toString()); - menuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - DebugUtils.displayMission(freeColClient, unit); - } + menuItem.addActionListener((ActionEvent ae) -> { + DebugUtils.displayMission(freeColClient, unit); }); transportLists.add(menuItem); } if (unit.isPerson()) { JMenuItem roleMenuItem = new JMenuItem(unit.toString()); - roleMenuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - DebugUtils.changeRole(freeColClient, unit); - } + roleMenuItem.addActionListener((ActionEvent ae) -> { + DebugUtils.changeRole(freeColClient, unit); }); changeRole.add(roleMenuItem); } @@ -339,40 +292,28 @@ public final class TilePopup extends JPopupMenu { } JMenuItem toMenuItem = new JMenuItem(tile.getColony().toString()); final Colony colony = tile.getColony(); - toMenuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - DebugUtils.changeOwnership(freeColClient, colony); - } + toMenuItem.addActionListener((ActionEvent ae) -> { + DebugUtils.changeOwnership(freeColClient, colony); }); changeOwnership.add(toMenuItem); JMenuItem displayColonyPlan = new JMenuItem("Display Colony Plan"); - displayColonyPlan.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - DebugUtils.displayColonyPlan(freeColClient, colony); - } + displayColonyPlan.addActionListener((ActionEvent ae) -> { + DebugUtils.displayColonyPlan(freeColClient, colony); }); add(displayColonyPlan); JMenuItem applyDisaster = new JMenuItem("Apply Disaster"); - applyDisaster.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - DebugUtils.applyDisaster(freeColClient, colony); - } + applyDisaster.addActionListener((ActionEvent ae) -> { + DebugUtils.applyDisaster(freeColClient, colony); }); add(applyDisaster); } if (tile.getIndianSettlement() != null) { JMenuItem displayGoods = new JMenuItem("Examine Settlement"); final IndianSettlement is = tile.getIndianSettlement(); - displayGoods.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - DebugUtils.summarizeSettlement(freeColClient, is); - } + displayGoods.addActionListener((ActionEvent ae) -> { + DebugUtils.summarizeSettlement(freeColClient, is); }); add(displayGoods); } @@ -382,22 +323,16 @@ public final class TilePopup extends JPopupMenu { if (tile.hasLostCityRumour()) { JMenuItem rumourItem = new JMenuItem("Set Lost City Rumour type"); rumourItem.setOpaque(false); - rumourItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - DebugUtils.setRumourType(freeColClient, tile); - } + rumourItem.addActionListener((ActionEvent ae) -> { + DebugUtils.setRumourType(freeColClient, tile); }); add(rumourItem); } JMenuItem addu = new JMenuItem("Add unit"); addu.setOpaque(false); - addu.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - DebugUtils.addNewUnitToTile(freeColClient, tile); - } + addu.addActionListener((ActionEvent ae) -> { + DebugUtils.addNewUnitToTile(freeColClient, tile); }); add(addu); @@ -405,11 +340,8 @@ public final class TilePopup extends JPopupMenu { JMenuItem adda = new JMenuItem("Reset moves"); adda.setOpaque(false); final List tileUnits = tile.getUnitList(); - adda.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - DebugUtils.resetMoves(freeColClient, tileUnits); - } + adda.addActionListener((ActionEvent ae) -> { + DebugUtils.resetMoves(freeColClient, tileUnits); }); add(adda); } @@ -417,21 +349,18 @@ public final class TilePopup extends JPopupMenu { final Unit activeUnit = gui.getActiveUnit(); if (activeUnit != null && activeUnit.getTile() != null) { JMenuItem menuItem = new JMenuItem("Show search"); - menuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - if (!freeColClient.currentPlayerIsMyPlayer()) return; - Tile currTile = activeUnit.getTile(); - if (currTile == tile) return; - final Map map = activeUnit.getGame().getMap(); - LogBuilder lb = new LogBuilder(512); - PathNode path = map.findPath(activeUnit, - activeUnit.getTile(), tile, activeUnit.getCarrier(), - null, lb); - gui.showInformationMessage(lb.toString()); - mapViewer.setCurrentPath(path); - gui.refresh(); - } + menuItem.addActionListener((ActionEvent ae) -> { + if (!freeColClient.currentPlayerIsMyPlayer()) return; + Tile currTile = activeUnit.getTile(); + if (currTile == tile) return; + final Map map = activeUnit.getGame().getMap(); + LogBuilder lb = new LogBuilder(512); + PathNode path = map.findPath(activeUnit, + activeUnit.getTile(), tile, activeUnit.getCarrier(), + null, lb); + gui.showInformationMessage(lb.toString()); + canvas.setCurrentPath(path); + gui.refresh(); }); add(menuItem); } @@ -441,11 +370,8 @@ public final class TilePopup extends JPopupMenu { JMenuItem addg = new JMenuItem("Add goods"); addg.setOpaque(false); final Unit unit = u; - addg.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - DebugUtils.addUnitGoods(freeColClient, unit); - } + addg.addActionListener((ActionEvent ae) -> { + DebugUtils.addUnitGoods(freeColClient, unit); }); add(addg); break; @@ -454,11 +380,8 @@ public final class TilePopup extends JPopupMenu { JMenuItem dumpItem = new JMenuItem("Dump tile"); dumpItem.setOpaque(false); - dumpItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - DebugUtils.dumpTile(freeColClient, tile); - } + dumpItem.addActionListener((ActionEvent ae) -> { + DebugUtils.dumpTile(freeColClient, tile); }); add(dumpItem); } @@ -482,24 +405,18 @@ public final class TilePopup extends JPopupMenu { JMenuItem menuItem = new JMenuItem(text); menuItem.setFont(FontLibrary.createFont(FontLibrary.FontType.NORMAL, FontLibrary.FontSize.TINY, Font.BOLD, - gui.getImageLibrary().getScalingFactor())); - menuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - gui.setActiveUnit(unit); - } + gui.getImageLibrary().getScaleFactor())); + menuItem.addActionListener((ActionEvent ae) -> { + gui.setActiveUnit(unit); }); - int lineCount = 1; if (indent) { menuItem.setFont(menuItem.getFont().deriveFont(Font.ITALIC)); } menuItem.setEnabled(enabled); menu.add(menuItem); - for (Unit passenger : unit.getUnitList()) { - lineCount += addUnit(menu, passenger, true, true); - } - + int lineCount = 1 + unit.getUnitList().stream() + .mapToInt(u -> addUnit(menu, u, true, true)).sum(); boolean hasGoods = false; for (Goods goods: unit.getGoodsList()) { text = (indent ? " " : " ") @@ -533,22 +450,16 @@ public final class TilePopup extends JPopupMenu { JMenuItem menuItem = Utility.localizedMenuItem(name); menuItem.setFont(FontLibrary.createFont(FontLibrary.FontType.NORMAL, FontLibrary.FontSize.TINY, Font.BOLD, - gui.getImageLibrary().getScalingFactor())); - menuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - gui.showColonyPanel(colony, null); - } + gui.getImageLibrary().getScaleFactor())); + menuItem.addActionListener((ActionEvent ae) -> { + gui.showColonyPanel(colony, null); }); add(menuItem); menuItem = Utility.localizedMenuItem("rename"); - menuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - freeColClient.getInGameController().rename(colony); - } + menuItem.addActionListener((ActionEvent ae) -> { + freeColClient.getInGameController().rename(colony); }); add(menuItem); @@ -568,12 +479,9 @@ public final class TilePopup extends JPopupMenu { JMenuItem menuItem = Utility.localizedMenuItem(name); menuItem.setFont(FontLibrary.createFont(FontLibrary.FontType.NORMAL, FontLibrary.FontSize.TINY, Font.BOLD, - gui.getImageLibrary().getScalingFactor())); - menuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - gui.showIndianSettlementPanel(settlement); - } + gui.getImageLibrary().getScaleFactor())); + menuItem.addActionListener((ActionEvent ae) -> { + gui.showIndianSettlementPanel(settlement); }); add(menuItem); hasAnItem = true; @@ -586,11 +494,8 @@ public final class TilePopup extends JPopupMenu { */ private void addTile(final Tile tile) { JMenuItem menuItem = new JMenuItem(Messages.getName(tile)); - menuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - gui.showTilePanel(tile); - } + menuItem.addActionListener((ActionEvent ae) -> { + gui.showTilePanel(tile); }); add(menuItem); diff --git a/src/net/sf/freecol/client/gui/TileViewer.java b/src/net/sf/freecol/client/gui/TileViewer.java new file mode 100644 index 000000000..63f8278b1 --- /dev/null +++ b/src/net/sf/freecol/client/gui/TileViewer.java @@ -0,0 +1,789 @@ +/** + * Copyright (C) 2002-2015 The FreeCol Team + * + * This file is part of FreeCol. + * + * FreeCol is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * FreeCol is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with FreeCol. If not, see . + */ + +package net.sf.freecol.client.gui; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.geom.GeneralPath; +import java.awt.image.BufferedImage; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.logging.Logger; + +import net.sf.freecol.client.ClientOptions; +import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.common.debug.DebugUtils; +import net.sf.freecol.common.debug.FreeColDebugger; +import net.sf.freecol.common.i18n.Messages; +import net.sf.freecol.common.model.Ability; +import net.sf.freecol.common.model.Colony; +import net.sf.freecol.common.model.ColonyTile; +import net.sf.freecol.common.model.Direction; +import net.sf.freecol.common.model.GameOptions; +import net.sf.freecol.common.model.IndianSettlement; +import net.sf.freecol.common.model.LostCityRumour; +import net.sf.freecol.common.model.Player; +import net.sf.freecol.common.model.Resource; +import net.sf.freecol.common.model.Settlement; +import net.sf.freecol.common.model.Tile; +import net.sf.freecol.common.model.TileImprovement; +import net.sf.freecol.common.model.TileItem; +import net.sf.freecol.common.model.TileType; +import net.sf.freecol.common.model.Unit; +import net.sf.freecol.common.resources.ResourceManager; +import net.sf.freecol.common.util.Utils; + +import static net.sf.freecol.common.util.StringUtils.*; + + +/** + * TileViewer is a private helper class of MapViewer and SwingGUI. + * + * This class is responsible for drawing map tiles + * for MapViewer and some GUI-panels. + */ +public final class TileViewer { + + private static final Logger logger = Logger.getLogger(TileViewer.class.getName()); + + + private static class SortableImage implements Comparable { + + public final BufferedImage image; + public final int index; + + public SortableImage(BufferedImage image, int index) { + this.image = image; + this.index = index; + } + + // Implement Comparable + + @Override + public int compareTo(SortableImage other) { + return other.index - this.index; + } + + // Override Object + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object other) { + if (other instanceof SortableImage) { + return this.compareTo((SortableImage)other) == 0; + } + return super.equals(other); + } + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() { + int hash = super.hashCode(); + hash = 37 * hash + Utils.hashCode(image); + return 37 * hash + index; + } + } + + private final FreeColClient freeColClient; + + private ImageLibrary lib; + + private RoadPainter rp; + + // Helper variables for displaying. + private int tileHeight, tileWidth, halfHeight, halfWidth; + + // The height offset to paint at (in pixels). + static final int STATE_OFFSET_X = 25, + STATE_OFFSET_Y = 10; + + private final GeneralPath fog = new GeneralPath(); + + + /** + * The constructor to use. + * + * @param freeColClient The FreeColClient for the game. + */ + TileViewer(FreeColClient freeColClient) { + this.freeColClient = freeColClient; + + setImageLibraryAndUpdateData(new ImageLibrary()); + } + + + /** + * Gets the contained ImageLibrary. + * + * @return The image library; + */ + ImageLibrary getImageLibrary() { + return lib; + } + + /** + * Returns the scaled terrain-image for a terrain type (and position 0, 0). + * + * @param type The type of the terrain-image to return. + * @param size The maximum size of the terrain image to return. + * @return The terrain-image + */ + static BufferedImage createTileImageWithOverlayAndForest( + TileType type, Dimension size) { + Dimension size2 = new Dimension( + (size.width > 0) ? size.width + : (2*ImageLibrary.TILE_SIZE.width*size.height + + (ImageLibrary.TILE_OVERLAY_SIZE.height+1)) / + (2*ImageLibrary.TILE_OVERLAY_SIZE.height), + -1); + BufferedImage terrainImage = ImageLibrary.getTerrainImage( + type, 0, 0, size2); + BufferedImage overlayImage = ImageLibrary.getOverlayImage( + type, type.getId(), size2); + BufferedImage forestImage = type.isForested() + ? ImageLibrary.getForestImage(type, size2) + : null; + if (overlayImage == null && forestImage == null) { + return terrainImage; + } else { + int width = terrainImage.getWidth(); + int height = terrainImage.getHeight(); + if (overlayImage != null) { + height = Math.max(height, overlayImage.getHeight()); + } + if (forestImage != null) { + height = Math.max(height, forestImage.getHeight()); + } + BufferedImage compositeImage = new BufferedImage(width, height, + BufferedImage.TYPE_INT_ARGB); + Graphics2D g = compositeImage.createGraphics(); + g.drawImage(terrainImage, 0, height - terrainImage.getHeight(), null); + if (overlayImage != null) { + g.drawImage(overlayImage, 0, height - overlayImage.getHeight(), null); + } + if (forestImage != null) { + g.drawImage(forestImage, 0, height - forestImage.getHeight(), null); + } + g.dispose(); + return compositeImage; + } + } + + /** + * Create a BufferedImage and draw a Tile on it. + * Draws the terrain and improvements. + * + * @param tile The Tile to draw. + * @return The image. + */ + BufferedImage createTileImageWithBeachBorderAndItems(Tile tile) { + if (!tile.isExplored()) + return lib.getTerrainImage(null, tile.getX(), tile.getY()); + final TileType tileType = tile.getType(); + Dimension terrainTileSize = lib.tileSize; + BufferedImage overlayImage = lib.getOverlayImage(tile); + final int compoundHeight = (overlayImage != null) + ? overlayImage.getHeight() + : tileType.isForested() + ? lib.tileForestSize.height + : terrainTileSize.height; + BufferedImage image = new BufferedImage( + terrainTileSize.width, compoundHeight, BufferedImage.TYPE_INT_ARGB); + Graphics2D g = image.createGraphics(); + g.translate(0, compoundHeight - terrainTileSize.height); + displayTileWithBeachAndBorder(g, tile); + displayTileItems(g, tile, overlayImage); + g.dispose(); + return image; + } + + /** + * Create a BufferedImage and draw a Tile on it. + * + * @param tile The Tile to draw. + * @return The image. + */ + BufferedImage createTileImage(Tile tile) { + final TileType tileType = tile.getType(); + Dimension terrainTileSize = lib.tileSize; + BufferedImage overlayImage = lib.getOverlayImage(tile); + final int compoundHeight = (overlayImage != null) + ? overlayImage.getHeight() + : tileType.isForested() + ? lib.tileForestSize.height + : terrainTileSize.height; + BufferedImage image = new BufferedImage( + terrainTileSize.width, compoundHeight, BufferedImage.TYPE_INT_ARGB); + Graphics2D g = image.createGraphics(); + g.translate(0, compoundHeight - terrainTileSize.height); + displayTile(g, tile, overlayImage); + g.dispose(); + return image; + } + + /** + * Create a BufferedImage and draw a Tile on it. + * The visualization of the Tile also includes information + * from the corresponding ColonyTile of the given + * Colony. + * + * @param tile The Tile to draw. + * @param colony The Colony to create the visualization + * of the Tile for. This object is also used to + * get the ColonyTile for the given Tile. + * @return The image. + */ + BufferedImage createColonyTileImage(Tile tile, Colony colony) { + final TileType tileType = tile.getType(); + Dimension terrainTileSize = lib.tileSize; + BufferedImage overlayImage = lib.getOverlayImage(tile); + final int compoundHeight = (overlayImage != null) + ? overlayImage.getHeight() + : tileType.isForested() + ? lib.tileForestSize.height + : terrainTileSize.height; + BufferedImage image = new BufferedImage( + terrainTileSize.width, compoundHeight, BufferedImage.TYPE_INT_ARGB); + Graphics2D g = image.createGraphics(); + g.translate(0, compoundHeight - terrainTileSize.height); + displayColonyTile(g, tile, colony, overlayImage); + g.dispose(); + return image; + } + + /** + * Displays the 3x3 tiles for the TilesPanel in ColonyPanel. + * + * @param g The Graphics2D object on which to draw + * the Tile. + * @param tiles The array containing the Tile objects to draw. + * @param colony The Colony to create the visualization + * of the Tile objects for. + */ + void displayColonyTiles(Graphics2D g, Tile[][] tiles, Colony colony) { + Set overlayCache = ImageLibrary.createOverlayCache(); + Dimension tileSize = lib.tileSize; + for (int x = 0; x < 3; x++) { + for (int y = 0; y < 3; y++) { + if (tiles[x][y] != null) { + int xx = (((2 - x) + y) * tileSize.width) / 2; + int yy = ((x + y) * tileSize.height) / 2; + g.translate(xx, yy); + BufferedImage overlayImage = lib.getOverlayImage( + tiles[x][y], overlayCache); + displayColonyTile(g, tiles[x][y], colony, overlayImage); + g.translate(-xx, -yy); + } + } + } + } + + /** + * Displays the given colony tile. + * The visualization of the Tile also includes information + * from the corresponding ColonyTile from the given + * Colony. + * + * @param g The Graphics2D on which to draw. + * @param tile The Tile to draw. + * @param colony The Colony to create the visualization + * of the Tile for. This object is also used to + * get the ColonyTile for the given Tile. + * @param overlayImage The BufferedImage of the tile overlay. + */ + private void displayColonyTile(Graphics2D g, Tile tile, Colony colony, + BufferedImage overlayImage) { + displayTile(g, tile, overlayImage); + + ColonyTile colonyTile = colony.getColonyTile(tile); + switch (colonyTile.getNoWorkReason()) { + case NONE: case COLONY_CENTER: case CLAIM_REQUIRED: + break; + default: + g.drawImage(lib.getMiscImage(ImageLibrary.TILE_TAKEN), + 0, 0, null); + } + int price = colony.getOwner().getLandPrice(tile); + if (price > 0 && !tile.hasSettlement()) { + BufferedImage image = lib.getMiscImage( + ImageLibrary.TILE_OWNED_BY_INDIANS); + displayCenteredImage(g, image); + } + + Unit unit = colonyTile.getOccupyingUnit(); + if (unit != null) { + BufferedImage image = lib.getSmallerUnitImage(unit); + g.drawImage(image, + tileWidth/4 - image.getWidth() / 2, + halfHeight - image.getHeight() / 2, null); + // Draw an occupation and nation indicator. + Player owner = freeColClient.getMyPlayer(); + String text = Messages.message(unit.getOccupationLabel(owner, false)); + g.drawImage(lib.getOccupationIndicatorChip(g, unit, text), + (int)(STATE_OFFSET_X * lib.getScaleFactor()), + 0, null); + } + } + + /** + * Displays the given Tile. + * + * @param g The Graphics2D on which to draw the Tile. + * @param tile The Tile to draw. + * @param overlayImage The BufferedImage for the tile overlay. + */ + private void displayTile(Graphics2D g, Tile tile, BufferedImage overlayImage) { + displayTileWithBeachAndBorder(g, tile); + if (tile.isExplored()) { + displayTileItems(g, tile, overlayImage); + displaySettlementWithChipsOrPopulationNumber(g, tile, false); + displayFogOfWar(g, tile); + displayOptionalTileText(g, tile); + } + } + + /** + * Sets the ImageLibrary and calculates various items that depend + * on tile size. + * + * @param lib an ImageLibrary value + */ + void setImageLibraryAndUpdateData(ImageLibrary lib) { + this.lib = lib; + // ATTENTION: we assume that all base tiles have the same size + Dimension tileSize = lib.tileSize; + rp = new RoadPainter(tileSize); + tileHeight = tileSize.height; + tileWidth = tileSize.width; + halfHeight = tileHeight/2; + halfWidth = tileWidth/2; + + fog.reset(); + fog.moveTo(halfWidth, 0); + fog.lineTo(tileWidth, halfHeight); + fog.lineTo(halfWidth, tileHeight); + fog.lineTo(0, halfHeight); + fog.closePath(); + } + + /** + * Centers the given Image on the tile. + * + * @param g a Graphics2D + * @param image the BufferedImage + */ + void displayCenteredImage(Graphics2D g, BufferedImage image) { + g.drawImage(image, + (tileWidth - image.getWidth())/2, + (tileHeight - image.getHeight())/2, + null); + } + + /** + * Centers the given Image on the tile, ensuring it is not drawing + * over tiles south of it. + * + * @param g a Graphics2D + * @param image the BufferedImage + */ + void displayLargeCenteredImage(Graphics2D g, BufferedImage image) { + int y = tileHeight - image.getHeight(); + if(y > 0) + y /= 2; + g.drawImage(image, (tileWidth - image.getWidth())/2, y, null); + } + + /** + * Displays the given Tile onto the given Graphics2D object at the + * location specified by the coordinates. Only base terrain will be drawn. + * + * @param g The Graphics2D object on which to draw the Tile. + * @param tile The Tile to draw. + */ + void displayTileWithBeachAndBorder(Graphics2D g, Tile tile) { + if (tile != null) { + TileType tileType = tile.getType(); + int x = tile.getX(); + int y = tile.getY(); + // ATTENTION: we assume that all base tiles have the same size + g.drawImage(lib.getTerrainImage(tileType, x, y), + 0, 0, null); + if (tile.isExplored()) { + if (!tile.isLand() && tile.getStyle() > 0) { + int edgeStyle = tile.getStyle() >> 4; + if (edgeStyle > 0) { + g.drawImage(lib.getBeachEdgeImage(edgeStyle, x, y), + 0, 0, null); + } + int cornerStyle = tile.getStyle() & 15; + if (cornerStyle > 0) { + g.drawImage(lib.getBeachCornerImage(cornerStyle, x, y), + 0, 0, null); + } + } + + List imageBorders = new ArrayList<>(8); + SortableImage si; + for (Direction direction : Direction.values()) { + Tile borderingTile = tile.getNeighbourOrNull(direction); + if (borderingTile != null && borderingTile.isExplored()) { + TileType borderingTileType = borderingTile.getType(); + if (borderingTileType != tileType) { + if (!tile.isLand() && borderingTile.isLand()) { + // If there is a Coast image (eg. beach) defined, use it, otherwise skip + // Draw the grass from the neighboring tile, spilling over on the side of this tile + si = new SortableImage( + lib.getBorderImage(borderingTileType, direction, x, y), + borderingTileType.getIndex()); + imageBorders.add(si); + TileImprovement river = borderingTile.getRiver(); + if (river != null && river.isConnectedTo(direction.getReverseDirection())) { + si = new SortableImage( + lib.getRiverMouthImage(direction, + borderingTile.getRiver().getMagnitude(), x, y), + -1); + imageBorders.add(si); + } + } else if (!tile.isLand() || borderingTile.isLand()) { + if (borderingTileType.getIndex() < tileType.getIndex() && + !lib.getTerrainImage(tileType, 0, 0).equals(lib.getTerrainImage(borderingTileType, 0, 0))) { + // Draw land terrain with bordering land type, or ocean/high seas limit, + // if the tiles do not share same graphics (ocean & great river) + si = new SortableImage( + lib.getBorderImage(borderingTileType, direction, x, y), + borderingTileType.getIndex()); + imageBorders.add(si); + } + } + } + } + } + Collections.sort(imageBorders); + for (SortableImage sorted : imageBorders) { + g.drawImage(sorted.image, 0, 0, null); + } + } + } + } + + void displayUnknownTileBorder(Graphics2D g, Tile tile) { + for (Direction direction : Direction.values()) { + Tile borderingTile = tile.getNeighbourOrNull(direction); + if (borderingTile != null && !borderingTile.isExplored()) { + g.drawImage(lib.getBorderImage( + null, direction, tile.getX(), tile.getY()), + 0, 0, null); + } + } + } + + /** + * Displays the given Tile onto the given Graphics2D object at the + * location specified by the coordinates. Fog of war will be + * drawn. + * + * @param g The Graphics2D object on which to draw + * the Tile. + * @param tile The Tile to draw. + */ + void displayFogOfWar(Graphics2D g, Tile tile) { + if (freeColClient.getGame() != null + && freeColClient.getGame().getSpecification() + .getBoolean(GameOptions.FOG_OF_WAR) + && freeColClient.getMyPlayer() != null + && !freeColClient.getMyPlayer().canSee(tile)) { + g.setColor(Color.BLACK); + Composite oldComposite = g.getComposite(); + g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, + 0.2f)); + g.fill(fog); + g.setComposite(oldComposite); + } + } + + /** + * Displays the Tile text for a Tile. + * Shows tile names, coordinates and colony values. + * + * @param g The Graphics2D object on which the text gets drawn. + * @param tile The Tile to draw the text on. + */ + void displayOptionalTileText(Graphics2D g, Tile tile) { + String text = null; + int op = freeColClient.getClientOptions() + .getInteger(ClientOptions.DISPLAY_TILE_TEXT); + switch (op) { + case ClientOptions.DISPLAY_TILE_TEXT_NAMES: + text = Messages.getName(tile); + break; + case ClientOptions.DISPLAY_TILE_TEXT_OWNERS: + if (tile.getOwner() != null) { + text = Messages.message(tile.getOwner().getNationLabel()); + } + break; + case ClientOptions.DISPLAY_TILE_TEXT_REGIONS: + if (tile.getRegion() != null) { + if (FreeColDebugger.isInDebugMode(FreeColDebugger.DebugMode.MENUS) + && tile.getRegion().getName() == null) { + text = tile.getRegion().getSuffix(); + } else { + text = Messages.message(tile.getRegion().getLabel()); + } + } + break; + case ClientOptions.DISPLAY_TILE_TEXT_EMPTY: + break; + default: + logger.warning("displayTileText option " + op + " out of range"); + break; + } + + g.setColor(Color.BLACK); + g.setFont(FontLibrary.createFont(FontLibrary.FontType.NORMAL, + FontLibrary.FontSize.TINY, lib.getScaleFactor())); + if (text != null) { + int b = getBreakingPoint(text); + if (b == -1) { + g.drawString(text, + (tileWidth - g.getFontMetrics().stringWidth(text)) / 2, + (tileHeight - g.getFontMetrics().getAscent()) / 2); + } else { + g.drawString(text.substring(0, b), + (tileWidth - g.getFontMetrics().stringWidth(text.substring(0, b)))/2, + halfHeight - (g.getFontMetrics().getAscent()*2)/3); + g.drawString(text.substring(b+1), + (tileWidth - g.getFontMetrics().stringWidth(text.substring(b+1)))/2, + halfHeight + (g.getFontMetrics().getAscent()*2)/3); + } + } + + if (FreeColDebugger.debugDisplayCoordinates()) { + String posString = tile.getX() + ", " + tile.getY(); + if (tile.getHighSeasCount() >= 0) { + posString += "/" + Integer.toString(tile.getHighSeasCount()); + } + g.drawString(posString, + (tileWidth - g.getFontMetrics().stringWidth(posString)) / 2, + (tileHeight - g.getFontMetrics().getAscent()) / 2); + } + String value = DebugUtils.getColonyValue(tile); + if (value != null) { + g.drawString(value, + (tileWidth - g.getFontMetrics().stringWidth(value)) / 2, + (tileHeight - g.getFontMetrics().getAscent()) / 2); + } + } + + /** + * Displays the given Tile onto the given Graphics2D object at the + * location specified by the coordinates. Settlements and Lost + * City Rumours will be shown. + * + * @param g The Graphics2D object on which to draw the Tile. + * @param tile The Tile to draw. + * @param withNumber Whether to display the number of units present. + */ + void displaySettlementWithChipsOrPopulationNumber( + Graphics2D g, Tile tile, boolean withNumber) { + final Player player = freeColClient.getMyPlayer(); + final Settlement settlement = tile.getSettlement(); + + if (settlement != null) { + if (settlement instanceof Colony) { + Colony colony = (Colony)settlement; + + // Draw image of colony in center of the tile. + BufferedImage colonyImage = lib.getSettlementImage(settlement); + displayLargeCenteredImage(g, colonyImage); + + if (withNumber) { + String populationString = Integer.toString( + colony.getDisplayUnitCount()); + int bonus = colony.getProductionBonus(); + Color theColor = ResourceManager.getColor( + "color.map.productionBonus." + bonus); + // if government admits even more units, use + // italic and bigger number icon + Font font = (colony.getPreferredSizeChange() > 0) + ? FontLibrary.createFont(FontLibrary.FontType.SIMPLE, + FontLibrary.FontSize.SMALLER, Font.BOLD | Font.ITALIC, + lib.getScaleFactor()) + : FontLibrary.createFont(FontLibrary.FontType.SIMPLE, + FontLibrary.FontSize.TINY, Font.BOLD, + lib.getScaleFactor()); + BufferedImage stringImage = lib.getStringImage(g, + populationString, theColor, font); + displayCenteredImage(g, stringImage); + } + + } else if (settlement instanceof IndianSettlement) { + IndianSettlement is = (IndianSettlement)settlement; + BufferedImage settlementImage = lib.getSettlementImage(settlement); + + // Draw image of indian settlement in center of the tile. + displayCenteredImage(g, settlementImage); + + BufferedImage chip; + float xOffset = STATE_OFFSET_X * lib.getScaleFactor(); + float yOffset = STATE_OFFSET_Y * lib.getScaleFactor(); + final int colonyLabels = freeColClient.getClientOptions() + .getInteger(ClientOptions.COLONY_LABELS); + if (colonyLabels != ClientOptions.COLONY_LABELS_MODERN) { + // Draw the settlement chip + chip = lib.getIndianSettlementChip(g, is); + g.drawImage(chip, (int)xOffset, (int)yOffset, null); + xOffset += chip.getWidth() + 2; + + // Draw the mission chip if needed. + Unit missionary = is.getMissionary(); + if (missionary != null) { + boolean expert + = missionary.hasAbility(Ability.EXPERT_MISSIONARY); + g.drawImage(lib.getMissionChip(g, missionary.getOwner(), + expert), + (int)xOffset, (int)yOffset, null); + xOffset += chip.getWidth() + 2; + } + } + + // Draw the alarm chip if needed. + if ((chip = lib.getAlarmChip(g, is, player)) != null) { + g.drawImage(chip, (int)xOffset, (int)yOffset, null); + } + } else { + logger.warning("Bogus settlement: " + settlement); + } + } + } + + /** + * Displays the given tile's items onto the given Graphics2D object. + * Additions and improvements to Tile will be drawn. + * Only works for explored tiles. + * + * @param g The Graphics2D object on which to draw the Tile. + * @param tile The Tile to draw. + * @param overlayImage The BufferedImage for the tile overlay. + */ + void displayTileItems(Graphics2D g, Tile tile, BufferedImage overlayImage) { + // ATTENTION: we assume that only overlays and forests + // might be taller than a tile. + + // layer additions and improvements according to zIndex + List tileItems = (tile.getTileItemContainer() != null) + ? tile.getTileItemContainer().getTileItems() + : new ArrayList(); + int startIndex = 0; + for (int index = startIndex; index < tileItems.size(); index++) { + if (tileItems.get(index).getZIndex() < Tile.OVERLAY_ZINDEX) { + displayTileItem(g, tile, tileItems.get(index)); + startIndex = index + 1; + } else { + startIndex = index; + break; + } + } + // Tile Overlays (eg. hills and mountains) + if (overlayImage != null) { + g.drawImage(overlayImage, + 0, (tileHeight - overlayImage.getHeight()), null); + } + for (int index = startIndex; index < tileItems.size(); index++) { + if (tileItems.get(index).getZIndex() < Tile.FOREST_ZINDEX) { + displayTileItem(g, tile, tileItems.get(index)); + startIndex = index + 1; + } else { + startIndex = index; + break; + } + } + // Forest + if (tile.isForested()) { + BufferedImage forestImage = lib.getForestImage( + tile.getType(), tile.getRiverStyle()); + g.drawImage(forestImage, + 0, (tileHeight - forestImage.getHeight()), null); + } + + // draw all remaining items + for (TileItem ti : tileItems.subList(startIndex, tileItems.size())) { + displayTileItem(g, tile, ti); + } + } + + /** + * Draws the given TileItem on the given Tile. + */ + private void displayTileItem(Graphics2D g, Tile tile, TileItem item) { + if (item instanceof TileImprovement) { + displayTileImprovement(g, tile, (TileImprovement)item); + } else if (item instanceof LostCityRumour) { + displayLostCityRumour(g); + } else { + displayResourceTileItem(g, (Resource) item); + } + } + + private void displayResourceTileItem(Graphics2D g, Resource item) { + BufferedImage bonusImage = lib.getMiscImage( + "image.tileitem." + item.getType().getId()); + displayCenteredImage(g, bonusImage); + } + + private void displayLostCityRumour(Graphics2D g) { + displayCenteredImage(g, + lib.getMiscImage(ImageLibrary.LOST_CITY_RUMOUR)); + } + + private void displayTileImprovement(Graphics2D g, + Tile tile, TileImprovement ti) { + if (ti.isComplete()) { + if (ti.isRoad()) { + rp.displayRoad(g, tile); + } else if (ti.isRiver() + && ti.getMagnitude() < TileImprovement.FJORD_RIVER) { + // @compat 0.10.5 + // America_large had some bogus rivers in 0.10.5 + if (ti.getStyle() != null) + // end @compat 0.10.5 + g.drawImage(lib.getRiverImage(ti.getStyle()), 0, 0, null); + } else { + String key = "image.tile." + ti.getType().getId(); + if (ResourceManager.hasImageResource(key)) { + // Has its own Overlay Image in Misc, use it + BufferedImage overlay = ResourceManager.getImage(key, + lib.tileSize); + g.drawImage(overlay, 0, 0, null); + } + } + } + } + +} diff --git a/src/net/sf/freecol/client/gui/action/AboutAction.java b/src/net/sf/freecol/client/gui/action/AboutAction.java index 8c764eea8..339b60437 100644 --- a/src/net/sf/freecol/client/gui/action/AboutAction.java +++ b/src/net/sf/freecol/client/gui/action/AboutAction.java @@ -51,7 +51,7 @@ public class AboutAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showAboutPanel(); } } diff --git a/src/net/sf/freecol/client/gui/action/ActionManager.java b/src/net/sf/freecol/client/gui/action/ActionManager.java index 4c16ab10f..1eba723c9 100644 --- a/src/net/sf/freecol/client/gui/action/ActionManager.java +++ b/src/net/sf/freecol/client/gui/action/ActionManager.java @@ -19,7 +19,6 @@ package net.sf.freecol.client.gui.action; -import java.util.Iterator; import java.util.logging.Logger; import net.sf.freecol.client.FreeColClient; @@ -175,6 +174,7 @@ public class ActionManager extends OptionGroup { add(new ImprovementAction(freeColClient, type)); } } + update(); } /** diff --git a/src/net/sf/freecol/client/gui/action/AssignTradeRouteAction.java b/src/net/sf/freecol/client/gui/action/AssignTradeRouteAction.java index 10e0e6fbf..a26106f5a 100644 --- a/src/net/sf/freecol/client/gui/action/AssignTradeRouteAction.java +++ b/src/net/sf/freecol/client/gui/action/AssignTradeRouteAction.java @@ -64,7 +64,7 @@ public class AssignTradeRouteAction extends UnitAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { Unit unit = getGUI().getActiveUnit(); if (unit != null) getGUI().showTradeRoutePanel(unit); } diff --git a/src/net/sf/freecol/client/gui/action/BuildColonyAction.java b/src/net/sf/freecol/client/gui/action/BuildColonyAction.java index 328b9c76f..20c7e08de 100644 --- a/src/net/sf/freecol/client/gui/action/BuildColonyAction.java +++ b/src/net/sf/freecol/client/gui/action/BuildColonyAction.java @@ -68,7 +68,7 @@ public class BuildColonyAction extends UnitAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { igc().buildColony(getGUI().getActiveUnit()); } } diff --git a/src/net/sf/freecol/client/gui/action/CenterAction.java b/src/net/sf/freecol/client/gui/action/CenterAction.java index f3c1346ae..751133396 100644 --- a/src/net/sf/freecol/client/gui/action/CenterAction.java +++ b/src/net/sf/freecol/client/gui/action/CenterAction.java @@ -48,7 +48,7 @@ public class CenterAction extends UnitAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().centerActiveUnit(); } } diff --git a/src/net/sf/freecol/client/gui/action/ChangeAction.java b/src/net/sf/freecol/client/gui/action/ChangeAction.java index a6815bbc9..8c51a250e 100644 --- a/src/net/sf/freecol/client/gui/action/ChangeAction.java +++ b/src/net/sf/freecol/client/gui/action/ChangeAction.java @@ -70,14 +70,14 @@ public class ChangeAction extends UnitAction { public final void update() { super.update(); - Unit unit = getGUI().getActiveUnit(); + final Unit unit = getGUI().getActiveUnit(); if (unit != null && unit.hasTile()) { if (unit.getColony() != null) { - putValue(NAME, Messages.message("changeAction.enterColony.name")); + putValue(NAME, Messages.getName("changeAction.enterColony")); } else if (unit.isOnCarrier()) { - putValue(NAME, Messages.message("changeAction.selectCarrier.name")); + putValue(NAME, Messages.getName("changeAction.selectCarrier")); } else { - putValue(NAME, Messages.message("changeAction.nextUnitOnTile.name")); + putValue(NAME, Messages.getName("changeAction.nextUnitOnTile")); } } } @@ -89,9 +89,9 @@ public class ChangeAction extends UnitAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { - Unit unit = getGUI().getActiveUnit(); - Tile tile = unit.getTile(); + public void actionPerformed(ActionEvent ae) { + final Unit unit = getGUI().getActiveUnit(); + final Tile tile = unit.getTile(); if (tile.getColony() != null) { getGUI().showColonyPanel(tile.getColony(), unit); diff --git a/src/net/sf/freecol/client/gui/action/ChangeWindowedModeAction.java b/src/net/sf/freecol/client/gui/action/ChangeWindowedModeAction.java index 84d5b7d8a..8a4bd7cc4 100644 --- a/src/net/sf/freecol/client/gui/action/ChangeWindowedModeAction.java +++ b/src/net/sf/freecol/client/gui/action/ChangeWindowedModeAction.java @@ -75,9 +75,9 @@ public class ChangeWindowedModeAction extends SelectableAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { GUI gui = getGUI(); if (gui == null) return; - gui.changeWindowedMode(!gui.isWindowed()); + gui.changeWindowedMode(); } } diff --git a/src/net/sf/freecol/client/gui/action/ChatAction.java b/src/net/sf/freecol/client/gui/action/ChatAction.java index 9dafbf861..186353faf 100644 --- a/src/net/sf/freecol/client/gui/action/ChatAction.java +++ b/src/net/sf/freecol/client/gui/action/ChatAction.java @@ -64,7 +64,7 @@ public class ChatAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showChatPanel(); } } diff --git a/src/net/sf/freecol/client/gui/action/ClearOrdersAction.java b/src/net/sf/freecol/client/gui/action/ClearOrdersAction.java index c21bbd85a..798461124 100644 --- a/src/net/sf/freecol/client/gui/action/ClearOrdersAction.java +++ b/src/net/sf/freecol/client/gui/action/ClearOrdersAction.java @@ -48,7 +48,7 @@ public class ClearOrdersAction extends UnitAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { igc().clearOrders(getGUI().getActiveUnit()); } } diff --git a/src/net/sf/freecol/client/gui/action/ColopediaAction.java b/src/net/sf/freecol/client/gui/action/ColopediaAction.java index a0a23b734..fb65cb146 100644 --- a/src/net/sf/freecol/client/gui/action/ColopediaAction.java +++ b/src/net/sf/freecol/client/gui/action/ColopediaAction.java @@ -33,9 +33,10 @@ public class ColopediaAction extends FreeColAction { public static final String id = "colopediaAction."; + // Order of elements will influence ingame order of menu items. public static enum PanelType { - TERRAIN, RESOURCES, UNITS, GOODS, - SKILLS, BUILDINGS, FATHERS, NATIONS, + TERRAIN, RESOURCES, GOODS, UNITS, + BUILDINGS, FATHERS, NATIONS, NATION_TYPES, CONCEPTS; public String getKey() { @@ -46,9 +47,8 @@ public class ColopediaAction extends FreeColAction { private static final int[] mnemonics = { KeyEvent.VK_T, KeyEvent.VK_R, - KeyEvent.VK_U, KeyEvent.VK_G, - KeyEvent.VK_S, + KeyEvent.VK_U, KeyEvent.VK_B, KeyEvent.VK_F, KeyEvent.VK_N, @@ -76,7 +76,7 @@ public class ColopediaAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showColopediaPanel(getId()); } } diff --git a/src/net/sf/freecol/client/gui/action/ContinueAction.java b/src/net/sf/freecol/client/gui/action/ContinueAction.java index a6c14ee36..276d51a95 100644 --- a/src/net/sf/freecol/client/gui/action/ContinueAction.java +++ b/src/net/sf/freecol/client/gui/action/ContinueAction.java @@ -55,7 +55,7 @@ public class ContinueAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { File lastSave = FreeColDirectories.getLastSaveGameFile(); if (lastSave != null) { getGUI().removeInGameComponents(); diff --git a/src/net/sf/freecol/client/gui/action/DebugAction.java b/src/net/sf/freecol/client/gui/action/DebugAction.java index 2cf350bef..d8f503691 100644 --- a/src/net/sf/freecol/client/gui/action/DebugAction.java +++ b/src/net/sf/freecol/client/gui/action/DebugAction.java @@ -66,7 +66,7 @@ public class DebugAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { if (shouldBeEnabled()) { igc().setInDebugMode(); getConnectController().reconnect(); diff --git a/src/net/sf/freecol/client/gui/action/DeclareIndependenceAction.java b/src/net/sf/freecol/client/gui/action/DeclareIndependenceAction.java index cd6a5c4e0..98eb373ec 100644 --- a/src/net/sf/freecol/client/gui/action/DeclareIndependenceAction.java +++ b/src/net/sf/freecol/client/gui/action/DeclareIndependenceAction.java @@ -63,8 +63,7 @@ public class DeclareIndependenceAction extends MapboardAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { igc().declareIndependence(); - update(); } } diff --git a/src/net/sf/freecol/client/gui/action/DetermineHighSeasAction.java b/src/net/sf/freecol/client/gui/action/DetermineHighSeasAction.java index a8732600f..8d46720fd 100644 --- a/src/net/sf/freecol/client/gui/action/DetermineHighSeasAction.java +++ b/src/net/sf/freecol/client/gui/action/DetermineHighSeasAction.java @@ -64,7 +64,7 @@ public class DetermineHighSeasAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { final Map map = getGame().getMap(); Parameters p = getGUI().showParametersDialog(); diff --git a/src/net/sf/freecol/client/gui/action/DisbandUnitAction.java b/src/net/sf/freecol/client/gui/action/DisbandUnitAction.java index 936469bbb..56539711b 100644 --- a/src/net/sf/freecol/client/gui/action/DisbandUnitAction.java +++ b/src/net/sf/freecol/client/gui/action/DisbandUnitAction.java @@ -50,7 +50,7 @@ public class DisbandUnitAction extends UnitAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { igc().disbandUnit(getGUI().getActiveUnit()); } } diff --git a/src/net/sf/freecol/client/gui/action/DisplayBordersAction.java b/src/net/sf/freecol/client/gui/action/DisplayBordersAction.java index 520814ad0..eeda94b0f 100644 --- a/src/net/sf/freecol/client/gui/action/DisplayBordersAction.java +++ b/src/net/sf/freecol/client/gui/action/DisplayBordersAction.java @@ -51,8 +51,8 @@ public class DisplayBordersAction extends SelectableAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { - setSelected(((JCheckBoxMenuItem) e.getSource()).isSelected()); + public void actionPerformed(ActionEvent ae) { + setSelected(((JCheckBoxMenuItem)ae.getSource()).isSelected()); setOption(isSelected()); getGUI().refresh(); } diff --git a/src/net/sf/freecol/client/gui/action/DisplayGridAction.java b/src/net/sf/freecol/client/gui/action/DisplayGridAction.java index a7ecd0625..95dec50da 100644 --- a/src/net/sf/freecol/client/gui/action/DisplayGridAction.java +++ b/src/net/sf/freecol/client/gui/action/DisplayGridAction.java @@ -51,8 +51,8 @@ public class DisplayGridAction extends SelectableAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { - setSelected(((JCheckBoxMenuItem)e.getSource()).isSelected()); + public void actionPerformed(ActionEvent ae) { + setSelected(((JCheckBoxMenuItem)ae.getSource()).isSelected()); setOption(isSelected()); getGUI().refresh(); } diff --git a/src/net/sf/freecol/client/gui/action/DisplayTileTextAction.java b/src/net/sf/freecol/client/gui/action/DisplayTileTextAction.java index 81c65f130..93d71f140 100644 --- a/src/net/sf/freecol/client/gui/action/DisplayTileTextAction.java +++ b/src/net/sf/freecol/client/gui/action/DisplayTileTextAction.java @@ -94,8 +94,8 @@ public class DisplayTileTextAction extends SelectableAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { - if (((JRadioButtonMenuItem) e.getSource()).isSelected()) { + public void actionPerformed(ActionEvent ae) { + if (((JRadioButtonMenuItem)ae.getSource()).isSelected()) { freeColClient.getClientOptions() .setInteger(ClientOptions.DISPLAY_TILE_TEXT, display.ordinal()); getGUI().refresh(); diff --git a/src/net/sf/freecol/client/gui/action/EndTurnAction.java b/src/net/sf/freecol/client/gui/action/EndTurnAction.java index 828ddf738..9d0a6db50 100644 --- a/src/net/sf/freecol/client/gui/action/EndTurnAction.java +++ b/src/net/sf/freecol/client/gui/action/EndTurnAction.java @@ -50,7 +50,7 @@ public class EndTurnAction extends MapboardAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { igc().endTurn(true); } } diff --git a/src/net/sf/freecol/client/gui/action/EuropeAction.java b/src/net/sf/freecol/client/gui/action/EuropeAction.java index 846a72acf..e125e69bf 100644 --- a/src/net/sf/freecol/client/gui/action/EuropeAction.java +++ b/src/net/sf/freecol/client/gui/action/EuropeAction.java @@ -62,7 +62,7 @@ public class EuropeAction extends MapboardAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showEuropePanel(); } } diff --git a/src/net/sf/freecol/client/gui/action/ExecuteGotoOrdersAction.java b/src/net/sf/freecol/client/gui/action/ExecuteGotoOrdersAction.java index 9728d305a..62c375f1c 100644 --- a/src/net/sf/freecol/client/gui/action/ExecuteGotoOrdersAction.java +++ b/src/net/sf/freecol/client/gui/action/ExecuteGotoOrdersAction.java @@ -48,7 +48,7 @@ public class ExecuteGotoOrdersAction extends MapboardAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { igc().executeGotoOrders(); } } diff --git a/src/net/sf/freecol/client/gui/action/FindSettlementAction.java b/src/net/sf/freecol/client/gui/action/FindSettlementAction.java index b96b1ef18..2fffdf4a8 100644 --- a/src/net/sf/freecol/client/gui/action/FindSettlementAction.java +++ b/src/net/sf/freecol/client/gui/action/FindSettlementAction.java @@ -48,7 +48,7 @@ public class FindSettlementAction extends MapboardAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showFindSettlementPanel(); } } diff --git a/src/net/sf/freecol/client/gui/action/FortifyAction.java b/src/net/sf/freecol/client/gui/action/FortifyAction.java index f0253520b..a7dc00cce 100644 --- a/src/net/sf/freecol/client/gui/action/FortifyAction.java +++ b/src/net/sf/freecol/client/gui/action/FortifyAction.java @@ -63,7 +63,7 @@ public class FortifyAction extends UnitAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { igc().changeState(getGUI().getActiveUnit(), Unit.UnitState.FORTIFYING); } diff --git a/src/net/sf/freecol/client/gui/action/FreeColAction.java b/src/net/sf/freecol/client/gui/action/FreeColAction.java index 593088884..721d1b3e3 100644 --- a/src/net/sf/freecol/client/gui/action/FreeColAction.java +++ b/src/net/sf/freecol/client/gui/action/FreeColAction.java @@ -19,13 +19,11 @@ package net.sf.freecol.client.gui.action; -import java.awt.Image; import java.awt.event.ActionEvent; import java.util.logging.Logger; import javax.swing.AbstractAction; import javax.swing.Action; -import javax.swing.ImageIcon; import javax.swing.KeyStroke; import javax.swing.event.MenuKeyEvent; import javax.swing.event.MenuKeyListener; @@ -241,14 +239,10 @@ public abstract class FreeColAction extends AbstractAction + (ResourceManager.hasImageResource(pressedKey) ? 1 : 0) + (ResourceManager.hasImageResource(disabledKey) ? 1 : 0); if (hasOrderButtons()) { - Image normal = ResourceManager.getImage(normalKey); - Image highlighted = ResourceManager.getImage(highlightedKey); - Image pressed = ResourceManager.getImage(pressedKey); - Image disabled = ResourceManager.getImage(disabledKey); - putValue(BUTTON_IMAGE, new ImageIcon(normal)); - putValue(BUTTON_ROLLOVER_IMAGE, new ImageIcon(highlighted)); - putValue(BUTTON_PRESSED_IMAGE, new ImageIcon(pressed)); - putValue(BUTTON_DISABLED_IMAGE, new ImageIcon(disabled)); + putValue(BUTTON_IMAGE, normalKey); + putValue(BUTTON_ROLLOVER_IMAGE, highlightedKey); + putValue(BUTTON_PRESSED_IMAGE, pressedKey); + putValue(BUTTON_DISABLED_IMAGE, disabledKey); } else { logger.warning("Missing " + (4-orderButtonImageCount) + " order button images for " + getId()); @@ -364,9 +358,7 @@ public abstract class FreeColAction extends AbstractAction */ public void update() { boolean b = shouldBeEnabled(); - if (isEnabled() != b) { - setEnabled(b); - } + if (isEnabled() != b) setEnabled(b); } diff --git a/src/net/sf/freecol/client/gui/action/GotoAction.java b/src/net/sf/freecol/client/gui/action/GotoAction.java index fb76091a9..99040e589 100644 --- a/src/net/sf/freecol/client/gui/action/GotoAction.java +++ b/src/net/sf/freecol/client/gui/action/GotoAction.java @@ -62,7 +62,7 @@ public class GotoAction extends UnitAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { Unit unit = getGUI().getActiveUnit(); if (unit != null) { igc().selectDestination(unit); diff --git a/src/net/sf/freecol/client/gui/action/GotoTileAction.java b/src/net/sf/freecol/client/gui/action/GotoTileAction.java index 9c7f21850..02fe05c17 100644 --- a/src/net/sf/freecol/client/gui/action/GotoTileAction.java +++ b/src/net/sf/freecol/client/gui/action/GotoTileAction.java @@ -60,7 +60,7 @@ public class GotoTileAction extends UnitAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().activateGotoPath(); } } diff --git a/src/net/sf/freecol/client/gui/action/ImprovementAction.java b/src/net/sf/freecol/client/gui/action/ImprovementAction.java index 2a86d03fb..381d5d4d6 100644 --- a/src/net/sf/freecol/client/gui/action/ImprovementAction.java +++ b/src/net/sf/freecol/client/gui/action/ImprovementAction.java @@ -78,7 +78,7 @@ public class ImprovementAction extends UnitAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { Unit unit = getGUI().getActiveUnit(); if (unit == null) return; diff --git a/src/net/sf/freecol/client/gui/action/LoadAction.java b/src/net/sf/freecol/client/gui/action/LoadAction.java index a9a4e305d..c3e5a5e53 100644 --- a/src/net/sf/freecol/client/gui/action/LoadAction.java +++ b/src/net/sf/freecol/client/gui/action/LoadAction.java @@ -68,7 +68,7 @@ public class LoadAction extends MapboardAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { final Unit unit = getGUI().getActiveUnit(); if (unit == null) return; diff --git a/src/net/sf/freecol/client/gui/action/MapControlsAction.java b/src/net/sf/freecol/client/gui/action/MapControlsAction.java index 1d75f27bf..22d1d0b47 100644 --- a/src/net/sf/freecol/client/gui/action/MapControlsAction.java +++ b/src/net/sf/freecol/client/gui/action/MapControlsAction.java @@ -64,8 +64,8 @@ public class MapControlsAction extends SelectableAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { - setSelected(((AbstractButton)e.getSource()).isSelected()); + public void actionPerformed(ActionEvent ae) { + setSelected(((AbstractButton)ae.getSource()).isSelected()); setOption(isSelected()); update(); } diff --git a/src/net/sf/freecol/client/gui/action/MapEditorAction.java b/src/net/sf/freecol/client/gui/action/MapEditorAction.java index 8140e9d2a..79362ad64 100644 --- a/src/net/sf/freecol/client/gui/action/MapEditorAction.java +++ b/src/net/sf/freecol/client/gui/action/MapEditorAction.java @@ -48,7 +48,7 @@ public class MapEditorAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { freeColClient.getMapEditorController().startMapEditor(); } } diff --git a/src/net/sf/freecol/client/gui/action/MiniMapToggleFogOfWarAction.java b/src/net/sf/freecol/client/gui/action/MiniMapToggleFogOfWarAction.java index 1b442c228..3afbf8498 100644 --- a/src/net/sf/freecol/client/gui/action/MiniMapToggleFogOfWarAction.java +++ b/src/net/sf/freecol/client/gui/action/MiniMapToggleFogOfWarAction.java @@ -62,7 +62,7 @@ public class MiniMapToggleFogOfWarAction extends MapboardAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().miniMapToggleFogOfWarControls(); if (freeColClient.getClientOptions().getBoolean(ClientOptions.MINIMAP_TOGGLE_FOG_OF_WAR)) { diff --git a/src/net/sf/freecol/client/gui/action/MiniMapToggleViewAction.java b/src/net/sf/freecol/client/gui/action/MiniMapToggleViewAction.java index b437d318f..35202ebc1 100644 --- a/src/net/sf/freecol/client/gui/action/MiniMapToggleViewAction.java +++ b/src/net/sf/freecol/client/gui/action/MiniMapToggleViewAction.java @@ -62,7 +62,7 @@ public class MiniMapToggleViewAction extends MapboardAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().miniMapToggleViewControls(); if (freeColClient.getClientOptions().getBoolean(ClientOptions.MINIMAP_TOGGLE_BORDERS)) { diff --git a/src/net/sf/freecol/client/gui/action/MiniMapZoomInAction.java b/src/net/sf/freecol/client/gui/action/MiniMapZoomInAction.java index b1d3f44b1..6fe89c3c7 100644 --- a/src/net/sf/freecol/client/gui/action/MiniMapZoomInAction.java +++ b/src/net/sf/freecol/client/gui/action/MiniMapZoomInAction.java @@ -73,7 +73,7 @@ public class MiniMapZoomInAction extends MapboardAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().zoomInMapControls(); update(); getActionManager().getFreeColAction(MiniMapZoomOutAction.id).update(); diff --git a/src/net/sf/freecol/client/gui/action/MiniMapZoomOutAction.java b/src/net/sf/freecol/client/gui/action/MiniMapZoomOutAction.java index 9c7874a84..4ff530e21 100644 --- a/src/net/sf/freecol/client/gui/action/MiniMapZoomOutAction.java +++ b/src/net/sf/freecol/client/gui/action/MiniMapZoomOutAction.java @@ -73,7 +73,7 @@ public class MiniMapZoomOutAction extends MapboardAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().zoomOutMapControls(); update(); getActionManager().getFreeColAction(MiniMapZoomInAction.id).update(); diff --git a/src/net/sf/freecol/client/gui/action/MoveAction.java b/src/net/sf/freecol/client/gui/action/MoveAction.java index 26987bf47..5b1ac0fe9 100644 --- a/src/net/sf/freecol/client/gui/action/MoveAction.java +++ b/src/net/sf/freecol/client/gui/action/MoveAction.java @@ -69,7 +69,7 @@ public class MoveAction extends MapboardAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { switch (getGUI().getViewMode()) { case GUI.MOVE_UNITS_MODE: igc().moveUnit(getGUI().getActiveUnit(), direction); diff --git a/src/net/sf/freecol/client/gui/action/NewAction.java b/src/net/sf/freecol/client/gui/action/NewAction.java index baa8fdccb..50cfc5196 100644 --- a/src/net/sf/freecol/client/gui/action/NewAction.java +++ b/src/net/sf/freecol/client/gui/action/NewAction.java @@ -48,11 +48,11 @@ public class NewAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { if (freeColClient.isMapEditor()) { freeColClient.getMapEditorController().newMap(); } else { - freeColClient.newGame(); + freeColClient.newGame(true); } } } diff --git a/src/net/sf/freecol/client/gui/action/NewEmptyMapAction.java b/src/net/sf/freecol/client/gui/action/NewEmptyMapAction.java index bae197888..b7063678e 100644 --- a/src/net/sf/freecol/client/gui/action/NewEmptyMapAction.java +++ b/src/net/sf/freecol/client/gui/action/NewEmptyMapAction.java @@ -63,7 +63,7 @@ public class NewEmptyMapAction extends MapboardAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { Dimension size = getGUI().showMapSizeDialog(); if (size == null) return; final Game game = getGame(); @@ -72,7 +72,7 @@ public class NewEmptyMapAction extends MapboardAction { game.setMap(map); Tile tile = map.getTile(size.width/2, size.height/2); getGUI().setFocus(tile); - getFreeColClient().updateActions(); + getGUI().updateMenuBar(); getGUI().refresh(); } } diff --git a/src/net/sf/freecol/client/gui/action/OpenAction.java b/src/net/sf/freecol/client/gui/action/OpenAction.java index a13b7d36d..be539d1b9 100644 --- a/src/net/sf/freecol/client/gui/action/OpenAction.java +++ b/src/net/sf/freecol/client/gui/action/OpenAction.java @@ -48,7 +48,7 @@ public class OpenAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { if (!freeColClient.isMapEditor()) { igc().loadGame(); } else { diff --git a/src/net/sf/freecol/client/gui/action/PreferencesAction.java b/src/net/sf/freecol/client/gui/action/PreferencesAction.java index 2d705d7e2..eae03a6c7 100644 --- a/src/net/sf/freecol/client/gui/action/PreferencesAction.java +++ b/src/net/sf/freecol/client/gui/action/PreferencesAction.java @@ -48,7 +48,7 @@ public class PreferencesAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showClientOptionsDialog(); } } diff --git a/src/net/sf/freecol/client/gui/action/QuitAction.java b/src/net/sf/freecol/client/gui/action/QuitAction.java index 79c2ada4a..e442036c0 100644 --- a/src/net/sf/freecol/client/gui/action/QuitAction.java +++ b/src/net/sf/freecol/client/gui/action/QuitAction.java @@ -48,7 +48,7 @@ public class QuitAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { freeColClient.askToQuit(); } } diff --git a/src/net/sf/freecol/client/gui/action/ReconnectAction.java b/src/net/sf/freecol/client/gui/action/ReconnectAction.java index 9be9c4d8b..d04b7f3d8 100644 --- a/src/net/sf/freecol/client/gui/action/ReconnectAction.java +++ b/src/net/sf/freecol/client/gui/action/ReconnectAction.java @@ -48,7 +48,7 @@ public class ReconnectAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { igc().reconnect(); } } diff --git a/src/net/sf/freecol/client/gui/action/RenameAction.java b/src/net/sf/freecol/client/gui/action/RenameAction.java index dae097387..3a89d4f30 100644 --- a/src/net/sf/freecol/client/gui/action/RenameAction.java +++ b/src/net/sf/freecol/client/gui/action/RenameAction.java @@ -48,7 +48,7 @@ public class RenameAction extends UnitAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { igc().rename(getGUI().getActiveUnit()); } } diff --git a/src/net/sf/freecol/client/gui/action/ReportCargoAction.java b/src/net/sf/freecol/client/gui/action/ReportCargoAction.java index 86168b066..3cc788092 100644 --- a/src/net/sf/freecol/client/gui/action/ReportCargoAction.java +++ b/src/net/sf/freecol/client/gui/action/ReportCargoAction.java @@ -48,7 +48,7 @@ public class ReportCargoAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showReportCargoPanel(); } } diff --git a/src/net/sf/freecol/client/gui/action/ReportColonyAction.java b/src/net/sf/freecol/client/gui/action/ReportColonyAction.java index 69eb3499d..ebb26a448 100644 --- a/src/net/sf/freecol/client/gui/action/ReportColonyAction.java +++ b/src/net/sf/freecol/client/gui/action/ReportColonyAction.java @@ -48,7 +48,7 @@ public class ReportColonyAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showReportColonyPanel(); } } diff --git a/src/net/sf/freecol/client/gui/action/ReportContinentalCongressAction.java b/src/net/sf/freecol/client/gui/action/ReportContinentalCongressAction.java index 8c4683cf2..387de28de 100644 --- a/src/net/sf/freecol/client/gui/action/ReportContinentalCongressAction.java +++ b/src/net/sf/freecol/client/gui/action/ReportContinentalCongressAction.java @@ -48,7 +48,7 @@ public class ReportContinentalCongressAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showReportContinentalCongressPanel(); } } diff --git a/src/net/sf/freecol/client/gui/action/ReportEducationAction.java b/src/net/sf/freecol/client/gui/action/ReportEducationAction.java index c50184e9b..250d5bd09 100644 --- a/src/net/sf/freecol/client/gui/action/ReportEducationAction.java +++ b/src/net/sf/freecol/client/gui/action/ReportEducationAction.java @@ -48,7 +48,7 @@ public class ReportEducationAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showReportEducationPanel(); } } diff --git a/src/net/sf/freecol/client/gui/action/ReportExplorationAction.java b/src/net/sf/freecol/client/gui/action/ReportExplorationAction.java index 83f4324a7..ea32e4b93 100644 --- a/src/net/sf/freecol/client/gui/action/ReportExplorationAction.java +++ b/src/net/sf/freecol/client/gui/action/ReportExplorationAction.java @@ -48,7 +48,7 @@ public class ReportExplorationAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { freeColClient.getGUI().showReportExplorationPanel(); } } diff --git a/src/net/sf/freecol/client/gui/action/ReportForeignAction.java b/src/net/sf/freecol/client/gui/action/ReportForeignAction.java index da9a4927e..74f8fc39f 100644 --- a/src/net/sf/freecol/client/gui/action/ReportForeignAction.java +++ b/src/net/sf/freecol/client/gui/action/ReportForeignAction.java @@ -48,7 +48,7 @@ public class ReportForeignAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showReportForeignAffairPanel(); } } diff --git a/src/net/sf/freecol/client/gui/action/ReportHighScoresAction.java b/src/net/sf/freecol/client/gui/action/ReportHighScoresAction.java index 685bab740..810a562d8 100644 --- a/src/net/sf/freecol/client/gui/action/ReportHighScoresAction.java +++ b/src/net/sf/freecol/client/gui/action/ReportHighScoresAction.java @@ -48,7 +48,7 @@ public class ReportHighScoresAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { igc().displayHighScores(null); } } diff --git a/src/net/sf/freecol/client/gui/action/ReportHistoryAction.java b/src/net/sf/freecol/client/gui/action/ReportHistoryAction.java index e6214dd85..ff2816d69 100644 --- a/src/net/sf/freecol/client/gui/action/ReportHistoryAction.java +++ b/src/net/sf/freecol/client/gui/action/ReportHistoryAction.java @@ -48,7 +48,7 @@ public class ReportHistoryAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showReportHistoryPanel(); } } diff --git a/src/net/sf/freecol/client/gui/action/ReportIndianAction.java b/src/net/sf/freecol/client/gui/action/ReportIndianAction.java index abca471fd..ce5d98089 100644 --- a/src/net/sf/freecol/client/gui/action/ReportIndianAction.java +++ b/src/net/sf/freecol/client/gui/action/ReportIndianAction.java @@ -48,7 +48,7 @@ public class ReportIndianAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showReportIndianPanel(); } } diff --git a/src/net/sf/freecol/client/gui/action/ReportLabourAction.java b/src/net/sf/freecol/client/gui/action/ReportLabourAction.java index c4b568a5b..879568ce9 100644 --- a/src/net/sf/freecol/client/gui/action/ReportLabourAction.java +++ b/src/net/sf/freecol/client/gui/action/ReportLabourAction.java @@ -49,7 +49,7 @@ public class ReportLabourAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { if (getClientOptions().getInteger(ClientOptions.LABOUR_REPORT) == ClientOptions.LABOUR_REPORT_CLASSIC) { getGUI().showReportLabourPanel(); diff --git a/src/net/sf/freecol/client/gui/action/ReportMilitaryAction.java b/src/net/sf/freecol/client/gui/action/ReportMilitaryAction.java index 1f021f73a..af40e6dab 100644 --- a/src/net/sf/freecol/client/gui/action/ReportMilitaryAction.java +++ b/src/net/sf/freecol/client/gui/action/ReportMilitaryAction.java @@ -48,7 +48,7 @@ public class ReportMilitaryAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showReportMilitaryPanel(); } } diff --git a/src/net/sf/freecol/client/gui/action/ReportNavalAction.java b/src/net/sf/freecol/client/gui/action/ReportNavalAction.java index 1d53fc23e..0d8dbafad 100644 --- a/src/net/sf/freecol/client/gui/action/ReportNavalAction.java +++ b/src/net/sf/freecol/client/gui/action/ReportNavalAction.java @@ -48,7 +48,7 @@ public class ReportNavalAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showReportNavalPanel(); } } diff --git a/src/net/sf/freecol/client/gui/action/ReportProductionAction.java b/src/net/sf/freecol/client/gui/action/ReportProductionAction.java index f3be6756a..a946d17ef 100644 --- a/src/net/sf/freecol/client/gui/action/ReportProductionAction.java +++ b/src/net/sf/freecol/client/gui/action/ReportProductionAction.java @@ -48,7 +48,7 @@ public class ReportProductionAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showReportProductionPanel(); } } diff --git a/src/net/sf/freecol/client/gui/action/ReportReligionAction.java b/src/net/sf/freecol/client/gui/action/ReportReligionAction.java index bf10a473b..dc5eebddc 100644 --- a/src/net/sf/freecol/client/gui/action/ReportReligionAction.java +++ b/src/net/sf/freecol/client/gui/action/ReportReligionAction.java @@ -48,7 +48,7 @@ public class ReportReligionAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showReportReligiousPanel(); } } diff --git a/src/net/sf/freecol/client/gui/action/ReportRequirementsAction.java b/src/net/sf/freecol/client/gui/action/ReportRequirementsAction.java index 4e14b9f38..8901e8ea0 100644 --- a/src/net/sf/freecol/client/gui/action/ReportRequirementsAction.java +++ b/src/net/sf/freecol/client/gui/action/ReportRequirementsAction.java @@ -48,7 +48,7 @@ public class ReportRequirementsAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showReportRequirementsPanel(); } } diff --git a/src/net/sf/freecol/client/gui/action/ReportTradeAction.java b/src/net/sf/freecol/client/gui/action/ReportTradeAction.java index d0d88188d..766b770c0 100644 --- a/src/net/sf/freecol/client/gui/action/ReportTradeAction.java +++ b/src/net/sf/freecol/client/gui/action/ReportTradeAction.java @@ -48,7 +48,7 @@ public class ReportTradeAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showReportTradePanel(); } } diff --git a/src/net/sf/freecol/client/gui/action/ReportTurnAction.java b/src/net/sf/freecol/client/gui/action/ReportTurnAction.java index 8acb1d972..b4208145c 100644 --- a/src/net/sf/freecol/client/gui/action/ReportTurnAction.java +++ b/src/net/sf/freecol/client/gui/action/ReportTurnAction.java @@ -48,7 +48,7 @@ public class ReportTurnAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { igc().displayTurnReportMessages(); } } diff --git a/src/net/sf/freecol/client/gui/action/RetireAction.java b/src/net/sf/freecol/client/gui/action/RetireAction.java index c1431e03d..dedb8330b 100644 --- a/src/net/sf/freecol/client/gui/action/RetireAction.java +++ b/src/net/sf/freecol/client/gui/action/RetireAction.java @@ -63,7 +63,7 @@ public class RetireAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { freeColClient.retire(); } } diff --git a/src/net/sf/freecol/client/gui/action/SaveAction.java b/src/net/sf/freecol/client/gui/action/SaveAction.java index c2817fd00..f24d7f480 100644 --- a/src/net/sf/freecol/client/gui/action/SaveAction.java +++ b/src/net/sf/freecol/client/gui/action/SaveAction.java @@ -63,7 +63,7 @@ public class SaveAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { if (!freeColClient.isMapEditor()) { igc().saveGame(); } else { diff --git a/src/net/sf/freecol/client/gui/action/SaveAndQuitAction.java b/src/net/sf/freecol/client/gui/action/SaveAndQuitAction.java index 31ce57c24..71678a2f3 100644 --- a/src/net/sf/freecol/client/gui/action/SaveAndQuitAction.java +++ b/src/net/sf/freecol/client/gui/action/SaveAndQuitAction.java @@ -48,7 +48,7 @@ public class SaveAndQuitAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { if (freeColClient.isMapEditor()) { freeColClient.getMapEditorController().saveGame(); } else { diff --git a/src/net/sf/freecol/client/gui/action/ScaleMapAction.java b/src/net/sf/freecol/client/gui/action/ScaleMapAction.java index 326bf09f1..f5ec13a61 100644 --- a/src/net/sf/freecol/client/gui/action/ScaleMapAction.java +++ b/src/net/sf/freecol/client/gui/action/ScaleMapAction.java @@ -96,7 +96,7 @@ public class ScaleMapAction extends FreeColAction { t.getTileItemContainer().updateRiver(); }*/ - getGUI().setSelectedTile(map.getTile(0, 0), false); + getGUI().setSelectedTile(map.getTile(0, 0)); getGUI().refresh(); } @@ -121,7 +121,7 @@ public class ScaleMapAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { Dimension ms = getGUI().showScaleMapSizeDialog(); if (ms != null) { scaleMapTo(ms.width, ms.height); diff --git a/src/net/sf/freecol/client/gui/action/ShowDifficultyAction.java b/src/net/sf/freecol/client/gui/action/ShowDifficultyAction.java index 234690194..535322c04 100644 --- a/src/net/sf/freecol/client/gui/action/ShowDifficultyAction.java +++ b/src/net/sf/freecol/client/gui/action/ShowDifficultyAction.java @@ -48,7 +48,7 @@ public class ShowDifficultyAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showDifficultyDialog(); } } diff --git a/src/net/sf/freecol/client/gui/action/ShowGameOptionsAction.java b/src/net/sf/freecol/client/gui/action/ShowGameOptionsAction.java index 74af1918e..168c21d11 100644 --- a/src/net/sf/freecol/client/gui/action/ShowGameOptionsAction.java +++ b/src/net/sf/freecol/client/gui/action/ShowGameOptionsAction.java @@ -48,7 +48,7 @@ public class ShowGameOptionsAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showGameOptionsDialog(false, false); } } diff --git a/src/net/sf/freecol/client/gui/action/ShowMainAction.java b/src/net/sf/freecol/client/gui/action/ShowMainAction.java index fb9105497..92ef5e8c1 100644 --- a/src/net/sf/freecol/client/gui/action/ShowMainAction.java +++ b/src/net/sf/freecol/client/gui/action/ShowMainAction.java @@ -51,7 +51,7 @@ public class ShowMainAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { if (!getGUI().confirmStopGame()) return; getConnectController().quitGame(true); getGUI().removeInGameComponents(); diff --git a/src/net/sf/freecol/client/gui/action/ShowMapGeneratorOptionsAction.java b/src/net/sf/freecol/client/gui/action/ShowMapGeneratorOptionsAction.java index f88375a57..49995bcb7 100644 --- a/src/net/sf/freecol/client/gui/action/ShowMapGeneratorOptionsAction.java +++ b/src/net/sf/freecol/client/gui/action/ShowMapGeneratorOptionsAction.java @@ -48,7 +48,7 @@ public class ShowMapGeneratorOptionsAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showMapGeneratorOptionsDialog(false); } } diff --git a/src/net/sf/freecol/client/gui/action/SkipUnitAction.java b/src/net/sf/freecol/client/gui/action/SkipUnitAction.java index fea637956..8a85bbf76 100644 --- a/src/net/sf/freecol/client/gui/action/SkipUnitAction.java +++ b/src/net/sf/freecol/client/gui/action/SkipUnitAction.java @@ -22,6 +22,7 @@ package net.sf.freecol.client.gui.action; import java.awt.event.ActionEvent; import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.common.model.Unit; /** @@ -50,7 +51,7 @@ public class SkipUnitAction extends UnitAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { - igc().skipUnit(getGUI().getActiveUnit()); + public void actionPerformed(ActionEvent ae) { + igc().changeState(getGUI().getActiveUnit(), Unit.UnitState.SKIPPED); } } diff --git a/src/net/sf/freecol/client/gui/action/TilePopupAction.java b/src/net/sf/freecol/client/gui/action/TilePopupAction.java index c32861155..3a28d9a08 100644 --- a/src/net/sf/freecol/client/gui/action/TilePopupAction.java +++ b/src/net/sf/freecol/client/gui/action/TilePopupAction.java @@ -48,7 +48,7 @@ public class TilePopupAction extends MapboardAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showTilePopUpAtSelectedTile(); } } diff --git a/src/net/sf/freecol/client/gui/action/ToggleViewModeAction.java b/src/net/sf/freecol/client/gui/action/ToggleViewModeAction.java index 99483e412..57e0b206d 100644 --- a/src/net/sf/freecol/client/gui/action/ToggleViewModeAction.java +++ b/src/net/sf/freecol/client/gui/action/ToggleViewModeAction.java @@ -49,7 +49,7 @@ public class ToggleViewModeAction extends MapboardAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().toggleViewMode(); } } diff --git a/src/net/sf/freecol/client/gui/action/TradeRouteAction.java b/src/net/sf/freecol/client/gui/action/TradeRouteAction.java index d23436fe4..af186a351 100644 --- a/src/net/sf/freecol/client/gui/action/TradeRouteAction.java +++ b/src/net/sf/freecol/client/gui/action/TradeRouteAction.java @@ -48,7 +48,7 @@ public class TradeRouteAction extends MapboardAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().showTradeRoutePanel(null); } } diff --git a/src/net/sf/freecol/client/gui/action/UnloadAction.java b/src/net/sf/freecol/client/gui/action/UnloadAction.java index ec4f62e55..8bba506f1 100644 --- a/src/net/sf/freecol/client/gui/action/UnloadAction.java +++ b/src/net/sf/freecol/client/gui/action/UnloadAction.java @@ -89,7 +89,7 @@ public class UnloadAction extends MapboardAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { Unit carrier = getUnit(); if (carrier != null) igc().unload(carrier); } diff --git a/src/net/sf/freecol/client/gui/action/WaitAction.java b/src/net/sf/freecol/client/gui/action/WaitAction.java index 8891c73ee..f1f5399e5 100644 --- a/src/net/sf/freecol/client/gui/action/WaitAction.java +++ b/src/net/sf/freecol/client/gui/action/WaitAction.java @@ -50,7 +50,7 @@ public class WaitAction extends UnitAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { igc().waitUnit(); } } diff --git a/src/net/sf/freecol/client/gui/action/ZoomInAction.java b/src/net/sf/freecol/client/gui/action/ZoomInAction.java index c25c14723..01f333a0d 100644 --- a/src/net/sf/freecol/client/gui/action/ZoomInAction.java +++ b/src/net/sf/freecol/client/gui/action/ZoomInAction.java @@ -63,7 +63,7 @@ public class ZoomInAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().zoomInMap(); update(); getActionManager().getFreeColAction(ZoomOutAction.id).update(); diff --git a/src/net/sf/freecol/client/gui/action/ZoomOutAction.java b/src/net/sf/freecol/client/gui/action/ZoomOutAction.java index 3b39da004..9fb43ffc7 100644 --- a/src/net/sf/freecol/client/gui/action/ZoomOutAction.java +++ b/src/net/sf/freecol/client/gui/action/ZoomOutAction.java @@ -63,7 +63,7 @@ public class ZoomOutAction extends FreeColAction { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().zoomOutMap(); update(); getActionManager().getFreeColAction(ZoomInAction.id).update(); diff --git a/src/net/sf/freecol/client/gui/animation/Animations.java b/src/net/sf/freecol/client/gui/animation/Animations.java index 87ec64c55..a07680881 100644 --- a/src/net/sf/freecol/client/gui/animation/Animations.java +++ b/src/net/sf/freecol/client/gui/animation/Animations.java @@ -19,7 +19,7 @@ package net.sf.freecol.client.gui.animation; -import net.sf.freecol.client.gui.GUI; +import net.sf.freecol.client.FreeColClient; import net.sf.freecol.common.model.Tile; import net.sf.freecol.common.model.Unit; @@ -32,32 +32,32 @@ public class Animations { /** * Animates a unit move. * - * @param gui The GUI to display on. + * @param freeColClient The enclosing FreeColClient. * @param unit The Unit to be animated. * @param source The source Tile for the unit. * @param destination The destination Tile for the unit. */ - public static void unitMove(GUI gui, Unit unit, + public static void unitMove(FreeColClient freeColClient, Unit unit, Tile source, Tile destination) { - new UnitMoveAnimation(gui, unit, source, destination) + new UnitMoveAnimation(freeColClient, unit, source, destination) .animate(); } /** * Animates a unit attack. * - * @param gui The GUI to display on. + * @param freeColClient The enclosing FreeColClient. * @param attacker The Unit that is attacking. * @param defender The Unit that is defending. * @param attackerTile The Tile the attack comes from. * @param defenderTile The Tile the attack goes to. * @param success Did the attack succeed? */ - public static void unitAttack(GUI gui, + public static void unitAttack(FreeColClient freeColClient, Unit attacker, Unit defender, Tile attackerTile, Tile defenderTile, boolean success) { - new UnitAttackAnimation(gui, attacker, defender, + new UnitAttackAnimation(freeColClient, attacker, defender, attackerTile, defenderTile, success) .animate(); } diff --git a/src/net/sf/freecol/client/gui/animation/UnitAttackAnimation.java b/src/net/sf/freecol/client/gui/animation/UnitAttackAnimation.java index 198d755ce..63ae84504 100644 --- a/src/net/sf/freecol/client/gui/animation/UnitAttackAnimation.java +++ b/src/net/sf/freecol/client/gui/animation/UnitAttackAnimation.java @@ -19,7 +19,8 @@ package net.sf.freecol.client.gui.animation; -import net.sf.freecol.client.gui.GUI; +import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.SwingGUI; import net.sf.freecol.common.io.sza.SimpleZippedAnimation; import net.sf.freecol.common.model.Direction; import net.sf.freecol.common.model.Tile; @@ -32,7 +33,7 @@ import net.sf.freecol.common.resources.ResourceManager; */ final class UnitAttackAnimation { - private final GUI gui; + private final FreeColClient freeColClient; private final Unit attacker; private final Unit defender; private final Tile attackerTile; @@ -43,17 +44,18 @@ final class UnitAttackAnimation { /** * Build a new attack animation. * - * @param gui The GUI to display on. + * @param freeColClient The enclosing FreeColClient. * @param attacker The Unit that is attacking. * @param defender The Unit that is defending. * @param attackerTile The Tile the attack comes from. * @param defenderTile The Tile the attack goes to. * @param success Does the attack succeed? */ - public UnitAttackAnimation(GUI gui, Unit attacker, Unit defender, + public UnitAttackAnimation(FreeColClient freeColClient, + Unit attacker, Unit defender, Tile attackerTile, Tile defenderTile, boolean success) { - this.gui = gui; + this.freeColClient = freeColClient; this.attacker = attacker; this.defender = defender; this.attackerTile = attackerTile; @@ -90,7 +92,7 @@ final class UnitAttackAnimation { */ private SimpleZippedAnimation getAnimation(Unit unit, Direction direction) { - float scale = gui.getMapScale(); + float scale = ((SwingGUI)freeColClient.getGUI()).getMapScale(); String roleStr = (unit.hasDefaultRole()) ? "" : "." + unit.getRoleSuffix(); String startStr = "animation.unit." + unit.getType().getId() + roleStr @@ -129,10 +131,11 @@ final class UnitAttackAnimation { * Do the animation. */ public void animate() { + final SwingGUI gui = (SwingGUI)freeColClient.getGUI(); Direction direction = attackerTile.getDirection(defenderTile); SimpleZippedAnimation sza; - if (gui.getAnimationSpeed(attacker) > 0) { + if (freeColClient.getAnimationSpeed(attacker.getOwner()) > 0) { if ((sza = getAnimation(attacker, direction)) != null) { new UnitImageAnimation(gui, attacker, attackerTile, sza, mirror) .animate(); @@ -140,7 +143,7 @@ final class UnitAttackAnimation { } if (!success - && gui.getAnimationSpeed(defender) > 0) { + && freeColClient.getAnimationSpeed(defender.getOwner()) > 0) { direction = direction.getReverseDirection(); if ((sza = getAnimation(defender, direction)) != null) { new UnitImageAnimation(gui, defender, defenderTile, sza, mirror) diff --git a/src/net/sf/freecol/client/gui/animation/UnitImageAnimation.java b/src/net/sf/freecol/client/gui/animation/UnitImageAnimation.java index 717e2922f..41e84c5c7 100644 --- a/src/net/sf/freecol/client/gui/animation/UnitImageAnimation.java +++ b/src/net/sf/freecol/client/gui/animation/UnitImageAnimation.java @@ -25,9 +25,8 @@ import java.awt.Rectangle; import javax.swing.ImageIcon; import javax.swing.JLabel; -import net.sf.freecol.client.gui.GUI; import net.sf.freecol.client.gui.ImageLibrary; -import net.sf.freecol.client.gui.OutForAnimationCallback; +import net.sf.freecol.client.gui.SwingGUI; import net.sf.freecol.common.io.sza.AnimationEvent; import net.sf.freecol.common.io.sza.ImageAnimationEvent; import net.sf.freecol.common.io.sza.SimpleZippedAnimation; @@ -40,7 +39,7 @@ import net.sf.freecol.common.model.Unit; */ public final class UnitImageAnimation { - private final GUI gui; + private final SwingGUI gui; private final Unit unit; private final Tile tile; private final SimpleZippedAnimation animation; @@ -49,11 +48,12 @@ public final class UnitImageAnimation { /** * Constructor * + * @param gui The gui. * @param unit The Unit to be animated. * @param tile The Tile where the animation occurs. * @param animation The animation to show. */ - public UnitImageAnimation(GUI gui, Unit unit, Tile tile, + public UnitImageAnimation(SwingGUI gui, Unit unit, Tile tile, SimpleZippedAnimation animation, boolean mirror) { this.gui = gui; this.unit = unit; @@ -70,9 +70,7 @@ public final class UnitImageAnimation { // Painting the whole screen once to get rid of disposed dialog-boxes. gui.paintImmediatelyCanvasInItsBounds(); - gui.executeWithUnitOutForAnimation(unit, tile, new OutForAnimationCallback() { - @Override - public void executeWithUnitOutForAnimation(final JLabel unitLabel) { + gui.executeWithUnitOutForAnimation(unit, tile, (JLabel unitLabel) -> { for (AnimationEvent event : animation) { long time = System.nanoTime(); if (event instanceof ImageAnimationEvent) { @@ -85,7 +83,7 @@ public final class UnitImageAnimation { } icon.setImage(image); gui.paintImmediatelyCanvasIn(getDirtyAnimationArea()); - + time = ievent.getDurationInMs() - (System.nanoTime() - time) / 1000000; if (time > 0) { @@ -96,9 +94,8 @@ public final class UnitImageAnimation { } } } - } - } - }); + } + }); } protected Rectangle getDirtyAnimationArea() { diff --git a/src/net/sf/freecol/client/gui/animation/UnitMoveAnimation.java b/src/net/sf/freecol/client/gui/animation/UnitMoveAnimation.java index 28e950934..39682d9ff 100644 --- a/src/net/sf/freecol/client/gui/animation/UnitMoveAnimation.java +++ b/src/net/sf/freecol/client/gui/animation/UnitMoveAnimation.java @@ -24,8 +24,9 @@ import java.awt.Rectangle; import javax.swing.JLabel; -import net.sf.freecol.client.gui.GUI; -import net.sf.freecol.client.gui.OutForAnimationCallback; +import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.ImageLibrary; +import net.sf.freecol.client.gui.SwingGUI; import net.sf.freecol.common.model.Tile; import net.sf.freecol.common.model.Unit; @@ -41,23 +42,22 @@ final class UnitMoveAnimation { */ private static final int ANIMATION_DELAY = 33; + private final FreeColClient freeColClient; private final Unit unit; private final Tile sourceTile; private final Tile destinationTile; - private final GUI gui; - /** * Constructor * - * @param gui The GUI to display on. + * @param freeColClient The enclosing FreeColClient. * @param unit The Unit to be animated. * @param sourceTile The Tile the unit is moving from. * @param destinationTile The Tile the unit is moving to. */ - public UnitMoveAnimation(GUI gui, Unit unit, + public UnitMoveAnimation(FreeColClient freeColClient, Unit unit, Tile sourceTile, Tile destinationTile) { - this.gui = gui; + this.freeColClient = freeColClient; this.unit = unit; this.sourceTile = sourceTile; this.destinationTile = destinationTile; @@ -68,7 +68,9 @@ final class UnitMoveAnimation { * Do the animation. */ public void animate() { - final int movementSpeed = gui.getAnimationSpeed(unit); + final int movementSpeed + = freeColClient.getAnimationSpeed(unit.getOwner()); + final SwingGUI gui = (SwingGUI)freeColClient.getGUI(); final Point srcP = gui.getTilePosition(sourceTile); final Point dstP = gui.getTilePosition(destinationTile); @@ -81,58 +83,55 @@ final class UnitMoveAnimation { final Rectangle bounds = r1.union(r2); gui.executeWithUnitOutForAnimation(unit, sourceTile, - new OutForAnimationCallback() { - @Override - public void executeWithUnitOutForAnimation(final JLabel unitLabel) { - final Point srcPoint - = gui.calculateUnitLabelPositionInTile(unitLabel, srcP); - final Point dstPoint - = gui.calculateUnitLabelPositionInTile(unitLabel, dstP); - final double xratio = gui.getTileWidthHeightRatio(); - final int stepX = (srcPoint.getX() == dstPoint.getX()) ? 0 - : (srcPoint.getX() > dstPoint.getX()) ? -1 : 1; - final int stepY = (srcPoint.getY() == dstPoint.getY()) ? 0 - : (srcPoint.getY() > dstPoint.getY()) ? -1 : 1; - - // Painting the whole screen once to get rid of - // disposed dialog-boxes. - gui.paintImmediatelyCanvasInItsBounds(); - - int dropFrames = 0; - Point point = srcPoint; - while (!point.equals(dstPoint)) { - long time = System.currentTimeMillis(); - - point.x += stepX * xratio * movementRatio; - point.y += stepY * movementRatio; - if ((stepX < 0 && point.x < dstPoint.x) - || (stepX > 0 && point.x > dstPoint.x)) { - point.x = dstPoint.x; - } - if ((stepY < 0 && point.y < dstPoint.y) - || (stepY > 0 && point.y > dstPoint.y)) { - point.y = dstPoint.y; - } - if (dropFrames <= 0) { - unitLabel.setLocation(point); - gui.paintImmediatelyCanvasIn(bounds); + (JLabel unitLabel) -> { + final int labelWidth = unitLabel.getWidth(); + final int labelHeight = unitLabel.getHeight(); + final Point srcPoint = gui.calculateUnitLabelPositionInTile(labelWidth, labelHeight, srcP); + final Point dstPoint = gui.calculateUnitLabelPositionInTile(labelWidth, labelHeight, dstP); + final double xratio = ImageLibrary.TILE_SIZE.width + / (double)ImageLibrary.TILE_SIZE.height; + final int stepX = (srcPoint.getX() == dstPoint.getX()) ? 0 + : (srcPoint.getX() > dstPoint.getX()) ? -1 : 1; + final int stepY = (srcPoint.getY() == dstPoint.getY()) ? 0 + : (srcPoint.getY() > dstPoint.getY()) ? -1 : 1; + + // Painting the whole screen once to get rid of + // disposed dialog-boxes. + gui.paintImmediatelyCanvasInItsBounds(); + + int dropFrames = 0; + Point point = srcPoint; + while (!point.equals(dstPoint)) { + long time = System.currentTimeMillis(); + + point.x += stepX * xratio * movementRatio; + point.y += stepY * movementRatio; + if ((stepX < 0 && point.x < dstPoint.x) + || (stepX > 0 && point.x > dstPoint.x)) { + point.x = dstPoint.x; + } + if ((stepY < 0 && point.y < dstPoint.y) + || (stepY > 0 && point.y > dstPoint.y)) { + point.y = dstPoint.y; + } + if (dropFrames <= 0) { + unitLabel.setLocation(point); + gui.paintImmediatelyCanvasIn(bounds); - int timeTaken = (int)(System.currentTimeMillis() - - time); - final int waitTime = ANIMATION_DELAY - timeTaken; - if (waitTime > 0) { - try { - Thread.sleep(waitTime); - } catch (InterruptedException ex) { - //ignore - } - dropFrames = 0; - } else { - dropFrames = timeTaken / ANIMATION_DELAY - 1; + int timeTaken = (int)(System.currentTimeMillis() - time); + final int waitTime = ANIMATION_DELAY - timeTaken; + if (waitTime > 0) { + try { + Thread.sleep(waitTime); + } catch (InterruptedException ex) { + //ignore } + dropFrames = 0; } else { - dropFrames--; + dropFrames = timeTaken / ANIMATION_DELAY - 1; } + } else { + dropFrames--; } } }); diff --git a/src/net/sf/freecol/client/gui/menu/DebugMenu.java b/src/net/sf/freecol/client/gui/menu/DebugMenu.java index d3d63aab3..a891c19dd 100644 --- a/src/net/sf/freecol/client/gui/menu/DebugMenu.java +++ b/src/net/sf/freecol/client/gui/menu/DebugMenu.java @@ -21,12 +21,8 @@ package net.sf.freecol.client.gui.menu; import java.awt.Toolkit; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.logging.Logger; @@ -50,6 +46,7 @@ import net.sf.freecol.common.model.Player; import net.sf.freecol.common.model.StringTemplate; import net.sf.freecol.common.resources.ImageResource; import net.sf.freecol.common.resources.ResourceManager; + import static net.sf.freecol.common.util.CollectionUtils.*; @@ -100,43 +97,34 @@ public class DebugMenu extends JMenu { sc.setOpaque(false); sc.setMnemonic(KeyEvent.VK_S); this.add(sc); - sc.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - boolean val = ((JCheckBoxMenuItem)e.getSource()).isSelected(); - FreeColDebugger.setDebugDisplayCoordinates(val); - gui.refresh(); - } + sc.addActionListener((ActionEvent ae) -> { + boolean val = ((JCheckBoxMenuItem)ae.getSource()).isSelected(); + FreeColDebugger.setDebugDisplayCoordinates(val); + gui.refresh(); }); sc.setEnabled(true); final JMenuItem reveal = Utility.localizedCheckBoxMenuItem("menuBar.debug.revealEntireMap", - false); + false); reveal.setOpaque(false); reveal.setMnemonic(KeyEvent.VK_R); this.add(reveal); - reveal.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - DebugUtils.revealMap(freeColClient, true); - reveal.setEnabled(false); - } + reveal.addActionListener((ActionEvent ae) -> { + DebugUtils.revealMap(freeColClient, true); + reveal.setEnabled(false); }); reveal.setEnabled(hasServer); final JMenuItem hide = Utility.localizedCheckBoxMenuItem("menuBar.debug.hideEntireMap", - false); + false); hide.setOpaque(false); //hide.setMnemonic(KeyEvent.VK_R); this.add(hide); - hide.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - DebugUtils.revealMap(freeColClient, false); - hide.setEnabled(false); - } + hide.addActionListener((ActionEvent ae) -> { + DebugUtils.revealMap(freeColClient, false); + hide.setEnabled(false); }); hide.setEnabled(hasServer); @@ -146,12 +134,9 @@ public class DebugMenu extends JMenu { game.getMap().getSearchTrace()); searchTrace.setOpaque(false); this.add(searchTrace); - searchTrace.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - boolean val = ((JCheckBoxMenuItem)e.getSource()).isSelected(); - game.getMap().setSearchTrace(val); - } + searchTrace.addActionListener((ActionEvent ae) -> { + boolean val = ((JCheckBoxMenuItem)ae.getSource()).isSelected(); + game.getMap().setSearchTrace(val); }); final JMenu cvpMenu @@ -165,30 +150,24 @@ public class DebugMenu extends JMenu { cv1.setMnemonic(KeyEvent.VK_C); cvpMenu.add(cv1); bg.add(cv1); - cv1.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - FreeColDebugger.setDebugDisplayColonyValuePlayer(null); - gui.refresh(); - } + cv1.addActionListener((ActionEvent ae) -> { + FreeColDebugger.setDebugDisplayColonyValuePlayer(null); + gui.refresh(); }); this.add(cvpMenu); cvpMenu.addSeparator(); for (Player p : game.getLiveEuropeanPlayers(null)) { final JRadioButtonMenuItem cv2 - = Utility.localizedRadioButtonMenuItem(p.getNationName(), + = Utility.localizedRadioButtonMenuItem(p.getCountryLabel(), FreeColDebugger.debugDisplayColonyValuePlayer() == p); cv2.setOpaque(false); //cv2.setMnemonic(KeyEvent.VK_C); cvpMenu.add(cv2); bg.add(cv2); final Player fp = p; - cv2.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - FreeColDebugger.setDebugDisplayColonyValuePlayer(fp); - gui.refresh(); - } + cv2.addActionListener((ActionEvent ae) -> { + FreeColDebugger.setDebugDisplayColonyValuePlayer(fp); + gui.refresh(); }); } @@ -198,11 +177,8 @@ public class DebugMenu extends JMenu { skipTurns.setOpaque(false); skipTurns.setMnemonic(KeyEvent.VK_T); this.add(skipTurns); - skipTurns.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - DebugUtils.skipTurns(freeColClient); - } + skipTurns.addActionListener((ActionEvent ae) -> { + DebugUtils.skipTurns(freeColClient); }); DebugUtils.addSkipChangeListener(freeColClient, this, skipTurns); skipTurns.setEnabled(hasServer); @@ -211,11 +187,8 @@ public class DebugMenu extends JMenu { addBuilding.setOpaque(false); addBuilding.setMnemonic(KeyEvent.VK_B); this.add(addBuilding); - addBuilding.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - DebugUtils.addBuildings(freeColClient, addBuilding.getText()); - } + addBuilding.addActionListener((ActionEvent ae) -> { + DebugUtils.addBuildings(freeColClient, addBuilding.getText()); }); addBuilding.setEnabled(hasServer); @@ -223,11 +196,8 @@ public class DebugMenu extends JMenu { addFather.setOpaque(false); addFather.setMnemonic(KeyEvent.VK_F); this.add(addFather); - addFather.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - DebugUtils.addFathers(freeColClient, addFather.getText()); - } + addFather.addActionListener((ActionEvent ae) -> { + DebugUtils.addFathers(freeColClient, addFather.getText()); }); addFather.setEnabled(hasServer); @@ -235,11 +205,8 @@ public class DebugMenu extends JMenu { runMonarch.setOpaque(false); runMonarch.setMnemonic(KeyEvent.VK_M); this.add(runMonarch); - runMonarch.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - DebugUtils.setMonarchAction(freeColClient, runMonarch.getText()); - } + runMonarch.addActionListener((ActionEvent ae) -> { + DebugUtils.setMonarchAction(freeColClient, runMonarch.getText()); }); runMonarch.setEnabled(hasServer); @@ -247,11 +214,8 @@ public class DebugMenu extends JMenu { addGold.setOpaque(false); addGold.setMnemonic(KeyEvent.VK_G); this.add(addGold); - addGold.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - DebugUtils.addGold(freeColClient); - } + addGold.addActionListener((ActionEvent ae) -> { + DebugUtils.addGold(freeColClient); }); addGold.setEnabled(hasServer); @@ -259,11 +223,8 @@ public class DebugMenu extends JMenu { addCrosses.setOpaque(false); addCrosses.setMnemonic(KeyEvent.VK_I); this.add(addCrosses); - addCrosses.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - DebugUtils.addImmigration(freeColClient); - } + addCrosses.addActionListener((ActionEvent ae) -> { + DebugUtils.addImmigration(freeColClient); }); addCrosses.setEnabled(hasServer); @@ -271,11 +232,8 @@ public class DebugMenu extends JMenu { giveBells.setOpaque(false); giveBells.setMnemonic(KeyEvent.VK_L); this.add(giveBells); - giveBells.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - DebugUtils.addLiberty(freeColClient); - } + giveBells.addActionListener((ActionEvent ae) -> { + DebugUtils.addLiberty(freeColClient); }); giveBells.setEnabled(hasServer); @@ -284,11 +242,8 @@ public class DebugMenu extends JMenu { rng.setOpaque(false); rng.setMnemonic(KeyEvent.VK_X); this.add(rng); - rng.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - DebugUtils.stepRNG(freeColClient); - } + rng.addActionListener((ActionEvent ae) -> { + DebugUtils.stepRNG(freeColClient); }); rng.setEnabled(hasServer); @@ -296,11 +251,8 @@ public class DebugMenu extends JMenu { final JMenuItem du = Utility.localizedMenuItem("menuBar.debug.displayUnits"); du.setOpaque(false); this.add(du); - du.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - DebugUtils.displayUnits(freeColClient); - } + du.addActionListener((ActionEvent ae) -> { + DebugUtils.displayUnits(freeColClient); }); du.setEnabled(true); @@ -310,21 +262,17 @@ public class DebugMenu extends JMenu { panelMenu.setOpaque(false); final JMenuItem monarchDialog = Utility.localizedMenuItem("menuBar.debug.displayMonarchPanel"); - monarchDialog.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - gui.showMonarchDialog(Monarch.MonarchAction.RAISE_TAX_WAR, - null, player.getMonarchKey()); - } + monarchDialog.addActionListener((ActionEvent ae) -> { + gui.showMonarchDialog( + Monarch.MonarchAction.RAISE_TAX_WAR, null, player.getMonarchKey(), + (Boolean b) -> + freeColClient.getInGameController().monarchAction(Monarch.MonarchAction.RAISE_TAX_WAR, b)); }); panelMenu.add(monarchDialog); final JMenuItem errorMessage = Utility.localizedMenuItem("menuBar.debug.displayErrorMessage"); - errorMessage.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - gui.showErrorMessage(ERROR_MESSAGE); - } + errorMessage.addActionListener((ActionEvent ae) -> { + gui.showErrorMessage(ERROR_MESSAGE); }); panelMenu.add(errorMessage); @@ -334,11 +282,8 @@ public class DebugMenu extends JMenu { europeStatus.setOpaque(false); europeStatus.setMnemonic(KeyEvent.VK_E); this.add(europeStatus); - europeStatus.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - DebugUtils.displayEurope(freeColClient); - } + europeStatus.addActionListener((ActionEvent ae) -> { + DebugUtils.displayEurope(freeColClient); }); europeStatus.setEnabled(hasServer); @@ -351,14 +296,11 @@ public class DebugMenu extends JMenu { dam.setOpaque(false); dam.setMnemonic(KeyEvent.VK_A); this.add(dam); - dam.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - boolean val = ((JCheckBoxMenuItem) e.getSource()).isSelected(); - FreeColDebugger.setDebugShowMission(val); - dami.setEnabled(val); - gui.refresh(); - } + dam.addActionListener((ActionEvent ae) -> { + boolean val = ((JCheckBoxMenuItem)ae.getSource()).isSelected(); + FreeColDebugger.setDebugShowMission(val); + dami.setEnabled(val); + gui.refresh(); }); dam.setEnabled(true); @@ -369,25 +311,19 @@ public class DebugMenu extends JMenu { Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() | InputEvent.ALT_MASK)); this.add(useAI); - useAI.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - DebugUtils.useAI(freeColClient); - } + useAI.addActionListener((ActionEvent ae) -> { + DebugUtils.useAI(freeColClient); }); useAI.setEnabled(hasServer); dami.setOpaque(false); dami.setMnemonic(KeyEvent.VK_I); this.add(dami); - dami.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - boolean val = ((JCheckBoxMenuItem) e.getSource()).isSelected(); - FreeColDebugger.setDebugShowMissionInfo(val); - dami.setEnabled(val); - gui.refresh(); - } + dami.addActionListener((ActionEvent ae) -> { + boolean val = ((JCheckBoxMenuItem)ae.getSource()).isSelected(); + FreeColDebugger.setDebugShowMissionInfo(val); + dami.setEnabled(val); + gui.refresh(); }); dami.setEnabled(FreeColDebugger.debugShowMissionInfo()); @@ -400,11 +336,8 @@ public class DebugMenu extends JMenu { Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() | InputEvent.ALT_MASK)); this.add(compareMaps); - compareMaps.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - DebugUtils.checkDesyncAction(freeColClient); - } + compareMaps.addActionListener((ActionEvent ae) -> { + DebugUtils.checkDesyncAction(freeColClient); }); compareMaps.setEnabled(hasServer); @@ -412,22 +345,19 @@ public class DebugMenu extends JMenu { showResourceKeys.setOpaque(false); //showResourceKeys.setMnemonic(KeyEvent.VK_R); this.add(showResourceKeys); - showResourceKeys.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - StringBuilder builder = new StringBuilder(); - Map resources - = ResourceManager.getImageResources(); - for (Entry en - : mapEntriesByKey(resources)) { - builder.append(en.getKey()); - builder.append(" ("); - builder.append(en.getValue().getCount()); - builder.append(")"); - builder.append("\n"); - } - gui.showInformationMessage(builder.toString()); + showResourceKeys.addActionListener((ActionEvent ae) -> { + StringBuilder builder = new StringBuilder(); + Map resources + = ResourceManager.getImageResources(); + for (Entry en + : mapEntriesByKey(resources)) { + builder.append(en.getKey()); + builder.append(" ("); + builder.append(en.getValue().getCount()); + builder.append(")"); + builder.append("\n"); } + gui.showInformationMessage(builder.toString()); }); showResourceKeys.setEnabled(true); @@ -436,11 +366,8 @@ public class DebugMenu extends JMenu { statistics.setOpaque(false); //statistics.setMnemonic(KeyEvent.VK_I); this.add(statistics); - statistics.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - gui.showStatisticsPanel(); - } + statistics.addActionListener((ActionEvent ae) -> { + gui.showStatisticsPanel(); }); statistics.setEnabled(true); @@ -449,11 +376,8 @@ public class DebugMenu extends JMenu { gc.setOpaque(false); //gc.setMnemonic(KeyEvent.VK_G); this.add(gc); - gc.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - System.gc(); - } + gc.addActionListener((ActionEvent ae) -> { + System.gc(); }); gc.setEnabled(true); diff --git a/src/net/sf/freecol/client/gui/menu/FreeColMenuTest.java b/src/net/sf/freecol/client/gui/menu/FreeColMenuTest.java index 6e065fe0b..0e73821fa 100644 --- a/src/net/sf/freecol/client/gui/menu/FreeColMenuTest.java +++ b/src/net/sf/freecol/client/gui/menu/FreeColMenuTest.java @@ -79,8 +79,8 @@ public class FreeColMenuTest implements ActionListener, ItemListener { } @Override - public void actionPerformed(ActionEvent e) { - JMenuItem source = (JMenuItem)(e.getSource()); + public void actionPerformed(ActionEvent ae) { + JMenuItem source = (JMenuItem)ae.getSource(); String s = "Action event detected." + newline + " Event source: " + source.getText() @@ -154,11 +154,6 @@ public class FreeColMenuTest implements ActionListener, ItemListener { public static void main(String[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application's GUI. - javax.swing.SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - createAndShowGUI(); - } - }); + javax.swing.SwingUtilities.invokeLater(() -> { createAndShowGUI(); }); } } diff --git a/src/net/sf/freecol/client/gui/menu/InGameMenuBar.java b/src/net/sf/freecol/client/gui/menu/InGameMenuBar.java index 2ef09b563..8faaf69fb 100644 --- a/src/net/sf/freecol/client/gui/menu/InGameMenuBar.java +++ b/src/net/sf/freecol/client/gui/menu/InGameMenuBar.java @@ -23,6 +23,7 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.KeyEvent; +import java.awt.event.MouseMotionListener; import java.awt.geom.Rectangle2D; import java.util.logging.Logger; @@ -30,10 +31,8 @@ import javax.swing.ButtonGroup; import javax.swing.JMenu; import net.sf.freecol.client.FreeColClient; -import net.sf.freecol.client.gui.MapViewer; import net.sf.freecol.client.gui.action.*; import net.sf.freecol.client.gui.action.DisplayTileTextAction.DisplayText; -import net.sf.freecol.client.gui.menu.DebugMenu; import net.sf.freecol.client.gui.panel.Utility; import net.sf.freecol.common.debug.FreeColDebugger; import net.sf.freecol.common.i18n.Messages; @@ -61,9 +60,10 @@ public class InGameMenuBar extends FreeColMenuBar { * Creates a new FreeColMenuBar. This menu bar will include * all of the submenus and items. * - * @param f The main controller. + * @param freeColClient The main controller. + * @param listener An optional mouse motion listener. */ - public InGameMenuBar(FreeColClient f, MapViewer mapViewer) { + public InGameMenuBar(FreeColClient freeColClient, MouseMotionListener listener) { // FIXME: FreeColClient should not have to be passed in to // this class. This is only a menu bar, it doesn't need a // reference to the main controller. The only reason it has @@ -79,11 +79,11 @@ public class InGameMenuBar extends FreeColMenuBar { // Okay, I lied.. the update() and paintComponent() methods in // this MenuBar use freeColClient, too. But so what. Move // those to another class too. :) - super(f); + super(freeColClient); // Add a mouse listener so that autoscrolling can happen in // this menubar - this.addMouseMotionListener(new MenuMouseMotionListener(f, mapViewer)); + this.addMouseMotionListener(listener); reset(); } @@ -277,7 +277,7 @@ public class InGameMenuBar extends FreeColMenuBar { freeColClient.getGame().getTurn().getLabel())); Rectangle2D displayStringBounds = g2d.getFontMetrics().getStringBounds(displayString, g); - int y = Math.round(12f*freeColClient.getGUI().getImageLibrary().getScalingFactor()) + int y = Math.round(12f*freeColClient.getGUI().getImageLibrary().getScaleFactor()) + 3 + getInsets().top; g2d.drawString(displayString, getWidth() - 10 - (int) displayStringBounds.getWidth(), y); } diff --git a/src/net/sf/freecol/client/gui/menu/MapEditorMenuBar.java b/src/net/sf/freecol/client/gui/menu/MapEditorMenuBar.java index 70c7395e2..153c7543f 100644 --- a/src/net/sf/freecol/client/gui/menu/MapEditorMenuBar.java +++ b/src/net/sf/freecol/client/gui/menu/MapEditorMenuBar.java @@ -20,8 +20,8 @@ package net.sf.freecol.client.gui.menu; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.KeyEvent; +import java.awt.event.MouseMotionListener; import java.io.File; import java.io.FileNotFoundException; import java.util.logging.Logger; @@ -31,7 +31,6 @@ import javax.swing.JMenu; import javax.swing.JMenuItem; import net.sf.freecol.client.FreeColClient; -import net.sf.freecol.client.gui.MapViewer; import net.sf.freecol.client.gui.action.*; import net.sf.freecol.client.gui.action.DisplayTileTextAction.DisplayText; import net.sf.freecol.client.gui.panel.Utility; @@ -62,12 +61,13 @@ public class MapEditorMenuBar extends FreeColMenuBar { * all of the submenus and items. * * @param freeColClient The FreeColClient for the game. + * @param listener An optional mouse motion listener. */ - public MapEditorMenuBar(final FreeColClient freeColClient, MapViewer mapViewer) { + public MapEditorMenuBar(final FreeColClient freeColClient, MouseMotionListener listener) { super(freeColClient); // Add a mouse listener so that autoscrolling can happen in this menubar - this.addMouseMotionListener(new MenuMouseMotionListener(freeColClient, mapViewer)); + this.addMouseMotionListener(listener); reset(); } @@ -101,24 +101,20 @@ public class MapEditorMenuBar extends FreeColMenuBar { menu.add(getMenuItem(OpenAction.id)); menu.add(getMenuItem(SaveAction.id)); JMenuItem playItem = Utility.localizedMenuItem("startGame"); - playItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - File startFile = FreeColDirectories.getStartMapFile(); - freeColClient.getMapEditorController() - .saveGame(startFile); - OptionGroup options = freeColClient.getGame() - .getMapGeneratorOptions(); - FileOption fileOption = (FileOption)options - .getOption(MapGeneratorOptions.IMPORT_FILE); - fileOption.setValue(startFile); - File mapOptionsFile = FreeColDirectories - .getOptionsFile(FreeColDirectories.MAP_GENERATOR_OPTIONS_FILE_NAME); - try { - options.save(mapOptionsFile); - } catch (FileNotFoundException fnfe) {} - freeColClient.newGame(); - } + playItem.addActionListener((ActionEvent ae) -> { + File startFile = FreeColDirectories.getStartMapFile(); + freeColClient.getMapEditorController().saveGame(startFile); + OptionGroup options = freeColClient.getGame() + .getMapGeneratorOptions(); + FileOption fileOption = (FileOption)options + .getOption(MapGeneratorOptions.IMPORT_FILE); + fileOption.setValue(startFile); + File mapOptionsFile = FreeColDirectories + .getOptionsFile(FreeColDirectories.MAP_GENERATOR_OPTIONS_FILE_NAME); + try { + options.save(mapOptionsFile); + } catch (FileNotFoundException fnfe) {} + freeColClient.newGame(true); }); menu.add(playItem); menu.addSeparator(); diff --git a/src/net/sf/freecol/client/gui/menu/MenuMouseMotionListener.java b/src/net/sf/freecol/client/gui/menu/MenuMouseMotionListener.java index 1e7df06dd..d94a40b6b 100644 --- a/src/net/sf/freecol/client/gui/menu/MenuMouseMotionListener.java +++ b/src/net/sf/freecol/client/gui/menu/MenuMouseMotionListener.java @@ -24,7 +24,7 @@ import java.awt.event.MouseMotionListener; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.gui.AbstractCanvasListener; -import net.sf.freecol.client.gui.MapViewer; +import net.sf.freecol.client.gui.Canvas; /** @@ -47,8 +47,8 @@ public class MenuMouseMotionListener extends AbstractCanvasListener * * @param freeColClient The enclosing FreeColClient. */ - public MenuMouseMotionListener(FreeColClient freeColClient, MapViewer mapViewer) { - super(freeColClient, mapViewer); + public MenuMouseMotionListener(FreeColClient freeColClient, Canvas canvas) { + super(freeColClient, canvas); } @@ -57,7 +57,7 @@ public class MenuMouseMotionListener extends AbstractCanvasListener */ @Override public void mouseDragged(MouseEvent e) { - return; //Do nothing + //Do nothing } /** diff --git a/src/net/sf/freecol/client/gui/option/AudioMixerOptionUI.java b/src/net/sf/freecol/client/gui/option/AudioMixerOptionUI.java index f342428de..550d3e651 100644 --- a/src/net/sf/freecol/client/gui/option/AudioMixerOptionUI.java +++ b/src/net/sf/freecol/client/gui/option/AudioMixerOptionUI.java @@ -49,23 +49,6 @@ public final class AudioMixerOptionUI extends OptionUI { private final JButton button2; private final JLabel currentMixerLabel; - private final ActionListener aHandler = new ActionListener () { - @Override - public void actionPerformed(ActionEvent e) { - if (e.getSource() == button1) { - gui.playSound("sound.event.buildingComplete"); - } else if (e.getSource() == button2) { - gui.playSound("sound.intro.general"); - } else if (e.getSource() == cbox) { - MixerWrapper value = (MixerWrapper) cbox.getSelectedItem(); - if (getOption().getValue() != value) { - getOption().setValue(value); - updateMixerLabel(); - } - } - } - }; - /** * Creates a new AudioMixerOptionUI for the given @@ -95,18 +78,31 @@ public final class AudioMixerOptionUI extends OptionUI { button1 = Utility.localizedButton("test"); panel.add(button1); - button1.addActionListener(aHandler); button2 = Utility.localizedButton("music"); panel.add(button2); - button2.addActionListener(aHandler); cbox.add(super.getJLabel()); cbox.setModel(new DefaultComboBoxModel<>(getOption().getChoices() .toArray(new MixerWrapper[0]))); reset(); - cbox.setEnabled(editable); + + ActionListener aHandler = (ActionEvent ae) -> { + if (ae.getSource() == button1) { + gui.playSound("sound.event.buildingComplete"); + } else if (ae.getSource() == button2) { + gui.playSound("sound.intro.general"); + } else if (ae.getSource() == cbox) { + MixerWrapper value = (MixerWrapper) cbox.getSelectedItem(); + if (getOption().getValue() != value) { + getOption().setValue(value); + updateMixerLabel(); + } + } + }; + button1.addActionListener(aHandler); + button2.addActionListener(aHandler); cbox.addActionListener(aHandler); initialize(); diff --git a/src/net/sf/freecol/client/gui/option/FileOptionUI.java b/src/net/sf/freecol/client/gui/option/FileOptionUI.java index 195a87424..3c018d196 100644 --- a/src/net/sf/freecol/client/gui/option/FileOptionUI.java +++ b/src/net/sf/freecol/client/gui/option/FileOptionUI.java @@ -20,7 +20,6 @@ package net.sf.freecol.client.gui.option; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.Color; import java.io.File; @@ -63,23 +62,17 @@ public final class FileOptionUI extends OptionUI { JButton browse = Utility.localizedButton("browse"); if (editable) { - browse.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - File file = gui.showLoadSaveFileDialog(); - if (file != null) setValue(file); - } + browse.addActionListener((ActionEvent ae) -> { + File f = gui.showLoadSaveFileDialog(); + if (f != null) setValue(f); }); } panel.add(browse); JButton remove = Utility.localizedButton("remove"); if (editable) { - remove.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - setValue(null); - } + remove.addActionListener((ActionEvent ae) -> { + setValue(null); }); } panel.add(remove); diff --git a/src/net/sf/freecol/client/gui/option/FreeColActionUI.java b/src/net/sf/freecol/client/gui/option/FreeColActionUI.java index b8eff5c79..43db00be3 100644 --- a/src/net/sf/freecol/client/gui/option/FreeColActionUI.java +++ b/src/net/sf/freecol/client/gui/option/FreeColActionUI.java @@ -168,11 +168,11 @@ public final class FreeColActionUI extends OptionUI * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent evt) { - if (evt.getSource() == recordButton) { + public void actionPerformed(ActionEvent ae) { + if (ae.getSource() == recordButton) { bl.startBlinking(); bl.requestFocus(); - } else if (evt.getSource() == removeButton) { + } else if (ae.getSource() == removeButton) { bl.stopBlinking(); bl.setText(" "); keyStroke = null; @@ -264,7 +264,7 @@ public final class FreeColActionUI extends OptionUI * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { if (!hasFocus()) stopBlinking(); if (blinkOn) { diff --git a/src/net/sf/freecol/client/gui/option/ListOptionUI.java b/src/net/sf/freecol/client/gui/option/ListOptionUI.java index ff1157f50..247327d72 100644 --- a/src/net/sf/freecol/client/gui/option/ListOptionUI.java +++ b/src/net/sf/freecol/client/gui/option/ListOptionUI.java @@ -20,7 +20,6 @@ package net.sf.freecol.client.gui.option; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; @@ -110,66 +109,49 @@ public final class ListOptionUI extends OptionUI> this.panel.add(button); } - addButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - AbstractOption oldValue - = list.getSelectedValue(); - if (oldValue == null) oldValue = option.getTemplate(); - try { - AbstractOption newValue = (oldValue == null) ? null - : oldValue.clone(); - if (gui.showEditOptionDialog(newValue)) { - if (option.canAdd(newValue)) { - model.addElement(newValue); - list.setSelectedValue(newValue, true); - list.repaint(); - } - } - } catch (CloneNotSupportedException e) { - logger.log(Level.WARNING, "Can not clone: " + oldValue, - e); - } - } - }); - editButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - Object object = list.getSelectedValue(); - if (object != null) { - if (gui.showEditOptionDialog((Option)object)) { + addButton.addActionListener((ActionEvent ae) -> { + AbstractOption oldValue = list.getSelectedValue(); + if (oldValue == null) oldValue = option.getTemplate(); + try { + AbstractOption newValue = (oldValue == null) ? null + : oldValue.clone(); + if (gui.showEditOptionDialog(newValue)) { + if (option.canAdd(newValue)) { + model.addElement(newValue); + list.setSelectedValue(newValue, true); list.repaint(); } } + } catch (CloneNotSupportedException e) { + logger.log(Level.WARNING, "Can not clone: " + oldValue, e); } }); - removeButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - model.removeElementAt(list.getSelectedIndex()); + editButton.addActionListener((ActionEvent ae) -> { + Object object = list.getSelectedValue(); + if (object != null) { + if (gui.showEditOptionDialog((Option)object)) { + list.repaint(); + } } }); - upButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (list.getSelectedIndex() == 0) return; - final int index = list.getSelectedIndex(); - final AbstractOption temp = model.getElementAt(index); - model.setElementAt(model.getElementAt(index-1), index); - model.setElementAt(temp, index-1); - list.setSelectedIndex(index-1); - } + removeButton.addActionListener((ActionEvent ae) -> { + model.removeElementAt(list.getSelectedIndex()); }); - downButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (list.getSelectedIndex() == model.getSize() - 1) return; - final int index = list.getSelectedIndex(); - final AbstractOption temp = model.getElementAt(index); - model.setElementAt(model.getElementAt(index+1), index); - model.setElementAt(temp, index+1); - list.setSelectedIndex(index+1); - } + upButton.addActionListener((ActionEvent ae) -> { + if (list.getSelectedIndex() == 0) return; + final int index = list.getSelectedIndex(); + final AbstractOption temp = model.getElementAt(index); + model.setElementAt(model.getElementAt(index-1), index); + model.setElementAt(temp, index-1); + list.setSelectedIndex(index-1); + }); + downButton.addActionListener((ActionEvent ae) -> { + if (list.getSelectedIndex() == model.getSize() - 1) return; + final int index = list.getSelectedIndex(); + final AbstractOption temp = model.getElementAt(index); + model.setElementAt(model.getElementAt(index+1), index); + model.setElementAt(temp, index+1); + list.setSelectedIndex(index+1); }); list.addListSelectionListener(this); diff --git a/src/net/sf/freecol/client/gui/panel/AboutPanel.java b/src/net/sf/freecol/client/gui/panel/AboutPanel.java index 16206315a..8506a6b29 100644 --- a/src/net/sf/freecol/client/gui/panel/AboutPanel.java +++ b/src/net/sf/freecol/client/gui/panel/AboutPanel.java @@ -38,7 +38,6 @@ import net.miginfocom.swing.MigLayout; import net.sf.freecol.FreeCol; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.gui.FontLibrary; -import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.resources.ResourceManager; @@ -72,13 +71,15 @@ import net.sf.freecol.common.resources.ResourceManager; */ public final class AboutPanel extends FreeColPanel { - private static final Logger logger = Logger - .getLogger(AboutPanel.class.getName()); + private static final Logger logger = Logger.getLogger(AboutPanel.class.getName()); public static final String SITE_URL = "http://www.freecol.org"; public static final String PROJECT_URL = "http://sourceforge.net/projects/freecol/"; + private static final String MANUAL_URL + = "http://www.freecol.org/documentation/freecol-user-manual.html"; + /** * The constructor that will add the items to this panel. @@ -99,9 +100,9 @@ public final class AboutPanel extends FreeColPanel { // Create available Font choices Font fontBold = FontLibrary.createFont(FontLibrary.FontType.NORMAL, FontLibrary.FontSize.TINY, Font.BOLD, - getImageLibrary().getScalingFactor()); + getImageLibrary().getScaleFactor()); Font fontNormal = FontLibrary.createFont(FontLibrary.FontType.NORMAL, - FontLibrary.FontSize.TINY, getImageLibrary().getScalingFactor()); + FontLibrary.FontSize.TINY, getImageLibrary().getScaleFactor()); // Version JLabel apVersion = Utility.localizedLabel("aboutPanel.version"); @@ -131,6 +132,15 @@ public final class AboutPanel extends FreeColPanel { apProjectURL.setFont(fontNormal); add(apProjectURL, "newline"); + // Manual + JLabel apManual = Utility.localizedLabel("aboutPanel.manual"); + apManual.setFont(fontBold); + add(apManual, "newline 10"); + JButton apManualURL = Utility.getLinkButton(MANUAL_URL, null, + MANUAL_URL); + apManualURL.addActionListener(this); + add(apManualURL, "newline"); + // License Disclaimer JTextArea apLegal = Utility.localizedTextArea("aboutPanel.legalDisclaimer"); @@ -149,12 +159,12 @@ public final class AboutPanel extends FreeColPanel { /** * {@inheritDoc} - * @param event */ @Override - public void actionPerformed(ActionEvent event) { - String url = event.getActionCommand(); - if (SITE_URL.equals(url) || PROJECT_URL.equals(url)) { + public void actionPerformed(ActionEvent ae) { + final String url = ae.getActionCommand(); + if (SITE_URL.equals(url) || PROJECT_URL.equals(url) + || MANUAL_URL.equals(url)) { String os = System.getProperty("os.name"); // FIXME: move this to OS utilities String[] cmd = null; @@ -181,7 +191,7 @@ public final class AboutPanel extends FreeColPanel { // couldn't start browser } } else { - super.actionPerformed(event); + super.actionPerformed(ae); } } } diff --git a/src/net/sf/freecol/client/gui/panel/AbstractGoodsLabel.java b/src/net/sf/freecol/client/gui/panel/AbstractGoodsLabel.java index 8699a22af..ae67389b4 100644 --- a/src/net/sf/freecol/client/gui/panel/AbstractGoodsLabel.java +++ b/src/net/sf/freecol/client/gui/panel/AbstractGoodsLabel.java @@ -38,6 +38,8 @@ public class AbstractGoodsLabel extends JLabel { private boolean partialChosen = false; + private boolean fullChosen = false; + /** * Initializes this JLabel with the given goods data. @@ -72,6 +74,24 @@ public class AbstractGoodsLabel extends JLabel { this.partialChosen = partialChosen; } + /** + * Has full amount been selected? + * + * @return True if a full amount has been selected. + */ + public boolean isFullChosen() { + return fullChosen; + } + + /** + * Set the full amount state. + * + * @param fullChosen The new full amount state. + */ + public void setFullChosen(boolean fullChosen) { + this.fullChosen = fullChosen; + } + /** * Get the goods data. * diff --git a/src/net/sf/freecol/client/gui/panel/BuildQueuePanel.java b/src/net/sf/freecol/client/gui/panel/BuildQueuePanel.java index 1395a6884..8f57b3cd0 100644 --- a/src/net/sf/freecol/client/gui/panel/BuildQueuePanel.java +++ b/src/net/sf/freecol/client/gui/panel/BuildQueuePanel.java @@ -32,6 +32,7 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; @@ -85,7 +86,7 @@ import net.sf.freecol.common.model.Specification; import net.sf.freecol.common.model.StringTemplate; import net.sf.freecol.common.model.Turn; import net.sf.freecol.common.model.UnitType; - +import static net.sf.freecol.common.util.CollectionUtils.*; import static net.sf.freecol.common.util.StringUtils.*; @@ -164,10 +165,7 @@ public class BuildQueuePanel extends FreeColPanel implements ItemListener { */ @Override public boolean isDataFlavorSupported(DataFlavor flavor) { - for (DataFlavor myFlavor : supportedFlavors) { - if (myFlavor.equals(flavor)) return true; - } - return false; + return any(supportedFlavors, f -> f.equals(flavor)); } } @@ -338,11 +336,8 @@ public class BuildQueuePanel extends FreeColPanel implements ItemListener { */ @Override public boolean canImport(JComponent comp, DataFlavor[] flavors) { - if (flavors == null) return false; - for (DataFlavor flavor : flavors) { - if (flavor.equals(BUILD_LIST_FLAVOR)) return true; - } - return false; + return flavors != null + && any(flavors, f -> f.equals(BUILD_LIST_FLAVOR)); } /** @@ -552,15 +547,15 @@ public class BuildQueuePanel extends FreeColPanel implements ItemListener { BuildQueueMouseAdapter adapter = new BuildQueueMouseAdapter(true); Action addAction = new AbstractAction() { @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { JList bql = BuildQueuePanel.this.buildQueueList; DefaultListModel model = (DefaultListModel)bql.getModel(); JList btl - = (e.getSource() == BuildQueuePanel.this.unitList) + = (ae.getSource() == BuildQueuePanel.this.unitList) ? BuildQueuePanel.this.unitList - : (e.getSource() == BuildQueuePanel.this.buildingList) + : (ae.getSource() == BuildQueuePanel.this.buildingList) ? BuildQueuePanel.this.buildingList : null; if (btl != null) { @@ -575,12 +570,12 @@ public class BuildQueuePanel extends FreeColPanel implements ItemListener { // Create Font choice Font fontSubHead = FontLibrary.createFont(FontLibrary.FontType.NORMAL, FontLibrary.FontSize.SMALLER, Font.BOLD, - getImageLibrary().getScalingFactor()); + getImageLibrary().getScaleFactor()); // Create the components - JLabel header = Utility.localizedLabel("buildQueuePanel.buildQueue"); - header.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - FontLibrary.FontSize.BIG)); + JLabel header = Utility.localizedHeaderLabel( + "buildQueuePanel.buildQueue", + SwingConstants.LEADING, FontLibrary.FontSize.BIG); // JLabel SubHeads JLabel bqpUnits = Utility.localizedLabel("buildQueuePanel.units"); @@ -619,7 +614,7 @@ public class BuildQueuePanel extends FreeColPanel implements ItemListener { this.buildQueueList.getActionMap().put("delete", new AbstractAction() { @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { JList bql = BuildQueuePanel. this.buildQueueList; for (BuildableType bt : bql.getSelectedValuesList()) { @@ -946,18 +941,6 @@ public class BuildQueuePanel extends FreeColPanel implements ItemListener { return result; } - private List getBuildableTypes(Object[] objects) { - List result = new ArrayList<>(); - if (objects != null) { - for (Object object : objects) { - if (object instanceof BuildableType) { - result.add((BuildableType) object); - } - } - } - return result; - } - private int getMinimumIndex(BuildableType buildableType) { ListModel buildQueue = this.buildQueueList.getModel(); if (buildableType instanceof UnitType) { @@ -1073,10 +1056,10 @@ public class BuildQueuePanel extends FreeColPanel implements ItemListener { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { + public void actionPerformed(ActionEvent ae) { final String FAIL = "FAIL"; if (this.colony.getOwner() == getMyPlayer()) { - String command = event.getActionCommand(); + String command = ae.getActionCommand(); List buildables = getBuildableTypes(this .buildQueueList); while (!buildables.isEmpty() @@ -1098,7 +1081,7 @@ public class BuildQueuePanel extends FreeColPanel implements ItemListener { igc().payForBuilding(this.colony); break; default: - super.actionPerformed(event); + super.actionPerformed(ae); break; } } diff --git a/src/net/sf/freecol/client/gui/panel/BuildingDetailPanel.java b/src/net/sf/freecol/client/gui/panel/BuildingDetailPanel.java index 3e398f080..71c4ad5be 100644 --- a/src/net/sf/freecol/client/gui/panel/BuildingDetailPanel.java +++ b/src/net/sf/freecol/client/gui/panel/BuildingDetailPanel.java @@ -21,7 +21,6 @@ package net.sf.freecol.client.gui.panel; import java.awt.Dimension; import java.awt.Font; -import java.awt.Image; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -53,7 +52,6 @@ import net.sf.freecol.common.model.Modifier; import net.sf.freecol.common.model.ProductionType; import net.sf.freecol.common.model.StringTemplate; import net.sf.freecol.common.model.UnitType; -import net.sf.freecol.common.resources.ResourceManager; /** @@ -74,21 +72,22 @@ public class BuildingDetailPanel } + // Implement ColopediaDetailPanel + /** - * Adds one or several subtrees for all the objects for which this - * ColopediaDetailPanel could build a detail panel to the given - * root node. - * - * @param root a DefaultMutableTreeNode + * {@inheritDoc} */ @Override public void addSubTrees(DefaultMutableTreeNode root) { - DefaultMutableTreeNode parent = - new DefaultMutableTreeNode(new ColopediaTreeItem(this, getId(), getName(), null)); + DefaultMutableTreeNode parent + = new DefaultMutableTreeNode(new ColopediaTreeItem(this, getId(), + getName(), null)); List buildingTypes = new ArrayList<>(); - Map buildingHash = new HashMap<>(); - for (BuildingType buildingType : getSpecification().getBuildingTypeList()) { + Map buildingHash + = new HashMap<>(); + for (BuildingType buildingType + : getSpecification().getBuildingTypeList()) { if (buildingType.getUpgradesFrom() == null) { String name = Messages.getName(buildingType); DefaultMutableTreeNode item = @@ -124,24 +123,16 @@ public class BuildingDetailPanel } /** - * Builds the details panel for the BuildingType with the given - * identifier. - * - * @param id The object identifier. - * @param panel the detail panel to build + * {@inheritDoc} */ @Override public void buildDetail(String id, JPanel panel) { - if (getId().equals(id)) { - return; - } + if (getId().equals(id)) return; BuildingType buildingType = getSpecification().getBuildingType(id); panel.setLayout(new MigLayout("wrap 7, gapx 20", "", "")); - JLabel name = Utility.localizedLabel(buildingType); - name.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - FontLibrary.FontSize.SMALL)); + JLabel name = Utility.localizedHeaderLabel(buildingType, FontLibrary.FontSize.SMALL); panel.add(name, "span, align center, wrap 40"); // Requires - prerequisites to build @@ -280,5 +271,4 @@ public class BuildingDetailPanel panel.add(Utility.localizedTextArea(Messages.descriptionKey(buildingType)), "span, growx"); } - } diff --git a/src/net/sf/freecol/client/gui/panel/BuildingPanel.java b/src/net/sf/freecol/client/gui/panel/BuildingPanel.java index 81f1b805e..d1bb7a56a 100644 --- a/src/net/sf/freecol/client/gui/panel/BuildingPanel.java +++ b/src/net/sf/freecol/client/gui/panel/BuildingPanel.java @@ -262,7 +262,7 @@ public class BuildingPanel extends MigPanel implements PropertyChangeListener { Integer.toString(number), getForeground(), FontLibrary.createFont(FontLibrary.FontType.SIMPLE, FontLibrary.FontSize.TINY, Font.BOLD, - lib.getScalingFactor())); + lib.getScaleFactor())); g.drawImage(image, (getIcon().getIconWidth() - image.getWidth(null))/2, (getIcon().getIconHeight() - image.getHeight(null))/2, null); diff --git a/src/net/sf/freecol/client/gui/panel/BuildingToolTip.java b/src/net/sf/freecol/client/gui/panel/BuildingToolTip.java index fc799398c..1f248371f 100644 --- a/src/net/sf/freecol/client/gui/panel/BuildingToolTip.java +++ b/src/net/sf/freecol/client/gui/panel/BuildingToolTip.java @@ -72,7 +72,7 @@ public class BuildingToolTip extends JToolTip { if (arrow == null) { arrow = new JLabel(ResourceManager.getString("arrow.E")); arrow.setFont(FontLibrary.createFont(FontLibrary.FontType.SIMPLE, - FontLibrary.FontSize.SMALL, Font.BOLD, lib.getScalingFactor())); + FontLibrary.FontSize.SMALL, Font.BOLD, lib.getScaleFactor())); } String columns = "[align center]"; @@ -86,42 +86,46 @@ public class BuildingToolTip extends JToolTip { JLabel buildingName = new JLabel(Messages.getName(building)); buildingName.setFont(FontLibrary.createFont(FontLibrary.FontType.SIMPLE, - FontLibrary.FontSize.SMALLER, Font.BOLD, lib.getScalingFactor())); + FontLibrary.FontSize.SMALLER, Font.BOLD, lib.getScaleFactor())); add(buildingName, "span"); ProductionInfo info = building.getProductionInfo(); - if (info == null || info.getProduction().isEmpty()) { + AbstractGoods production + = (info == null || info.getProduction().isEmpty()) ? null + : info.getProduction().get(0); + AbstractGoods consumption + = (info == null || info.getConsumption().isEmpty()) ? null + : info.getConsumption().get(0); + if (production == null || production.getAmount() <= 0) { add(new JLabel(), "span"); } else { - AbstractGoods production = info.getProduction().get(0); + AbstractGoods maxProduction = (info == null + || info.getMaximumProduction().isEmpty()) ? null + : info.getMaximumProduction().get(0); ProductionLabel productionOutput = new ProductionLabel(freeColClient, production, - ((info.getMaximumProduction().isEmpty()) - ? production - : info.getMaximumProduction().get(0)) - .getAmount()); - if (info.getConsumption().isEmpty()) { + ((maxProduction == null) ? production + : maxProduction).getAmount()); + if (consumption == null) { add(productionOutput, "span"); + } else if (consumption.getAmount() > 0) { + AbstractGoods maxConsumption = (info == null + || info.getMaximumConsumption().isEmpty()) ? null + : info.getMaximumConsumption().get(0); + ProductionLabel productionInput + = new ProductionLabel(freeColClient, consumption, + ((maxConsumption == null) ? consumption + : maxConsumption).getAmount()); + add(productionInput, "span, split 3"); + add(arrow); + add(productionOutput); } else { - AbstractGoods consumption = info.getConsumption().get(0); - if (consumption.getAmount() > 0) { - ProductionLabel productionInput - = new ProductionLabel(freeColClient, consumption, - ((info.getMaximumConsumption().isEmpty()) - ? consumption - : info.getMaximumConsumption().get(0)) - .getAmount()); - add(productionInput, "span, split 3"); - add(arrow); - add(productionOutput); - } else { - add(new JLabel(new ImageIcon( - lib.getIconImage(consumption.getType()))), - "span, split 3"); - add(arrow); - add(new JLabel(new ImageIcon( - lib.getIconImage(production.getType())))); - } + add(new JLabel(new ImageIcon(lib + .getIconImage(consumption.getType()))), + "span, split 3"); + add(arrow); + add(new JLabel(new ImageIcon(lib + .getIconImage(production.getType())))); } } @@ -129,11 +133,11 @@ public class BuildingToolTip extends JToolTip { for (Unit unit : building.getUnitList()) { UnitLabel unitLabel = new UnitLabel(freeColClient, unit, false); - int production = building.getUnitProduction(unit, output); - if (production > 0) { + int amount = building.getUnitProduction(unit, output); + if (amount > 0) { add(unitLabel); JLabel pLabel = new ProductionLabel(freeColClient, - new AbstractGoods(output, production)); + new AbstractGoods(output, amount)); add(pLabel, "split 2"); add(new JLabel()); } else if (building.canTeach() && unit.getStudent() != null) { diff --git a/src/net/sf/freecol/client/gui/panel/CaptureGoodsDialog.java b/src/net/sf/freecol/client/gui/panel/CaptureGoodsDialog.java index b4dfa4d13..b0c6609ef 100644 --- a/src/net/sf/freecol/client/gui/panel/CaptureGoodsDialog.java +++ b/src/net/sf/freecol/client/gui/panel/CaptureGoodsDialog.java @@ -21,7 +21,6 @@ package net.sf.freecol.client.gui.panel; import java.awt.Component; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; @@ -38,6 +37,7 @@ import javax.swing.ListCellRenderer; import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.Goods; import net.sf.freecol.common.model.Unit; @@ -126,31 +126,25 @@ public final class CaptureGoodsDialog extends FreeColDialog> { this.maxCargo = winner.getSpaceLeft(); this.allButton = Utility.localizedButton("all"); - this.allButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - JList gl = CaptureGoodsDialog.this.goodsList; - for (int i = 0; i < gl.getModel().getSize() - && i < CaptureGoodsDialog.this.maxCargo; i++) { - GoodsItem gi = gl.getModel().getElementAt(i); - gi.setSelected(true); - updateComponents(); - } + this.allButton.addActionListener((ActionEvent ae) -> { + JList gl = CaptureGoodsDialog.this.goodsList; + for (int i = 0; i < gl.getModel().getSize() + && i < CaptureGoodsDialog.this.maxCargo; i++) { + GoodsItem gi = gl.getModel().getElementAt(i); + gi.setSelected(true); + updateComponents(); } }); this.allButton.setMnemonic('a'); this.allButton.setActionCommand(this.allButton.getText()); this.noneButton = Utility.localizedButton("none"); - this.noneButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - JList gl = CaptureGoodsDialog.this.goodsList; - for (int i = 0; i < gl.getModel().getSize(); i++) { - GoodsItem gi = gl.getModel().getElementAt(i); - gi.setSelected(false); - updateComponents(); - } + this.noneButton.addActionListener((ActionEvent ae) -> { + JList gl = CaptureGoodsDialog.this.goodsList; + for (int i = 0; i < gl.getModel().getSize(); i++) { + GoodsItem gi = gl.getModel().getElementAt(i); + gi.setSelected(false); + updateComponents(); } }); this.noneButton.setMnemonic('n'); diff --git a/src/net/sf/freecol/client/gui/panel/ChatPanel.java b/src/net/sf/freecol/client/gui/panel/ChatPanel.java index df9fbe9ae..66cb416c8 100644 --- a/src/net/sf/freecol/client/gui/panel/ChatPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ChatPanel.java @@ -95,8 +95,8 @@ public final class ChatPanel extends FreeColPanel { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - final String command = event.getActionCommand(); + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); try { switch (Integer.parseInt(command)) { case CHAT: @@ -106,7 +106,7 @@ public final class ChatPanel extends FreeColPanel { getGUI().removeFromCanvas(this); break; default: - super.actionPerformed(event); + super.actionPerformed(ae); } } catch (NumberFormatException e) { logger.warning("Invalid ActionEvent, not a number: " + command); diff --git a/src/net/sf/freecol/client/gui/panel/ChooseFoundingFatherDialog.java b/src/net/sf/freecol/client/gui/panel/ChooseFoundingFatherDialog.java index 72e5f2b0d..a9bd946c1 100644 --- a/src/net/sf/freecol/client/gui/panel/ChooseFoundingFatherDialog.java +++ b/src/net/sf/freecol/client/gui/panel/ChooseFoundingFatherDialog.java @@ -30,6 +30,7 @@ import javax.swing.JTabbedPane; import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.FoundingFather; diff --git a/src/net/sf/freecol/client/gui/panel/ColonyPanel.java b/src/net/sf/freecol/client/gui/panel/ColonyPanel.java index 092480df5..380320dd9 100644 --- a/src/net/sf/freecol/client/gui/panel/ColonyPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ColonyPanel.java @@ -274,15 +274,28 @@ public final class ColonyPanel extends PortPanel selectedUnitLabel = null; // Make the colony label - this.nameBox.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - FontLibrary.FontSize.SMALL, getImageLibrary().getScalingFactor())); + Font nameBoxFont = FontLibrary.createFont(FontLibrary.FontType.HEADER, + FontLibrary.FontSize.SMALL, getImageLibrary().getScaleFactor()); + boolean incompatibleFont = false; if (editable) { for (Colony c : freeColClient.getMySortedColonies()) { this.nameBox.addItem(c); + if(!incompatibleFont && + nameBoxFont.canDisplayUpTo(c.getName()) != -1) { + incompatibleFont = true; + } } } else { // When spying, only add the given colony. this.nameBox.addItem(colony); + if(nameBoxFont.canDisplayUpTo(colony.getName()) != -1) + incompatibleFont = true; } + if(incompatibleFont) { + nameBoxFont = FontLibrary.createFont(FontLibrary.FontType.NORMAL, + FontLibrary.FontSize.SMALL, + getImageLibrary().getScaleFactor()); + } + this.nameBox.setFont(nameBoxFont); this.nameBox.setSelectedItem(colony); this.nameBox.getInputMap().put(KeyStroke.getKeyStroke("LEFT"), "selectPrevious2"); @@ -342,7 +355,7 @@ public final class ColonyPanel extends PortPanel JComponent.WHEN_IN_FOCUSED_WINDOW, nameIM); initialize(colony); - float scale = getImageLibrary().getScalingFactor(); + float scale = getImageLibrary().getScaleFactor(); getGUI().restoreSavedSize(this, 200 + (int)(scale*850), 200 + (int)(scale*525)); } @@ -401,13 +414,10 @@ public final class ColonyPanel extends PortPanel final GUI gui = getGUI(); this.nameBox.setEnabled(isEditable()); - this.nameBox.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - final Colony newColony = (Colony)nameBox.getSelectedItem(); - closeColonyPanel(); - gui.showColonyPanel(newColony, null); - } + this.nameBox.addActionListener((ActionEvent ae) -> { + final Colony newColony = (Colony)nameBox.getSelectedItem(); + closeColonyPanel(); + gui.showColonyPanel(newColony, null); }); updateNetProductionPanel(); @@ -422,7 +432,7 @@ public final class ColonyPanel extends PortPanel add(this.nameBox, "height 42:, grow"); int tmp = (int)(ImageLibrary.ICON_SIZE.height - * gui.getImageLibrary().getScalingFactor()); + * gui.getImageLibrary().getScaleFactor()); add(netProductionPanel, "grow, height " + (tmp+10) + ":" + (2*tmp+10) + ":" + (2*tmp+10)); add(tilesScroll, "width 390!, height 200!, top"); @@ -644,7 +654,7 @@ public final class ColonyPanel extends PortPanel .template(goodsType) .addAmount("%amount%", producing)); sb.append(unit.getDescription()) - .append(" ").append(Messages.message("producing.name")) + .append(" ").append(Messages.message("colonyPanel.producing")) .append(" ").append(producing) .append(" ").append(nominative); } else if (workingInBuilding != null && goodsType != null) { @@ -664,12 +674,9 @@ public final class ColonyPanel extends PortPanel } String menuTitle = sb.toString(); subMenu = new JMenuItem(menuTitle, unitIcon); - subMenu.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - unitMenu.addMenuItems(new UnitLabel(freeColClient, unit)); - unitMenu.show(getGUI().getCanvas(), 0, 0); - } + subMenu.addActionListener((ActionEvent ae) -> { + unitMenu.addMenuItems(new UnitLabel(freeColClient, unit)); + unitMenu.show(getGUI().getCanvas(), 0, 0); }); unitNumber++; colonyUnitsMenu.add(subMenu); @@ -681,13 +688,10 @@ public final class ColonyPanel extends PortPanel String menuTitle = unit.getDescription() + " " + Messages.message("colonyPanel.inPort"); subMenu = new JMenuItem(menuTitle, unitIcon); - subMenu.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { + subMenu.addActionListener((ActionEvent ae) -> { unitMenu.addMenuItems(new UnitLabel(freeColClient, unit)); unitMenu.show(getGUI().getCanvas(), 0, 0); - } - }); + }); unitNumber++; colonyUnitsMenu.add(subMenu); if (unit.getUnitList() != null) { @@ -697,13 +701,10 @@ public final class ColonyPanel extends PortPanel + " " + Messages.message("cargoOnCarrier") + " " + unit.getDescription(); subMenu = new JMenuItem(menuTitle, unitIcon); - subMenu.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { + subMenu.addActionListener((ActionEvent ae) -> { unitMenu.addMenuItems(new UnitLabel(freeColClient, innerUnit)); unitMenu.show(getGUI().getCanvas(), 0, 0); - } - }); + }); unitNumber++; colonyUnitsMenu.add(subMenu); } @@ -711,15 +712,12 @@ public final class ColonyPanel extends PortPanel } else if (!unit.isOnCarrier()) { unitIcon = new ImageIcon(lib.getSmallerUnitImage(unit)); String menuTitle = unit.getDescription() - + " " + Messages.message("colonyPanel.outsideOfColony"); + + " " + Messages.message("colonyPanel.outsideColony"); subMenu = new JMenuItem(menuTitle, unitIcon); - subMenu.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { + subMenu.addActionListener((ActionEvent ae) -> { unitMenu.addMenuItems(new UnitLabel(freeColClient, unit)); unitMenu.show(getGUI().getCanvas(), 0, 0); - } - }); + }); unitNumber++; colonyUnitsMenu.add(subMenu); } @@ -893,7 +891,7 @@ public final class ColonyPanel extends PortPanel final Colony colony = getColony(); boolean abandon = false; if (colony.getUnitCount() == 0 && getMyPlayer().owns(colony)) { - if (!getGUI().confirm(true, null, + if (!getGUI().confirm(null, StringTemplate.key("abandonColony.text"), "abandonColony.yes", "abandonColony.no")) return; @@ -903,7 +901,7 @@ public final class ColonyPanel extends PortPanel BuildableType buildable = colony.getCurrentlyBuilding(); if (buildable != null && buildable.getRequiredPopulation() > colony.getUnitCount() - && !getGUI().confirm(true, null, StringTemplate + && !getGUI().confirm(null, StringTemplate .template("colonyPanel.reducePopulation") .addName("%colony%", colony.getName()) .addAmount("%number%", buildable.getRequiredPopulation()) @@ -916,7 +914,6 @@ public final class ColonyPanel extends PortPanel cleanup(); getGUI().removeFromCanvas(this); - getGUI().restartBlinking(); getGUI().updateMapControls(); // Talk to the controller last, allow all the cleanup to happen first. @@ -953,9 +950,9 @@ public final class ColonyPanel extends PortPanel * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { + public void actionPerformed(ActionEvent ae) { final Colony colony = getColony(); - final String command = event.getActionCommand(); + final String command = ae.getActionCommand(); final Unit unit = getSelectedUnit(); if (OK.equals(command)) { @@ -1017,7 +1014,7 @@ public final class ColonyPanel extends PortPanel colony.setOccupationTrace(!colony.getOccupationTrace()); break; default: - super.actionPerformed(event); + super.actionPerformed(ae); } } } @@ -1075,6 +1072,8 @@ public final class ColonyPanel extends PortPanel updateInPortPanel(); updatePopulationPanel(); updateWarehousePanel();// Role change changes equipment goods + } else if (Unit.MOVE_CHANGE.equals(property)) { + updateOutsideColonyPanel(); } else { // ColonyTiles and Buildings now have their own // propertyChangeListeners so {ColonyTile,Building}.UNIT_CHANGE @@ -1208,10 +1207,9 @@ public final class ColonyPanel extends PortPanel public void update() { final Colony colony = getColony(); if (colony == null) return; - final ImageLibrary lib = getGUI().getColonyTileMapViewer() - .getImageLibrary(); + final ImageLibrary lib = getGUI().getTileImageLibrary(); final Font font = FontLibrary.createFont(FontLibrary.FontType.NORMAL, - FontLibrary.FontSize.SMALLER, lib.getScalingFactor()); + FontLibrary.FontSize.SMALLER, lib.getScaleFactor()); final int uc = colony.getUnitCount(); final int solPercent = colony.getSoL(); final int rebels = Colony.calculateRebels(uc, solPercent); @@ -1911,8 +1909,8 @@ public final class ColonyPanel extends PortPanel /** * A panel that displays the tiles in the immediate area around the colony. - * TilesPanel class must use the ImageLibrary inside - * getGUI().getColonyTileMapViewer() for everything. + * TilesPanel class must use the ImageLibrary inside SwingGUI.tileMapViewer + * for everything. */ public final class TilesPanel extends JPanel { @@ -2001,8 +1999,7 @@ public final class ColonyPanel extends PortPanel g.fillRect(0, 0, getWidth(), getHeight()); if (colony == null) return; - getGUI().getColonyTileMapViewer().displayColonyTiles( - (Graphics2D)g, tiles, colony); + getGUI().displayColonyTiles((Graphics2D)g, tiles, colony); } /** @@ -2030,8 +2027,8 @@ public final class ColonyPanel extends PortPanel setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); setOpaque(false); // Size and position: - Dimension size = getGUI().getColonyTileMapViewer() - .getImageLibrary().calculateTileSize(colonyTile.getTile()); + Dimension size = getGUI().getTileImageLibrary() + .scaleDimension(ImageLibrary.TILE_SIZE); setSize(size); setLocation(((2 - x) + y) * size.width / 2, (x + y) * size.height / 2); @@ -2099,8 +2096,7 @@ public final class ColonyPanel extends PortPanel for (AbstractGoods ag : info.getProduction()) { ProductionLabel productionLabel = new ProductionLabel(getFreeColClient(), - getGUI().getColonyTileMapViewer() - .getImageLibrary(), + getGUI().getTileImageLibrary(), ag); productionLabel.addMouseListener(pressListener); add(productionLabel); diff --git a/src/net/sf/freecol/client/gui/panel/ColopediaGameObjectTypePanel.java b/src/net/sf/freecol/client/gui/panel/ColopediaGameObjectTypePanel.java index 932355cae..e82589620 100644 --- a/src/net/sf/freecol/client/gui/panel/ColopediaGameObjectTypePanel.java +++ b/src/net/sf/freecol/client/gui/panel/ColopediaGameObjectTypePanel.java @@ -19,7 +19,6 @@ package net.sf.freecol.client.gui.panel; -import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; @@ -60,10 +59,20 @@ public abstract class ColopediaGameObjectTypePanel { + /** The enclosing colopedia panel. */ + private ColopediaPanel colopediaPanel; + + /** The specific panel id. */ private final String id; - private ColopediaPanel colopediaPanel; + /** + * Create a new Colopedia game object type panel. + * + * @param freeColClient The FreeColClient for the game. + * @param colopediaPanel The parent ColopediaPanel. + * @param id The panel type identifier. + */ public ColopediaGameObjectTypePanel(FreeColClient freeColClient, ColopediaPanel colopediaPanel, String id) { @@ -73,21 +82,27 @@ public abstract class ColopediaGameObjectTypePanel types) { + public void addSubTrees(DefaultMutableTreeNode root, String id, + List types) { String name = getName(); - DefaultMutableTreeNode node = - new DefaultMutableTreeNode(new ColopediaTreeItem(this, id, name, null)); + ColopediaTreeItem cti = new ColopediaTreeItem(this, id, name, null); + DefaultMutableTreeNode node = new DefaultMutableTreeNode(cti); int width = ImageLibrary.ICON_SIZE.width; int height = ImageLibrary.ICON_SIZE.height; for (FreeColGameObjectType type : types) { Image image = (type instanceof GoodsType) - ? ImageLibrary.getMiscImage("image.icon." + type.getId(), ImageLibrary.ICON_SIZE) + ? ImageLibrary.getMiscImage("image.icon." + type.getId(), + ImageLibrary.ICON_SIZE) : (type instanceof ResourceType) - ? ImageLibrary.getMiscImage("image.tileitem." + type.getId(), ImageLibrary.ICON_SIZE) - : (type instanceof Nation) - ? ImageLibrary.getMiscIconImage(type, ImageLibrary.ICON_SIZE) - : (type instanceof BuildableType) - ? ImageLibrary.getBuildableImage((BuildableType)type, ImageLibrary.ICON_SIZE) - : ImageLibrary.getMiscImage(ResourceManager.REPLACEMENT_IMAGE, ImageLibrary.ICON_SIZE); + ? ImageLibrary.getMiscImage("image.tileitem." + type.getId(), + ImageLibrary.ICON_SIZE) + : (type instanceof Nation) + ? ImageLibrary.getMiscIconImage(type, ImageLibrary.ICON_SIZE) + : (type instanceof BuildableType) + ? ImageLibrary.getBuildableImage((BuildableType)type, + ImageLibrary.ICON_SIZE) + : ImageLibrary.getMiscImage(ResourceManager.REPLACEMENT_IMAGE, + ImageLibrary.ICON_SIZE); int x = (width - image.getWidth(null)) / 2; int y = (height - image.getHeight(null)) / 2; - BufferedImage centeredImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + BufferedImage centeredImage + = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g = centeredImage.createGraphics(); g.drawImage(image, x, y, null); g.dispose(); @@ -132,21 +153,23 @@ public abstract class ColopediaGameObjectTypePanelTreeSelectionEvent
. */ @Override public void valueChanged(TreeSelectionEvent event) { - DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); + DefaultMutableTreeNode node + = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent(); if (node != null) { - showDetails((ColopediaTreeItem) node.getUserObject()); + showDetails((ColopediaTreeItem)node.getUserObject()); } } @@ -221,8 +223,8 @@ public final class ColopediaPanel extends FreeColPanel * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - String command = event.getActionCommand(); + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); if (OK.equals(command)) { getGUI().removeFromCanvas(this); } else { diff --git a/src/net/sf/freecol/client/gui/panel/ColopediaTreeCellRenderer.java b/src/net/sf/freecol/client/gui/panel/ColopediaTreeCellRenderer.java index bd3307ef8..2a1e62146 100644 --- a/src/net/sf/freecol/client/gui/panel/ColopediaTreeCellRenderer.java +++ b/src/net/sf/freecol/client/gui/panel/ColopediaTreeCellRenderer.java @@ -43,25 +43,25 @@ public class ColopediaTreeCellRenderer extends DefaultTreeCellRenderer { setBackgroundNonSelectionColor(new Color(0,0,0,1)); } + /** - * Returns the rendered Component - * - * @return the rendered item's Component + * {@inheritDoc} */ @Override - public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, - boolean expanded, boolean leaf, int row, boolean hasFocus) { + public Component getTreeCellRendererComponent(JTree tree, Object value, + boolean selected, boolean expanded, boolean leaf, int row, + boolean hasFocus) { DefaultMutableTreeNode node = (DefaultMutableTreeNode)value; - super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); + super.getTreeCellRendererComponent(tree, value, selected, expanded, + leaf, row, hasFocus); ColopediaTreeItem nodeItem = (ColopediaTreeItem)node.getUserObject(); - if (nodeItem.getIcon() != null) { setIcon(nodeItem.getIcon()); - } else if (expanded) { - setIcon(new ImageIcon(ResourceManager.getImage("image.icon.Colopedia.openSection"))); } else { - setIcon(new ImageIcon(ResourceManager.getImage("image.icon.Colopedia.closedSection"))); + String key = "image.icon.Colopedia." + + ((expanded) ? "open" : "closed") + "Section"; + setIcon(new ImageIcon(ResourceManager.getImage(key))); } return this; } diff --git a/src/net/sf/freecol/client/gui/panel/ColopediaTreeItem.java b/src/net/sf/freecol/client/gui/panel/ColopediaTreeItem.java index 4e56a3515..383ad64ff 100644 --- a/src/net/sf/freecol/client/gui/panel/ColopediaTreeItem.java +++ b/src/net/sf/freecol/client/gui/panel/ColopediaTreeItem.java @@ -28,22 +28,24 @@ import javax.swing.ImageIcon; */ class ColopediaTreeItem { - private final ColopediaDetailPanel panelType; + private final ColopediaDetailPanel detailPanel; private final String id; private final String text; private final ImageIcon icon; + /** * The default constructor for a ColopediaTreeItem that * corresponds to a leaf node. * - * @param panelType a ColopediaDetailPanel value + * @param detailPanel A ColopediaDetailPanel value. * @param id The object identifier. * @param text a String value * @param icon an ImageIcon value */ - ColopediaTreeItem(ColopediaDetailPanel panelType, String id, String text, ImageIcon icon) { - this.panelType = panelType; + ColopediaTreeItem(ColopediaDetailPanel detailPanel, String id, String text, + ImageIcon icon) { + this.detailPanel = detailPanel; this.id = id; this.text = text; this.icon = icon; @@ -55,7 +57,7 @@ class ColopediaTreeItem { * @return the panel type this item belongs to. */ public ColopediaDetailPanel getPanelType() { - return panelType; + return detailPanel; } public String getId() { diff --git a/src/net/sf/freecol/client/gui/panel/ColorCellEditor.java b/src/net/sf/freecol/client/gui/panel/ColorCellEditor.java index b7bb89202..52a2f6b4f 100644 --- a/src/net/sf/freecol/client/gui/panel/ColorCellEditor.java +++ b/src/net/sf/freecol/client/gui/panel/ColorCellEditor.java @@ -32,7 +32,7 @@ import javax.swing.JTable; import javax.swing.table.TableCellEditor; import net.sf.freecol.client.FreeColClient; -import net.sf.freecol.client.gui.GUI; +import net.sf.freecol.client.gui.SwingGUI; /** @@ -96,9 +96,9 @@ public final class ColorCellEditor extends AbstractCellEditor * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - final String command = event.getActionCommand(); - GUI gui = freeColClient.getGUI(); + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); + SwingGUI gui = (SwingGUI)freeColClient.getGUI(); if (null != command) switch (command) { case EDIT: this.colorChooserPanel = gui.showColorChooserPanel(this); diff --git a/src/net/sf/freecol/client/gui/panel/CompactLabourReport.java b/src/net/sf/freecol/client/gui/panel/CompactLabourReport.java index 6634c9452..fb1418195 100644 --- a/src/net/sf/freecol/client/gui/panel/CompactLabourReport.java +++ b/src/net/sf/freecol/client/gui/panel/CompactLabourReport.java @@ -128,11 +128,8 @@ public final class CompactLabourReport extends ReportPanel { } } - return createButton(text, new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { + return createButton(text, (ActionEvent ae) -> { getGUI().showColonyPanel(colony, null); - } }); } @@ -397,32 +394,34 @@ public final class CompactLabourReport extends ReportPanel { int row = 1; JLabel summaryLabel = Utility.localizedLabel("report.labour.summary"); summaryLabel.setBorder(Utility.LEFTCELLBORDER); - reportPanel.add(summaryLabel, "cell " + COLONY_COLUMN + " " + row + " 1 " + unitTotal.getRowCount()); + reportPanel.add(summaryLabel, "cell " + COLONY_COLUMN + " " + row + + " 1 " + unitTotal.getRowCount()); row = addLocationData(unitTotal, null, row); for (Colony colony : getFreeColClient().getMySortedColonies()) { - LabourData.LocationData colonyData = unitData.getDetails().get(colony); + LabourData.LocationData colonyData + = unitData.getDetails().get(colony); if (colonyData != null) { - reportPanel.add(createColonyButton(colony), "cell " + COLONY_COLUMN + " " - + row + " 1 " + colonyData.getRowCount()); + reportPanel.add(createColonyButton(colony), + "cell " + COLONY_COLUMN + " " + row + + " 1 " + colonyData.getRowCount()); row = addLocationData(colonyData, colony, row); } } LabourData.LocationData europe = unitData.getUnitsInEurope(); if (europe.getRowCount() > 0) { - JButton button = createButton(Messages.getName(getMyPlayer().getEurope()), - new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - getGUI().showEuropePanel(); - } - }); - reportPanel.add(button, "cell " + COLONY_COLUMN + " " + row + " 1 " + europe.getRowCount()); + String nam = Messages.getName(getMyPlayer().getEurope()); + JButton button = createButton(nam, + (ActionEvent ae) -> { getGUI().showEuropePanel(); }); + reportPanel.add(button, "cell " + COLONY_COLUMN + " " + row + + " 1 " + europe.getRowCount()); row = addLocationData(europe, null, row); } - row = addNonLinkedLocation(unitData.getUnitsOnLand(), "report.labour.onLand", row); - row = addNonLinkedLocation(unitData.getUnitsAtSea(), "report.labour.atSea", row); + row = addNonLinkedLocation(unitData.getUnitsOnLand(), + "report.labour.onLand", row); + row = addNonLinkedLocation(unitData.getUnitsAtSea(), + "report.labour.atSea", row); reportPanel.add(Utility.localizedLabel("report.labour.canTrain"), "cell 1 " + row + " " + COLUMNS + " 1"); @@ -590,7 +589,8 @@ public final class CompactLabourReport extends ReportPanel { } private JLabel createNonCountedLabel(int otherAmateurs) { - JLabel label = createNumberLabel(otherAmateurs, "report.labour.notCounted.tooltip"); + JLabel label = createNumberLabel(otherAmateurs, + "report.labour.notCounted.tooltip"); label.setForeground(Color.GRAY); return label; } @@ -603,13 +603,11 @@ public final class CompactLabourReport extends ReportPanel { return label; } - private JButton createUnitNameButton(String name, final LabourData.UnitData unitData) { - JButton button = createButton(name, new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { + private JButton createUnitNameButton(String name, + LabourData.UnitData unitData) { + JButton button = createButton(name, (ActionEvent ae) -> { getGUI().showCompactLabourReport(unitData); - } - }); + }); if (!unitData.isSummary()) { button.setIcon(new ImageIcon( @@ -620,18 +618,23 @@ public final class CompactLabourReport extends ReportPanel { } private GoodsType getGoodsType() { - return isSummary() ? null : unitData.getUnitType().getExpertProduction(); + return (isSummary()) ? null + : unitData.getUnitType().getExpertProduction(); } /** - * @return if this is the location summary, grouped by unit type + * Is this an overview/location summary? + * + * @return True if this is the location summary. */ private boolean isOverview() { return unitData == null; } /** - * @return if we are any summary + * Is this a summary? + * + * @return True if this is any sort of summary. */ private boolean isSummary() { return isOverview() || unitData.isSummary(); diff --git a/src/net/sf/freecol/client/gui/panel/ConceptDetailPanel.java b/src/net/sf/freecol/client/gui/panel/ConceptDetailPanel.java index 598da6f62..db500e80d 100644 --- a/src/net/sf/freecol/client/gui/panel/ConceptDetailPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ConceptDetailPanel.java @@ -30,6 +30,7 @@ import java.util.List; import javax.swing.JEditorPane; import javax.swing.JLabel; import javax.swing.JPanel; +import javax.swing.SwingConstants; import javax.swing.tree.DefaultMutableTreeNode; import net.miginfocom.swing.MigLayout; @@ -60,13 +61,8 @@ public class ConceptDetailPanel extends FreeColPanel }; private static final Comparator nodeComparator - = new Comparator() { - @Override - public int compare(DefaultMutableTreeNode node1, DefaultMutableTreeNode node2) { - return ((ColopediaTreeItem) node1.getUserObject()).getText() - .compareTo(((ColopediaTreeItem) node2.getUserObject()).getText()); - } - }; + = Comparator.comparing(tn -> + ((ColopediaTreeItem)tn.getUserObject()).getText()); private ColopediaPanel colopediaPanel; @@ -89,22 +85,22 @@ public class ConceptDetailPanel extends FreeColPanel return Messages.getName(id); } + // Implement ColopediaDetailPanel + /** - * Adds one or several subtrees for all the objects for which this - * ColopediaDetailPanel could build a detail panel to the given - * root node. - * - * @param root a DefaultMutableTreeNode + * {@inheritDoc} */ @Override public void addSubTrees(DefaultMutableTreeNode root) { - DefaultMutableTreeNode node = - new DefaultMutableTreeNode(new ColopediaTreeItem(this, id, getName(), null)); + DefaultMutableTreeNode node + = new DefaultMutableTreeNode(new ColopediaTreeItem(this, id, + getName(), null)); List nodes = new ArrayList<>(); for (String concept : concepts) { String nodeId = "colopedia.concepts." + concept; String nodeName = Messages.getName(nodeId); - nodes.add(new DefaultMutableTreeNode(new ColopediaTreeItem(this, nodeId, nodeName, null))); + nodes.add(new DefaultMutableTreeNode(new ColopediaTreeItem(this, + nodeId, nodeName, null))); } Collections.sort(nodes, nodeComparator); for (DefaultMutableTreeNode n : nodes) { @@ -114,25 +110,20 @@ public class ConceptDetailPanel extends FreeColPanel } /** - * Builds the details panel for the given identifier. - * - * @param id The object identifier to display. - * @param panel the detail panel to build + * {@inheritDoc} */ @Override public void buildDetail(String id, JPanel panel) { - if (ConceptDetailPanel.id.equals(id)) { - return; - } + if (this.id.equals(id)) return; panel.setLayout(new MigLayout("wrap 1, center")); - JLabel header = Utility.localizedLabel(Messages.nameKey(id)); - header.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - FontLibrary.FontSize.SMALL)); + JLabel header = Utility.localizedHeaderLabel(Messages.nameKey(id), + SwingConstants.LEADING, FontLibrary.FontSize.SMALL); panel.add(header, "align center, wrap 20"); - JEditorPane editorPane = new JEditorPane("text/html", Messages.getDescription(id)) { + JEditorPane editorPane = new JEditorPane("text/html", + Messages.getDescription(id)) { @Override public void paintComponent(Graphics g) { @@ -145,11 +136,9 @@ public class ConceptDetailPanel extends FreeColPanel graphics2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); */ - super.paintComponent(graphics2d); } }; - editorPane.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE); editorPane.setFont(panel.getFont()); @@ -158,19 +147,5 @@ public class ConceptDetailPanel extends FreeColPanel editorPane.addHyperlinkListener(colopediaPanel); panel.add(editorPane, "width 95%"); - - } - - // Override Component - - /** - * {@inheritDoc} - */ - @Override - public void removeNotify() { - super.removeNotify(); - - removeAll(); - colopediaPanel = null; } } diff --git a/src/net/sf/freecol/client/gui/panel/ConfirmDeclarationDialog.java b/src/net/sf/freecol/client/gui/panel/ConfirmDeclarationDialog.java index 58ba4c9bf..c974d8429 100644 --- a/src/net/sf/freecol/client/gui/panel/ConfirmDeclarationDialog.java +++ b/src/net/sf/freecol/client/gui/panel/ConfirmDeclarationDialog.java @@ -42,7 +42,7 @@ import javax.swing.JTextField; import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; -import net.sf.freecol.client.gui.GUI; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.client.gui.panel.Flag.Background; import net.sf.freecol.client.gui.panel.Flag.Decoration; import net.sf.freecol.client.gui.panel.Flag.UnionPosition; @@ -271,7 +271,7 @@ public class ConfirmDeclarationDialog extends FreeColDialog> StringTemplate nation = StringTemplate .template("confirmDeclarationDialog.defaultNation") - .addStringTemplate("%nation%", player.getNationName()); + .addStringTemplate("%nation%", player.getNationLabel()); this.nationField = new JTextField(Messages.message(nation), 20); this.label = new JLabel(); @@ -392,8 +392,8 @@ public class ConfirmDeclarationDialog extends FreeColDialog> * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { - ColorButton button = (ColorButton)e.getSource(); + public void actionPerformed(ActionEvent ae) { + ColorButton button = (ColorButton)ae.getSource(); Color color = JColorChooser.showDialog(this, this.label.getText(), button.getBackground()); button.setColor(color); diff --git a/src/net/sf/freecol/client/gui/panel/ConstructionPanel.java b/src/net/sf/freecol/client/gui/panel/ConstructionPanel.java index 3e4924b94..bb27083ca 100644 --- a/src/net/sf/freecol/client/gui/panel/ConstructionPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ConstructionPanel.java @@ -35,13 +35,15 @@ import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.gui.FontLibrary; import net.sf.freecol.client.gui.ImageLibrary; +import net.sf.freecol.client.gui.SwingGUI; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.AbstractGoods; import net.sf.freecol.common.model.BuildableType; import net.sf.freecol.common.model.Colony; import net.sf.freecol.common.model.StringTemplate; import net.sf.freecol.common.model.Turn; -import static net.sf.freecol.common.util.StringUtils.*; + +import static net.sf.freecol.common.util.StringUtils.getBreakingPoint; /** @@ -109,7 +111,7 @@ public class ConstructionPanel extends MigPanel addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { - freeColClient.getGUI().showBuildQueuePanel(colony); + ((SwingGUI)freeColClient.getGUI()).showBuildQueuePanel(colony); } }); } @@ -132,10 +134,10 @@ public class ConstructionPanel extends MigPanel public void update(BuildableType buildable) { removeAll(); - final ImageLibrary lib = freeColClient.getGUI() - .getColonyTileMapViewer().getImageLibrary(); + final ImageLibrary lib = ((SwingGUI)freeColClient.getGUI()) + .getTileImageLibrary(); final Font font = FontLibrary.createFont(FontLibrary.FontType.NORMAL, - FontLibrary.FontSize.SMALLER, lib.getScalingFactor()); + FontLibrary.FontSize.SMALLER, lib.getScaleFactor()); if (buildable == null) { String clickToBuild = Messages.message(getDefaultLabel()); diff --git a/src/net/sf/freecol/client/gui/panel/DeclarationPanel.java b/src/net/sf/freecol/client/gui/panel/DeclarationPanel.java index 386450c57..04d4c1687 100644 --- a/src/net/sf/freecol/client/gui/panel/DeclarationPanel.java +++ b/src/net/sf/freecol/client/gui/panel/DeclarationPanel.java @@ -95,11 +95,8 @@ public final class DeclarationPanel extends FreeColPanel { add(signaturePanel); - Timer t = new Timer(START_DELAY, new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - signaturePanel.startAnimation(); - } + Timer t = new Timer(START_DELAY, (ActionEvent ae) -> { + signaturePanel.startAnimation(); }); t.setRepeats(false); t.start(); @@ -112,19 +109,16 @@ public final class DeclarationPanel extends FreeColPanel { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - final String command = event.getActionCommand(); + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); if (ANIMATION_STOPPED.equals(command)) { - Timer t = new Timer(FINISH_DELAY, new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - getGUI().removeFromCanvas(DeclarationPanel.this); - } + Timer t = new Timer(FINISH_DELAY, (x) -> { + getGUI().removeFromCanvas(DeclarationPanel.this); }); t.setRepeats(false); t.start(); } else { - super.actionPerformed(event); + super.actionPerformed(ae); } } @@ -151,7 +145,8 @@ public final class DeclarationPanel extends FreeColPanel { private final FAFile faFile; - private final ArrayList actionListeners = new ArrayList<>(); + private final ArrayList actionListeners + = new ArrayList<>(); private Point[] points = null; @@ -258,22 +253,19 @@ public final class DeclarationPanel extends FreeColPanel { * @see #addActionListener(ActionListener) */ public void startAnimation() { - ActionListener taskPerformer = new ActionListener() { - @Override - public void actionPerformed(ActionEvent evt) { - if (counter < points.length - 1) { - counter += 20; - if (counter > points.length) { - counter = points.length - 1; - ((Timer) evt.getSource()).stop(); - notifyStopped(); - } - validate(); - repaint(); - } else { - ((Timer)evt.getSource()).stop(); + ActionListener taskPerformer = (ActionEvent ae) -> { + if (counter < points.length - 1) { + counter += 20; + if (counter > points.length) { + counter = points.length - 1; + ((Timer)ae.getSource()).stop(); notifyStopped(); } + validate(); + repaint(); + } else { + ((Timer)ae.getSource()).stop(); + notifyStopped(); } }; new Timer(ANIMATION_DELAY, taskPerformer).start(); diff --git a/src/net/sf/freecol/client/gui/panel/DefaultTransferHandler.java b/src/net/sf/freecol/client/gui/panel/DefaultTransferHandler.java index 7441a93ac..cb1e23196 100644 --- a/src/net/sf/freecol/client/gui/panel/DefaultTransferHandler.java +++ b/src/net/sf/freecol/client/gui/panel/DefaultTransferHandler.java @@ -37,6 +37,7 @@ import java.awt.dnd.DragSourceListener; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; +import java.util.Arrays; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -48,8 +49,8 @@ import javax.swing.JPanel; import javax.swing.TransferHandler; import net.sf.freecol.client.FreeColClient; -import net.sf.freecol.client.gui.GUI; import net.sf.freecol.client.gui.ImageLibrary; +import net.sf.freecol.client.gui.SwingGUI; import net.sf.freecol.common.model.Ability; import net.sf.freecol.common.model.AbstractGoods; import net.sf.freecol.common.model.Goods; @@ -58,6 +59,7 @@ import net.sf.freecol.common.model.GoodsLocation; import net.sf.freecol.common.model.GoodsType; import net.sf.freecol.common.model.Role; import net.sf.freecol.common.model.Unit; +import static net.sf.freecol.common.util.CollectionUtils.*; /** @@ -235,7 +237,7 @@ public final class DefaultTransferHandler extends TransferHandler { private final FreeColClient freeColClient; - private final GUI gui; + private final SwingGUI gui; private final FreeColPanel parentPanel; @@ -249,7 +251,7 @@ public final class DefaultTransferHandler extends TransferHandler { public DefaultTransferHandler(FreeColClient freeColClient, FreeColPanel parentPanel) { this.freeColClient = freeColClient; - this.gui = freeColClient.getGUI(); + this.gui = (SwingGUI)freeColClient.getGUI(); this.parentPanel = parentPanel; } @@ -277,14 +279,8 @@ public final class DefaultTransferHandler extends TransferHandler { */ @Override public boolean canImport(JComponent comp, DataFlavor[] flavor) { - if (comp instanceof JPanel || comp instanceof JLabel) { - for (DataFlavor aFlavor : flavor) { - if (aFlavor.equals(DefaultTransferHandler.flavor)) { - return true; - } - } - } - return false; + return (comp instanceof JPanel || comp instanceof JLabel) + && any(flavor, f -> f.equals(DefaultTransferHandler.flavor)); } /** @@ -393,6 +389,7 @@ public final class DefaultTransferHandler extends TransferHandler { defaultAmount, false); if (amount <= 0) return false; goods.setAmount(amount); + } else if (label.isFullChosen()) { } else if (goods.getAmount() > GoodsContainer.CARGO_SIZE) { goods.setAmount(GoodsContainer.CARGO_SIZE); } diff --git a/src/net/sf/freecol/client/gui/panel/DifficultyDialog.java b/src/net/sf/freecol/client/gui/panel/DifficultyDialog.java index d1423f0e8..6fe88f897 100644 --- a/src/net/sf/freecol/client/gui/panel/DifficultyDialog.java +++ b/src/net/sf/freecol/client/gui/panel/DifficultyDialog.java @@ -20,7 +20,6 @@ package net.sf.freecol.client.gui.panel; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.io.File; import java.util.logging.Logger; @@ -29,13 +28,14 @@ import javax.swing.JFrame; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.filechooser.FileFilter; +import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; import net.sf.freecol.FreeCol; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.common.io.FreeColDirectories; -import net.sf.freecol.common.io.FreeColFileFilter; +import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.Specification; import net.sf.freecol.common.option.OptionGroup; @@ -50,9 +50,8 @@ public final class DifficultyDialog extends OptionsDialog private static final Logger logger = Logger.getLogger(DifficultyDialog.class.getName()); - private static final FileFilter[] filters = { - FreeColFileFilter.freeColXMLFilter - }; + /** File filters array to filter for XML files. */ + private static final FileFilter[] filters = { null }; /** The currently selected subgroup. */ private OptionGroup selected; @@ -126,11 +125,8 @@ public final class DifficultyDialog extends OptionsDialog * @param button The JButton to add the action to. */ private void addResetAction(JButton button) { - button.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - getOptionUI().reset(); - } + button.addActionListener((ActionEvent ae) -> { + getOptionUI().reset(); }); } @@ -140,16 +136,14 @@ public final class DifficultyDialog extends OptionsDialog * @param button The JButton to add the action to. */ private void addLoadAction(JButton button) { - button.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - File dir = FreeColDirectories.getOptionsDirectory(); - File file = getGUI().showLoadDialog(dir, filters); - if (file != null && load(file)) { - invalidate(); - validate(); - repaint(); - } + initializeFilters(); + button.addActionListener((ActionEvent ae) -> { + File dir = FreeColDirectories.getOptionsDirectory(); + File file = getGUI().showLoadDialog(dir, filters); + if (file != null && load(file)) { + invalidate(); + validate(); + repaint(); } }); } @@ -160,20 +154,30 @@ public final class DifficultyDialog extends OptionsDialog * @param button The JButton to add the action to. */ private void addSaveAction(JButton button) { - button.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - File dir = FreeColDirectories.getOptionsDirectory(); - File file = getGUI().showSaveDialog(dir, filters, - getDefaultFileName(), ".xml"); - if (file != null) { - getOptionUI().updateOption(); - save(file); - } + initializeFilters(); + button.addActionListener((ActionEvent ae) -> { + File dir = FreeColDirectories.getOptionsDirectory(); + File file = getGUI().showSaveDialog(dir, filters, + getDefaultFileName()); + if (file != null) { + getOptionUI().updateOption(); + save(file); } }); } + /** + * Initialize the XML file filter. + */ + private void initializeFilters() { + synchronized (filters) { + if (filters[0] == null) { + String desc = Messages.message("filter.xml"); + filters[0] = new FileNameExtensionFilter(desc, "xml"); + } + } + } + // Implement TreeSelectionListener diff --git a/src/net/sf/freecol/client/gui/panel/DragListener.java b/src/net/sf/freecol/client/gui/panel/DragListener.java index d9ead3167..084292395 100644 --- a/src/net/sf/freecol/client/gui/panel/DragListener.java +++ b/src/net/sf/freecol/client/gui/panel/DragListener.java @@ -29,7 +29,7 @@ import javax.swing.JPopupMenu; import javax.swing.TransferHandler; import net.sf.freecol.client.FreeColClient; -import net.sf.freecol.client.gui.GUI; +import net.sf.freecol.client.gui.SwingGUI; import net.sf.freecol.common.model.Unit; @@ -89,7 +89,7 @@ public final class DragListener extends MouseAdapter { menu.remove(lastIdx); if (menu.getComponentCount() <= 0) return; - final GUI gui = freeColClient.getGUI(); + final SwingGUI gui = (SwingGUI)freeColClient.getGUI(); boolean windows = System.getProperty("os.name").startsWith("Windows"); boolean small = Toolkit.getDefaultToolkit() .getScreenSize().getHeight() < 768; @@ -112,6 +112,8 @@ public final class DragListener extends MouseAdapter { AbstractGoodsLabel label = (AbstractGoodsLabel)comp; if (e.isShiftDown()) { label.setPartialChosen(true); + } else if (e.isControlDown()) { + label.setFullChosen(true); } else { label.setPartialChosen(false); label.setDefaultAmount(); diff --git a/src/net/sf/freecol/client/gui/panel/DumpCargoDialog.java b/src/net/sf/freecol/client/gui/panel/DumpCargoDialog.java index 64d87cd64..af9b45f4a 100644 --- a/src/net/sf/freecol/client/gui/panel/DumpCargoDialog.java +++ b/src/net/sf/freecol/client/gui/panel/DumpCargoDialog.java @@ -30,6 +30,7 @@ import javax.swing.JFrame; import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.Goods; import net.sf.freecol.common.model.Unit; diff --git a/src/net/sf/freecol/client/gui/panel/EditSettlementDialog.java b/src/net/sf/freecol/client/gui/panel/EditSettlementDialog.java index 6def7e01b..223c717c3 100644 --- a/src/net/sf/freecol/client/gui/panel/EditSettlementDialog.java +++ b/src/net/sf/freecol/client/gui/panel/EditSettlementDialog.java @@ -37,7 +37,8 @@ import javax.swing.SpinnerNumberModel; import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; -import net.sf.freecol.client.gui.GUI; +import net.sf.freecol.client.gui.ChoiceItem; +import net.sf.freecol.client.gui.SwingGUI; import net.sf.freecol.client.gui.plaf.FreeColComboBoxRenderer; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.IndianNationType; @@ -49,6 +50,7 @@ import net.sf.freecol.common.model.Specification; import net.sf.freecol.common.model.Tile; import net.sf.freecol.common.model.Unit; import net.sf.freecol.common.model.UnitType; +import static net.sf.freecol.common.util.CollectionUtils.*; import net.sf.freecol.common.util.RandomChoice; import net.sf.freecol.server.model.ServerUnit; @@ -151,11 +153,9 @@ public final class EditSettlementDialog extends FreeColDialog } private Player getOwnerPlayer() { - Nation n = getOwnerNation(); - for (Player player : settlement.getGame().getLivePlayers(null)) { - if (player.getNationId().equals(n.getId())) return player; - } - return null; + final Nation n = getOwnerNation(); + return find(settlement.getGame().getLivePlayers(null), + p -> p.getNationId().equals(n.getId())); } private SettlementType getSettlementType() { @@ -205,7 +205,7 @@ public final class EditSettlementDialog extends FreeColDialog @Override public IndianSettlement getResponse() { final Specification spec = freeColClient.getGame().getSpecification(); - final GUI gui = freeColClient.getGUI(); + final SwingGUI gui = getGUI(); IndianSettlement ret = null; Set tiles = settlement.getOwnedTiles(); Object value = getValue(); @@ -263,8 +263,8 @@ public final class EditSettlementDialog extends FreeColDialog ret = settlement; } else if (options.get(1).equals(value)) { - if (!getGUI().confirm("editSettlementDialog.removeSettlement.text", - "ok", "cancel")) { + if (!gui.confirm("editSettlementDialog.removeSettlement.text", + "ok", "cancel")) { return settlement; } // Dispose of units and settlement on tile diff --git a/src/net/sf/freecol/client/gui/panel/EmigrationDialog.java b/src/net/sf/freecol/client/gui/panel/EmigrationDialog.java index 8355357f0..edf5f227b 100644 --- a/src/net/sf/freecol/client/gui/panel/EmigrationDialog.java +++ b/src/net/sf/freecol/client/gui/panel/EmigrationDialog.java @@ -29,6 +29,7 @@ import javax.swing.JTextArea; import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.client.gui.ImageLibrary; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.Europe; diff --git a/src/net/sf/freecol/client/gui/panel/EndTurnDialog.java b/src/net/sf/freecol/client/gui/panel/EndTurnDialog.java index 6b17190cb..f3f0a6a16 100644 --- a/src/net/sf/freecol/client/gui/panel/EndTurnDialog.java +++ b/src/net/sf/freecol/client/gui/panel/EndTurnDialog.java @@ -165,7 +165,7 @@ public final class EndTurnDialog extends FreeColConfirmDialog { "select"); this.unitList.getActionMap().put("select", new AbstractAction() { @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { selectUnit(); } }); @@ -173,7 +173,7 @@ public final class EndTurnDialog extends FreeColConfirmDialog { "quit"); this.unitList.getActionMap().put("quit", new AbstractAction() { @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { EndTurnDialog.this.setValue(options.get(1)); } }); diff --git a/src/net/sf/freecol/client/gui/panel/ErrorPanel.java b/src/net/sf/freecol/client/gui/panel/ErrorPanel.java index 05d809799..939a478c6 100644 --- a/src/net/sf/freecol/client/gui/panel/ErrorPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ErrorPanel.java @@ -105,12 +105,12 @@ public final class ErrorPanel extends FreeColPanel { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - final String command = event.getActionCommand(); + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); if (SHOW.equals(command)) { getGUI().showLogFilePanel(); } else { - super.actionPerformed(event); + super.actionPerformed(ae); } } } diff --git a/src/net/sf/freecol/client/gui/panel/EuropePanel.java b/src/net/sf/freecol/client/gui/panel/EuropePanel.java index 849b49c1e..b38c97d3f 100644 --- a/src/net/sf/freecol/client/gui/panel/EuropePanel.java +++ b/src/net/sf/freecol/client/gui/panel/EuropePanel.java @@ -49,8 +49,6 @@ import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.ClientOptions; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.control.InGameController.BoycottAction; -import net.sf.freecol.client.gui.Canvas; -import net.sf.freecol.client.gui.GUI; import net.sf.freecol.client.gui.ImageLibrary; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.Europe; @@ -183,7 +181,7 @@ public final class EuropePanel extends PortPanel { && unit.hasSpaceLeft()) { StringTemplate locName = destination .getLocationLabelFor(unit.getOwner()); - if (!getGUI().confirm(true, null, StringTemplate + if (!getGUI().confirm(null, StringTemplate .template("europePanel.leaveColonists") .addStringTemplate("%newWorld%", locName), unit, "ok", "cancel")) return null; @@ -568,9 +566,9 @@ public final class EuropePanel extends PortPanel { * The constructor for a EuropePanel. * * @param freeColClient The FreeColClient for the game. - * @param canvas The enclosing Canvas. + * @param header True when a header should be added. */ - public EuropePanel(FreeColClient freeColClient, Canvas canvas) { + public EuropePanel(FreeColClient freeColClient, boolean header) { super(freeColClient, new MigLayout("wrap 3, fill", "[30%:][30%:][15%:]")); @@ -678,7 +676,7 @@ public final class EuropePanel extends PortPanel { initialize(europe); - if (canvas.getHeight() > 780) { + if(header) { add(Utility.localizedHeader(europe.getNameKey(), false), "span, top, center"); } @@ -699,7 +697,7 @@ public final class EuropePanel extends PortPanel { setSelectedUnitLabel(null); - float scale = getImageLibrary().getScalingFactor(); + float scale = getImageLibrary().getScaleFactor(); getGUI().restoreSavedSize(this, 200 + (int)(scale*850), 200 + (int)(scale*525)); } @@ -839,8 +837,8 @@ public final class EuropePanel extends PortPanel { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - final String command = event.getActionCommand(); + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); EuropeAction act = EuropeAction.valueOf(command); switch (act) { case EXIT: @@ -862,7 +860,7 @@ public final class EuropePanel extends PortPanel { unloadAction(); break; default: - super.actionPerformed(event); + super.actionPerformed(ae); break; } } diff --git a/src/net/sf/freecol/client/gui/panel/EventPanel.java b/src/net/sf/freecol/client/gui/panel/EventPanel.java index b853aa6c2..911c2f339 100644 --- a/src/net/sf/freecol/client/gui/panel/EventPanel.java +++ b/src/net/sf/freecol/client/gui/panel/EventPanel.java @@ -52,8 +52,8 @@ public final class EventPanel extends FreeColPanel { super(freeColClient, new MigLayout("wrap 1", "[center]", "[]20")); JLabel headerLabel = new JLabel(header); - headerLabel.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - FontLibrary.FontSize.MEDIUM)); + headerLabel.setFont(FontLibrary.createCompatibleFont(header, + FontLibrary.FontType.HEADER, FontLibrary.FontSize.MEDIUM)); JLabel imageLabel = new JLabel(new ImageIcon(ResourceManager.getImage(key))); diff --git a/src/net/sf/freecol/client/gui/panel/FatherDetailPanel.java b/src/net/sf/freecol/client/gui/panel/FatherDetailPanel.java index a03967eb2..f698c9758 100644 --- a/src/net/sf/freecol/client/gui/panel/FatherDetailPanel.java +++ b/src/net/sf/freecol/client/gui/panel/FatherDetailPanel.java @@ -29,6 +29,7 @@ import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextArea; +import javax.swing.SwingConstants; import javax.swing.tree.DefaultMutableTreeNode; import net.miginfocom.swing.MigLayout; @@ -40,6 +41,7 @@ import net.sf.freecol.client.gui.action.ColopediaAction.PanelType; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.FoundingFather; import net.sf.freecol.common.model.FoundingFather.FoundingFatherType; +import net.sf.freecol.common.model.Specification; import net.sf.freecol.common.model.StringTemplate; import net.sf.freecol.common.model.Turn; import net.sf.freecol.common.resources.ResourceManager; @@ -64,33 +66,33 @@ public class FatherDetailPanel } + // Implelement ColopediaDetailPanel + /** - * Adds one or several subtrees for all the objects for which this - * ColopediaDetailPanel could build a detail panel to the given - * root node. - * - * @param root a DefaultMutableTreeNode + * {@inheritDoc} */ @Override public void addSubTrees(DefaultMutableTreeNode root) { - DefaultMutableTreeNode parent = - new DefaultMutableTreeNode(new ColopediaTreeItem(this, getId(), getName(), null)); + final Specification spec = getSpecification(); + DefaultMutableTreeNode parent + = new DefaultMutableTreeNode(new ColopediaTreeItem(this, getId(), + getName(), null)); - EnumMap> fathersByType = - new EnumMap<>(FoundingFatherType.class); + EnumMap> fathersByType + = new EnumMap<>(FoundingFatherType.class); for (FoundingFatherType fatherType : FoundingFatherType.values()) { fathersByType.put(fatherType, new ArrayList()); } - for (FoundingFather foundingFather : getSpecification().getFoundingFathers()) { + for (FoundingFather foundingFather : spec.getFoundingFathers()) { fathersByType.get(foundingFather.getType()).add(foundingFather); } ImageIcon icon = new ImageIcon(ImageLibrary.getMiscImage(ImageLibrary.BELLS, ImageLibrary.ICON_SIZE)); for (FoundingFatherType fatherType : FoundingFatherType.values()) { String id = FoundingFather.getTypeKey(fatherType); String typeName = Messages.message(id); - DefaultMutableTreeNode node = - new DefaultMutableTreeNode(new ColopediaTreeItem(this, id, typeName, null)); - + DefaultMutableTreeNode node + = new DefaultMutableTreeNode(new ColopediaTreeItem(this, id, + typeName, null)); parent.add(node); for (FoundingFather father : fathersByType.get(fatherType)) { node.add(buildItem(father, icon)); @@ -100,11 +102,7 @@ public class FatherDetailPanel } /** - * Builds the details panel for the FoundingFather with the given - * identifier. - * - * @param id The object identifier. - * @param panel the detail panel to build + * {@inheritDoc} */ @Override public void buildDetail(String id, JPanel panel) { @@ -114,15 +112,16 @@ public class FatherDetailPanel } catch (IllegalArgumentException e) { // this is not a founding father panel.setLayout(new MigLayout("wrap 1, align center", "align center")); - JLabel header = Utility.localizedLabel(Messages.nameKey(id)); - header.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - FontLibrary.FontSize.SMALL)); - panel.add(header, "align center, wrap 20"); if (getId().equals(id)) { + JLabel header = Utility.localizedHeaderLabel(Messages.nameKey(id), + SwingConstants.LEADING, FontLibrary.FontSize.SMALL); + panel.add(header, "align center, wrap 20"); panel.add(Utility.localizedTextArea("colopedia.foundingFather.description", 40)); } else { + JLabel header = Utility.localizedHeaderLabel(Messages.message(id), + SwingConstants.LEADING, FontLibrary.FontSize.SMALL); + panel.add(header, "align center, wrap 20"); Image image = ResourceManager.getImage("image.flavor." + id); - header.setText(Messages.message(id)); panel.add(new JLabel(new ImageIcon(image))); } } @@ -139,9 +138,10 @@ public class FatherDetailPanel String name = Messages.getName(father); String type = Messages.message(father.getTypeKey()); - JLabel header = new JLabel(name + " (" + type + ")"); - header.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - FontLibrary.FontSize.SMALL)); + String text = name + " (" + type + ")"; + JLabel header = new JLabel(text); + header.setFont(FontLibrary.createCompatibleFont(text, + FontLibrary.FontType.HEADER, FontLibrary.FontSize.SMALL)); Image image = ImageLibrary.getFoundingFatherImage(father, false); JLabel label = new JLabel(new ImageIcon(image)); diff --git a/src/net/sf/freecol/client/gui/panel/FindSettlementPanel.java b/src/net/sf/freecol/client/gui/panel/FindSettlementPanel.java index 30a3d3aa2..ec9a09edf 100644 --- a/src/net/sf/freecol/client/gui/panel/FindSettlementPanel.java +++ b/src/net/sf/freecol/client/gui/panel/FindSettlementPanel.java @@ -76,7 +76,7 @@ public final class FindSettlementPanel extends FreeColPanel .addName("%name%", value.getName()) .addName("%capital%", ((value.isCapital()) ? "*" : "")) .addStringTemplate("%nation%", - value.getOwner().getNationName()); + value.getOwner().getNationLabel()); label.setText(Messages.message(template)); label.setIcon(new ImageIcon(ImageLibrary.getSettlementImage(value, new Dimension(64, -1)))); @@ -111,7 +111,7 @@ public final class FindSettlementPanel extends FreeColPanel this.settlementList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); Action selectAction = new AbstractAction() { @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { selectSettlement(); } }; @@ -120,7 +120,7 @@ public final class FindSettlementPanel extends FreeColPanel this.settlementList.getActionMap().put("select", selectAction); Action quitAction = new AbstractAction() { @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().removeFromCanvas(FindSettlementPanel.this); } }; diff --git a/src/net/sf/freecol/client/gui/panel/FirstContactDialog.java b/src/net/sf/freecol/client/gui/panel/FirstContactDialog.java index 08bd079a6..362d51e23 100644 --- a/src/net/sf/freecol/client/gui/panel/FirstContactDialog.java +++ b/src/net/sf/freecol/client/gui/panel/FirstContactDialog.java @@ -23,6 +23,7 @@ import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextArea; +import javax.swing.SwingConstants; import net.miginfocom.swing.MigLayout; @@ -64,18 +65,19 @@ public class FirstContactDialog extends FreeColConfirmDialog { MigPanel panel = new MigPanel(new MigLayout("wrap 1", "[center]", "[]20")); + panel.setOpaque(false); - String headerKey = BASE_KEY + other.getNationNameKey(); - String imageKey = IMAGE_BASE_KEY + other.getNationNameKey(); + String headerKey = BASE_KEY + other.getNation().getSuffix(); + String imageKey = IMAGE_BASE_KEY + other.getNationResourceKey(); if (!Messages.containsKey(headerKey)) { headerKey = BASE_KEY + NATIVES_KEY; imageKey = IMAGE_BASE_KEY + NATIVES_KEY; } - JLabel header = Utility.localizedLabel(headerKey); - header.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - FontLibrary.FontSize.MEDIUM)); + JLabel header = Utility.localizedHeaderLabel(headerKey, + SwingConstants.LEADING, FontLibrary.FontSize.MEDIUM); JLabel image = new JLabel(new ImageIcon(ResourceManager.getImage(imageKey))); + image.setOpaque(false); JTextArea tutorial = null; if (!player.hasContactedIndians() && freeColClient.tutorialMode()) { @@ -89,7 +91,7 @@ public class FirstContactDialog extends FreeColConfirmDialog { .getSettlementTypeKey(true); JTextArea text = Utility.localizedTextArea(StringTemplate .template(messageId) - .addStringTemplate("%nation%", other.getNationName()) + .addStringTemplate("%nation%", other.getNationLabel()) .addName("%camps%", Integer.toString(settlementCount)) .add("%settlementType%", type)); diff --git a/src/net/sf/freecol/client/gui/panel/FreeColChoiceDialog.java b/src/net/sf/freecol/client/gui/panel/FreeColChoiceDialog.java index ce334ccea..565c639c7 100644 --- a/src/net/sf/freecol/client/gui/panel/FreeColChoiceDialog.java +++ b/src/net/sf/freecol/client/gui/panel/FreeColChoiceDialog.java @@ -25,6 +25,7 @@ import javax.swing.ImageIcon; import javax.swing.JFrame; import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.common.i18n.Messages; diff --git a/src/net/sf/freecol/client/gui/panel/FreeColConfirmDialog.java b/src/net/sf/freecol/client/gui/panel/FreeColConfirmDialog.java index 103fc80e9..1a4152de3 100644 --- a/src/net/sf/freecol/client/gui/panel/FreeColConfirmDialog.java +++ b/src/net/sf/freecol/client/gui/panel/FreeColConfirmDialog.java @@ -25,6 +25,7 @@ import javax.swing.ImageIcon; import javax.swing.JFrame; import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.common.i18n.Messages; diff --git a/src/net/sf/freecol/client/gui/panel/FreeColDialog.java b/src/net/sf/freecol/client/gui/panel/FreeColDialog.java index d75bc8fbe..c4df42e99 100644 --- a/src/net/sf/freecol/client/gui/panel/FreeColDialog.java +++ b/src/net/sf/freecol/client/gui/panel/FreeColDialog.java @@ -37,17 +37,21 @@ import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.ImageIcon; +import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; +import javax.swing.JLabel; import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTextArea; import javax.swing.SwingUtilities; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.control.InGameController; -import net.sf.freecol.client.gui.GUI; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.client.gui.ImageLibrary; +import net.sf.freecol.client.gui.SwingGUI; import net.sf.freecol.client.gui.plaf.FreeColOptionPaneUI; -import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.Game; import net.sf.freecol.common.model.Player; import net.sf.freecol.common.model.Specification; @@ -141,11 +145,7 @@ public class FreeColDialog extends JDialog implements PropertyChangeListener * @return An array of enabled options. */ private Object[] selectOptions() { - List> actual = new ArrayList<>(); - for (ChoiceItem c : this.options) { - if (c.isEnabled()) actual.add(c); - } - return actual.toArray(); + return this.options.stream().filter(ChoiceItem::isEnabled).toArray(); } /** @@ -173,11 +173,14 @@ public class FreeColDialog extends JDialog implements PropertyChangeListener int def = selectDefault(options); ChoiceItem ci = (def >= 0) ? options.get(def) : null; if (obj instanceof StringTemplate) { - obj = Messages.message((StringTemplate)obj); + obj = Utility.localizedTextArea((StringTemplate)obj); + } else if(obj instanceof String) { + obj = Utility.getDefaultTextArea((String)obj); } this.pane = new JOptionPane(obj, paneType, JOptionPane.DEFAULT_OPTION, icon, selectOptions(), ci); this.pane.setBorder(Utility.DIALOG_BORDER); + this.pane.setOpaque(false); this.pane.setName("FreeColDialog"); this.pane.setValue(JOptionPane.UNINITIALIZED_VALUE); this.pane.addPropertyChangeListener(this); @@ -190,6 +193,8 @@ public class FreeColDialog extends JDialog implements PropertyChangeListener setResizable(false); setUndecorated(true); setModal(modal); + + setSubcomponentsNotOpaque(this.pane); try { // Layout failures might not get logged. pack(); } catch (Exception e) { @@ -257,6 +262,36 @@ public class FreeColDialog extends JDialog implements PropertyChangeListener }); } + public static void setSubcomponentsNotOpaque(JComponent j) { + synchronized(j.getTreeLock()) { + iterateOverOpaqueLayersComponents(j); + } + } + + private static void iterateOverOpaqueLayersComponents(JComponent j){ + if (j instanceof JPanel || j instanceof JOptionPane) { + Component[] componentes = j.getComponents(); + for (Component componente : componentes) { + setOpaqueLayerRecursive(componente); + } + } + } + + private static void setOpaqueLayerRecursive(Component opaqueComponent) { + if (opaqueComponent instanceof JTextArea || + opaqueComponent instanceof JLabel) { + if (opaqueComponent.isOpaque()) { + ((JComponent) opaqueComponent).setOpaque(false); + } + } else if (opaqueComponent instanceof JPanel) { + JComponent panel = (JComponent)opaqueComponent; + if (panel.isOpaque()) { + panel.setOpaque(false); + } + iterateOverOpaqueLayersComponents(panel); + } + } + /** * Get the FreeColClient. * @@ -271,8 +306,8 @@ public class FreeColDialog extends JDialog implements PropertyChangeListener * * @return The GUI. */ - protected GUI getGUI() { - return freeColClient.getGUI(); + protected SwingGUI getGUI() { + return (SwingGUI)freeColClient.getGUI(); } /** @@ -428,7 +463,7 @@ public class FreeColDialog extends JDialog implements PropertyChangeListener public void removeNotify() { super.removeNotify(); - freeColClient.getGUI().dialogRemove(FreeColDialog.this); + getGUI().dialogRemove(FreeColDialog.this); removeAll(); if (this.pane != null) { diff --git a/src/net/sf/freecol/client/gui/panel/FreeColInputDialog.java b/src/net/sf/freecol/client/gui/panel/FreeColInputDialog.java index 3083e03e9..fcc6460d4 100644 --- a/src/net/sf/freecol/client/gui/panel/FreeColInputDialog.java +++ b/src/net/sf/freecol/client/gui/panel/FreeColInputDialog.java @@ -19,14 +19,14 @@ package net.sf.freecol.client.gui.panel; -import javax.swing.ImageIcon; - import java.util.List; import java.util.logging.Logger; +import javax.swing.ImageIcon; import javax.swing.JFrame; import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.common.i18n.Messages; diff --git a/src/net/sf/freecol/client/gui/panel/FreeColPanel.java b/src/net/sf/freecol/client/gui/panel/FreeColPanel.java index 16d04e250..faa7e0f3a 100644 --- a/src/net/sf/freecol/client/gui/panel/FreeColPanel.java +++ b/src/net/sf/freecol/client/gui/panel/FreeColPanel.java @@ -39,8 +39,8 @@ import javax.swing.KeyStroke; import net.sf.freecol.client.ClientOptions; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.control.InGameController; -import net.sf.freecol.client.gui.GUI; import net.sf.freecol.client.gui.ImageLibrary; +import net.sf.freecol.client.gui.SwingGUI; import net.sf.freecol.common.model.Colony; import net.sf.freecol.common.model.Game; import net.sf.freecol.common.model.Player; @@ -128,8 +128,8 @@ public abstract class FreeColPanel extends MigPanel implements ActionListener { * * @return The current GUI. */ - protected GUI getGUI() { - return freeColClient.getGUI(); + protected SwingGUI getGUI() { + return (SwingGUI)freeColClient.getGUI(); } /** @@ -220,6 +220,7 @@ public abstract class FreeColPanel extends MigPanel implements ActionListener { public void propertyChange(PropertyChangeEvent e) { if ("closing".equals(e.getPropertyName())) { runnable.run(); + // Lambda unsuitable due to use of "this" FreeColPanel.this.removePropertyChangeListener(this); } } @@ -232,8 +233,8 @@ public abstract class FreeColPanel extends MigPanel implements ActionListener { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - final String command = event.getActionCommand(); + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); if (OK.equals(command)) { getGUI().removeFromCanvas(this); } else { diff --git a/src/net/sf/freecol/client/gui/panel/FreeColStringInputDialog.java b/src/net/sf/freecol/client/gui/panel/FreeColStringInputDialog.java index 53f6362e1..a47a5dd47 100644 --- a/src/net/sf/freecol/client/gui/panel/FreeColStringInputDialog.java +++ b/src/net/sf/freecol/client/gui/panel/FreeColStringInputDialog.java @@ -54,12 +54,14 @@ public final class FreeColStringInputDialog extends FreeColInputDialog { super(freeColClient, frame); textField = new JTextField(defaultValue); + textField.setOpaque(false); JPanel panel = new JPanel(new BorderLayout()) { @Override public void requestFocus() { textField.requestFocus(); } }; + panel.setOpaque(false); panel.add(Utility.getDefaultTextArea(text)); panel.add(textField, BorderLayout.SOUTH); diff --git a/src/net/sf/freecol/client/gui/panel/GoodsDetailPanel.java b/src/net/sf/freecol/client/gui/panel/GoodsDetailPanel.java index 2cd3ce340..4036e8098 100644 --- a/src/net/sf/freecol/client/gui/panel/GoodsDetailPanel.java +++ b/src/net/sf/freecol/client/gui/panel/GoodsDetailPanel.java @@ -63,12 +63,10 @@ public class GoodsDetailPanel extends ColopediaGameObjectTypePanel { } + // Implement ColopediaDetailPanel + /** - * Adds one or several subtrees for all the objects for which this - * ColopediaDetailPanel could build a detail panel to the given - * root node. - * - * @param root a DefaultMutableTreeNode + * {@inheritDoc} */ @Override public void addSubTrees(DefaultMutableTreeNode root) { @@ -76,23 +74,16 @@ public class GoodsDetailPanel extends ColopediaGameObjectTypePanel { } /** - * Builds the details panel for the GoodsType with the given identifier. - * - * @param id The object identifier. - * @param panel the detail panel to build + * {@inheritDoc} */ @Override public void buildDetail(String id, JPanel panel) { - if (getId().equals(id)) { - return; - } + if (getId().equals(id)) return; GoodsType type = getSpecification().getGoodsType(id); panel.setLayout(new MigLayout("wrap 4", "[]20[]")); - JLabel name = Utility.localizedLabel(type); - name.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - FontLibrary.FontSize.SMALL)); + JLabel name = Utility.localizedHeaderLabel(type, FontLibrary.FontSize.SMALL); panel.add(name, "span, align center, wrap 40"); if (type.isFarmed()) { @@ -217,17 +208,16 @@ public class GoodsDetailPanel extends ColopediaGameObjectTypePanel { } - private boolean filterBuildables(List input, List output, GoodsType type) { + private boolean filterBuildables(List input, + List output, GoodsType type) { boolean result = true; - for (T buildableType : input) { - if (buildableType.needsGoodsToBuild()) { - AbstractGoods goods = AbstractGoods.findByType(type, - buildableType.getRequiredGoods()); - if (goods != null) { - output.add(buildableType); - continue; + for (T bt : input) { + if (bt.needsGoodsToBuild()) { + if (AbstractGoods.containsType(type, bt.getRequiredGoods())) { + output.add(bt); + } else { + result = false; } - result = false; } } return result; diff --git a/src/net/sf/freecol/client/gui/panel/IndianSettlementPanel.java b/src/net/sf/freecol/client/gui/panel/IndianSettlementPanel.java index afd4b5c58..07b7f7009 100644 --- a/src/net/sf/freecol/client/gui/panel/IndianSettlementPanel.java +++ b/src/net/sf/freecol/client/gui/panel/IndianSettlementPanel.java @@ -71,7 +71,7 @@ public final class IndianSettlementPanel extends FreeColPanel { .template(settlement.isCapital() ? "indianSettlementPanel.indianCapital" : "indianSettlementPanel.indianSettlement") - .addStringTemplate("%nation%", indian.getNationName())); + .addStringTemplate("%nation%", indian.getNationLabel())); Tension tension = settlement.getAlarm(player); if (tension != null) text += " (" + Messages.getName(tension) + ")"; if (settlement.worthScouting(player)) { diff --git a/src/net/sf/freecol/client/gui/panel/InfoPanel.java b/src/net/sf/freecol/client/gui/panel/InfoPanel.java index a30637022..46b804f74 100644 --- a/src/net/sf/freecol/client/gui/panel/InfoPanel.java +++ b/src/net/sf/freecol/client/gui/panel/InfoPanel.java @@ -44,21 +44,20 @@ import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.gui.FontLibrary; import net.sf.freecol.client.gui.GUI; import net.sf.freecol.client.gui.ImageLibrary; -import net.sf.freecol.client.gui.MapViewer; import net.sf.freecol.client.gui.action.EndTurnAction; import net.sf.freecol.client.gui.panel.MapEditorTransformPanel.MapTransform; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.AbstractGoods; import net.sf.freecol.common.model.Goods; import net.sf.freecol.common.model.GoodsContainer; -import net.sf.freecol.common.model.Modifier; +import net.sf.freecol.common.model.GoodsType; import net.sf.freecol.common.model.Player; import net.sf.freecol.common.model.StringTemplate; import net.sf.freecol.common.model.Tile; -import net.sf.freecol.common.model.TileImprovement; import net.sf.freecol.common.model.Unit; import net.sf.freecol.common.resources.ResourceManager; -import static net.sf.freecol.common.util.StringUtils.*; + +import static net.sf.freecol.common.util.StringUtils.splitText; /** @@ -88,10 +87,9 @@ public final class InfoPanel extends FreeColPanel { public EndTurnPanel() { super(new MigLayout("wrap 1, center", "[center]", "")); - final ImageLibrary lib = getGUI().getColonyTileMapViewer() - .getImageLibrary(); + final ImageLibrary lib = getGUI().getTileImageLibrary(); Font font = FontLibrary.createFont(FontLibrary.FontType.NORMAL, - FontLibrary.FontSize.TINY, lib.getScalingFactor()); + FontLibrary.FontSize.TINY, lib.getScaleFactor()); String labelString = Messages.message("infoPanel.endTurn"); for (String s : splitText(labelString, " /", @@ -144,18 +142,12 @@ public final class InfoPanel extends FreeColPanel { removeAll(); - final MapViewer mapViewer = getGUI().getColonyTileMapViewer(); - final ImageLibrary lib = mapViewer.getImageLibrary(); + final ImageLibrary lib = getGUI().getTileImageLibrary(); final Font font = FontLibrary.createFont(FontLibrary.FontType.NORMAL, - FontLibrary.FontSize.TINY, lib.getScalingFactor()); - if (tile != null && tile.getType() != null) { + FontLibrary.FontSize.TINY, lib.getScaleFactor()); + if (tile != null) { final int width = getWidth() - SLACK; - List production = tile.getType() - .getPossibleProduction(true); - if (production.size() > PRODUCTION) { - production = production.subList(0, PRODUCTION); - } - BufferedImage image = mapViewer.createTileImageWithBeachBorderAndItems(tile); + BufferedImage image = getGUI().createTileImageWithBeachBorderAndItems(tile); if (tile.isExplored()) { String text = Messages.message(tile.getLabel()); for (String s : splitText(text, " /", @@ -168,8 +160,10 @@ public final class InfoPanel extends FreeColPanel { add(new JLabel(new ImageIcon(image)), "spany"); final Player owner = tile.getOwner(); - if (owner != null) { - StringTemplate t = owner.getNationName(); + if (owner == null) { + add(new JLabel(), "span " + PRODUCTION); + } else { + StringTemplate t = owner.getNationLabel(); add(Utility.localizedLabel(t), "span " + PRODUCTION); } @@ -187,16 +181,21 @@ public final class InfoPanel extends FreeColPanel { List produce = tile.getType() .getPossibleProduction(true); - Collections.sort(produce, - AbstractGoods.abstractGoodsComparator); - for (AbstractGoods goods : produce) { - JLabel goodsLabel = new JLabel( - String.valueOf(tile.getPotentialProduction(goods.getType(), null)), - new ImageIcon(lib.getSmallIconImage(goods.getType())), - JLabel.RIGHT); - goodsLabel.setToolTipText(Messages.getName(goods.getType())); - goodsLabel.setFont(font); - add(goodsLabel); + if (produce.isEmpty()) { + add(new JLabel(), "span " + PRODUCTION); + } else { + Collections.sort(produce, + AbstractGoods.abstractGoodsComparator); + for (AbstractGoods ag : produce) { + GoodsType type = ag.getType(); + int n = tile.getPotentialProduction(type, null); + JLabel label = new JLabel(String.valueOf(n), + new ImageIcon(lib.getSmallIconImage(type)), + JLabel.RIGHT); + label.setToolTipText(Messages.getName(type)); + label.setFont(font); + add(label); + } } } else { add(Utility.localizedLabel("unexplored"), @@ -234,7 +233,7 @@ public final class InfoPanel extends FreeColPanel { * Create a new unit information panel. */ public UnitInfoPanel() { - super(new MigLayout("wrap 6, fill, gap 0 0", "", "")); + super(new MigLayout("wrap 5, fill, gap 0 0", "", "")); setSize(260, 130); setOpaque(false); @@ -267,9 +266,17 @@ public final class InfoPanel extends FreeColPanel { GoodsContainer gc = unit.getGoodsContainer(); if (gc != null) gc.addPropertyChangeListener(this); } + logger.info("Switching UnitInfoPanel from " + + (this.unit == null ? "null" : + (this.unit.getId() + " " + this.unit.getDescription() + + " " + this.unit.getMovesAsString())) + + " to " + + (unit == null ? "null" : + (unit.getId() + " " + unit.getDescription() + + " " + unit.getMovesAsString()))); this.unit = unit; - update(); } + update(); } /** @@ -278,10 +285,9 @@ public final class InfoPanel extends FreeColPanel { public void update() { removeAll(); - final ImageLibrary lib = getGUI().getColonyTileMapViewer() - .getImageLibrary(); + final ImageLibrary lib = getGUI().getTileImageLibrary(); Font font = FontLibrary.createFont(FontLibrary.FontType.NORMAL, - FontLibrary.FontSize.TINY, lib.getScalingFactor()); + FontLibrary.FontSize.TINY, lib.getScaleFactor()); String text; JLabel textLabel; if (unit != null) { @@ -309,8 +315,17 @@ public final class InfoPanel extends FreeColPanel { ImageIcon icon; JLabel label; for (Goods goods : unit.getGoodsList()) { - icon = new ImageIcon(lib.getSmallIconImage(goods.getType())); - label = new JLabel(icon); + int amount = goods.getAmount(); + GoodsType gt = goods.getType(); + // FIXME: Get size of full stack from appropriate place. + if(amount == 100) { + icon = new ImageIcon(lib.getIconImage(gt)); + label = new JLabel(icon); + } else { + icon = new ImageIcon(lib.getSmallIconImage(gt)); + label = new JLabel(String.valueOf(amount), + icon, JLabel.RIGHT); + } text = Messages.message(goods.getLabel(true)); label.setFont(font); label.setToolTipText(text); @@ -434,17 +449,15 @@ public final class InfoPanel extends FreeColPanel { * @return The panel mode. */ private InfoPanelMode getMode() { - Player player; return (getFreeColClient().isMapEditor()) ? InfoPanelMode.MAP : (getGUI().getViewMode() == GUI.VIEW_TERRAIN_MODE) ? InfoPanelMode.TILE : (unitInfoPanel.hasUnit()) ? InfoPanelMode.UNIT - : ((player = getFreeColClient().getMyPlayer()) != null - && !player.hasNextActiveUnit()) - ? InfoPanelMode.END - : InfoPanelMode.NONE; + : (getFreeColClient().getMyPlayer() == null) + ? InfoPanelMode.NONE + : InfoPanelMode.END; } /** @@ -496,7 +509,13 @@ public final class InfoPanel extends FreeColPanel { */ public void update() { InfoPanelMode newMode = getMode(); + if(newMode == InfoPanelMode.END && + getFreeColClient().getMyPlayer().hasNextActiveUnit()) { + logger.warning("Inconsistent InfoPanel status"); + } if (this.mode != newMode) { + logger.info("Switching InfoPanel mode from " + mode + + " to " + newMode); switch (this.mode = newMode) { case END: this.mapEditorPanel.setVisible(false); diff --git a/src/net/sf/freecol/client/gui/panel/InformationPanel.java b/src/net/sf/freecol/client/gui/panel/InformationPanel.java index 075869f74..2e1d7a9b5 100644 --- a/src/net/sf/freecol/client/gui/panel/InformationPanel.java +++ b/src/net/sf/freecol/client/gui/panel/InformationPanel.java @@ -22,7 +22,6 @@ package net.sf.freecol.client.gui.panel; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; @@ -33,7 +32,7 @@ import javax.swing.JScrollPane; import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; -import net.sf.freecol.client.gui.GUI; +import net.sf.freecol.client.gui.SwingGUI; import net.sf.freecol.common.model.FreeColObject; import net.sf.freecol.common.model.Location; import net.sf.freecol.common.model.StringTemplate; @@ -75,7 +74,7 @@ public class InformationPanel extends FreeColPanel { super(freeColClient, new MigLayout("wrap 1, insets 200 10 10 10", "[510]", "[242]20[20]")); - final GUI gui = getGUI(); + final SwingGUI gui = getGUI(); JPanel textPanel = new MigPanel(); textPanel.setOpaque(false); textPanel.setLayout(new MigLayout("wrap 2", "", "top")); @@ -94,11 +93,8 @@ public class InformationPanel extends FreeColPanel { .template("informationPanel.display") .addStringTemplate("%object%", disp)); final FreeColObject fco = fcos[i]; - button.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - gui.displayObject(fco); - } + button.addActionListener((ActionEvent ae) -> { + gui.displayObject(fco); }); textPanel.add(button, "skip"); } diff --git a/src/net/sf/freecol/client/gui/panel/LabourData.java b/src/net/sf/freecol/client/gui/panel/LabourData.java index 21eca2446..b5da7c793 100644 --- a/src/net/sf/freecol/client/gui/panel/LabourData.java +++ b/src/net/sf/freecol/client/gui/panel/LabourData.java @@ -19,11 +19,11 @@ package net.sf.freecol.client.gui.panel; -import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.common.i18n.Messages; @@ -451,14 +451,9 @@ public class LabourData { } public static List getLabourTypes(Player player) { - List unitTypes = player.getSpecification().getUnitTypeList(); - ArrayList labourTypes = new ArrayList<>(); - for (UnitType unitType : unitTypes) { - if (unitType.hasSkill() && unitType.isAvailableTo(player)) { - labourTypes.add(unitType); - } - } - return labourTypes; + return player.getSpecification().getUnitTypeList().stream() + .filter(ut -> ut.hasSkill() && ut.isAvailableTo(player)) + .collect(Collectors.toList()); } private void summarize() { diff --git a/src/net/sf/freecol/client/gui/panel/LoadDialog.java b/src/net/sf/freecol/client/gui/panel/LoadDialog.java index 0d5cfd3d0..ab76981b8 100644 --- a/src/net/sf/freecol/client/gui/panel/LoadDialog.java +++ b/src/net/sf/freecol/client/gui/panel/LoadDialog.java @@ -20,15 +20,15 @@ package net.sf.freecol.client.gui.panel; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.io.File; import java.util.List; -import javax.swing.filechooser.FileFilter; import javax.swing.JFileChooser; import javax.swing.JFrame; +import javax.swing.filechooser.FileFilter; import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.common.i18n.Messages; @@ -67,15 +67,12 @@ public final class LoadDialog extends FreeColDialog { fileChooser.setDialogType(JFileChooser.OPEN_DIALOG); fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); fileChooser.setFileHidingEnabled(false); - fileChooser.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - final String cmd = event.getActionCommand(); - File value = (JFileChooser.APPROVE_SELECTION.equals(cmd)) - ? ((JFileChooser)event.getSource()).getSelectedFile() - : cancelFile; - setValue(value); - } + fileChooser.addActionListener((ActionEvent ae) -> { + final String cmd = ae.getActionCommand(); + File value = (JFileChooser.APPROVE_SELECTION.equals(cmd)) + ? ((JFileChooser)ae.getSource()).getSelectedFile() + : cancelFile; + setValue(value); }); List> c = choices(); diff --git a/src/net/sf/freecol/client/gui/panel/LoadingSavegameDialog.java b/src/net/sf/freecol/client/gui/panel/LoadingSavegameDialog.java index 82d5e263e..6744e2ab1 100644 --- a/src/net/sf/freecol/client/gui/panel/LoadingSavegameDialog.java +++ b/src/net/sf/freecol/client/gui/panel/LoadingSavegameDialog.java @@ -35,6 +35,7 @@ import javax.swing.SpinnerNumberModel; import net.sf.freecol.FreeCol; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.gui.FontLibrary; +import net.sf.freecol.client.gui.LoadingSavegameInfo; import net.sf.freecol.common.i18n.Messages; @@ -70,9 +71,9 @@ public final class LoadingSavegameDialog extends FreeColConfirmDialog { panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); panel.setOpaque(false); - JLabel header = Utility.localizedLabel(Messages.nameKey("loadingSavegameDialog"), JLabel.CENTER); - header.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - FontLibrary.FontSize.MEDIUM)); + JLabel header = Utility.localizedHeaderLabel( + Messages.nameKey("loadingSavegameDialog"), JLabel.CENTER, + FontLibrary.FontSize.MEDIUM); header.setBorder(Utility.blankBorder(20, 0, 0, 0)); JPanel p1 = new JPanel(new FlowLayout(FlowLayout.LEFT)); @@ -146,6 +147,15 @@ public final class LoadingSavegameDialog extends FreeColConfirmDialog { return serverNameField.getName(); } + /** + * Get all important information at once. + * + * @return A LoadingSavegameInfo. + */ + public LoadingSavegameInfo getInfo() { + return new LoadingSavegameInfo(isSinglePlayer(), getPort(), getServerName()); + } + /** * Reset the dialog to a given state. * diff --git a/src/net/sf/freecol/client/gui/panel/MainPanel.java b/src/net/sf/freecol/client/gui/panel/MainPanel.java index a6808604b..5a9288efc 100644 --- a/src/net/sf/freecol/client/gui/panel/MainPanel.java +++ b/src/net/sf/freecol/client/gui/panel/MainPanel.java @@ -98,7 +98,7 @@ public final class MainPanel extends FreeColPanel { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { + public void actionPerformed(ActionEvent ae) { // The actions are handled implicitly by the JButton/FreeColActions getGUI().removeFromCanvas(this); } diff --git a/src/net/sf/freecol/client/gui/panel/MapEditorTransformPanel.java b/src/net/sf/freecol/client/gui/panel/MapEditorTransformPanel.java index 43c1cefc9..64db864ba 100644 --- a/src/net/sf/freecol/client/gui/panel/MapEditorTransformPanel.java +++ b/src/net/sf/freecol/client/gui/panel/MapEditorTransformPanel.java @@ -21,10 +21,10 @@ package net.sf.freecol.client.gui.panel; import java.awt.BorderLayout; import java.awt.Color; +import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Image; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; @@ -38,12 +38,14 @@ import javax.swing.JToggleButton; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.control.MapEditorController; +import net.sf.freecol.client.control.MapEditorController.IMapTransform; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.client.gui.ImageLibrary; -import net.sf.freecol.client.gui.MapViewer; +import net.sf.freecol.client.gui.SwingGUI; import net.sf.freecol.common.i18n.Messages; +import net.sf.freecol.common.model.Direction; import net.sf.freecol.common.model.IndianNationType; import net.sf.freecol.common.model.LostCityRumour; -import net.sf.freecol.common.model.Direction; import net.sf.freecol.common.model.ModelMessage; import net.sf.freecol.common.model.Nation; import net.sf.freecol.common.model.Player; @@ -116,15 +118,17 @@ public final class MapEditorTransformPanel extends FreeColPanel { private void buildList() { final Specification spec = getSpecification(); List tileList = spec.getTileTypeList(); + Dimension terrainSize = ImageLibrary.scaleDimension(ImageLibrary.TILE_OVERLAY_SIZE, 0.5f); for (TileType type : tileList) { - listPanel.add(buildButton(MapViewer.createTileImageWithOverlayAndForest(type, 0.5f), + listPanel.add(buildButton(SwingGUI.createTileImageWithOverlayAndForest(type, terrainSize), Messages.getName(type), new TileTypeTransform(type))); } - listPanel.add(buildButton(ImageLibrary.getRiverImage("0101", 0.5f), + Dimension riverSize = ImageLibrary.scaleDimension(ImageLibrary.TILE_SIZE, 0.5f); + listPanel.add(buildButton(ImageLibrary.getRiverImage("0101", riverSize), Messages.message("mapEditorTransformPanel.minorRiver"), new RiverTransform(TileImprovement.SMALL_RIVER))); - listPanel.add(buildButton(ImageLibrary.getRiverImage("0202", 0.5f), + listPanel.add(buildButton(ImageLibrary.getRiverImage("0202", riverSize), Messages.message("mapEditorTransformPanel.majorRiver"), new RiverTransform(TileImprovement.LARGE_RIVER))); listPanel.add(buildButton(ImageLibrary.getMiscImage("image.tileitem." @@ -161,19 +165,18 @@ public final class MapEditorTransformPanel extends FreeColPanel { button.setToolTipText(text); button.setOpaque(false); group.add(button); - button.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - MapEditorController ctlr = getFreeColClient().getMapEditorController(); - MapTransform newMapTransform = null; - if(ctlr.getMapTransform() != mt){ - newMapTransform = mt; - } - ctlr.setMapTransform(newMapTransform); - if(newMapTransform == null && mt != null){ - //select the invisible button, de-selecting all others - group.setSelected(group.getElements().nextElement().getModel(),true); - } + button.addActionListener((ActionEvent ae) -> { + MapEditorController ctlr + = getFreeColClient().getMapEditorController(); + MapTransform newMapTransform = null; + if (ctlr.getMapTransform() != mt) { + newMapTransform = mt; + } + ctlr.setMapTransform(newMapTransform); + if (newMapTransform == null && mt != null) { + //select the invisible button, de-selecting all others + group.setSelected(group.getElements().nextElement() + .getModel(), true); } }); button.setBorder(null); @@ -195,7 +198,7 @@ public final class MapEditorTransformPanel extends FreeColPanel { * * @see #transform(Tile) */ - public abstract class MapTransform { + public abstract class MapTransform implements IMapTransform { /** * A panel with information about this transformation. @@ -311,9 +314,9 @@ public final class MapEditorTransformPanel extends FreeColPanel { String name = Messages.getName(rt); choices.add(new ChoiceItem<>(name, rt)); } - ResourceType choice = getGUI().getChoice(true, null, + ResourceType choice = getGUI().getChoice(null, Messages.message("mapEditorTransformPanel.chooseResource"), - null, "cancel", choices); + "cancel", choices); if (choice != null) { t.addResource(new Resource(t.getGame(), t, choice, choice.getMaxValue())); @@ -345,7 +348,7 @@ public final class MapEditorTransformPanel extends FreeColPanel { || nativeNation == null) return; UnitType skill = ((IndianNationType)nativeNation.getType()) .getSkills().get(0).getObject(); - Player nativePlayer = getGame().getPlayer(nativeNation.getId()); + Player nativePlayer = getGame().getPlayerByNation(nativeNation); if (nativePlayer == null) return; String name = nativePlayer.getSettlementName(null); ServerIndianSettlement settlement diff --git a/src/net/sf/freecol/client/gui/panel/MapGeneratorOptionsDialog.java b/src/net/sf/freecol/client/gui/panel/MapGeneratorOptionsDialog.java index fc85817ac..7da9f2f8d 100644 --- a/src/net/sf/freecol/client/gui/panel/MapGeneratorOptionsDialog.java +++ b/src/net/sf/freecol/client/gui/panel/MapGeneratorOptionsDialog.java @@ -22,7 +22,6 @@ package net.sf.freecol.client.gui.panel; import java.awt.Dimension; import java.awt.Image; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.io.File; import java.util.Arrays; import java.util.Comparator; @@ -37,7 +36,6 @@ import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; -import net.sf.freecol.FreeCol; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.gui.GUI; import net.sf.freecol.client.gui.option.BooleanOptionUI; @@ -81,7 +79,7 @@ public final class MapGeneratorOptionsDialog extends OptionsDialog { // FIXME: The update should be solved by PropertyEvent. File mapDirectory = FreeColDirectories.getMapsDirectory(); if (mapDirectory.isDirectory()) { - File[] files = mapDirectory.listFiles(FreeCol.freeColSaveFileFilter); + File[] files = mapDirectory.listFiles(FreeColSavegameFile.getFileFilter()); Arrays.sort(files, new Comparator() { @Override public int compare(File f1, File f2) { @@ -92,11 +90,8 @@ public final class MapGeneratorOptionsDialog extends OptionsDialog { for (final File file : files) { JButton mapButton = makeMapButton(file); if (mapButton == null) continue; - mapButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - updateFile(file); - } + mapButton.addActionListener((ActionEvent ae) -> { + updateFile(file); }); mapPanel.add(mapButton); } diff --git a/src/net/sf/freecol/client/gui/panel/MiniMap.java b/src/net/sf/freecol/client/gui/panel/MiniMap.java index d1b15e9af..80dcbc318 100644 --- a/src/net/sf/freecol/client/gui/panel/MiniMap.java +++ b/src/net/sf/freecol/client/gui/panel/MiniMap.java @@ -21,9 +21,9 @@ package net.sf.freecol.client.gui.panel; import java.awt.BasicStroke; import java.awt.Color; +import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; -import java.awt.Image; import java.awt.RenderingHints; import java.awt.event.MouseEvent; import java.awt.geom.AffineTransform; @@ -349,12 +349,11 @@ public final class MiniMap extends JPanel implements MouseInputListener { * Use miniRectWidth/Height / 2 to get the upper left corner. * x/yTiles are the number of tiles that fit on the large map */ if (getParent() != null) { - TileType tileType = freeColClient.getGame().getSpecification().getTileTypeList().get(0); int miniRectX = (gui.getFocus().getX() - firstColumn) * tileSize; int miniRectY = (gui.getFocus().getY() - firstRow) * tileSize / 4; - Image image = library.getTerrainImage(tileType, 0, 0); - int miniRectWidth = (getParent().getWidth() / image.getWidth(null) + 1) * tileSize; - int miniRectHeight = (getParent().getHeight() / image.getHeight(null) + 1) * tileSize / 2; + Dimension mapTileSize = library.scaleDimension(ImageLibrary.TILE_SIZE); + int miniRectWidth = (getParent().getWidth() / mapTileSize.width + 1) * tileSize; + int miniRectHeight = (getParent().getHeight() / mapTileSize.height + 1) * tileSize / 2; if (miniRectX + miniRectWidth / 2 > width) { miniRectX = width - miniRectWidth / 2 - 1; } else if (miniRectX - miniRectWidth / 2 < 0) { diff --git a/src/net/sf/freecol/client/gui/panel/ModifierFormat.java b/src/net/sf/freecol/client/gui/panel/ModifierFormat.java index cbada3ef1..86c7714aa 100644 --- a/src/net/sf/freecol/client/gui/panel/ModifierFormat.java +++ b/src/net/sf/freecol/client/gui/panel/ModifierFormat.java @@ -20,6 +20,8 @@ package net.sf.freecol.client.gui.panel; import java.text.DecimalFormat; +import java.util.Arrays; +import java.util.stream.Collectors; import javax.swing.JLabel; @@ -99,12 +101,8 @@ public class ModifierFormat { FreeColGameObjectType fcgot, Turn turn) { String sourceName = getSourceName(modifier.getSource()); - if (fcgot != null) { - for (Scope scope : modifier.getScopes()) { - if (scope.appliesTo(fcgot)) { - sourceName += " (" + Messages.getName(fcgot) + ")"; - } - } + if (fcgot != null && modifier.appliesTo(fcgot)) { + sourceName += " (" + Messages.getName(fcgot) + ")"; } float value = modifier.getValue(turn); String[] bonus = getModifierStrings(value, modifier.getType()); @@ -116,33 +114,22 @@ public class ModifierFormat { } public static String getFeatureAsString(Feature feature) { - String label = Messages.getName(feature) + ":"; - if (feature.hasScope()) { - for (Scope scope : feature.getScopes()) { - String key = null; - if (scope.getType() != null) { - key = scope.getType(); - } else if (scope.getAbilityId() != null) { - key = scope.getAbilityId(); - } else if (scope.getMethodName() != null) { - key = "model.scope." + scope.getMethodName(); - } - if (key != null) { - label += (scope.isMatchNegated() ? " !" : " ") - + Messages.getName(key) + ","; - } - } - } - return label.substring(0, label.length() - 1); + return Messages.getName(feature) + ":" + + ((!feature.hasScope()) ? "" + : feature.getScopes().stream().map(scope -> { + String k = scope.getKey(); + if (k == null) { + k = ""; + } else { + k = Messages.getName(k); + if (scope.isMatchNegated()) k = "!" + k; + } + return k; + }).collect(Collectors.joining())); } public static String getModifierAsString(Modifier modifier) { - String result = ""; - for (String string : getModifierStrings(modifier)) { - if (string != null) { - result += string; - } - } - return result; + return Arrays.stream(getModifierStrings(modifier)) + .filter(s -> s != null).collect(Collectors.joining()); } } diff --git a/src/net/sf/freecol/client/gui/panel/MonarchDialog.java b/src/net/sf/freecol/client/gui/panel/MonarchDialog.java index 690746ba7..9e4b1bad2 100644 --- a/src/net/sf/freecol/client/gui/panel/MonarchDialog.java +++ b/src/net/sf/freecol/client/gui/panel/MonarchDialog.java @@ -20,18 +20,19 @@ package net.sf.freecol.client.gui.panel; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.util.List; import javax.swing.ImageIcon; - import javax.swing.JButton; import javax.swing.JFrame; +import javax.swing.JLabel; import javax.swing.JTextArea; +import javax.swing.SwingConstants; import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.client.gui.FontLibrary; import net.sf.freecol.client.gui.ImageLibrary; import net.sf.freecol.common.i18n.Messages; @@ -77,9 +78,8 @@ public final class MonarchDialog extends FreeColDialog { if (!Messages.containsKey(hdrKey)) { hdrKey = "monarchDialog.default"; } - JTextArea header = Utility.localizedTextArea(hdrKey); - header.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - FontLibrary.FontSize.MEDIUM)); + JLabel header = Utility.localizedHeaderLabel(hdrKey, + SwingConstants.LEADING, FontLibrary.FontSize.MEDIUM); MigPanel panel = new MigPanel(new MigLayout("wrap 2, insets 10", "[]20[]")); @@ -87,11 +87,8 @@ public final class MonarchDialog extends FreeColDialog { if (action == MonarchAction.RAISE_TAX_ACT || action == MonarchAction.RAISE_TAX_WAR) { JButton helpButton = Utility.localizedButton("help"); - helpButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - getGUI().showColopediaPanel("colopedia.concepts.taxes"); - } + helpButton.addActionListener((ActionEvent ae) -> { + getGUI().showColopediaPanel("colopedia.concepts.taxes"); }); panel.add(helpButton, "tag help"); } diff --git a/src/net/sf/freecol/client/gui/panel/NationDetailPanel.java b/src/net/sf/freecol/client/gui/panel/NationDetailPanel.java index ebcc7c97c..6392ca6a5 100644 --- a/src/net/sf/freecol/client/gui/panel/NationDetailPanel.java +++ b/src/net/sf/freecol/client/gui/panel/NationDetailPanel.java @@ -56,12 +56,10 @@ public class NationDetailPanel extends ColopediaGameObjectTypePanel { } + // Implement ColopediaDetailPanel + /** - * Adds one or several subtrees for all the objects for which this - * ColopediaDetailPanel could build a detail panel to the given - * root node. - * - * @param root a DefaultMutableTreeNode + * {@inheritDoc} */ @Override public void addSubTrees(DefaultMutableTreeNode root) { @@ -72,10 +70,7 @@ public class NationDetailPanel extends ColopediaGameObjectTypePanel { } /** - * Builds the details panel for the Nation with the given identifier. - * - * @param id The object identifier. - * @param panel the detail panel to build + * {@inheritDoc} */ @Override public void buildDetail(String id, JPanel panel) { @@ -92,9 +87,7 @@ public class NationDetailPanel extends ColopediaGameObjectTypePanel { panel.setLayout(new MigLayout("wrap 3, fillx, gapx 20", "", "")); - JLabel name = Utility.localizedLabel(nation); - name.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - FontLibrary.FontSize.SMALL)); + JLabel name = Utility.localizedHeaderLabel(nation, FontLibrary.FontSize.SMALL); panel.add(name, "span, align center, wrap 40"); JLabel artLabel = new JLabel(new ImageIcon(ImageLibrary.getMonarchImage(nation))); diff --git a/src/net/sf/freecol/client/gui/panel/NationTypeDetailPanel.java b/src/net/sf/freecol/client/gui/panel/NationTypeDetailPanel.java index 3ca5c1ca1..6e1b31b17 100644 --- a/src/net/sf/freecol/client/gui/panel/NationTypeDetailPanel.java +++ b/src/net/sf/freecol/client/gui/panel/NationTypeDetailPanel.java @@ -68,17 +68,16 @@ public class NationTypeDetailPanel } + // Implement ColopediaDetailPanel + /** - * Adds one or several subtrees for all the objects for which this - * ColopediaDetailPanel could build a detail panel to the given - * root node. - * - * @param root a DefaultMutableTreeNode + * {@inheritDoc} */ @Override public void addSubTrees(DefaultMutableTreeNode root) { - DefaultMutableTreeNode parent = - new DefaultMutableTreeNode(new ColopediaTreeItem(this, getId(), getName(), null)); + DefaultMutableTreeNode parent + = new DefaultMutableTreeNode(new ColopediaTreeItem(this, getId(), + getName(), null)); List nations = new ArrayList<>(); nations.addAll(getSpecification().getEuropeanNationTypes()); @@ -92,22 +91,17 @@ public class NationTypeDetailPanel } /** - * Builds the details panel for the NationType with the given identifier. - * - * @param id The object identifier to display. - * @param panel the detail panel to build + * {@inheritDoc} */ @Override public void buildDetail(String id, JPanel panel) { - if (getId().equals(id)) { - return; - } + if (getId().equals(id)) return; NationType nationType = getSpecification().getNationType(id); if (nationType instanceof EuropeanNationType) { - buildEuropeanNationTypeDetail((EuropeanNationType) nationType, panel); + buildEuropeanNationTypeDetail((EuropeanNationType)nationType, panel); } else if (nationType instanceof IndianNationType) { - buildIndianNationTypeDetail((IndianNationType) nationType, panel); + buildIndianNationTypeDetail((IndianNationType)nationType, panel); } } @@ -118,8 +112,8 @@ public class NationTypeDetailPanel * @param nationType - the EuropeanNationType * @param panel the panel to use */ - private void buildEuropeanNationTypeDetail(EuropeanNationType nationType, JPanel panel) { - + private void buildEuropeanNationTypeDetail(EuropeanNationType nationType, + JPanel panel) { Font boldFont = FontLibrary.createFont(FontLibrary.FontType.SIMPLE, FontLibrary.FontSize.SMALLER, Font.BOLD); @@ -128,9 +122,7 @@ public class NationTypeDetailPanel panel.setLayout(new MigLayout("wrap 2, gapx 20")); - JLabel label = Utility.localizedLabel(nationType); - label.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - FontLibrary.FontSize.SMALL)); + JLabel label = Utility.localizedHeaderLabel(nationType, FontLibrary.FontSize.SMALL); panel.add(label, "span, align center, wrap 40"); label = Utility.localizedLabel("colopedia.nationType.units"); @@ -171,25 +163,22 @@ public class NationTypeDetailPanel } } - /** * Builds the details panel for the given nation type. * * @param nationType - the IndianNationType * @param panel the panel to use */ - private void buildIndianNationTypeDetail(IndianNationType nationType, JPanel panel) { - + private void buildIndianNationTypeDetail(IndianNationType nationType, + JPanel panel) { List> skills = nationType.getSkills(); panel.setLayout(new MigLayout("wrap 2, gapx 20", "", "")); - JLabel name = Utility.localizedLabel(nationType); - name.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - FontLibrary.FontSize.SMALL)); + JLabel name = Utility.localizedHeaderLabel(nationType, FontLibrary.FontSize.SMALL); panel.add(name, "span, align center, wrap 40"); - panel.add(Utility.localizedLabel("colopedia.nationType.aggressionLevel")); + panel.add(Utility.localizedLabel("colopedia.nationType.aggression")); panel.add(Utility.localizedLabel("colopedia.nationType." + nationType.getAggression().getKey())); diff --git a/src/net/sf/freecol/client/gui/panel/NegotiationDialog.java b/src/net/sf/freecol/client/gui/panel/NegotiationDialog.java index 1877a93f1..22b9bed67 100644 --- a/src/net/sf/freecol/client/gui/panel/NegotiationDialog.java +++ b/src/net/sf/freecol/client/gui/panel/NegotiationDialog.java @@ -24,7 +24,6 @@ import java.awt.Cursor; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -47,6 +46,7 @@ import javax.swing.SpinnerNumberModel; import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.client.gui.FontLibrary; import net.sf.freecol.common.debug.FreeColDebugger; import net.sf.freecol.common.i18n.Messages; @@ -100,7 +100,7 @@ public final class NegotiationDialog extends FreeColDialog { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { agreement.remove(item); updateDialog(); } @@ -193,8 +193,8 @@ public final class NegotiationDialog extends FreeColDialog { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - final String command = event.getActionCommand(); + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); if (null != command) switch (command) { case ADD: NegotiationDialog.this.addColonyTradeItem(source, @@ -273,8 +273,8 @@ public final class NegotiationDialog extends FreeColDialog { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - final String command = event.getActionCommand(); + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); if (null != command) switch (command) { case ADD: int amount = ((Integer)spinner.getValue()); @@ -400,8 +400,8 @@ public final class NegotiationDialog extends FreeColDialog { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - final String command = event.getActionCommand(); + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); if (null != command) switch (command) { case ADD: NegotiationDialog.this.addGoodsTradeItem(source, @@ -432,7 +432,7 @@ public final class NegotiationDialog extends FreeColDialog { Player value, int index, boolean isSelected, boolean cellHasFocus) { setText((value == null) ? "" - : Messages.message(value.getNationName())); + : Messages.message(value.getNationLabel())); return this; } } @@ -519,8 +519,8 @@ public final class NegotiationDialog extends FreeColDialog { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - final String command = event.getActionCommand(); + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); if (null != command) switch (command) { case ADD: Player victim = (Player)victimBox.getSelectedItem(); @@ -641,8 +641,8 @@ public final class NegotiationDialog extends FreeColDialog { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - final String command = event.getActionCommand(); + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); if (null != command) switch (command) { case ADD: Stance stance = (Stance)stanceBox.getSelectedItem(); @@ -761,8 +761,8 @@ public final class NegotiationDialog extends FreeColDialog { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - final String command = event.getActionCommand(); + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); if (null != command) switch (command) { case ADD: NegotiationDialog.this.addUnitTradeItem(source, @@ -836,8 +836,8 @@ public final class NegotiationDialog extends FreeColDialog { this.agreement = agreement; this.comment = comment; - StringTemplate nation = player.getNationName(), - otherNation = otherPlayer.getNationName(); + StringTemplate nation = player.getNationLabel(), + otherNation = otherPlayer.getNationLabel(); this.demand = StringTemplate.template("negotiationDialog.demand") .addStringTemplate("%nation%", nation) .addStringTemplate("%otherNation%", otherNation); @@ -929,7 +929,7 @@ public final class NegotiationDialog extends FreeColDialog { JTextArea labelDemandMessage = Utility.localizedTextArea(this.demand); Font font = FontLibrary.createFont(FontLibrary.FontType.NORMAL, FontLibrary.FontSize.TINY, Font.BOLD, - getImageLibrary().getScalingFactor()); + getImageLibrary().getScaleFactor()); labelDemandMessage.setFont(font); panel.add(labelDemandMessage); JTextArea blank = new JTextArea(" "); diff --git a/src/net/sf/freecol/client/gui/panel/NewPanel.java b/src/net/sf/freecol/client/gui/panel/NewPanel.java index 4b503efd2..d1feec56f 100644 --- a/src/net/sf/freecol/client/gui/panel/NewPanel.java +++ b/src/net/sf/freecol/client/gui/panel/NewPanel.java @@ -43,7 +43,7 @@ import net.sf.freecol.FreeCol; import net.sf.freecol.client.ClientOptions; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.control.ConnectController; -import net.sf.freecol.client.gui.GUI; +import net.sf.freecol.client.gui.SwingGUI; import net.sf.freecol.client.gui.plaf.FreeColComboBoxRenderer; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.ServerInfo; @@ -217,11 +217,8 @@ public final class NewPanel extends FreeColPanel this.serverPortLabel = Utility.localizedLabel("newPanel.startServerOnPort"); this.serverPortField = new JTextField(Integer.toString(FreeCol.getServerPort())); - this.serverPortField.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - getSelectedPort(NewPanel.this.serverPortField); - } + this.serverPortField.addActionListener((ActionEvent ae) -> { + getSelectedPort(NewPanel.this.serverPortField); }); this.rulesLabel = Utility.localizedLabel("rules"); @@ -264,11 +261,8 @@ public final class NewPanel extends FreeColPanel this.joinPortLabel = Utility.localizedLabel("port"); this.joinPortField = new JTextField(Integer.toString(FreeCol.getServerPort())); - this.joinPortField.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - getSelectedPort(NewPanel.this.joinPortField); - } + this.joinPortField.addActionListener((ActionEvent ae) -> { + getSelectedPort(NewPanel.this.joinPortField); }); okButton.setActionCommand(String.valueOf(NewPanelAction.OK)); @@ -505,12 +499,11 @@ public final class NewPanel extends FreeColPanel * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { + public void actionPerformed(ActionEvent ae) { final ConnectController cc = getFreeColClient().getConnectController(); - final GUI gui = getGUI(); - final String command = event.getActionCommand(); + final SwingGUI gui = getGUI(); + final String command = ae.getActionCommand(); - int port; switch (Enum.valueOf(NewPanelAction.class, command)) { case OK: FreeCol.setName(getSelectedName()); @@ -560,7 +553,7 @@ public final class NewPanel extends FreeColPanel enableComponents(); break; default: - super.actionPerformed(event); + super.actionPerformed(ae); break; } } diff --git a/src/net/sf/freecol/client/gui/panel/NewUnitPanel.java b/src/net/sf/freecol/client/gui/panel/NewUnitPanel.java index 17ae3d2bd..0cb4b23ab 100644 --- a/src/net/sf/freecol/client/gui/panel/NewUnitPanel.java +++ b/src/net/sf/freecol/client/gui/panel/NewUnitPanel.java @@ -54,7 +54,7 @@ public class NewUnitPanel extends FreeColPanel { /** The unit types corresponding to the buttons. */ private final List units = new ArrayList<>(); - /** A comparator for unit prices. */ + /** A comparator by ascending unit price. */ private final Comparator priceComparator; /** Is there at least one available unit? */ @@ -73,16 +73,11 @@ public class NewUnitPanel extends FreeColPanel { String label, List units) { super(freeColClient, layout); - final Europe europe = getMyPlayer().getEurope(); - this.question = new JLabel(label); this.units.addAll(units); - this.priceComparator = new Comparator() { - @Override - public int compare(final UnitType u1, final UnitType u2) { - return europe.getUnitPrice(u1) - europe.getUnitPrice(u2); - } - }; + final Europe europe = getMyPlayer().getEurope(); + this.priceComparator = Comparator.comparingInt((UnitType ut) -> + europe.getUnitPrice(ut)); okButton.setText(Messages.message("close")); @@ -142,10 +137,10 @@ public class NewUnitPanel extends FreeColPanel { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - String command = event.getActionCommand(); + public void actionPerformed(ActionEvent ae) { + String command = ae.getActionCommand(); if (OK.equals(command)) { - super.actionPerformed(event); + super.actionPerformed(ae); } else { UnitType unitType = getSpecification().getUnitType(command); igc().trainUnitInEurope(unitType); diff --git a/src/net/sf/freecol/client/gui/panel/OptionsDialog.java b/src/net/sf/freecol/client/gui/panel/OptionsDialog.java index 09edb1ceb..1bfde9548 100644 --- a/src/net/sf/freecol/client/gui/panel/OptionsDialog.java +++ b/src/net/sf/freecol/client/gui/panel/OptionsDialog.java @@ -31,6 +31,7 @@ import net.miginfocom.swing.MigLayout; import net.sf.freecol.FreeCol; import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.client.gui.option.OptionGroupUI; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.io.FreeColDirectories; diff --git a/src/net/sf/freecol/client/gui/panel/ParametersDialog.java b/src/net/sf/freecol/client/gui/panel/ParametersDialog.java index 6853edfa0..44468a15e 100644 --- a/src/net/sf/freecol/client/gui/panel/ParametersDialog.java +++ b/src/net/sf/freecol/client/gui/panel/ParametersDialog.java @@ -32,6 +32,7 @@ import javax.swing.JTextField; import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.common.i18n.Messages; @@ -95,12 +96,9 @@ public class ParametersDialog extends FreeColDialog { panel.add(heightPanel); panel.setSize(panel.getPreferredSize()); - final ActionListener al = new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - ParametersDialog.this.checkFields(); - } - }; + final ActionListener al = (ActionEvent ae) -> { + ParametersDialog.this.checkFields(); + }; inputD.addActionListener(al); inputM.addActionListener(al); diff --git a/src/net/sf/freecol/client/gui/panel/PlayersTable.java b/src/net/sf/freecol/client/gui/panel/PlayersTable.java index d37d95ef9..7ca54a395 100644 --- a/src/net/sf/freecol/client/gui/panel/PlayersTable.java +++ b/src/net/sf/freecol/client/gui/panel/PlayersTable.java @@ -46,6 +46,7 @@ import javax.swing.table.JTableHeader; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; +import javax.swing.table.TableColumnModel; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.control.PreGameController; @@ -209,12 +210,9 @@ public final class PlayersTable extends JTable { = new JComboBox<>(NationState.values()); private JComboBox activeBox; - private final ActionListener listener = new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - stopCellEditing(); - } - }; + private final ActionListener listener = (ActionEvent ae) -> { + stopCellEditing(); + }; public AvailableCellEditor() { @@ -319,9 +317,10 @@ public final class PlayersTable extends JTable { Object value, boolean isSelected, boolean hasFocus, int row, int column) { Nation nation = (Nation) value; - setText(Messages.getName(nation)); - setIcon(new ImageIcon( - gui.getImageLibrary().getSmallerMiscIconImage(nation))); + setText(Messages.message(StringTemplate.template("countryName") + .add("%nation%", Messages.nameKey(nation.getId())))); + setIcon(new ImageIcon(gui.getImageLibrary() + .getSmallerMiscIconImage(nation))); return this; } } @@ -393,11 +392,8 @@ public final class PlayersTable extends JTable { public PlayerCellEditor() { - button.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - fireEditingStopped(); - } + button.addActionListener((ActionEvent ae) -> { + fireEditingStopped(); }); } @@ -666,20 +662,14 @@ public final class PlayersTable extends JTable { setRowHeight(47); JButton nationButton = Utility.localizedButton("nation"); - nationButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - gui.showColopediaPanel(PanelType.NATIONS.getKey()); - } + nationButton.addActionListener((ActionEvent ae) -> { + gui.showColopediaPanel(PanelType.NATIONS.getKey()); }); JLabel availabilityLabel = Utility.localizedLabel("playersTable.availability"); JButton advantageButton = Utility.localizedButton("playersTable.advantage"); - advantageButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - gui.showColopediaPanel(PanelType.NATION_TYPES.getKey()); - } + advantageButton.addActionListener((ActionEvent ae) -> { + gui.showColopediaPanel(PanelType.NATION_TYPES.getKey()); }); JLabel colorLabel = Utility.localizedLabel("color"); @@ -693,17 +683,19 @@ public final class PlayersTable extends JTable { JTableHeader header = getTableHeader(); header.addMouseListener(new HeaderListener(header, renderer)); - TableColumn nationColumn = getColumnModel().getColumn(NATION_COLUMN); + final TableColumnModel tcm = getColumnModel(); + + TableColumn nationColumn = tcm.getColumn(NATION_COLUMN); nationColumn.setCellRenderer(new NationCellRenderer()); nationColumn.setHeaderRenderer(renderer); + nationColumn.setPreferredWidth(2 * tcm.getTotalColumnWidth() + / tcm.getColumnCount()); - TableColumn availableColumn - = getColumnModel().getColumn(AVAILABILITY_COLUMN); + TableColumn availableColumn = tcm.getColumn(AVAILABILITY_COLUMN); availableColumn.setCellRenderer(new AvailableCellRenderer()); availableColumn.setCellEditor(new AvailableCellEditor()); - TableColumn advantagesColumn - = getColumnModel().getColumn(ADVANTAGE_COLUMN); + TableColumn advantagesColumn = tcm.getColumn(ADVANTAGE_COLUMN); switch (nationOptions.getNationalAdvantages()) { case SELECTABLE: advantagesColumn.setCellEditor(new AdvantageCellEditor(spec @@ -720,11 +712,11 @@ public final class PlayersTable extends JTable { advantagesColumn.setCellRenderer(new AdvantageCellRenderer(nationOptions.getNationalAdvantages())); advantagesColumn.setHeaderRenderer(renderer); - TableColumn colorsColumn = getColumnModel().getColumn(COLOR_COLUMN); + TableColumn colorsColumn = tcm.getColumn(COLOR_COLUMN); colorsColumn.setCellRenderer(new ColorCellRenderer(true)); colorsColumn.setCellEditor(new ColorCellEditor(freeColClient)); - TableColumn playerColumn = getColumnModel().getColumn(PLAYER_COLUMN); + TableColumn playerColumn = tcm.getColumn(PLAYER_COLUMN); playerColumn.setCellEditor(new PlayerCellEditor()); playerColumn.setCellRenderer(new PlayerCellRenderer()); } diff --git a/src/net/sf/freecol/client/gui/panel/PreCombatDialog.java b/src/net/sf/freecol/client/gui/panel/PreCombatDialog.java index 3a07f2247..94e346b6d 100644 --- a/src/net/sf/freecol/client/gui/panel/PreCombatDialog.java +++ b/src/net/sf/freecol/client/gui/panel/PreCombatDialog.java @@ -135,7 +135,7 @@ public class PreCombatDialog extends FreeColConfirmDialog { } Font bigFont = FontLibrary.createFont(FontLibrary.FontType.NORMAL, - FontLibrary.FontSize.SMALLER, Font.BOLD, lib.getScalingFactor()); + FontLibrary.FontSize.SMALLER, Font.BOLD, lib.getScaleFactor()); float offenceResult = FeatureContainer.applyModifiers(0f, turn, attackModifiers); JLabel finalOffenceLabel = Utility.localizedLabel("finalResult"); diff --git a/src/net/sf/freecol/client/gui/panel/ProductionLabel.java b/src/net/sf/freecol/client/gui/panel/ProductionLabel.java index d8d70efb8..53b4d7e43 100644 --- a/src/net/sf/freecol/client/gui/panel/ProductionLabel.java +++ b/src/net/sf/freecol/client/gui/panel/ProductionLabel.java @@ -145,8 +145,9 @@ public final class ProductionLabel extends AbstractGoodsLabel { logger.warning("Bad production label (no type)\n" + FreeColDebugger.stackTraceToString()); } else if (getAmount() == 0 && stockNumber < 0) { - logger.warning("Bad production label (bad amount)\n" - + FreeColDebugger.stackTraceToString()); + logger.warning("Bad production label: " + ag + + " stock=" + stockNumber + + "\n" + FreeColDebugger.stackTraceToString()); } this.maximumProduction = maximumProduction; @@ -166,7 +167,7 @@ public final class ProductionLabel extends AbstractGoodsLabel { : this.goodsIcon.getIconWidth() * 2; setFont(FontLibrary.createFont(FontLibrary.FontType.SIMPLE, - FontLibrary.FontSize.TINY, Font.BOLD, lib.getScalingFactor())); + FontLibrary.FontSize.TINY, Font.BOLD, lib.getScaleFactor())); setForeground((getAmount() < 0) ? Color.RED : Color.WHITE); setToolTipText((getType() == null || getAmount() == 0) ? null : Messages.message(getAbstractGoods().getLabel())); diff --git a/src/net/sf/freecol/client/gui/panel/QuickActionMenu.java b/src/net/sf/freecol/client/gui/panel/QuickActionMenu.java index 66c83af98..293fe1d4f 100644 --- a/src/net/sf/freecol/client/gui/panel/QuickActionMenu.java +++ b/src/net/sf/freecol/client/gui/panel/QuickActionMenu.java @@ -21,7 +21,6 @@ package net.sf.freecol.client.gui.panel; import java.awt.Font; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -43,8 +42,8 @@ import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.control.InGameController; -import net.sf.freecol.client.gui.GUI; import net.sf.freecol.client.gui.ImageLibrary; +import net.sf.freecol.client.gui.SwingGUI; import net.sf.freecol.client.gui.panel.ColonyPanel.TilesPanel.ASingleTilePanel; import net.sf.freecol.client.gui.panel.UnitLabel.UnitAction; import net.sf.freecol.common.debug.FreeColDebugger; @@ -70,6 +69,7 @@ import net.sf.freecol.common.model.UnitLocation; import net.sf.freecol.common.model.UnitType; import net.sf.freecol.common.model.UnitTypeChange.ChangeType; import net.sf.freecol.common.model.WorkLocation; +import static net.sf.freecol.common.util.CollectionUtils.*; /** @@ -83,7 +83,7 @@ public final class QuickActionMenu extends JPopupMenu { private final FreeColClient freeColClient; - private final GUI gui; + private final SwingGUI gui; private final FreeColPanel parentPanel; @@ -97,7 +97,7 @@ public final class QuickActionMenu extends JPopupMenu { public QuickActionMenu(FreeColClient freeColClient, FreeColPanel freeColPanel) { this.freeColClient = freeColClient; - this.gui = freeColClient.getGUI(); + this.gui = (SwingGUI)freeColClient.getGUI(); this.parentPanel = freeColPanel; } @@ -206,11 +206,8 @@ public final class QuickActionMenu extends JPopupMenu { .addStringTemplate("%unit%", unit.getLabel(Unit.UnitLabelType.NATIONAL)); JMenuItem menuItem = Utility.localizedMenuItem(template); - menuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - igc.boardShip(tempUnit, unit); - } + menuItem.addActionListener((ActionEvent ae) -> { + igc.boardShip(tempUnit, unit); }); this.add(menuItem); added = true; @@ -230,14 +227,11 @@ public final class QuickActionMenu extends JPopupMenu { .addStringTemplate("%unit%", unit.getLabel(Unit.UnitLabelType.NATIONAL)); JMenuItem menuItem = Utility.localizedMenuItem(template); - menuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if ((e.getModifiers() & ActionEvent.SHIFT_MASK) != 0) { - promptForGoods(goods); - } - igc.loadCargo(goods, unit); + menuItem.addActionListener((ActionEvent ae) -> { + if ((ae.getModifiers() & ActionEvent.SHIFT_MASK) != 0) { + promptForGoods(goods); } + igc.loadCargo(goods, unit); }); this.add(menuItem); added = true; @@ -388,11 +382,8 @@ public final class QuickActionMenu extends JPopupMenu { if (current != null && unit.getWorkType() != null) { JMenuItem ji = Utility.localizedMenuItem("showProductionModifiers"); - ji.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - gui.showWorkProductionPanel(unit); - } + ji.addActionListener((ActionEvent ae) -> { + gui.showWorkProductionPanel(unit); }); this.add(ji); } @@ -486,15 +477,12 @@ public final class QuickActionMenu extends JPopupMenu { final boolean isUnitAtSea = tempUnit.isAtSea(); JMenuItem menuItem = Utility.localizedMenuItem("activateUnit"); - menuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (tempUnit.getState() != Unit.UnitState.ACTIVE) { - freeColClient.getInGameController() - .changeState(tempUnit, Unit.UnitState.ACTIVE); - } - gui.setActiveUnit(tempUnit); + menuItem.addActionListener((ActionEvent ae) -> { + if (tempUnit.getState() != Unit.UnitState.ACTIVE) { + freeColClient.getInGameController() + .changeState(tempUnit, Unit.UnitState.ACTIVE); } + gui.setActiveUnit(tempUnit); }); menuItem.setEnabled(!isUnitAtSea); this.add(menuItem); @@ -536,12 +524,9 @@ public final class QuickActionMenu extends JPopupMenu { if (tempUnit.canCarryTreasure() && tempUnit.canCashInTreasureTrain()) { menuItem = Utility.localizedMenuItem("cashInTreasureTrain"); - menuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - freeColClient.getInGameController() - .checkCashInTreasureTrain(tempUnit); - } + menuItem.addActionListener((ActionEvent ae) -> { + freeColClient.getInGameController() + .checkCashInTreasureTrain(tempUnit); }); menuItem.setEnabled(true); this.add(menuItem); @@ -604,12 +589,7 @@ public final class QuickActionMenu extends JPopupMenu { change = need.get(0); break; default: - for (AbstractGoods ag : need) { - if (ag.getAmount() > 0) { - change = ag; - break; - } - } + change = find(need, ag -> ag.getAmount() > 0); break; } Icon icon = (change == null) ? null : new ImageIcon( @@ -617,15 +597,12 @@ public final class QuickActionMenu extends JPopupMenu { JMenuItem item = new JMenuItem(text, icon); final InGameController igc = freeColClient.getInGameController(); - item.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - igc.equipUnitForRole(unitLabel.getUnit(), to, toCount); - unitLabel.updateIcon(); - // FIXME: fix the PCL handling so this can go away - if (parentPanel instanceof ColonyPanel) { - ((ColonyPanel)parentPanel).update(); - } + item.addActionListener((ActionEvent ae) -> { + igc.equipUnitForRole(unitLabel.getUnit(), to, toCount); + unitLabel.updateIcon(); + // FIXME: fix the PCL handling so this can go away + if (parentPanel instanceof ColonyPanel) { + ((ColonyPanel)parentPanel).update(); } }); return item; @@ -706,11 +683,8 @@ public final class QuickActionMenu extends JPopupMenu { Messages.getName(goods) + " (" + Messages.message("colopedia") + ")", new ImageIcon( gui.getImageLibrary().getSmallIconImage(goods.getType()))); - name.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - gui.showColopediaPanel(goods.getType().getId()); - } + name.addActionListener((ActionEvent ae) -> { + gui.showColopediaPanel(goods.getType().getId()); }); this.add(name); @@ -743,14 +717,11 @@ public final class QuickActionMenu extends JPopupMenu { || (carrier.isInEurope() && player.canTrade(goods.getType()))) { JMenuItem unload = Utility.localizedMenuItem("unload"); - unload.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if ((e.getModifiers() & ActionEvent.SHIFT_MASK) != 0) { - promptForGoods(goods); - } - igc.unloadCargo(goods, false); + unload.addActionListener((ActionEvent ae) -> { + if ((ae.getModifiers() & ActionEvent.SHIFT_MASK) != 0) { + promptForGoods(goods); } + igc.unloadCargo(goods, false); }); this.add(unload); } else { @@ -760,19 +731,16 @@ public final class QuickActionMenu extends JPopupMenu { } JMenuItem dump = Utility.localizedMenuItem("dumpCargo"); - dump.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if ((e.getModifiers() & ActionEvent.SHIFT_MASK) != 0) { - promptForGoods(goods); - } - igc.unloadCargo(goods, true); - // FIXME: fix pcls so this hackery can go away - if (parentPanel instanceof CargoPanel) { - ((CargoPanel) parentPanel).initialize(); - } - parentPanel.revalidate(); + dump.addActionListener((ActionEvent ae) -> { + if ((ae.getModifiers() & ActionEvent.SHIFT_MASK) != 0) { + promptForGoods(goods); } + igc.unloadCargo(goods, true); + // FIXME: fix pcls so this hackery can go away + if (parentPanel instanceof CargoPanel) { + ((CargoPanel) parentPanel).initialize(); + } + parentPanel.revalidate(); }); this.add(dump); } @@ -788,17 +756,14 @@ public final class QuickActionMenu extends JPopupMenu { final InGameController igc = freeColClient.getInGameController(); JMenuItem menuItem = Utility.localizedMenuItem("payArrears"); - menuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - igc.payArrears(goodsType); - // FIXME: fix pcls so this hackery can go away - if (parentPanel instanceof CargoPanel) { - CargoPanel cargoPanel = (CargoPanel) parentPanel; - cargoPanel.initialize(); - } - parentPanel.revalidate(); + menuItem.addActionListener((ActionEvent ae) -> { + igc.payArrears(goodsType); + // FIXME: fix pcls so this hackery can go away + if (parentPanel instanceof CargoPanel) { + CargoPanel cargoPanel = (CargoPanel) parentPanel; + cargoPanel.initialize(); } + parentPanel.revalidate(); }); this.add(menuItem); } @@ -818,11 +783,8 @@ public final class QuickActionMenu extends JPopupMenu { Messages.getName(ag) + " (" + Messages.message("colopedia") + ")", new ImageIcon( gui.getImageLibrary().getSmallIconImage(ag.getType()))); - name.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - gui.showColopediaPanel(ag.getType().getId()); - } + name.addActionListener((ActionEvent ae) -> { + gui.showColopediaPanel(ag.getType().getId()); }); this.add(name); @@ -846,14 +808,11 @@ public final class QuickActionMenu extends JPopupMenu { .addStringTemplate("%unit%", unit.getLabel(Unit.UnitLabelType.NATIONAL)); JMenuItem menuItem = Utility.localizedMenuItem(template); - menuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if ((e.getModifiers() & ActionEvent.SHIFT_MASK) != 0) { - promptForGoods(ag); - } - igc.buyGoods(ag.getType(), ag.getAmount(), unit); + menuItem.addActionListener((ActionEvent ae) -> { + if ((ae.getModifiers() & ActionEvent.SHIFT_MASK) != 0) { + promptForGoods(ag); } + igc.buyGoods(ag.getType(), ag.getAmount(), unit); }); this.add(menuItem); added = true; @@ -897,11 +856,8 @@ public final class QuickActionMenu extends JPopupMenu { private void addTileItem(final Tile tile) { if (tile != null) { JMenuItem menuItem = new JMenuItem(Messages.getName(tile)); - menuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { + menuItem.addActionListener((ActionEvent ae) -> { gui.showTilePanel(tile); - } }); this.add(menuItem); } diff --git a/src/net/sf/freecol/client/gui/panel/RecruitPanel.java b/src/net/sf/freecol/client/gui/panel/RecruitPanel.java index fe31b73b9..a8a1475aa 100644 --- a/src/net/sf/freecol/client/gui/panel/RecruitPanel.java +++ b/src/net/sf/freecol/client/gui/panel/RecruitPanel.java @@ -21,10 +21,11 @@ package net.sf.freecol.client.gui.panel; import java.awt.event.ActionEvent; import java.util.logging.Logger; + import javax.swing.ImageIcon; import javax.swing.JButton; -import javax.swing.JTextArea; + import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; @@ -119,10 +120,10 @@ public final class RecruitPanel extends FreeColPanel { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - final String command = event.getActionCommand(); + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); if (OK.equals(command)) { - super.actionPerformed(event); + super.actionPerformed(ae); } else { try { int index = Integer.parseInt(command); diff --git a/src/net/sf/freecol/client/gui/panel/ReportClassicColonyPanel.java b/src/net/sf/freecol/client/gui/panel/ReportClassicColonyPanel.java index 1b701d7ad..a9e04c4e7 100644 --- a/src/net/sf/freecol/client/gui/panel/ReportClassicColonyPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ReportClassicColonyPanel.java @@ -20,18 +20,19 @@ package net.sf.freecol.client.gui.panel; import java.awt.GridLayout; -import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSeparator; + import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; @@ -44,7 +45,6 @@ import net.sf.freecol.common.model.Colony; import net.sf.freecol.common.model.GoodsType; import net.sf.freecol.common.model.Specification; import net.sf.freecol.common.model.Unit; -import net.sf.freecol.common.model.WorkLocation; /** @@ -70,6 +70,7 @@ public final class ReportClassicColonyPanel extends ReportPanel super(freeColClient, "reportColonyAction"); this.colonies.addAll(freeColClient.getMySortedColonies()); + update(); } private void update() { @@ -103,21 +104,17 @@ public final class ReportClassicColonyPanel extends ReportPanel JPanel colonistsPanel = new JPanel(new GridLayout(0, COLONISTS_PER_ROW)); colonistsPanel.setOpaque(false); - List unitList = colony.getUnitList(); - Collections.sort(unitList, getUnitTypeComparator()); - for (Unit unit : unitList) { - UnitLabel unitLabel = new UnitLabel(getFreeColClient(), unit, - true, true); - colonistsPanel.add(unitLabel); + for (Unit u : colony.getUnitList().stream() + .sorted(Unit.typeRoleComparator).collect(Collectors.toList())) { + colonistsPanel.add(new UnitLabel(getFreeColClient(), u, + true, true)); } JPanel unitsPanel = new JPanel(new GridLayout(0, UNITS_PER_ROW)); unitsPanel.setOpaque(false); - unitList = colony.getTile().getUnitList(); - Collections.sort(unitList, getUnitTypeComparator()); - for (Unit unit : unitList) { - UnitLabel unitLabel = new UnitLabel(getFreeColClient(), unit, - true, true); - unitsPanel.add(unitLabel); + for (Unit u : colony.getTile().getUnitList().stream() + .sorted(Unit.typeRoleComparator).collect(Collectors.toList())) { + unitsPanel.add(new UnitLabel(getFreeColClient(), u, + true, true)); } if (buildableLabel != null && spec.getUnitTypeList().contains(currentType)) { @@ -135,11 +132,8 @@ public final class ReportClassicColonyPanel extends ReportPanel int newValue = colony.getNetProductionOf(gt); int stockValue = colony.getGoodsCount(gt); if (newValue != 0 || stockValue > 0) { - int maxProduction = 0; - for (WorkLocation wl - : colony.getWorkLocationsForProducing(gt)) { - maxProduction += wl.getMaximumProductionOf(gt); - } + int maxProduction = colony.getWorkLocationsForProducing(gt).stream() + .mapToInt(wl -> wl.getMaximumProductionOf(gt)).sum(); ProductionLabel productionLabel = new ProductionLabel(getFreeColClient(), new AbstractGoods(gt, newValue), diff --git a/src/net/sf/freecol/client/gui/panel/ReportCompactColonyPanel.java b/src/net/sf/freecol/client/gui/panel/ReportCompactColonyPanel.java index 9da827587..8ee3331fe 100644 --- a/src/net/sf/freecol/client/gui/panel/ReportCompactColonyPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ReportCompactColonyPanel.java @@ -31,17 +31,17 @@ import java.util.Map; import java.util.Map.Entry; import java.util.HashMap; import java.util.List; +import java.util.function.BinaryOperator; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JLabel; -import javax.swing.JPanel; import javax.swing.JSeparator; import javax.swing.SwingConstants; + import net.miginfocom.swing.MigLayout; -import net.sf.freecol.client.ClientOptions; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.gui.ImageLibrary; import net.sf.freecol.common.i18n.Messages; @@ -51,20 +51,15 @@ import net.sf.freecol.common.model.BuildableType; import net.sf.freecol.common.model.Building; import net.sf.freecol.common.model.Colony; import net.sf.freecol.common.model.Colony.TileImprovementSuggestion; -import net.sf.freecol.common.model.ColonyTile; import net.sf.freecol.common.model.ExportData; import net.sf.freecol.common.model.FreeColObject; import net.sf.freecol.common.model.Game; -import net.sf.freecol.common.model.Goods; import net.sf.freecol.common.model.GoodsContainer; import net.sf.freecol.common.model.GoodsType; -import net.sf.freecol.common.model.Location; import net.sf.freecol.common.model.Market; -import net.sf.freecol.common.model.Occupation; import net.sf.freecol.common.model.Player; import net.sf.freecol.common.model.ProductionInfo; import net.sf.freecol.common.model.Region; -import net.sf.freecol.common.model.Settlement; import net.sf.freecol.common.model.Specification; import net.sf.freecol.common.model.StringTemplate; import net.sf.freecol.common.model.Tile; @@ -75,7 +70,6 @@ import net.sf.freecol.common.model.WorkLocation; import net.sf.freecol.common.model.WorkLocation.Suggestion; import net.sf.freecol.common.resources.ResourceManager; import static net.sf.freecol.common.util.CollectionUtils.*; -import net.sf.freecol.common.util.CollectionUtils.Accumulator; /** @@ -101,21 +95,18 @@ public final class ReportCompactColonyPanel extends ReportPanel CONSUMPTION, // Positive production but could consume more }; - public static Accumulator goodsProductionAccumulator - = new Accumulator() { - public GoodsProduction accumulate(GoodsProduction g1, - GoodsProduction g2) { - g1.amount += g2.amount; - g1.status = (g1.status == ProductionStatus.NONE - && g2.status == ProductionStatus.NONE) - ? ProductionStatus.NONE - : (g1.amount < 0) ? ProductionStatus.BAD - : (g1.amount > 0) ? ProductionStatus.GOOD - : ProductionStatus.ZERO; - g1.extra = 0; - return g1; - } - }; + public static BinaryOperator goodsProductionAccumulator + = (g1, g2) -> { + g1.amount += g2.amount; + g1.status = (g1.status == ProductionStatus.NONE + && g2.status == ProductionStatus.NONE) + ? ProductionStatus.NONE + : (g1.amount < 0) ? ProductionStatus.BAD + : (g1.amount > 0) ? ProductionStatus.GOOD + : ProductionStatus.ZERO; + g1.extra = 0; + return g1; + }; /** Container class for goods production. */ public static class GoodsProduction { @@ -125,7 +116,7 @@ public final class ReportCompactColonyPanel extends ReportPanel public int extra; public GoodsProduction(int amount, ProductionStatus status, - int extra) { + int extra) { this.amount = amount; this.status = status; this.extra = extra; @@ -472,7 +463,7 @@ public final class ReportCompactColonyPanel extends ReportPanel } private JLabel newLabel(String h, ImageIcon i, Color c, StringTemplate t) { - h = (h != null && Messages.containsKey(h)) ? Messages.message(h) : ""; + if (h != null && Messages.containsKey(h)) h = Messages.message(h); JLabel l = newLabel(h, i, c); if (t != null) Utility.localizeToolTip(l, t); return l; @@ -508,6 +499,8 @@ public final class ReportCompactColonyPanel extends ReportPanel */ private void updateColony(ColonySummary s) { final String cac = s.colony.getId(); + final UnitType defaultUnitType + = spec.getDefaultUnitType(s.colony.getOwner()); List buttons = new ArrayList<>(); JButton b; Color c; @@ -580,17 +573,27 @@ public final class ReportCompactColonyPanel extends ReportPanel } if (n > 0) { c = cAlarm; - // TODO-post-0.11.4-release: temporary hack until 0.11.4-release - String key = ("model.improvement.plow".equals(ti.getId()) - || "model.improvement.clearForest".equals(ti.getId())) - ? "report.colony.plowing" - : ("model.improvement.road".equals(ti.getId())) - ? "report.colony.roadBuilding" - : null; - t = (key == null) ? null : stpld(key) - .addName("%colony%", s.colony.getName()) - .addAmount("%amount%", n); - // end temporary hack + if (n == 1) { + TileImprovementSuggestion tis = s.tileSuggestions.get(0); + for (Unit u : tis.tile.getUnitList()) { + if (u.getState() == Unit.UnitState.IMPROVING + && u.getWorkImprovement() != null + && u.getWorkImprovement().getType() + == tis.tileImprovementType) { + c = cWarn; // Work is underway + break; + } + } + t = stpld("report.colony.tile." + ti.getSuffix() + + ".specific") + .addName("%colony%", s.colony.getName()) + .addStringTemplate("%location%", + tis.tile.getColonyTileLocationLabel(s.colony)); + } else { + t = stpld("report.colony.tile." + ti.getSuffix()) + .addName("%colony%", s.colony.getName()) + .addAmount("%amount%", n); + } b = newButton(cac, Integer.toString(n), null, c, t); if (center) b.setFont(b.getFont().deriveFont(Font.BOLD)); } else { @@ -667,17 +670,19 @@ public final class ReportCompactColonyPanel extends ReportPanel break; case PRODUCTION: c = cWarn; - t = stpld("report.colony.production") + t = stpld("report.colony.production.maxProduction") .addName("%colony%", s.colony.getName()) .addNamed("%goods%", gt) - .addAmount("%amount%", gp.amount); + .addAmount("%amount%", gp.amount) + .addAmount("%more%", gp.extra); break; case CONSUMPTION: c = cWarn; - t = stpld("report.colony.production") + t = stpld("report.colony.production.maxConsumption") .addName("%colony%", s.colony.getName()) .addNamed("%goods%", gt) - .addAmount("%amount%", gp.amount); + .addAmount("%amount%", gp.amount) + .addAmount("%more%", gp.extra); break; default: throw new IllegalStateException("Bogus status: " + gp.status); @@ -692,8 +697,7 @@ public final class ReportCompactColonyPanel extends ReportPanel if (s.newColonist > 0) { t = stpld("report.colony.arriving") .addName("%colony%", s.colony.getName()) - .addNamed("%unit%", - spec.getDefaultUnitType(s.colony.getOwner())) + .addNamed("%unit%", defaultUnitType) .addAmount("%turns%", s.newColonist); b = newButton(cac, Integer.toString(s.newColonist), null, cGood, t); @@ -747,8 +751,13 @@ public final class ReportCompactColonyPanel extends ReportPanel buttons.add(b); } - // Field: What is being trained. + // Field: What is being trained, including shadow units for vacant + // places. // Colour: cAlarm if completion is blocked, otherwise cPlain. + int empty = 0; + Building school = s.colony.getWorkLocationWithAbility(Ability.TEACH, + Building.class); + if (school != null) empty = school.getType().getWorkPlaces(); for (Entry e : mapEntriesByValue(s.teachers, descendingIntegerComparator)) { Unit u = e.getKey(); @@ -770,6 +779,18 @@ public final class ReportCompactColonyPanel extends ReportPanel cPlain, t); } buttons.add(b); + empty--; + } + + if (empty > 0) { + final ImageIcon emptyIcon + = new ImageIcon(this.lib.getTinyUnitImage(defaultUnitType, true)); + t = stpld("report.colony.making.educationVacancy") + .addName("%colony%", s.colony.getName()) + .addAmount("%number%", empty); + for (; empty > 0; empty--) { + buttons.add(newButton(cac, "", emptyIcon, cPlain, t)); + } } addTogether(buttons); @@ -814,12 +835,16 @@ public final class ReportCompactColonyPanel extends ReportPanel ? stpld("report.colony.wanting") .addName("%colony%", colony.getName()) .addNamed("%unit%", type) + .addStringTemplate("%location%", + suggestion.workLocation.getLabel()) .addNamed("%goods%", suggestion.goodsType) .addAmount("%amount%", suggestion.amount) : stpld("report.colony.improving") .addName("%colony%", colony.getName()) .addNamed("%oldUnit%", suggestion.oldType) .addNamed("%unit%", type) + .addStringTemplate("%location%", + suggestion.workLocation.getLabel()) .addNamed("%goods%", suggestion.goodsType) .addAmount("%amount%", suggestion.amount); JButton b = newButton(cac, label, icon, @@ -891,13 +916,15 @@ public final class ReportCompactColonyPanel extends ReportPanel // Colour: Plain t = mapEntriesByValue(rRegionMap, descendingIntegerComparator) .get(0).getKey().getLabel(); - reportPanel.add(newLabel(Messages.message(t), null, cPlain, null), + reportPanel.add(newLabel(Messages.message(t), null, cPlain, + stpld("report.colony.name.summary")), "newline"); // Field: The total of the size change field. // Colour: cGood if efficient/cAlarm if inefficient. reportPanel.add(newLabel(Integer.toString(rSizeChange), null, - (rSizeChange < 0) ? cAlarm : cGood, null)); + (rSizeChange < 0) ? cAlarm : cGood, + stpld("report.colony.growing.summary"))); // Field: The number of potential colony tiles that need // exploring. @@ -909,7 +936,8 @@ public final class ReportCompactColonyPanel extends ReportPanel } } reportPanel.add((tiles.isEmpty()) ? new JLabel() - : newLabel(Integer.toString(tiles.size()), null, cAlarm, null)); + : newLabel(Integer.toString(tiles.size()), null, cAlarm, + stpld("report.colony.exploring.summary"))); // Fields: The number of existing colony tiles that would // benefit from improvements. @@ -924,7 +952,9 @@ public final class ReportCompactColonyPanel extends ReportPanel } } reportPanel.add((tiles.isEmpty()) ? new JLabel() - : newLabel(Integer.toString(tiles.size()), null, cAlarm, null)); + : newLabel(Integer.toString(tiles.size()), null, cAlarm, + stpld("report.colony.tile." + ti.getSuffix() + + ".summary"))); } // Fields: The net production of each storable+non-trade-goods @@ -950,13 +980,16 @@ public final class ReportCompactColonyPanel extends ReportPanel throw new IllegalStateException("Bogus status: " + gp.status); } reportPanel.add((c == null) ? new JLabel() - : newLabel(Integer.toString(gp.amount), null, c, null)); + : newLabel(Integer.toString(gp.amount), null, c, + stpld("report.colony.production.summary") + .addNamed("%goods%", gt))); } // Field: New colonist arrival or famine warning. // Colour: cWarn if negative, else cGood reportPanel.add(newLabel(Integer.toString((int)rNewColonist), null, - (rNewColonist < 0) ? cWarn : cGood, null)); + (rNewColonist < 0) ? cWarn : cGood, + stpld("report.colony.arriving.summary"))); // Field: The required goods rates. // Colour: cPlain @@ -965,18 +998,22 @@ public final class ReportCompactColonyPanel extends ReportPanel : mapEntriesByValue(rNeeded, descendingDoubleComparator)) { labels.add(newLabel(String.format("%4.1f %s", e.getValue(), Messages.getName(e.getKey())), - null, cPlain, null)); + null, cPlain, + stpld("report.colony.making.summary") + .addNamed("%goods%", e.getKey()))); } // Field: What is being trained (attached to previous) // Colour: cPlain. teacherLen = Math.max(3, teacherLen); // Always some room here - labels.addAll(unitTypeLabels(rTeachers, teacherLen, null)); + labels.addAll(unitTypeLabels(rTeachers, teacherLen, + stpld("report.colony.making.educating.summary"))); addTogether(labels); // Field: The units that could be upgraded, followed by the units // that could be added. - addTogether(unitTypeLabels(rImprove, improveLen, null)); + addTogether(unitTypeLabels(rImprove, improveLen, + stpld("report.colony.improving.summary"))); } private List unitTypeLabels(Map unitTypeMap, @@ -988,7 +1025,7 @@ public final class ReportCompactColonyPanel extends ReportPanel ImageIcon icon = new ImageIcon(this.lib.getTinyUnitImage(e.getKey(), false)); result.add(newLabel(Integer.toString(e.getValue()), icon, - cPlain, t)); + cPlain, t)); if (++n >= maxSize) break; } @@ -1014,13 +1051,7 @@ public final class ReportCompactColonyPanel extends ReportPanel stpld("report.colony.explore"))); for (TileImprovementType ti : this.spec.getTileImprovementTypeList()) { if (ti.isNatural()) continue; - // TODO-post-0.11.4-release: temporary hack until 0.11.4-release - String key = (("model.improvement.plow".equals(ti.getId())) - ? "report.colony.plow" - : ("model.improvement.road".equals(ti.getId())) - ? "report.colony.road" - : null) + ".header"; - // end temporary hack + String key = "report.colony.tile." + ti.getSuffix() + ".header"; reportPanel.add(newLabel(key, null, null, stpld(key))); } for (GoodsType gt : this.goodsTypes) { @@ -1082,34 +1113,24 @@ public final class ReportCompactColonyPanel extends ReportPanel * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { + public void actionPerformed(ActionEvent ae) { final Game game = getGame(); - String command = event.getActionCommand(); + String command = ae.getActionCommand(); if (command.startsWith(BUILDQUEUE)) { command = command.substring(BUILDQUEUE.length()); Colony colony = game.getFreeColGameObject(command, Colony.class); if (colony != null) { - getGUI().showBuildQueuePanel(colony, new Runnable() { - @Override - public void run() { - update(); - } - }); + getGUI().showBuildQueuePanel(colony, () -> { update(); }); return; } } else { Colony colony = game.getFreeColGameObject(command, Colony.class); if (colony != null) { - getGUI().showColonyPanel(colony, null) - .addClosingCallback(new Runnable() { - @Override - public void run() { - update(); - } - }); + getGUI().showColonyPanel2(colony, null) + .addClosingCallback(() -> { update(); }); return; } } - super.actionPerformed(event); + super.actionPerformed(ae); } } diff --git a/src/net/sf/freecol/client/gui/panel/ReportContinentalCongressPanel.java b/src/net/sf/freecol/client/gui/panel/ReportContinentalCongressPanel.java index d9fe12fde..06b7aad17 100644 --- a/src/net/sf/freecol/client/gui/panel/ReportContinentalCongressPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ReportContinentalCongressPanel.java @@ -36,7 +36,6 @@ import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.gui.ImageLibrary; import net.sf.freecol.common.debug.FreeColDebugger; import net.sf.freecol.common.i18n.Messages; -import net.sf.freecol.common.model.Colony; import net.sf.freecol.common.model.FoundingFather; import net.sf.freecol.common.model.FoundingFather.FoundingFatherType; import net.sf.freecol.common.model.GoodsType; @@ -84,10 +83,8 @@ public final class ReportContinentalCongressPanel extends ReportPanel { Messages.getDescription(currentFather)); recruitingPanel.add(currentFatherLabel); for (GoodsType gt : getSpecification().getLibertyGoodsTypeList()) { - int total = 0; - for (Colony colony : player.getColonies()) { - total += colony.getNetProductionOf(gt); - } + int total = player.getColonies().stream() + .mapToInt(c -> c.getNetProductionOf(gt)).sum(); FreeColProgressBar progressBar = new FreeColProgressBar(gt, 0, player.getTotalFoundingFatherCost(), player.getLiberty(), total); diff --git a/src/net/sf/freecol/client/gui/panel/ReportExplorationPanel.java b/src/net/sf/freecol/client/gui/panel/ReportExplorationPanel.java index fefe8501a..af38a1059 100644 --- a/src/net/sf/freecol/client/gui/panel/ReportExplorationPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ReportExplorationPanel.java @@ -78,7 +78,7 @@ public final class ReportExplorationPanel extends ReportPanel { * Header Row */ Font font = FontLibrary.createFont(FontLibrary.FontType.NORMAL, - FontLibrary.FontSize.TINY, Font.BOLD, getImageLibrary().getScalingFactor()); + FontLibrary.FontSize.TINY, Font.BOLD, getImageLibrary().getScaleFactor()); JLabel nameOfRegion = Utility.localizedLabel("report.exploration.nameOfRegion"); nameOfRegion.setFont(font); reportPanel.add(nameOfRegion); @@ -106,7 +106,7 @@ public final class ReportExplorationPanel extends ReportPanel { reportPanel.add(Utility.localizedLabel(region.getDiscoveredIn() .getLabel())); reportPanel.add(Utility.localizedLabel(region.getDiscoveredBy() - .getNationName())); + .getCountryLabel())); reportPanel.add(new JLabel(String.valueOf(region.getScoreValue()))); } } diff --git a/src/net/sf/freecol/client/gui/panel/ReportForeignAffairPanel.java b/src/net/sf/freecol/client/gui/panel/ReportForeignAffairPanel.java index 723f585df..0ab8b3245 100644 --- a/src/net/sf/freecol/client/gui/panel/ReportForeignAffairPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ReportForeignAffairPanel.java @@ -52,7 +52,7 @@ public final class ReportForeignAffairPanel extends ReportPanel { final ImageLibrary lib = freeColClient.getGUI().getImageLibrary(); final Font font = FontLibrary.createFont(FontLibrary.FontType.NORMAL, - FontLibrary.FontSize.SMALL, Font.BOLD, lib.getScalingFactor()); + FontLibrary.FontSize.SMALL, Font.BOLD, lib.getScaleFactor()); final String stance = Messages.message( StringTemplate.key("report.foreignAffair.stance")); final String numberOfColonies = Messages.message( @@ -83,13 +83,13 @@ public final class ReportForeignAffairPanel extends ReportPanel { if (ns == null) continue; JPanel enemyPanel = new MigPanel(new MigLayout("gapy 0", - "[][]20[align right]0[]", "")); + "[][]20[align right]0[]", "")); enemyPanel.setOpaque(false); final Image coatOfArms = lib.getMiscIconImage(enemy.getNation()); JLabel coatLabel = new JLabel(new ImageIcon(coatOfArms)); enemyPanel.add(coatLabel, "spany, aligny top"); - JLabel label = Utility.localizedLabel(enemy.getNationName()); + JLabel label = Utility.localizedLabel(enemy.getCountryLabel()); label.setFont(font); enemyPanel.add(label, "wrap 12"); diff --git a/src/net/sf/freecol/client/gui/panel/ReportHighScoresPanel.java b/src/net/sf/freecol/client/gui/panel/ReportHighScoresPanel.java index dd1e2d4e6..268462af0 100644 --- a/src/net/sf/freecol/client/gui/panel/ReportHighScoresPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ReportHighScoresPanel.java @@ -24,6 +24,8 @@ import java.text.DateFormat; import java.util.List; import javax.swing.JLabel; +import javax.swing.SwingConstants; + import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; @@ -72,8 +74,8 @@ public final class ReportHighScoresPanel extends ReportPanel { StringTemplate template = StringTemplate.template(messageId) .addName("%name%", highScore.getPlayerName()) .addName("%nation%", highScore.getNewLandName()); - JLabel headline = Utility.localizedLabel(template); - headline.setFont(font); + JLabel headline = Utility.localizedHeaderLabel(template, + SwingConstants.LEADING, FontLibrary.FontSize.SMALL); reportPanel.add(headline, "span, wrap 10"); @@ -102,7 +104,7 @@ public final class ReportHighScoresPanel extends ReportPanel { reportPanel.add(Utility.localizedLabel("report.highScores.nation"), "skip"); reportPanel.add(Utility.localizedLabel((highScore.getIndependenceTurn() > 0) - ? StringTemplate.name(highScore.getNationName()) + ? StringTemplate.name(highScore.getNationLabel()) : StringTemplate.key(highScore.getOldNationNameKey()))); reportPanel.add(Utility.localizedLabel("report.highScores.nationType"), diff --git a/src/net/sf/freecol/client/gui/panel/ReportIndianPanel.java b/src/net/sf/freecol/client/gui/panel/ReportIndianPanel.java index 1cb2d9960..ebeab91ea 100644 --- a/src/net/sf/freecol/client/gui/panel/ReportIndianPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ReportIndianPanel.java @@ -101,15 +101,15 @@ public final class ReportIndianPanel extends ReportPanel { JLabel villageLabel = new JLabel(); villageLabel.setIcon(new ImageIcon(ImageLibrary.getSettlementImage( opponent.getNationType().getCapitalType(), - lib.getScalingFactor()))); + lib.getScaleFactor()))); reportPanel.add(villageLabel, "span, split 2"); - JLabel headline = Utility.localizedLabel(opponent.getNationName()); + JLabel headline = Utility.localizedLabel(opponent.getNationLabel()); headline.setFont(FontLibrary.createFont(FontLibrary.FontType.NORMAL, - FontLibrary.FontSize.SMALL, Font.BOLD, lib.getScalingFactor())); + FontLibrary.FontSize.SMALL, Font.BOLD, lib.getScaleFactor())); reportPanel.add(headline, "wrap 20, aligny center"); JLabel label = Utility.localizedLabel("report.indian.chieftain"); Font font = FontLibrary.createFont(FontLibrary.FontType.NORMAL, - FontLibrary.FontSize.TINY, Font.BOLD, lib.getScalingFactor()); + FontLibrary.FontSize.TINY, Font.BOLD, lib.getScaleFactor()); label.setFont(font); reportPanel.add(label); reportPanel.add(Utility.localizedLabel(opponent.getName()), "left, wrap"); diff --git a/src/net/sf/freecol/client/gui/panel/ReportLabourPanel.java b/src/net/sf/freecol/client/gui/panel/ReportLabourPanel.java index 89cbdf5a8..363cd3f9e 100644 --- a/src/net/sf/freecol/client/gui/panel/ReportLabourPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ReportLabourPanel.java @@ -173,13 +173,13 @@ public final class ReportLabourPanel extends ReportPanel { } Action selectAction = new AbstractAction() { @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { showDetails(); } }; Action quitAction = new AbstractAction() { @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent ae) { getGUI().removeFromCanvas(ReportLabourPanel.this); } }; @@ -223,10 +223,10 @@ public final class ReportLabourPanel extends ReportPanel { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - String command = event.getActionCommand(); + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); if (OK.equals(command)) { - super.actionPerformed(event); + super.actionPerformed(ae); } else { UnitType unitType = getSpecification().getUnitType(command); getGUI().showReportLabourDetailPanel(unitType, this.data, diff --git a/src/net/sf/freecol/client/gui/panel/ReportPanel.java b/src/net/sf/freecol/client/gui/panel/ReportPanel.java index 6e758eabe..74a5af9ff 100644 --- a/src/net/sf/freecol/client/gui/panel/ReportPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ReportPanel.java @@ -31,17 +31,15 @@ import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; + import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.AbstractUnit; -import net.sf.freecol.common.model.Colony; import net.sf.freecol.common.model.Europe; import net.sf.freecol.common.model.FreeColGameObject; -import net.sf.freecol.common.model.IndianSettlement; import net.sf.freecol.common.model.Map; -import net.sf.freecol.common.model.Tile; import net.sf.freecol.common.model.Unit; import net.sf.freecol.common.model.UnitType; @@ -53,20 +51,6 @@ public class ReportPanel extends FreeColPanel { protected static final Logger logger = Logger.getLogger(ReportPanel.class.getName()); - private static final Comparator unitTypeComparator - = new Comparator() { - @Override - public int compare(Unit unit1, Unit unit2) { - int deltaType = unit2.getType().compareTo(unit1.getType()); - if (deltaType == 0) { - return (unit2.getRole() == null) ? -1 - : unit2.getRole().getId().compareTo(unit1.getRole().getId()); - } else { - return deltaType; - } - } - }; - protected final JPanel reportPanel; protected final JLabel header; @@ -98,7 +82,7 @@ public class ReportPanel extends FreeColPanel { add(scrollPane, "cell 0 1, height 100%, width 100%"); add(okButton, "cell 0 2, tag ok"); - float scale = getImageLibrary().getScalingFactor(); + float scale = getImageLibrary().getScaleFactor(); getGUI().restoreSavedSize(this, 200 + (int)(scale*850), 200 + (int)(scale*525)); } @@ -111,15 +95,6 @@ public class ReportPanel extends FreeColPanel { reportPanel.doLayout(); } - /** - * Returns a unit type comparator. - * - * @return A unit type comparator. - */ - public static Comparator getUnitTypeComparator() { - return unitTypeComparator; - } - private Border createBorder() { return new EmptyBorder(20, 20, 20, 20); } @@ -162,8 +137,8 @@ public class ReportPanel extends FreeColPanel { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - final String command = event.getActionCommand(); + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); if (OK.equals(command)) { getGUI().removeFromCanvas(this); } else { diff --git a/src/net/sf/freecol/client/gui/panel/ReportProductionPanel.java b/src/net/sf/freecol/client/gui/panel/ReportProductionPanel.java index 2455af1ea..ee94c0dfc 100644 --- a/src/net/sf/freecol/client/gui/panel/ReportProductionPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ReportProductionPanel.java @@ -20,7 +20,6 @@ package net.sf.freecol.client.gui.panel; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; @@ -93,11 +92,8 @@ public final class ReportProductionPanel extends ReportPanel { reportPanel.add(selectLabel); JButton selectButton = Utility.localizedButton("report.production.update"); - selectButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - update(); - } + selectButton.addActionListener((ActionEvent ae) -> { + update(); }); reportPanel.add(selectButton, "wrap"); diff --git a/src/net/sf/freecol/client/gui/panel/ReportReligiousPanel.java b/src/net/sf/freecol/client/gui/panel/ReportReligiousPanel.java index 4edb797ab..c12ec5611 100644 --- a/src/net/sf/freecol/client/gui/panel/ReportReligiousPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ReportReligiousPanel.java @@ -49,7 +49,7 @@ public final class ReportReligiousPanel extends ReportPanel { final Font font = FontLibrary.createFont(FontLibrary.FontType.NORMAL, FontLibrary.FontSize.SMALLER, Font.BOLD, - freeColClient.getGUI().getImageLibrary().getScalingFactor()); + freeColClient.getGUI().getImageLibrary().getScaleFactor()); final Player player = getMyPlayer(); final Specification spec = getSpecification(); diff --git a/src/net/sf/freecol/client/gui/panel/ReportRequirementsPanel.java b/src/net/sf/freecol/client/gui/panel/ReportRequirementsPanel.java index d365becfb..8f516feec 100644 --- a/src/net/sf/freecol/client/gui/panel/ReportRequirementsPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ReportRequirementsPanel.java @@ -32,6 +32,7 @@ import javax.swing.JButton; import javax.swing.JTextPane; import javax.swing.text.StyleConstants; import javax.swing.text.StyledDocument; + import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; @@ -43,7 +44,6 @@ import net.sf.freecol.common.model.Colony; import net.sf.freecol.common.model.Colony.TileImprovementSuggestion; import net.sf.freecol.common.model.ColonyTile; import net.sf.freecol.common.model.GoodsType; -import net.sf.freecol.common.model.Direction; import net.sf.freecol.common.model.ProductionInfo; import net.sf.freecol.common.model.Specification; import net.sf.freecol.common.model.StringTemplate; @@ -190,20 +190,16 @@ public final class ReportRequirementsPanel extends ReportPanel { List tileSuggestions = colony.getTileImprovementSuggestions(); for (TileImprovementSuggestion tis : tileSuggestions) { - // TODO-post-0.11.4-release: temporary hack until 0.11.4-release - String key = (tis.isExploration()) - ? "report.requirements.exploreTile" - : ("model.improvement.plow".equals(tis.tileImprovementType.getId())) - ? ((tis.tile == colony.getTile()) - ? "report.requirements.plowCenter" - : "report.requirements.plowTile") - : ("model.improvement.clearForest".equals(tis.tileImprovementType.getId())) - ? "report.requirements.clearTile" - : ("model.improvement.road".equals(tis.tileImprovementType.getId())) - ? "report.requirements.roadTile" - : null; - // end temporary hack - addTileWarning(doc, colony, key, tis.tile); + if (tis.tileImprovementType == null) { + addTileWarning(doc, colony, "report.requirements.exploreTile", + tis.tile); + } else { + String key = "report.requirements.tile." + + tis.tileImprovementType.getSuffix(); + if (Messages.containsKey(key)) { + addTileWarning(doc, colony, key, tis.tile); + } + } } if (tileSuggestions.isEmpty() @@ -223,12 +219,9 @@ public final class ReportRequirementsPanel extends ReportPanel { private void addTileWarning(StyledDocument doc, Colony colony, String messageId, Tile tile) { if (messageId == null || !Messages.containsKey(messageId)) return; - // TODO-post-0.11.4-release: migrate to using Tile.getColonyTileLocationLabel() - Direction direction = colony.getTile().getDirection(tile); StringTemplate t = StringTemplate.template(messageId) - .addNamed("%type%", tile.getType()) - .addName("%colony%", colony.getName()); - if (direction != null) t.addNamed("%direction%", direction); + .addStringTemplate("%location%", + tile.getColonyTileLocationLabel(colony)); try { doc.insertString(doc.getLength(), "\n\n" + Messages.message(t), doc.getStyle("regular")); @@ -237,7 +230,8 @@ public final class ReportRequirementsPanel extends ReportPanel { } } - private void addBadAssignmentWarning(StyledDocument doc, Colony colony, Unit expert, Unit nonExpert) { + private void addBadAssignmentWarning(StyledDocument doc, Colony colony, + Unit expert, Unit nonExpert) { GoodsType expertGoods = expert.getWorkType(); GoodsType nonExpertGoods = nonExpert.getWorkType(); String colonyName = colony.getName(); @@ -260,7 +254,8 @@ public final class ReportRequirementsPanel extends ReportPanel { } } - private void addExpertWarning(StyledDocument doc, Colony c, GoodsType goodsType, UnitType workType) { + private void addExpertWarning(StyledDocument doc, Colony c, + GoodsType goodsType, UnitType workType) { String newMessage = Messages.message(StringTemplate .template("report.requirements.noExpert") .addName("%colony%", c.getName()) @@ -391,11 +386,11 @@ public final class ReportRequirementsPanel extends ReportPanel { } private JButton createColonyButton(Colony colony, String info, boolean headline) { - JButton button = Utility.getLinkButton(colony.getName() + info, null, - colony.getId()); + String text = colony.getName() + info; + JButton button = Utility.getLinkButton(text, null, colony.getId()); if (headline) { - button.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - FontLibrary.FontSize.SMALL)); + button.setFont(FontLibrary.createCompatibleFont(text, + FontLibrary.FontType.HEADER, FontLibrary.FontSize.SMALL)); } button.addActionListener(this); return button; diff --git a/src/net/sf/freecol/client/gui/panel/ReportTradePanel.java b/src/net/sf/freecol/client/gui/panel/ReportTradePanel.java index 5df300d83..1e730b555 100644 --- a/src/net/sf/freecol/client/gui/panel/ReportTradePanel.java +++ b/src/net/sf/freecol/client/gui/panel/ReportTradePanel.java @@ -27,7 +27,6 @@ import java.util.List; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; -import javax.swing.SwingConstants; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; @@ -87,7 +86,7 @@ public final class ReportTradePanel extends ReportPanel { String layoutConstraints = "insets 0, gap 0 0"; String columnConstraints = "[25%!, fill][" - + Math.round(lib.getScalingFactor() + + Math.round(lib.getScaleFactor() * (ImageLibrary.ICON_SIZE.width * 1.25f)) + "!, fill]"; String rowConstraints = "[fill]"; @@ -176,6 +175,13 @@ public final class ReportTradePanel extends ReportPanel { : Utility.CELLBORDER); goodsLabel.setForeground(GoodsLabel.getColor(goodsType, amount, colony)); + ExportData ed = colony.getExportData(goodsType); + if (ed.getExported()) { + goodsLabel.setToolTipText(Messages.message(StringTemplate + .template("report.trade.export") + .addNamed("%goods%", goodsType) + .addAmount("%amount%", ed.getExportLevel()))); + } reportPanel.add(goodsLabel, "cell " + column + " " + row); int production = colony.getNetProductionOf(goodsType); @@ -216,7 +222,7 @@ public final class ReportTradePanel extends ReportPanel { } private JLabel createLeftLabel(String key) { - JLabel result = Utility.localizedLabel(key, JLabel.LEADING); + JLabel result = Utility.localizedLabel(key); result.setBorder(Utility.LEFTCELLBORDER); return result; } diff --git a/src/net/sf/freecol/client/gui/panel/ReportTurnPanel.java b/src/net/sf/freecol/client/gui/panel/ReportTurnPanel.java index 7a0c24782..45868da3f 100644 --- a/src/net/sf/freecol/client/gui/panel/ReportTurnPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ReportTurnPanel.java @@ -19,9 +19,9 @@ package net.sf.freecol.client.gui.panel; +import java.awt.Font; import java.awt.Image; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.util.Collections; import java.util.Comparator; import java.util.Hashtable; @@ -38,6 +38,7 @@ import javax.swing.JTextPane; import javax.swing.text.BadLocationException; import javax.swing.text.StyleConstants; import javax.swing.text.StyledDocument; + import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.ClientOptions; @@ -50,12 +51,10 @@ import net.sf.freecol.common.model.Europe; import net.sf.freecol.common.model.FreeColGameObject; import net.sf.freecol.common.model.FreeColObject; import net.sf.freecol.common.model.Game; -import net.sf.freecol.common.model.Location; import net.sf.freecol.common.model.Market; import net.sf.freecol.common.model.ModelMessage; import net.sf.freecol.common.model.Nameable; import net.sf.freecol.common.model.Player; -import net.sf.freecol.common.model.Settlement; import net.sf.freecol.common.model.StringTemplate; import net.sf.freecol.common.model.Tile; import net.sf.freecol.common.model.Unit; @@ -124,15 +123,14 @@ public final class ReportTurnPanel extends ReportPanel { FreeColGameObject messageSource = game.getMessageSource(message); if (messageSource != source) { source = messageSource; - reportPanel.add(getHeadline(source), "newline 20, skip"); + reportPanel.add(getHeadline(messageSource), "newline 20, skip"); } break; case ClientOptions.MESSAGES_GROUP_BY_TYPE: if (message.getMessageType() != type) { type = message.getMessageType(); - JLabel headline = Utility.localizedLabel(message.getMessageType()); - headline.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - FontLibrary.FontSize.SMALL)); + JLabel headline = Utility.localizedHeaderLabel( + message.getMessageType(), FontLibrary.FontSize.SMALL); reportPanel.add(headline, "newline 20, skip, span"); } break; @@ -142,19 +140,19 @@ public final class ReportTurnPanel extends ReportPanel { JComponent component = new JLabel(); FreeColObject messageDisplay = game.getMessageDisplay(message); + final ImageLibrary lib = getImageLibrary(); if (messageDisplay != null) { - Image image = getImageLibrary().getObjectImage(messageDisplay, 1f); + Image image = lib.getObjectImage(messageDisplay, 1f); ImageIcon icon = (image == null) ? null : new ImageIcon(image); - if (messageDisplay instanceof Colony || messageDisplay instanceof Europe) { JButton button = Utility.getLinkButton(null, icon, - messageDisplay.getId()); + messageDisplay.getId()); button.addActionListener(this); component = button; } else if (messageDisplay instanceof Unit) { JButton button = Utility.getLinkButton(null, icon, - upLoc(((Unit)messageDisplay).getLocation()).getId()); + ((Unit)messageDisplay).up().getId()); button.addActionListener(this); component = button; } else { // includes Player @@ -165,8 +163,12 @@ public final class ReportTurnPanel extends ReportPanel { reportPanel.add(component, "newline"); final JTextPane textPane = Utility.getDefaultTextPane(); - insertMessage(textPane.getStyledDocument(), message, - getMyPlayer()); + try { + insertMessage(textPane.getStyledDocument(), message, + getMyPlayer()); + } catch (BadLocationException ble) { + logger.log(Level.WARNING, "message insert fail", ble); + } reportPanel.add(textPane); boolean ignore = false; @@ -177,14 +179,11 @@ public final class ReportTurnPanel extends ReportPanel { Utility.localizeToolTip(ignoreButton, StringTemplate.copy("report.turn.ignore", message)); final ModelMessage m = message; - ignoreButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - boolean flag = label.isEnabled(); - igc().ignoreMessage(m, flag); - textPane.setEnabled(!flag); - label.setEnabled(!flag); - } + ignoreButton.addActionListener((ActionEvent ae) -> { + boolean flag = label.isEnabled(); + igc().ignoreMessage(m, flag); + textPane.setEnabled(!flag); + label.setEnabled(!flag); }); reportPanel.add(ignoreButton); ignore = true; @@ -214,18 +213,12 @@ public final class ReportTurnPanel extends ReportPanel { .template("report.turn.filter") .addNamed("%type%", message.getMessageType())); final ModelMessage m = message; - filterButton.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent event) { - boolean flag = filterOption.getValue(); - filterOption.setValue(!flag); - //textPane.setEnabled(!flag); - //label.setEnabled(!flag); - - setEnabledByType(m.getMessageType(), !flag); - } - + filterButton.addActionListener((ActionEvent ae) -> { + boolean flag = filterOption.getValue(); + filterOption.setValue(!flag); + //textPane.setEnabled(!flag); + //label.setEnabled(!flag); + setEnabledByType(m.getMessageType(), !flag); }); if (ignore) { reportPanel.add(filterButton); @@ -250,184 +243,77 @@ public final class ReportTurnPanel extends ReportPanel { } } - private JComponent getHeadline(Object source) { - JComponent headline; + private JComponent getHeadline(FreeColGameObject source) { + String text; + String commandId = null; if (source == null) { - return new JLabel(); + text = ""; } else if (source instanceof Player) { Player player = (Player) source; - headline = Utility.localizedLabel(StringTemplate + StringTemplate template = StringTemplate .template("report.turn.playerNation") .addName("%player%", player.getName()) - .addStringTemplate("%nation%", player.getNationName())); + .addStringTemplate("%nation%", player.getNationLabel()); + text = Messages.message(template); } else if (source instanceof Europe) { Europe europe = (Europe) source; - JButton button = new JButton(Messages.getName(europe)); - button.addActionListener(this); - button.setActionCommand(europe.getId()); - headline = button; + text = Messages.getName(europe); + commandId = europe.getId(); } else if (source instanceof Market) { Market market = (Market) source; - JButton button = Utility.localizedButton(market.getOwner().getMarketName()); - button.addActionListener(this); - button.setActionCommand(getMyPlayer().getEurope().getId()); - headline = button; + StringTemplate template = market.getOwner().getMarketName(); + text = Messages.message(template); + commandId = getMyPlayer().getEurope().getId(); } else if (source instanceof Colony) { final Colony colony = (Colony) source; - JButton button = new JButton(colony.getName()); - button.addActionListener(this); - button.setActionCommand(colony.getId()); - headline = button; + text = colony.getName(); + commandId = colony.getId(); } else if (source instanceof Unit) { final Unit unit = (Unit) source; - JButton button - = new JButton(unit.getDescription(Unit.UnitLabelType.NATIONAL)); - button.addActionListener(this); - button.setActionCommand(unit.getLocation().getId()); - headline = button; + text = unit.getDescription(Unit.UnitLabelType.NATIONAL); + commandId = unit.getLocation().getId(); } else if (source instanceof Tile) { final Tile tile = (Tile) source; - JButton button = Utility.localizedButton(tile.getLocationLabelFor(getMyPlayer())); - button.addActionListener(this); - button.setActionCommand(tile.getId()); - headline = button; + StringTemplate template = tile.getLocationLabelFor(getMyPlayer()); + text = Messages.message(template); + commandId = tile.getId(); } else if (source instanceof Nameable) { - headline = new JLabel(((Nameable) source).getName()); + text = ((Nameable) source).getName(); } else { - headline = new JLabel(source.toString()); + text = source.toString(); } - headline.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - FontLibrary.FontSize.SMALL)); + Font font = FontLibrary.createCompatibleFont(text, + FontLibrary.FontType.HEADER, FontLibrary.FontSize.SMALL); + JComponent headline; + if(commandId != null) { + JButton button = new JButton(text); + button.addActionListener(this); + button.setActionCommand(commandId); + headline = button; + headline.setForeground(Utility.LINK_COLOR); + } else { + headline = new JLabel(text); + } + headline.setFont(font); headline.setOpaque(false); - headline.setForeground(Utility.LINK_COLOR); headline.setBorder(Utility.blankBorder(5, 0, 0, 0)); return headline; } private void insertMessage(StyledDocument document, ModelMessage message, - Player player) { - try { - String input = null; - String id = message.getId(); - if (id == null || id.equals(input = Messages.message(id))) { - // id not present, fallback to default - input = Messages.message(message.getDefaultId()); + Player player) throws BadLocationException { + for (Object o : message.splitLinks(player)) { + if (o instanceof String) { + document.insertString(document.getLength(), (String)o, + document.getStyle("regular")); + } else if (o instanceof JButton) { + JButton b = (JButton)o; + b.addActionListener(this); + StyleConstants.setComponent(document.getStyle("button"), b); + document.insertString(document.getLength(), " ", + document.getStyle("button")); } - int start = input.indexOf('%'); - if (start == -1) { - // no variables present - insertText(document, input); - return; - } else if (start > 0) { - // output any string before the first occurrence of '%' - insertText(document, input.substring(0, start)); - } - - int end; - while ((end = input.indexOf('%', start + 1)) >= 0) { - String var = input.substring(start, end + 1); - String item = Messages.message(message.getReplacement(var)); - FreeColGameObject messageSource = getFreeColClient().getGame() - .getMessageSource(message); - if (item != null) { - // found variable to replace - if ("%colony%".equals(var) || var.endsWith("Colony%")) { - Colony colony = player.getColonyByName(item); - if (colony != null) { - insertLinkButton(document, colony, item); - } else if (messageSource instanceof Tile) { - insertLinkButton(document, messageSource, item); - } else { - insertText(document, item); - } - } else if ("%europe%".equals(var) - || ("%market%".equals(var) && player.isColonial())) { - insertLinkButton(document, player.getEurope(), - Messages.getName(player.getEurope())); - } else if ("%unit%".equals(var) - || var.endsWith("Unit%") - || "%newName%".equals(var)) { - Tile tile = null; - if (messageSource instanceof Unit) { - tile = ((Unit)messageSource).getTile(); - } else if (messageSource instanceof Tile) { - tile = (Tile)messageSource; - } - if (tile != null) { - Settlement settlement = tile.getSettlement(); - if (settlement != null) { - insertLinkButton(document, settlement, item); - } else { - insertLinkButton(document, tile, item); - } - } else { - insertText(document, item); - } - } else if ("%location%".equals(var) - || var.endsWith("Location%")) { - if (messageSource instanceof Europe) { - insertLinkButton(document, player.getEurope(), - Messages.getName(player.getEurope())); - } else if (messageSource instanceof Location) { - Location loc = upLoc((Location)messageSource); - insertLinkButton(document, (FreeColGameObject)loc, - item); - } else { - insertText(document, item); - } - } else { - insertText(document, item); - } - start = end + 1; - } else { - // found no variable to replace: either a single '%', or - // some unnecessary variable - insertText(document, input.substring(start, end)); - start = end; - } - } - - // output any string after the last occurrence of '%' - if (start < input.length()) { - insertText(document, input.substring(start)); - } - - } catch (Exception e) { - logger.log(Level.WARNING, "Insert fail: " + message, e); } } - - private void insertText(StyledDocument document, String text) - throws BadLocationException { - document.insertString(document.getLength(), text, - document.getStyle("regular")); - } - - private void insertLinkButton(StyledDocument document, - FreeColGameObject object, String name) - throws BadLocationException { - JButton button = Utility.getLinkButton(name, null, object.getId()); - button.addActionListener(this); - StyleConstants.setComponent(document.getStyle("button"), button); - document.insertString(document.getLength(), " ", - document.getStyle("button")); - } - - public static Location upLoc(Location loc) { - if (loc instanceof Unit) loc = ((Unit)loc).getLocation(); - return (loc == null) ? null - : (loc.getSettlement() != null) ? loc.getSettlement() - : loc; - } - - // Interface ActionListener - - /** - * {@inheritDoc} - */ - @Override - public void actionPerformed(ActionEvent event) { - super.actionPerformed(event); - } } diff --git a/src/net/sf/freecol/client/gui/panel/ReportUnitPanel.java b/src/net/sf/freecol/client/gui/panel/ReportUnitPanel.java index 541ed74c1..277ab1dc7 100644 --- a/src/net/sf/freecol/client/gui/panel/ReportUnitPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ReportUnitPanel.java @@ -25,6 +25,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.stream.Collectors; import javax.swing.ImageIcon; import javax.swing.JButton; @@ -184,17 +185,18 @@ public abstract class ReportUnitPanel extends ReportPanel { if (unitList == null || unitList.isEmpty()) { reportPanel.add(Utility.localizedLabel("none"), "sg"); } else { - Collections.sort(unitList, ReportPanel.getUnitTypeComparator()); - for (Unit unit : unitList) { - JButton unitButton = getUnitButton(unit); - if (unit.isCarrier()) { + for (Unit u : unitList.stream() + .sorted(Unit.typeRoleComparator).collect(Collectors.toList())) { + JButton unitButton = getUnitButton(u); + if (u.isCarrier()) { reportPanel.add(unitButton, "newline, sg"); - for (Goods goods : unit.getGoodsList()) { + for (Goods goods : u.getGoodsList()) { GoodsLabel goodsLabel = new GoodsLabel(getGUI(), goods); reportPanel.add(goodsLabel); } - for (Unit unitLoaded : unit.getUnitList()) { - UnitLabel unitLoadedLabel = new UnitLabel(getFreeColClient(), unitLoaded, true); + for (Unit unitLoaded : u.getUnitList()) { + UnitLabel unitLoadedLabel + = new UnitLabel(getFreeColClient(), unitLoaded, true); reportPanel.add(unitLoadedLabel); } } else { diff --git a/src/net/sf/freecol/client/gui/panel/ResourcesDetailPanel.java b/src/net/sf/freecol/client/gui/panel/ResourcesDetailPanel.java index 4a7b302fb..e7a8b7dc9 100644 --- a/src/net/sf/freecol/client/gui/panel/ResourcesDetailPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ResourcesDetailPanel.java @@ -20,6 +20,7 @@ package net.sf.freecol.client.gui.panel; import java.util.ArrayList; +import java.util.stream.Collectors; import javax.swing.JButton; import javax.swing.JLabel; @@ -37,7 +38,7 @@ import net.sf.freecol.common.model.GoodsType; import net.sf.freecol.common.model.Modifier; import net.sf.freecol.common.model.ResourceType; import net.sf.freecol.common.model.Scope; - +import net.sf.freecol.common.model.Specification; import static net.sf.freecol.common.util.StringUtils.*; @@ -60,12 +61,10 @@ public class ResourcesDetailPanel } + // Implement ColopediaDetailPanel + /** - * Adds one or several subtrees for all the objects for which this - * ColopediaDetailPanel could build a detail panel to the given - * root node. - * - * @param root a DefaultMutableTreeNode + * {@inheritDoc} */ @Override public void addSubTrees(DefaultMutableTreeNode root) { @@ -73,24 +72,16 @@ public class ResourcesDetailPanel } /** - * Builds the details panel for the ResourceType with the given - * identifier. - * - * @param id The object identifier. - * @param panel the detail panel to build + * {@inheritDoc} */ @Override public void buildDetail(String id, JPanel panel) { - if (getId().equals(id)) { - return; - } + if (getId().equals(id)) return; ResourceType type = getSpecification().getResourceType(id); panel.setLayout(new MigLayout("wrap 2", "[]20[]")); - JLabel name = Utility.localizedLabel(type); - name.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - FontLibrary.FontSize.SMALL)); + JLabel name = Utility.localizedHeaderLabel(type, FontLibrary.FontSize.SMALL); panel.add(name, "span, align center, wrap 40"); panel.add(Utility.localizedLabel("colopedia.resource.bonusProduction")); @@ -99,17 +90,12 @@ public class ResourcesDetailPanel for (Modifier modifier : type.getModifiers()) { String text = ModifierFormat.getModifierAsString(modifier); if (modifier.hasScope()) { - ArrayList scopeStrings = new ArrayList<>(); - for (Scope scope : modifier.getScopes()) { - if (scope.getType() != null) { - FreeColGameObjectType fcgot = getSpecification() - .findType(scope.getType()); - scopeStrings.add(Messages.getName(fcgot)); - } - } - if (!scopeStrings.isEmpty()) { - text += " (" + join(", ", scopeStrings) + ")"; - } + final Specification spec = getSpecification(); + String scopeStrings = modifier.getScopes().stream() + .filter(s -> s.getType() != null) + .map(s -> Messages.getName(spec.findType(s.getType()))) + .collect(Collectors.joining(", ")); + if (!scopeStrings.isEmpty()) text += " (" + scopeStrings + ")"; } GoodsType goodsType = getSpecification().getGoodsType(modifier.getId()); @@ -123,5 +109,4 @@ public class ResourcesDetailPanel panel.add(Utility.localizedTextArea(Messages.descriptionKey(type), 30), "growx"); } - } diff --git a/src/net/sf/freecol/client/gui/panel/RiverStyleDialog.java b/src/net/sf/freecol/client/gui/panel/RiverStyleDialog.java index ccdcad0cb..389e5476e 100644 --- a/src/net/sf/freecol/client/gui/panel/RiverStyleDialog.java +++ b/src/net/sf/freecol/client/gui/panel/RiverStyleDialog.java @@ -19,15 +19,15 @@ package net.sf.freecol.client.gui.panel; -import javax.swing.ImageIcon; -import javax.swing.JPanel; - import java.util.List; import java.util.logging.Logger; +import javax.swing.ImageIcon; import javax.swing.JFrame; +import javax.swing.JPanel; import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.client.gui.ImageLibrary; import net.sf.freecol.common.resources.ResourceManager; diff --git a/src/net/sf/freecol/client/gui/panel/SaveDialog.java b/src/net/sf/freecol/client/gui/panel/SaveDialog.java index 2b2713de2..50402569e 100644 --- a/src/net/sf/freecol/client/gui/panel/SaveDialog.java +++ b/src/net/sf/freecol/client/gui/panel/SaveDialog.java @@ -20,18 +20,15 @@ package net.sf.freecol.client.gui.panel; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JFileChooser; -import javax.swing.filechooser.FileFilter; - import java.io.File; - import java.util.List; +import javax.swing.JFileChooser; import javax.swing.JFrame; +import javax.swing.filechooser.FileFilter; import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.ChoiceItem; /** @@ -54,11 +51,9 @@ public final class SaveDialog extends FreeColDialog { * @param directory The directory to display when choosing the file. * @param fileFilters The available file filters in the dialog. * @param defaultName Name of the default save game file. - * @param ext The default extension to add to user specified file names. */ public SaveDialog(FreeColClient freeColClient, JFrame frame, - File directory, FileFilter[] fileFilters, - String defaultName, final String ext) { + File directory, FileFilter[] fileFilters, String defaultName) { super(freeColClient, frame); final JFileChooser fileChooser = new JFileChooser(directory); @@ -73,22 +68,11 @@ public final class SaveDialog extends FreeColDialog { fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); fileChooser.setFileHidingEnabled(false); fileChooser.setSelectedFile(new File(defaultName)); - fileChooser.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - final String cmd = event.getActionCommand(); - if (JFileChooser.APPROVE_SELECTION.equals(cmd)) { - File file = fileChooser.getSelectedFile(); - if (!file.getName().endsWith(ext)) { - file = new File(file.getAbsolutePath() + ext); - } - setValue(file); - } else { - setValue(cancelFile); - } - } - }); - + fileChooser.addActionListener((ActionEvent ae) -> + setValue((JFileChooser.APPROVE_SELECTION + .equals(ae.getActionCommand())) + ? fileChooser.getSelectedFile() : cancelFile)); + List> c = choices(); initializeDialog(frame, DialogType.QUESTION, true, fileChooser, null, c); } diff --git a/src/net/sf/freecol/client/gui/panel/ScaleMapSizeDialog.java b/src/net/sf/freecol/client/gui/panel/ScaleMapSizeDialog.java index 84982f337..8587814dc 100644 --- a/src/net/sf/freecol/client/gui/panel/ScaleMapSizeDialog.java +++ b/src/net/sf/freecol/client/gui/panel/ScaleMapSizeDialog.java @@ -33,6 +33,7 @@ import javax.swing.JTextField; import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.Map; @@ -95,12 +96,9 @@ public class ScaleMapSizeDialog extends FreeColDialog { panel.add(heightPanel); panel.setSize(panel.getPreferredSize()); - final ActionListener al = new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - ScaleMapSizeDialog.this.checkFields(); - } - }; + final ActionListener al = (ActionEvent ae) -> { + ScaleMapSizeDialog.this.checkFields(); + }; inputWidth.addActionListener(al); inputHeight.addActionListener(al); diff --git a/src/net/sf/freecol/client/gui/panel/SelectAmountDialog.java b/src/net/sf/freecol/client/gui/panel/SelectAmountDialog.java index 2a367812f..0afb832be 100644 --- a/src/net/sf/freecol/client/gui/panel/SelectAmountDialog.java +++ b/src/net/sf/freecol/client/gui/panel/SelectAmountDialog.java @@ -30,7 +30,6 @@ import javax.swing.JTextArea; import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; -import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.GoodsType; import net.sf.freecol.common.model.Player; diff --git a/src/net/sf/freecol/client/gui/panel/SelectDestinationDialog.java b/src/net/sf/freecol/client/gui/panel/SelectDestinationDialog.java index fe743c338..a08dc0357 100644 --- a/src/net/sf/freecol/client/gui/panel/SelectDestinationDialog.java +++ b/src/net/sf/freecol/client/gui/panel/SelectDestinationDialog.java @@ -21,7 +21,6 @@ package net.sf.freecol.client.gui.panel; import java.awt.Dimension; import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; @@ -41,14 +40,13 @@ import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.ListSelectionModel; import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; -import net.sf.freecol.client.gui.GUI; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.client.gui.ImageLibrary; import net.sf.freecol.client.gui.plaf.FreeColComboBoxRenderer; import net.sf.freecol.common.i18n.Messages; @@ -73,8 +71,9 @@ import net.sf.freecol.common.model.Unit; import net.sf.freecol.common.model.UnitType; import net.sf.freecol.common.model.UnitTypeChange.ChangeType; import net.sf.freecol.common.model.pathfinding.GoalDeciders.MultipleAdjacentDecider; -import net.sf.freecol.common.util.LogBuilder; import net.sf.freecol.common.resources.ResourceManager; +import static net.sf.freecol.common.util.CollectionUtils.*; +import net.sf.freecol.common.util.LogBuilder; /** @@ -196,13 +195,8 @@ public final class SelectDestinationDialog extends FreeColDialog Unit up = (unit.getType().canBeUpgraded(sk, ChangeType.NATIVES)) ? unit : null; if (unit.isCarrier()) { - for (Unit u : unit.getUnitList()) { - if (u.getType().canBeUpgraded(sk, - ChangeType.NATIVES)) { - up = u; - break; - } - } + up = find(unit.getUnitList(), + u -> u.getType().canBeUpgraded(sk, ChangeType.NATIVES)); } if (up != null) { lb.add("[", Messages.getName(sk), "]"); @@ -387,12 +381,9 @@ public final class SelectDestinationDialog extends FreeColDialog String omcb = Messages.message("selectDestinationDialog.onlyMyColonies"); this.onlyMyColoniesBox = new JCheckBox(omcb, showOnlyMyColonies); - this.onlyMyColoniesBox.addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent event) { - showOnlyMyColonies = onlyMyColoniesBox.isSelected(); - updateDestinationList(); - } + this.onlyMyColoniesBox.addChangeListener((ChangeEvent event) -> { + showOnlyMyColonies = onlyMyColoniesBox.isSelected(); + updateDestinationList(); }); this.comparatorBox = new JComboBox<>(new String[] { @@ -400,14 +391,11 @@ public final class SelectDestinationDialog extends FreeColDialog Messages.message("selectDestinationDialog.sortByName"), Messages.message("selectDestinationDialog.sortByDistance") }); - this.comparatorBox.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent event) { - updateDestinationComparator(); - Collections.sort(SelectDestinationDialog.this.destinations, - SelectDestinationDialog.this.destinationComparator); - updateDestinationList(); - } + this.comparatorBox.addItemListener((ItemEvent event) -> { + updateDestinationComparator(); + Collections.sort(SelectDestinationDialog.this.destinations, + SelectDestinationDialog.this.destinationComparator); + updateDestinationList(); }); this.comparatorBox.setSelectedIndex( (this.destinationComparator instanceof NameComparator) ? 1 diff --git a/src/net/sf/freecol/client/gui/panel/ServerListPanel.java b/src/net/sf/freecol/client/gui/panel/ServerListPanel.java index 06ea61828..8ba0f38f4 100644 --- a/src/net/sf/freecol/client/gui/panel/ServerListPanel.java +++ b/src/net/sf/freecol/client/gui/panel/ServerListPanel.java @@ -184,9 +184,8 @@ public final class ServerListPanel extends FreeColPanel { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - final String command = event.getActionCommand(); - + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); try { switch (Integer.parseInt(command)) { case CONNECT: @@ -198,9 +197,9 @@ public final class ServerListPanel extends FreeColPanel { getGUI().showNewPanel(); break; default: - super.actionPerformed(event); + super.actionPerformed(ae); } - } catch (NumberFormatException e) { + } catch (NumberFormatException nfe) { logger.warning("Invalid ActionEvent, not a number: " + command); } } diff --git a/src/net/sf/freecol/client/gui/panel/StartGamePanel.java b/src/net/sf/freecol/client/gui/panel/StartGamePanel.java index 6afa4a0f7..1450703eb 100644 --- a/src/net/sf/freecol/client/gui/panel/StartGamePanel.java +++ b/src/net/sf/freecol/client/gui/panel/StartGamePanel.java @@ -31,10 +31,11 @@ import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.ScrollPaneConstants; + import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; -import net.sf.freecol.client.gui.GUI; +import net.sf.freecol.client.gui.SwingGUI; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.GameOptions; import net.sf.freecol.common.model.Nation; @@ -292,10 +293,10 @@ public final class StartGamePanel extends FreeColPanel { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - final String command = event.getActionCommand(); + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); final FreeColClient fcc = getFreeColClient(); - final GUI gui = getGUI(); + final SwingGUI gui = getGUI(); try { switch (Integer.parseInt(command)) { case START: @@ -347,9 +348,9 @@ public final class StartGamePanel extends FreeColPanel { } break; default: - super.actionPerformed(event); + super.actionPerformed(ae); } - } catch (NumberFormatException e) { + } catch (NumberFormatException nfe) { logger.warning("Invalid ActionEvent, not a number: " + command); } } diff --git a/src/net/sf/freecol/client/gui/panel/StatisticsPanel.java b/src/net/sf/freecol/client/gui/panel/StatisticsPanel.java index 8a823361d..ac8fd6f3b 100644 --- a/src/net/sf/freecol/client/gui/panel/StatisticsPanel.java +++ b/src/net/sf/freecol/client/gui/panel/StatisticsPanel.java @@ -23,9 +23,7 @@ import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.logging.Logger; @@ -40,6 +38,7 @@ import javax.swing.table.AbstractTableModel; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.common.i18n.Messages; + import static net.sf.freecol.common.util.CollectionUtils.*; @@ -158,7 +157,8 @@ public final class StatisticsPanel extends FreeColPanel { // Retrieve the client and server data Map serverStatistics = igc().getServerStatistics(); - Map clientStatistics = igc().getClientStatistics(); + Map clientStatistics = freeColClient.getGame() + .getStatistics(); // Title JPanel header = new JPanel(); diff --git a/src/net/sf/freecol/client/gui/panel/TerrainDetailPanel.java b/src/net/sf/freecol/client/gui/panel/TerrainDetailPanel.java index 394b830f9..0b3b12463 100644 --- a/src/net/sf/freecol/client/gui/panel/TerrainDetailPanel.java +++ b/src/net/sf/freecol/client/gui/panel/TerrainDetailPanel.java @@ -19,6 +19,7 @@ package net.sf.freecol.client.gui.panel; +import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; @@ -36,7 +37,7 @@ import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.gui.FontLibrary; import net.sf.freecol.client.gui.ImageLibrary; -import net.sf.freecol.client.gui.MapViewer; +import net.sf.freecol.client.gui.SwingGUI; import net.sf.freecol.client.gui.action.ColopediaAction.PanelType; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.AbstractGoods; @@ -63,25 +64,21 @@ public class TerrainDetailPanel } + // Implement ColopediaDetailPanel + /** - * Adds one or several subtrees for all the objects for which this - * ColopediaDetailPanel could build a detail panel to the given - * root node. - * - * @param root a DefaultMutableTreeNode + * {@inheritDoc} */ @Override public void addSubTrees(DefaultMutableTreeNode root) { - DefaultMutableTreeNode node = - new DefaultMutableTreeNode(new ColopediaTreeItem(this, getId(), getName(), null)); + DefaultMutableTreeNode node + = new DefaultMutableTreeNode(new ColopediaTreeItem(this, getId(), + getName(), null)); for (TileType t : getSpecification().getTileTypeList()) { - // FIXME: Use different method supporting a direct request of an - // image of fixed ICON_SIZE. - final float maxTileImageHeight = ImageLibrary.TILE_OVERLAY_SIZE.height; - Image tile = MapViewer.createTileImageWithOverlayAndForest(t, - ImageLibrary.ICON_SIZE.height / maxTileImageHeight); - BufferedImage image = new BufferedImage(tile.getWidth(null), ImageLibrary.ICON_SIZE.height, - BufferedImage.TYPE_INT_ARGB); + Image tile = SwingGUI.createTileImageWithOverlayAndForest(t, + new Dimension(-1, ImageLibrary.ICON_SIZE.height)); + BufferedImage image = new BufferedImage(tile.getWidth(null), + ImageLibrary.ICON_SIZE.height, BufferedImage.TYPE_INT_ARGB); Graphics2D g = image.createGraphics(); g.drawImage(tile, 0, (ImageLibrary.ICON_SIZE.height - tile.getHeight(null)) / 2, null); g.dispose(); @@ -92,16 +89,11 @@ public class TerrainDetailPanel } /** - * Builds the details panel for the TileType with the given identifier. - * - * @param id The object identifier. - * @param panel the detail panel to build + * {@inheritDoc} */ @Override public void buildDetail(String id, JPanel panel) { - if (getId().equals(id)) { - return; - } + if (getId().equals(id)) return; TileType tileType = getSpecification().getTileType(id); panel.setLayout(new MigLayout("wrap 4, gap 20")); @@ -113,13 +105,12 @@ public class TerrainDetailPanel defenseBonus = ModifierFormat.getModifierAsString(defenceModifiers.iterator().next()); } - JLabel nameLabel = Utility.localizedLabel(tileType); - nameLabel.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - FontLibrary.FontSize.SMALL)); + JLabel nameLabel = Utility.localizedHeaderLabel(tileType, FontLibrary.FontSize.SMALL); panel.add(nameLabel, "span, align center"); panel.add(Utility.localizedLabel("colopedia.terrain.terrainImage"), "spany 3"); - Image terrainImage = MapViewer.createTileImageWithOverlayAndForest(tileType, 1); + Image terrainImage = SwingGUI.createTileImageWithOverlayAndForest( + tileType, ImageLibrary.TILE_OVERLAY_SIZE); panel.add(new JLabel(new ImageIcon(terrainImage)), "spany 3"); List resourceList = tileType.getResourceTypes(); diff --git a/src/net/sf/freecol/client/gui/panel/TilePanel.java b/src/net/sf/freecol/client/gui/panel/TilePanel.java index 9b1f968f5..c7653316d 100644 --- a/src/net/sf/freecol/client/gui/panel/TilePanel.java +++ b/src/net/sf/freecol/client/gui/panel/TilePanel.java @@ -33,11 +33,11 @@ import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; + import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.gui.ImageLibrary; -import net.sf.freecol.client.gui.MapViewer; import net.sf.freecol.common.debug.DebugUtils; import net.sf.freecol.common.debug.FreeColDebugger; import net.sf.freecol.common.i18n.Messages; @@ -90,9 +90,8 @@ public final class TilePanel extends FreeColPanel { .addAmount("%y%", tile.getY()); add(Utility.localizedLabel(template), "span, center"); - final MapViewer mapViewer = getGUI().getColonyTileMapViewer(); final ImageLibrary lib = getImageLibrary(); - BufferedImage image = mapViewer.createColonyTileImage(tile, null); + BufferedImage image = getGUI().createTileImage(tile); add(new JLabel(new ImageIcon(image)), "span, center"); if (tile.getRegion() != null) { @@ -101,7 +100,7 @@ public final class TilePanel extends FreeColPanel { } if (tile.getOwner() != null) { - StringTemplate ownerName = tile.getOwner().getNationName(); + StringTemplate ownerName = tile.getOwner().getNationLabel(); if (ownerName != null) { add(Utility.localizedLabel("tilePanel.owner")); add(Utility.localizedLabel(ownerName)); @@ -220,8 +219,8 @@ public final class TilePanel extends FreeColPanel { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - final String command = event.getActionCommand(); + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); if (OK.equals(command)) { getGUI().removeFromCanvas(this); } else { diff --git a/src/net/sf/freecol/client/gui/panel/TradeRouteInputPanel.java b/src/net/sf/freecol/client/gui/panel/TradeRouteInputPanel.java index 07a6f96e1..056e1fdae 100644 --- a/src/net/sf/freecol/client/gui/panel/TradeRouteInputPanel.java +++ b/src/net/sf/freecol/client/gui/panel/TradeRouteInputPanel.java @@ -26,12 +26,12 @@ import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseListener; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -52,6 +52,7 @@ import javax.swing.TransferHandler; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.plaf.PanelUI; + import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; @@ -68,6 +69,7 @@ import net.sf.freecol.common.model.Player; import net.sf.freecol.common.model.StringTemplate; import net.sf.freecol.common.model.TradeRoute; import net.sf.freecol.common.model.TradeRouteStop; +import static net.sf.freecol.common.util.CollectionUtils.*; /** @@ -223,12 +225,7 @@ public final class TradeRouteInputPanel extends FreeColPanel @Override public boolean canImport(JComponent c, DataFlavor[] flavors) { - for (DataFlavor flavor : flavors) { - if (flavor.equals(DefaultTransferHandler.flavor)) { - return true; - } - } - return false; + return any(flavors, f -> f.equals(DefaultTransferHandler.flavor)); } } @@ -345,12 +342,7 @@ public final class TradeRouteInputPanel extends FreeColPanel */ @Override public boolean canImport(JComponent c, DataFlavor[] flavors) { - for (DataFlavor flavor : flavors) { - if (flavor.equals(STOP_FLAVOR)) { - return true; - } - } - return false; + return any(flavors, f -> f.equals(STOP_FLAVOR)); } /** @@ -465,7 +457,7 @@ public final class TradeRouteInputPanel extends FreeColPanel } else if (location instanceof Colony) { Colony colony = (Colony) location; icon = new JLabel(new ImageIcon(ImageLibrary.getSettlementImage( - colony, lib.getScalingFactor()* 0.5f))); + colony, lib.getScaleFactor()* 0.5f))); name = new JLabel(colony.getName()); } else { throw new IllegalStateException("Bogus location: " + location); @@ -587,27 +579,18 @@ public final class TradeRouteInputPanel extends FreeColPanel this.messagesBox = new JCheckBox(Messages.message("tradeRouteInputPanel.silence")); this.messagesBox.setSelected(tradeRoute.isSilent()); - this.messagesBox.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - tradeRoute.setSilent(messagesBox.isSelected()); - } + this.messagesBox.addActionListener((ActionEvent ae) -> { + tradeRoute.setSilent(messagesBox.isSelected()); }); this.addStopButton = Utility.localizedButton("tradeRouteInputPanel.addStop"); - this.addStopButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - addSelectedStops(); - } + this.addStopButton.addActionListener((ActionEvent ae) -> { + addSelectedStops(); }); this.removeStopButton = Utility.localizedButton("tradeRouteInputPanel.removeStop"); - this.removeStopButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - deleteCurrentlySelectedStops(); - } + this.removeStopButton.addActionListener((ActionEvent ae) -> { + deleteCurrentlySelectedStops(); }); this.goodsPanel = new GoodsPanel(); @@ -764,21 +747,21 @@ public final class TradeRouteInputPanel extends FreeColPanel * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - final String command = event.getActionCommand(); + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); if (command == null) return; switch (command) { case OK: if (!verifyNewTradeRoute()) return; // Return to TradeRoutePanel, which will add the route // if needed, and it is valid. - super.actionPerformed(event); + super.actionPerformed(ae); break; case CANCEL: cancelTradeRoute(); break; default: - super.actionPerformed(event); + super.actionPerformed(ae); break; } } diff --git a/src/net/sf/freecol/client/gui/panel/TradeRoutePanel.java b/src/net/sf/freecol/client/gui/panel/TradeRoutePanel.java index 0d00dc853..ace6c5c0b 100644 --- a/src/net/sf/freecol/client/gui/panel/TradeRoutePanel.java +++ b/src/net/sf/freecol/client/gui/panel/TradeRoutePanel.java @@ -21,7 +21,6 @@ package net.sf.freecol.client.gui.panel; import java.awt.Component; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -38,7 +37,7 @@ import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; + import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; @@ -63,12 +62,7 @@ public final class TradeRoutePanel extends FreeColPanel { /** Compare trade routes by name. */ private static final Comparator tradeRouteComparator - = new Comparator() { - @Override - public int compare(TradeRoute r1, TradeRoute r2) { - return r1.getName().compareTo(r2.getName()); - } - }; + = Comparator.comparing(TradeRoute::getName); /** The unit to assign/deassign trade routes for. */ private final Unit unit; @@ -106,11 +100,8 @@ public final class TradeRoutePanel extends FreeColPanel { this.unit = unit; this.tradeRoutes = new JList<>(listModel); - this.tradeRoutes.addListSelectionListener(new ListSelectionListener() { - @Override - public void valueChanged(ListSelectionEvent e) { - updateButtons(); - } + this.tradeRoutes.addListSelectionListener((ListSelectionEvent e) -> { + updateButtons(); }); this.tradeRoutes.setCellRenderer(new DefaultListCellRenderer() { @Override @@ -139,52 +130,38 @@ public final class TradeRoutePanel extends FreeColPanel { // listener below. this.newRouteButton = Utility.localizedButton("tradeRoutePanel.newRoute"); Utility.localizeToolTip(this.newRouteButton, "tradeRoutePanel.new.tooltip"); - this.newRouteButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - newRoute(); - } + this.newRouteButton.addActionListener((ActionEvent ae) -> { + newRoute(); }); this.editRouteButton = Utility.localizedButton("tradeRoutePanel.editRoute"); Utility.localizeToolTip(this.editRouteButton, "tradeRoutePanel.edit.tooltip"); - this.editRouteButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - final TradeRoute selected - = tradeRoutes.getSelectedValue(); - final String name = selected.getName(); - getGUI().showTradeRouteInputPanel(selected, - new Runnable() { - @Override - public void run() { - StringTemplate template = null; - if (selected.getName() == null) { // Cancelled - selected.setName(name); - } else if ((template = selected.verify()) == null) { - igc().updateTradeRoute(selected); - updateList(selected); - } else { - getGUI().showInformationMessage(template); - } - } - }); - } + this.editRouteButton.addActionListener((ActionEvent ae) -> { + final TradeRoute selected = tradeRoutes.getSelectedValue(); + final String name = selected.getName(); + getGUI().showTradeRouteInputPanel(selected, () -> { + StringTemplate template = null; + if (selected.getName() == null) { // Cancelled + selected.setName(name); + } else if ((template = selected.verify()) == null) { + igc().updateTradeRoute(selected); + updateList(selected); + } else { + getGUI().showInformationMessage(template); + } + }); }); this.deleteRouteButton = Utility.localizedButton("tradeRoutePanel.deleteRoute"); Utility.localizeToolTip(this.deleteRouteButton, "tradeRoutePanel.delete.tooltip"); - this.deleteRouteButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - TradeRoute route = getRoute(); - if (route != null) { - for (Unit u : route.getAssignedUnits()) { - igc().assignTradeRoute(u, null); - } - deleteTradeRoute(route); - updateList(null); + this.deleteRouteButton.addActionListener((ActionEvent ae) -> { + TradeRoute route = getRoute(); + if (route != null) { + for (Unit u : route.getAssignedUnits()) { + igc().assignTradeRoute(u, null); } + deleteTradeRoute(route); + updateList(null); } }); @@ -240,24 +217,18 @@ public final class TradeRoutePanel extends FreeColPanel { final Player player = getMyPlayer(); final Unit u = this.unit; final TradeRoute newRoute = igc().getNewTradeRoute(player); - getGUI().showTradeRouteInputPanel(newRoute, - new Runnable() { - @Override - public void run() { - StringTemplate template = null; - if (newRoute.getName() == null) { // Cancelled - deleteTradeRoute(newRoute); - updateList(null); - } else { - if ((template = newRoute.verify()) == null) { - igc().updateTradeRoute(newRoute); - if (u != null) igc().assignTradeRoute(u, newRoute); - updateList(newRoute); - } else { - updateList(null); - getGUI().showInformationMessage(template); - } - } + getGUI().showTradeRouteInputPanel(newRoute, () -> { + StringTemplate template = null; + if (newRoute.getName() == null) { // Cancelled + deleteTradeRoute(newRoute); + updateList(null); + } else if ((template = newRoute.verify()) == null) { + igc().updateTradeRoute(newRoute); + if (u != null) igc().assignTradeRoute(u, newRoute); + updateList(newRoute); + } else { + updateList(null); + getGUI().showInformationMessage(template); } }); } @@ -332,8 +303,8 @@ public final class TradeRoutePanel extends FreeColPanel { * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { - final String command = event.getActionCommand(); + public void actionPerformed(ActionEvent ae) { + final String command = ae.getActionCommand(); if (null == command) return; final TradeRoute route = getRoute(); switch (command) { @@ -352,13 +323,13 @@ public final class TradeRoutePanel extends FreeColPanel { if (unit != null && route != null) { igc().assignTradeRoute(unit, route); } - super.actionPerformed(event); + super.actionPerformed(ae); break; case CANCEL: getGUI().removeTradeRoutePanel(this); break; default: - super.actionPerformed(event); + super.actionPerformed(ae); break; } } diff --git a/src/net/sf/freecol/client/gui/panel/UnitButton.java b/src/net/sf/freecol/client/gui/panel/UnitButton.java index 53eadb27e..ebc3381dd 100644 --- a/src/net/sf/freecol/client/gui/panel/UnitButton.java +++ b/src/net/sf/freecol/client/gui/panel/UnitButton.java @@ -25,10 +25,12 @@ import java.beans.PropertyChangeListener; import javax.swing.AbstractButton; import javax.swing.Action; import javax.swing.Icon; +import javax.swing.ImageIcon; import javax.swing.JButton; import net.sf.freecol.client.gui.action.ActionManager; import net.sf.freecol.client.gui.action.FreeColAction; +import net.sf.freecol.common.resources.ResourceManager; /** @@ -72,20 +74,21 @@ public final class UnitButton extends JButton { if (a != null) { setRolloverEnabled(true); - Icon bi = (Icon) a.getValue(FreeColAction.BUTTON_IMAGE); + String key = (String) a.getValue(FreeColAction.BUTTON_IMAGE); + ImageIcon bi = new ImageIcon(ResourceManager.getImage(key)); setIcon(bi); - setRolloverIcon((Icon) a.getValue(FreeColAction.BUTTON_ROLLOVER_IMAGE)); - setPressedIcon((Icon) a.getValue(FreeColAction.BUTTON_PRESSED_IMAGE)); - setDisabledIcon((Icon) a.getValue(FreeColAction.BUTTON_DISABLED_IMAGE)); + key = (String) a.getValue(FreeColAction.BUTTON_ROLLOVER_IMAGE); + setRolloverIcon(new ImageIcon(ResourceManager.getImage(key))); + key = (String) a.getValue(FreeColAction.BUTTON_PRESSED_IMAGE); + setPressedIcon(new ImageIcon(ResourceManager.getImage(key))); + key = (String) a.getValue(FreeColAction.BUTTON_DISABLED_IMAGE); + setDisabledIcon(new ImageIcon(ResourceManager.getImage(key))); setToolTipText((String) a.getValue(FreeColAction.NAME)); setText(null); setFocusPainted(false); setContentAreaFilled(false); setBorderPainted(false); - if (bi == null) { - throw new IllegalArgumentException("The given action is missing \"BUTTON_IMAGE\"."); - } setSize(bi.getIconWidth(), bi.getIconHeight()); } } @@ -118,20 +121,20 @@ public final class UnitButton extends JButton { button.setIcon(icon); button.repaint(); } else if (FreeColAction.BUTTON_IMAGE.equals(e.getPropertyName())) { - Icon icon = (Icon) e.getNewValue(); - button.setIcon(icon); + String key = (String) e.getNewValue(); + button.setIcon(new ImageIcon(ResourceManager.getImage(key))); button.repaint(); } else if (FreeColAction.BUTTON_ROLLOVER_IMAGE.equals(e.getPropertyName())) { - Icon icon = (Icon) e.getNewValue(); - button.setRolloverIcon(icon); + String key = (String) e.getNewValue(); + button.setRolloverIcon(new ImageIcon(ResourceManager.getImage(key))); button.repaint(); } else if (FreeColAction.BUTTON_PRESSED_IMAGE.equals(e.getPropertyName())) { - Icon icon = (Icon) e.getNewValue(); - button.setPressedIcon(icon); + String key = (String) e.getNewValue(); + button.setPressedIcon(new ImageIcon(ResourceManager.getImage(key))); button.repaint(); } else if (FreeColAction.BUTTON_DISABLED_IMAGE.equals(e.getPropertyName())) { - Icon icon = (Icon) e.getNewValue(); - button.setDisabledIcon(icon); + String key = (String) e.getNewValue(); + button.setDisabledIcon(new ImageIcon(ResourceManager.getImage(key))); button.repaint(); } else if (Action.MNEMONIC_KEY.equals(e.getPropertyName())) { Integer mn = (Integer) e.getNewValue(); diff --git a/src/net/sf/freecol/client/gui/panel/UnitDetailPanel.java b/src/net/sf/freecol/client/gui/panel/UnitDetailPanel.java index 219104224..1390a4472 100644 --- a/src/net/sf/freecol/client/gui/panel/UnitDetailPanel.java +++ b/src/net/sf/freecol/client/gui/panel/UnitDetailPanel.java @@ -23,6 +23,7 @@ import java.awt.GridLayout; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import javax.swing.JButton; import javax.swing.JLabel; @@ -46,8 +47,10 @@ import net.sf.freecol.common.model.GoodsType; import net.sf.freecol.common.model.IndianNationType; import net.sf.freecol.common.model.Modifier; import net.sf.freecol.common.model.Player; +import net.sf.freecol.common.model.Specification; import net.sf.freecol.common.model.StringTemplate; import net.sf.freecol.common.model.UnitType; +import static net.sf.freecol.common.util.CollectionUtils.*; import net.sf.freecol.common.util.RandomChoice; @@ -56,12 +59,12 @@ import net.sf.freecol.common.util.RandomChoice; */ public class UnitDetailPanel extends ColopediaGameObjectTypePanel { - // layout of production modifier panel + /** Layout of production modifier panel. */ private static final int MODIFIERS_PER_ROW = 5; /** - * Creates a new instance of this ColopediaDetailPanel. + * Creates a new instance of this colopedia subpanel. * * @param freeColClient The FreeColClient for the game. * @param colopediaPanel The parent ColopediaPanel. @@ -72,49 +75,29 @@ public class UnitDetailPanel extends ColopediaGameObjectTypePanel { } + // Implement ColopediaDetailPanel + /** - * Adds one or several subtrees for all the objects for which this - * ColopediaDetailPanel could build a detail panel to the given - * root node. - * - * @param root a DefaultMutableTreeNode + * {@inheritDoc} */ @Override public void addSubTrees(DefaultMutableTreeNode root) { - List units = new ArrayList<>(); - List skills = new ArrayList<>(); - for (UnitType u : getSpecification().getUnitTypeList()) { - if (u.getSkill() <= 0 || u.hasAbility(Ability.EXPERT_SOLDIER)) { - units.add(u); - } else { - skills.add(u); - } - } - super.addSubTrees(root, "colopediaAction." + PanelType.UNITS.getKey(), - units); - super.addSubTrees(root, "colopediaAction." + PanelType.SKILLS.getKey(), - skills); + super.addSubTrees(root, getId(), + new ArrayList<>(getSpecification().getUnitTypeList())); } /** - * Builds the details panel for the UnitType with the given identifier. - * - * @param id The object identifier. - * @param panel the detail panel to build + * {@inheritDoc} */ @Override public void buildDetail(String id, JPanel panel) { - if (getId().equals(id) - || ("colopediaAction." + PanelType.SKILLS.getKey()).equals(id)) { - return; - } + if (getId().equals(id)) return; - UnitType type = getSpecification().getUnitType(id); + final Specification spec = getSpecification(); + UnitType type = spec.getUnitType(id); panel.setLayout(new MigLayout("wrap 4", "[]20[]40[]20[]")); - JLabel name = Utility.localizedLabel(type); - name.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - FontLibrary.FontSize.SMALL)); + JLabel name = Utility.localizedHeaderLabel(type, FontLibrary.FontSize.SMALL); panel.add(name, "span, align center, wrap 40"); panel.add(Utility.localizedLabel("colopedia.unit.offensivePower")); @@ -152,8 +135,9 @@ public class UnitDetailPanel extends ColopediaGameObjectTypePanel { panel.add(new JLabel(Integer.toString(type.getSkill())), "right"); List schools = new ArrayList<>(); - for (final BuildingType buildingType : getSpecification().getBuildingTypeList()) { - if (buildingType.hasAbility(Ability.TEACH) && buildingType.canAdd(type)) { + for (BuildingType buildingType : spec.getBuildingTypeList()) { + if (buildingType.hasAbility(Ability.TEACH) + && buildingType.canAdd(type)) { schools.add(buildingType); } } @@ -172,14 +156,9 @@ public class UnitDetailPanel extends ColopediaGameObjectTypePanel { } } - List nations = new ArrayList<>(); - for (IndianNationType nation : getSpecification().getIndianNationTypes()) { - for (RandomChoice choice : nation.getSkills()) { - if (choice.getObject() == type) { - nations.add(nation); - } - } - } + List nations = spec.getIndianNationTypes().stream() + .filter(nt -> any(nt.getSkills(), ut -> ut.getObject() == type)) + .collect(Collectors.toList()); if (!nations.isEmpty()) { panel.add(Utility.localizedLabel("colopedia.unit.natives"), "newline"); int count = 0; @@ -211,7 +190,7 @@ public class UnitDetailPanel extends ColopediaGameObjectTypePanel { } List bonusList = new ArrayList<>(); - for (GoodsType goodsType : getSpecification().getGoodsTypeList()) { + for (GoodsType goodsType : spec.getGoodsTypeList()) { bonusList.addAll(type.getModifiers(goodsType.getId())); } int bonusNumber = bonusList.size(); @@ -223,7 +202,7 @@ public class UnitDetailPanel extends ColopediaGameObjectTypePanel { JPanel productionPanel = new JPanel(new GridLayout(0, MODIFIERS_PER_ROW)); productionPanel.setOpaque(false); for (Modifier productionBonus : bonusList) { - GoodsType goodsType = getSpecification().getGoodsType(productionBonus.getId()); + GoodsType goodsType = spec.getGoodsType(productionBonus.getId()); String bonus = ModifierFormat.getModifierAsString(productionBonus); productionPanel.add(getGoodsButton(goodsType, bonus)); } diff --git a/src/net/sf/freecol/client/gui/panel/UnitLabel.java b/src/net/sf/freecol/client/gui/panel/UnitLabel.java index 0f6a5cb7b..bb867ce85 100644 --- a/src/net/sf/freecol/client/gui/panel/UnitLabel.java +++ b/src/net/sf/freecol/client/gui/panel/UnitLabel.java @@ -36,8 +36,8 @@ import javax.swing.JLabel; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.control.InGameController; import net.sf.freecol.client.gui.FontLibrary; -import net.sf.freecol.client.gui.GUI; import net.sf.freecol.client.gui.ImageLibrary; +import net.sf.freecol.client.gui.SwingGUI; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.Ability; import net.sf.freecol.common.model.AbstractGoods; @@ -47,12 +47,10 @@ import net.sf.freecol.common.model.Game; import net.sf.freecol.common.model.GoodsType; import net.sf.freecol.common.model.Player; import net.sf.freecol.common.model.Specification; -import net.sf.freecol.common.model.Tile; -import net.sf.freecol.common.model.TileType; import net.sf.freecol.common.model.Unit; import net.sf.freecol.common.model.WorkLocation; -import static net.sf.freecol.common.util.StringUtils.*; +import static net.sf.freecol.common.util.StringUtils.lastPart; /** @@ -83,7 +81,7 @@ public final class UnitLabel extends JLabel private final FreeColClient freeColClient; - private final GUI gui; + private final SwingGUI gui; private final Unit unit; @@ -93,7 +91,7 @@ public final class UnitLabel extends JLabel private boolean ignoreLocation; - private boolean useMapImageLibrary; + private boolean useTileImageLibrary; /** @@ -140,20 +138,20 @@ public final class UnitLabel extends JLabel * @param isSmall The image will be smaller if set to true. * @param ignoreLocation The image will not include production or state * information if set to true. - * @param useMapImageLibrary If false use ImageLibrary in gui. - * If true use ImageLibrary in gui.getColonyTileMapViewer(). + * @param useTileImageLibrary If false use ImageLibrary in GUI. + * If true use tileImageLibrary in SwingGUI. */ public UnitLabel(FreeColClient freeColClient, Unit unit, boolean isSmall, boolean ignoreLocation, - boolean useMapImageLibrary) { + boolean useTileImageLibrary) { this.freeColClient = freeColClient; - this.gui = freeColClient.getGUI(); + this.gui = (SwingGUI)freeColClient.getGUI(); this.unit = unit; selected = false; this.isSmall = isSmall; this.ignoreLocation = ignoreLocation; - this.useMapImageLibrary = useMapImageLibrary; + this.useTileImageLibrary = useTileImageLibrary; updateIcon(); } @@ -194,8 +192,8 @@ public final class UnitLabel extends JLabel * @param isSmall The image will be smaller if set to true. */ public void setSmall(boolean isSmall) { - final ImageLibrary lib = useMapImageLibrary - ? gui.getColonyTileMapViewer().getImageLibrary() + final ImageLibrary lib = useTileImageLibrary + ? gui.getTileImageLibrary() : gui.getImageLibrary(); if (isSmall) { ImageIcon imageIcon = new ImageIcon(lib.getSmallUnitImage(unit)); @@ -210,12 +208,10 @@ public final class UnitLabel extends JLabel ImageIcon imageIcon = new ImageIcon(lib.getUnitImage(unit)); ImageIcon disabledImageIcon = new ImageIcon(lib.getUnitImage(unit, true)); if (unit.getLocation() instanceof ColonyTile) { - final Tile tile = unit.getLocation().getTile(); - final TileType tileType = tile.getType(); - final Image image = lib.getTerrainImage(tileType, tile.getX(), - tile.getY()); - setSize(new Dimension(image.getWidth(null) / 2, - imageIcon.getIconHeight())); + Dimension tileSize = lib.scaleDimension(ImageLibrary.TILE_SIZE); + tileSize.width /= 2; + tileSize.height = imageIcon.getIconHeight(); + setSize(tileSize); } else { setPreferredSize(null); } @@ -261,8 +257,8 @@ public final class UnitLabel extends JLabel @Override public void paintComponent(Graphics g) { final Player player = freeColClient.getMyPlayer(); - final ImageLibrary lib = useMapImageLibrary - ? gui.getColonyTileMapViewer().getImageLibrary() + final ImageLibrary lib = useTileImageLibrary + ? gui.getTileImageLibrary() : gui.getImageLibrary(); if (ignoreLocation || selected || (!unit.isCarrier() && unit.getState() != Unit.UnitState.SENTRY)) { @@ -301,7 +297,7 @@ public final class UnitLabel extends JLabel String underRepair1 = underRepair.substring(0, underRepair.indexOf('(')).trim(); String underRepair2 = underRepair.substring(underRepair.indexOf('(')).trim(); Font font = FontLibrary.createFont(FontLibrary.FontType.NORMAL, - FontLibrary.FontSize.TINY, lib.getScalingFactor()); + FontLibrary.FontSize.TINY, lib.getScaleFactor()); Image repairImage1 = lib.getStringImage(g, underRepair1, Color.RED, font); Image repairImage2 = lib.getStringImage(g, underRepair2, Color.RED, font); int textHeight = repairImage1.getHeight(null) + repairImage2.getHeight(null); @@ -370,11 +366,11 @@ public final class UnitLabel extends JLabel * {@inheritDoc} */ @Override - public void actionPerformed(ActionEvent event) { + public void actionPerformed(ActionEvent ae) { final Game game = freeColClient.getGame(); final Specification spec = game.getSpecification(); final InGameController igc = freeColClient.getInGameController(); - String[] args = event.getActionCommand().split("/"); + String[] args = ae.getActionCommand().split("/"); GoodsType gt; switch (Enum.valueOf(UnitAction.class, args[0].toUpperCase(Locale.US))) { diff --git a/src/net/sf/freecol/client/gui/panel/UnitPanel.java b/src/net/sf/freecol/client/gui/panel/UnitPanel.java index 50c4c18d8..caa5f3299 100644 --- a/src/net/sf/freecol/client/gui/panel/UnitPanel.java +++ b/src/net/sf/freecol/client/gui/panel/UnitPanel.java @@ -66,6 +66,8 @@ public abstract class UnitPanel extends MigPanel cleanup(); addPropertyChangeListeners(); update(); + Unit active = portPanel.getGUI().getActiveUnit(); + if (active != null && active.isCarrier()) setSelectedUnit(active); } /** diff --git a/src/net/sf/freecol/client/gui/panel/Utility.java b/src/net/sf/freecol/client/gui/panel/Utility.java index 5fddf4f9c..0e9796a4b 100644 --- a/src/net/sf/freecol/client/gui/panel/Utility.java +++ b/src/net/sf/freecol/client/gui/panel/Utility.java @@ -48,8 +48,13 @@ import javax.swing.text.StyleContext; import net.sf.freecol.client.gui.FontLibrary; import net.sf.freecol.common.i18n.Messages; +import net.sf.freecol.common.model.FreeColGameObject; +import net.sf.freecol.common.model.Location; import net.sf.freecol.common.model.Named; +import net.sf.freecol.common.model.Player; +import net.sf.freecol.common.model.Settlement; import net.sf.freecol.common.model.StringTemplate; +import net.sf.freecol.common.model.Unit; import net.sf.freecol.common.resources.ResourceManager; @@ -171,6 +176,43 @@ public final class Utility { return button; } + /** + * Make a suitable link button for a given key. + * + * Colonies and Europe-like objects are obvious, locations and units + * are dependent on the message source. + * TODO: Are there more useful possibilities? + * + * @param key The message key to make a link for. + * @param val The text for the link. + * @param player The Player to make a link for. + * @param source The message source FreeColGameObject. + * @return A JButton for the link, or null if no good + * choice found. + */ + public static JButton getMessageButton(String key, String val, + Player player, FreeColGameObject source) { + FreeColGameObject link = null; + if ("%colony%".equals(key) || key.endsWith("Colony%")) { + Settlement settlement = player.getGame().getSettlementByName(val); + link = (settlement == null) ? null + : (player.owns(settlement)) ? settlement + : settlement.getTile(); + } else if ("%europe%".equals(key) || "%market%".equals(key)) { + link = player.getEurope(); + } else if ("%location%".equals(key) || key.endsWith("Location%")) { + if (source instanceof Location) { + link = source.getLinkTarget(player); + } + } else if ("%unit%".equals(key) || key.endsWith("Unit%")) { + if (source instanceof Unit) { + link = source.getLinkTarget(player); + } + } + return (link == null) ? null + : getLinkButton(val, null, link.getId()); + } + /** * Creates a text area with standard settings suitable for use in FreeCol * panels, without setting its size. @@ -233,7 +275,14 @@ public final class Utility { * @return The default JTextPane to use. */ public static JTextPane getDefaultTextPane() { - return getDefaultTextPane(null); + DefaultStyledDocument document + = new DefaultStyledDocument(STYLE_CONTEXT); + + JTextPane textPane = new JTextPane(document); + textPane.setOpaque(false); + textPane.setEditable(false); + textPane.setLogicalStyle(STYLE_CONTEXT.getStyle("regular")); + return textPane; } /** @@ -243,14 +292,7 @@ public final class Utility { * @return A suitable JTextPane. */ public static JTextPane getDefaultTextPane(String text) { - DefaultStyledDocument document - = new DefaultStyledDocument(STYLE_CONTEXT); - - JTextPane textPane = new JTextPane(document); - textPane.setOpaque(false); - textPane.setEditable(false); - textPane.setLogicalStyle(STYLE_CONTEXT.getStyle("regular")); - + JTextPane textPane = getDefaultTextPane(); textPane.setText(text); return textPane; } @@ -353,6 +395,55 @@ public final class Utility { return new JCheckBoxMenuItem(Messages.message(key), value); } + /** + * Gets a default header for panels containing a localized message. + * + * @param key The message key to use. + * @param small If true, use a smaller font. + * @return A suitable JLabel. + */ + public static JLabel localizedHeader(String key, boolean small) { + JLabel header = localizedHeaderLabel(key, SwingConstants.CENTER, + (small ? FontLibrary.FontSize.SMALL : FontLibrary.FontSize.BIG)); + header.setBorder(BorderFactory.createEmptyBorder(20, 0, 20, 0)); + return header; + } + + /** + * Gets a label containing a localized message using the header font. + * + * @param key The message key to use. + * @param alignment The alignment. + * @param size The font size. + * @return A suitable JLabel. + */ + public static JLabel localizedHeaderLabel(String key, int alignment, + FontLibrary.FontSize size) { + String text = Messages.message(key); + JLabel header = new JLabel(text, alignment); + header.setFont(FontLibrary.createCompatibleFont( + text, FontLibrary.FontType.HEADER, size)); + header.setOpaque(false); + return header; + } + + public static JLabel localizedHeaderLabel(StringTemplate template, + int alignment, + FontLibrary.FontSize size) { + String text = Messages.message(template); + JLabel header = new JLabel(text, alignment); + header.setFont(FontLibrary.createCompatibleFont( + text, FontLibrary.FontType.HEADER, size)); + header.setOpaque(false); + return header; + } + + public static JLabel localizedHeaderLabel(Named named, + FontLibrary.FontSize size) { + return localizedHeaderLabel(named.getNameKey(), + SwingConstants.LEADING, size); + } + /** * Get a JLabel with a named object. * @@ -363,21 +454,6 @@ public final class Utility { return localizedLabel(named.getNameKey()); } - /** - * Gets a default header for panels containing a localized message. - * - * @param key The message key to use. - * @param small If true, use a smaller font. - * @return A suitable JLabel. - */ - public static JLabel localizedHeader(String key, boolean small) { - JLabel header = new JLabel(Messages.message(key), JLabel.CENTER); - header.setFont(FontLibrary.createFont(FontLibrary.FontType.HEADER, - (small) ? FontLibrary.FontSize.SMALL : FontLibrary.FontSize.BIG)); - header.setBorder(BorderFactory.createEmptyBorder(20, 0, 20, 0)); - return header; - } - /** * Get a JLabel with Messages.message(key) as text. * @@ -385,30 +461,7 @@ public final class Utility { * @return The JLabel. */ public static JLabel localizedLabel(String key) { - return localizedLabel(key, SwingConstants.LEADING); - } - - /** - * Get a JLabel with Messages.message(key) as text. - * - * @param key The key to use. - * @param alignment The alignment. - * @return The JLabel. - */ - public static JLabel localizedLabel(String key, int alignment) { - return localizedLabel(key, null, alignment); - } - - /** - * Get a JLabel with Messages.message(key) as text. - * - * @param key The key to use. - * @param icon The icon to use. - * @param alignment The alignment. - * @return The JLabel. - */ - public static JLabel localizedLabel(String key, Icon icon, int alignment) { - return localizedLabel(StringTemplate.key(key), icon, alignment); + return localizedLabel(StringTemplate.key(key)); } /** @@ -418,7 +471,9 @@ public final class Utility { * @return The JLabel. */ public static JLabel localizedLabel(StringTemplate template) { - return localizedLabel(template, null, SwingConstants.LEADING); + JLabel label = new JLabel(Messages.message(template)); + label.setOpaque(false); + return label; } /** @@ -431,7 +486,9 @@ public final class Utility { */ public static JLabel localizedLabel(StringTemplate template, Icon icon, int alignment) { - return new JLabel(Messages.message(template), icon, alignment); + JLabel label = new JLabel(Messages.message(template), icon, alignment); + label.setOpaque(false); + return label; } /** diff --git a/src/net/sf/freecol/client/gui/panel/VictoryDialog.java b/src/net/sf/freecol/client/gui/panel/VictoryDialog.java index d41e015cf..34d098b24 100644 --- a/src/net/sf/freecol/client/gui/panel/VictoryDialog.java +++ b/src/net/sf/freecol/client/gui/panel/VictoryDialog.java @@ -47,7 +47,7 @@ public final class VictoryDialog extends FreeColConfirmDialog { super(freeColClient, frame); MigPanel panel = new MigPanel(new MigLayout("wrap 1", "", "")); - panel.add(Utility.localizedHeader(Messages.nameKey("victoryDialog"), + panel.add(Utility.localizedHeader(Messages.message("victory.text"), false), "align center, wrap 20"); Image image = ResourceManager.getImage("image.flavor.Victory"); diff --git a/src/net/sf/freecol/client/gui/panel/WarehouseDialog.java b/src/net/sf/freecol/client/gui/panel/WarehouseDialog.java index c63da19fb..e228e3a15 100644 --- a/src/net/sf/freecol/client/gui/panel/WarehouseDialog.java +++ b/src/net/sf/freecol/client/gui/panel/WarehouseDialog.java @@ -34,7 +34,6 @@ import javax.swing.SpinnerNumberModel; import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; -import net.sf.freecol.client.gui.GUI; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.model.Ability; import net.sf.freecol.common.model.Colony; diff --git a/src/net/sf/freecol/client/gui/panel/WorkProductionPanel.java b/src/net/sf/freecol/client/gui/panel/WorkProductionPanel.java index 69973ff16..555d7f449 100644 --- a/src/net/sf/freecol/client/gui/panel/WorkProductionPanel.java +++ b/src/net/sf/freecol/client/gui/panel/WorkProductionPanel.java @@ -89,8 +89,7 @@ public class WorkProductionPanel extends FreeColPanel { final TileType tileType = tile.getType(); shortName = Messages.getName(tileType); longName = Messages.message(colonyTile.getLabel()); - image = getGUI().getColonyTileMapViewer() - .createColonyTileImage(tile, colony); + image = getGUI().createColonyTileImage(tile, colony); } else if (wl instanceof Building) { final Building building = (Building)wl; @@ -119,7 +118,7 @@ public class WorkProductionPanel extends FreeColPanel { } Font bigFont = FontLibrary.createFont(FontLibrary.FontType.NORMAL, - FontLibrary.FontSize.SMALLER, Font.BOLD, lib.getScalingFactor()); + FontLibrary.FontSize.SMALLER, Font.BOLD, lib.getScaleFactor()); JLabel finalLabel = Utility.localizedLabel("finalResult"); finalLabel.setFont(bigFont); add(finalLabel, "newline"); diff --git a/src/net/sf/freecol/client/gui/plaf/FreeColOptionPaneUI.java b/src/net/sf/freecol/client/gui/plaf/FreeColOptionPaneUI.java index 4df0492fa..26575afd9 100644 --- a/src/net/sf/freecol/client/gui/plaf/FreeColOptionPaneUI.java +++ b/src/net/sf/freecol/client/gui/plaf/FreeColOptionPaneUI.java @@ -25,7 +25,6 @@ import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionListener; import java.awt.event.HierarchyEvent; -import java.awt.event.HierarchyListener; import javax.swing.Icon; import javax.swing.JButton; @@ -40,7 +39,7 @@ import javax.swing.plaf.basic.BasicOptionPaneUI; import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.gui.ImageLibrary; -import net.sf.freecol.client.gui.panel.ChoiceItem; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.client.gui.panel.MigPanel; import net.sf.freecol.common.i18n.Messages; @@ -170,15 +169,11 @@ public class FreeColOptionPaneUI extends BasicOptionPaneUI { if (0 <= initialIndex && initialIndex < buttons.length) { JButton b = newButtons[initialIndex]; this.initialFocusComponent = b; - b.addHierarchyListener(new HierarchyListener() { - @Override - public void hierarchyChanged(HierarchyEvent e) { - if ((e.getChangeFlags() - & HierarchyEvent.PARENT_CHANGED) != 0) { - JButton b = (JButton)e.getComponent(); - JRootPane root = SwingUtilities.getRootPane(b); - if (root != null) root.setDefaultButton(b); - } + b.addHierarchyListener((HierarchyEvent e) -> { + if ((e.getChangeFlags() & HierarchyEvent.PARENT_CHANGED) != 0) { + JButton button = (JButton)e.getComponent(); + JRootPane root = SwingUtilities.getRootPane(button); + if (root != null) root.setDefaultButton(button); } }); } diff --git a/src/net/sf/freecol/client/gui/video/VideoComponent.java b/src/net/sf/freecol/client/gui/video/VideoComponent.java index 9eb3669f0..dc73e11d6 100644 --- a/src/net/sf/freecol/client/gui/video/VideoComponent.java +++ b/src/net/sf/freecol/client/gui/video/VideoComponent.java @@ -27,11 +27,11 @@ import java.util.logging.Logger; import javax.swing.JPanel; import javax.swing.border.Border; +import com.fluendo.player.Cortado; + import net.sf.freecol.client.gui.panel.FreeColImageBorder; import net.sf.freecol.common.resources.Video; -import com.fluendo.player.Cortado; - /** * A component for playing video. @@ -55,6 +55,7 @@ public class VideoComponent extends JPanel { public VideoComponent(Video video, boolean mute) { final String url = video.getURL().toExternalForm(); + setOpaque(false); setBorder(createBorder()); final Insets insets = getInsets(); @@ -77,11 +78,9 @@ public class VideoComponent extends JPanel { // Disable the feature that seems to be missing from the stock Cortado //applet.setStopListener(new StopListener() { // public void stopped() { - // SwingUtilities.invokeLater(new Runnable() { - // public void run() { - // for (VideoListener sl : videoListeners) { - // sl.stopped(); - // } + // SwingUtilities.invokeLater(() -> { + // for (VideoListener sl : videoListeners) { + // sl.stopped(); // } // }); // } diff --git a/src/net/sf/freecol/common/debug/DebugUtils.java b/src/net/sf/freecol/common/debug/DebugUtils.java index 7671d8abd..ab8d1b203 100644 --- a/src/net/sf/freecol/common/debug/DebugUtils.java +++ b/src/net/sf/freecol/common/debug/DebugUtils.java @@ -20,20 +20,21 @@ package net.sf.freecol.common.debug; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; import java.util.logging.Logger; +import java.util.stream.Collectors; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.gui.GUI; -import net.sf.freecol.client.gui.panel.ChoiceItem; +import net.sf.freecol.client.gui.ChoiceItem; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.io.FreeColXMLWriter.WriteScope; import net.sf.freecol.common.model.Building; @@ -63,8 +64,10 @@ import net.sf.freecol.common.model.Unit; import net.sf.freecol.common.model.UnitType; import net.sf.freecol.common.option.BooleanOption; import net.sf.freecol.common.util.LogBuilder; +import static net.sf.freecol.common.util.CollectionUtils.*; import net.sf.freecol.common.util.RandomChoice; import static net.sf.freecol.common.util.StringUtils.*; + import net.sf.freecol.server.FreeColServer; import net.sf.freecol.server.ai.AIColony; import net.sf.freecol.server.ai.AIMain; @@ -113,16 +116,14 @@ public class DebugUtils { final GUI gui = freeColClient.getGUI(); final Player player = freeColClient.getMyPlayer(); - List> buildings = new ArrayList<>(); - for (BuildingType b : game.getSpecification().getBuildingTypeList()) { - String msg = Messages.getName(b); - buildings.add(new ChoiceItem<>(msg, b)); - } - Collections.sort(buildings); - - BuildingType buildingType - = gui.getChoice(true, null, buildingTitle, null, "cancel", - buildings); + BuildingType buildingType = gui.getChoice(null, buildingTitle, + "cancel", + game.getSpecification().getBuildingTypeList().stream() + .map(bt -> { + String msg = Messages.getName(bt); + return new ChoiceItem(msg, bt); + }) + .sorted().collect(Collectors.toList())); if (buildingType == null) return; final Game sGame = server.getGame(); @@ -172,17 +173,15 @@ public class DebugUtils { final Player sPlayer = sGame.getFreeColGameObject(player.getId(), Player.class); - List> fathers = new ArrayList<>(); - for (FoundingFather father : sSpec.getFoundingFathers()) { - if (!sPlayer.hasFather(father)) { - String msg = Messages.getName(father); - fathers.add(new ChoiceItem<>(msg, father)); - } - } - Collections.sort(fathers); - - FoundingFather father = gui.getChoice(true, null, fatherTitle, null, - "cancel", fathers); + FoundingFather father = gui.getChoice(null, fatherTitle, + "cancel", + sSpec.getFoundingFathers().stream() + .filter(f -> !sPlayer.hasFather(f)) + .map(f -> { + String msg = Messages.getName(f); + return new ChoiceItem(msg, f); + }) + .sorted().collect(Collectors.toList())); if (father != null) { server.getInGameController() .addFoundingFather((ServerPlayer)sPlayer, father); @@ -204,7 +203,7 @@ public class DebugUtils { final Player sPlayer = sGame.getFreeColGameObject(player.getId(), Player.class); - String response = gui.getInput(true, null, + String response = gui.getInput(null, StringTemplate.template("prompt.selectGold"), Integer.toString(1000), "ok", "cancel"); if (response == null || response.isEmpty()) return; @@ -233,7 +232,7 @@ public class DebugUtils { final Player sPlayer = sGame.getFreeColGameObject(player.getId(), Player.class); - String response = gui.getInput(true, null, + String response = gui.getInput(null, StringTemplate.template("prompt.selectImmigration"), Integer.toString(100), "ok", "cancel"); if (response == null || response.isEmpty()) return; @@ -260,7 +259,7 @@ public class DebugUtils { final Player player = freeColClient.getMyPlayer(); final Game sGame = server.getGame(); - String response = gui.getInput(true, null, + String response = gui.getInput(null, StringTemplate.template("prompt.selectLiberty"), Integer.toString(100), "ok", "cancel"); if (response == null || response.isEmpty()) return; @@ -290,15 +289,12 @@ public class DebugUtils { final FreeColServer server = freeColClient.getFreeColServer(); if (server == null) return; - menu.addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - boolean skipping = server.getInGameController() - .getSkippedTurns() > 0; - item.setText(Messages.message((skipping) - ? "menuBar.debug.stopSkippingTurns" - : "menuBar.debug.skipTurns")); - } + menu.addChangeListener((ChangeEvent e) -> { + boolean skipping = server.getInGameController() + .getSkippedTurns() > 0; + item.setText(Messages.message((skipping) + ? "menuBar.debug.stopSkippingTurns" + : "menuBar.debug.skipTurns")); }); } @@ -321,26 +317,20 @@ public class DebugUtils { final Tile sTile = sGame.getFreeColGameObject(tile.getId(), Tile.class); final GUI gui = freeColClient.getGUI(); - List> uts = new ArrayList<>(); - for (UnitType t : sSpec.getUnitTypeList()) { - String msg = Messages.getName(t); - uts.add(new ChoiceItem<>(msg, t)); - } - Collections.sort(uts); - UnitType unitChoice = gui.getChoice(true, null, - StringTemplate.template("prompt.selectUnitType"), - null, "cancel", uts); + UnitType unitChoice = gui.getChoice(null, + StringTemplate.template("prompt.selectUnitType"), "cancel", + sSpec.getUnitTypeList().stream() + .map(ut -> { + String msg = Messages.getName(ut); + return new ChoiceItem(msg, ut); + }) + .sorted().collect(Collectors.toList())); if (unitChoice == null) return; Unit carrier = null, sCarrier = null; if (!sTile.isLand() && !unitChoice.isNaval()) { - for (Unit u : sTile.getUnitList()) { - if (u.isNaval() - && u.getSpaceLeft() >= unitChoice.getSpaceTaken()) { - sCarrier = u; - break; - } - } + sCarrier = find(sTile.getUnitList(), u -> u.isNaval() + && u.getSpaceLeft() >= unitChoice.getSpaceTaken()); } Location loc = (sCarrier != null) ? sCarrier : sTile; ServerUnit sUnit = new ServerUnit(sGame, loc, sPlayer, @@ -382,12 +372,19 @@ public class DebugUtils { gtl.add(new ChoiceItem<>(msg, t)); } Collections.sort(gtl); - GoodsType goodsType = gui.getChoice(true, null, + GoodsType goodsType = gui.getChoice(null, StringTemplate.template("prompt.selectGoodsType"), - null, "cancel", gtl); + "cancel", + sSpec.getGoodsTypeList().stream() + .filter(gt -> !gt.isFoodType() || gt == sSpec.getPrimaryFoodType()) + .map(gt -> { + String msg = Messages.getName(gt); + return new ChoiceItem(msg, gt); + }) + .sorted().collect(Collectors.toList())); if (goodsType == null) return; - String amount = gui.getInput(true, null, + String amount = gui.getInput(null, StringTemplate.template("prompt.selectGoodsAmount"), "20", "ok", "cancel"); if (amount == null) return; @@ -424,16 +421,15 @@ public class DebugUtils { .addName("%colony%", colony.getName())); return; } - List> choices = new ArrayList<>(); - for (RandomChoice rc : disasters) { - String label = Messages.getName(rc.getObject()) - + " " + Integer.toString(rc.getProbability()); - choices.add(new ChoiceItem<>(label, rc.getObject())); - } - Collections.sort(choices); - Disaster disaster = gui.getChoice(true, null, - StringTemplate.template("prompt.selectDisaster"), - null, "cancel", choices); + Disaster disaster = gui.getChoice(null, + StringTemplate.template("prompt.selectDisaster"), "cancel", + disasters.stream() + .map(rc -> { + String label = Messages.getName(rc.getObject()) + + " " + Integer.toString(rc.getProbability()); + return new ChoiceItem(label, rc.getObject()); + }) + .sorted().collect(Collectors.toList())); if (disaster == null) return; final FreeColServer server = freeColClient.getFreeColServer(); @@ -469,15 +465,14 @@ public class DebugUtils { final GUI gui = freeColClient.getGUI(); final Game game = freeColClient.getGame(); - List> pcs = new ArrayList<>(); - for (Player p : game.getLiveEuropeanPlayers(colony.getOwner())) { - String msg = Messages.message(p.getNationName()); - pcs.add(new ChoiceItem<>(msg, p)); - } - Collections.sort(pcs); - Player player = gui.getChoice(true, null, - StringTemplate.template("prompt.selectOwner"), - null, "cancel", pcs); + Player player = gui.getChoice(null, + StringTemplate.template("prompt.selectOwner"), "cancel", + game.getLiveEuropeanPlayers(colony.getOwner()).stream() + .map(p -> { + String msg = Messages.message(p.getCountryLabel()); + return new ChoiceItem(msg, p); + }) + .sorted().collect(Collectors.toList())); if (player == null) return; ServerPlayer sPlayer = sGame.getFreeColGameObject(player.getId(), @@ -507,17 +502,15 @@ public class DebugUtils { final GUI gui = freeColClient.getGUI(); final Game game = unit.getGame(); - List> pcs = new ArrayList<>(); - for (Player p : game.getLivePlayers(null)) { - if (unit.getType().isAvailableTo(p)) { - String msg = Messages.message(p.getNationName()); - pcs.add(new ChoiceItem<>(msg, p)); - } - } - Collections.sort(pcs); - Player player = gui.getChoice(true, null, - StringTemplate.template("prompt.selectOwner"), - null, "cancel", pcs); + Player player = gui.getChoice(null, + StringTemplate.template("prompt.selectOwner"), "cancel", + game.getLivePlayers(null).stream() + .filter(p -> unit.getType().isAvailableTo(p)) + .map(p -> { + String msg = Messages.message(p.getCountryLabel()); + return new ChoiceItem(msg, p); + }) + .sorted().collect(Collectors.toList())); if (player == null || unit.getOwner() == player) return; final Game sGame = server.getGame(); @@ -552,14 +545,11 @@ public class DebugUtils { final Unit sUnit = sGame.getFreeColGameObject(unit.getId(), Unit.class); final GUI gui = freeColClient.getGUI(); - List> rcs = new ArrayList<>(); - for (Role role : sGame.getSpecification().getRoles()) { - rcs.add(new ChoiceItem<>(role.getId(), role)); - } - Collections.sort(rcs); - Role roleChoice = gui.getChoice(true, null, - StringTemplate.template("prompt.selectRole"), - null, "cancel", rcs); + Role roleChoice = gui.getChoice(null, + StringTemplate.template("prompt.selectRole"), "cancel", + sGame.getSpecification().getRoles().stream() + .map(r -> new ChoiceItem(r.getId(), r)) + .sorted().collect(Collectors.toList())); if (roleChoice == null) return; sUnit.changeRole(roleChoice, roleChoice.getMaximumCount()); @@ -739,7 +729,7 @@ public class DebugUtils { units.put(Messages.message("sailingToEurope"), toEurope); units.put(Messages.getName(p.getEurope()), inEurope); units.put(Messages.message("sailingToAmerica"), toAmerica); - lb.add("\n==", Messages.message(p.getNationName()), "==\n"); + lb.add("\n==", Messages.message(p.getCountryLabel()), "==\n"); for (Unit u : p.getEurope().getUnitList()) { if (u.getDestination() instanceof Map) { @@ -945,19 +935,18 @@ public class DebugUtils { public static void setColonyGoods(final FreeColClient freeColClient, final Colony colony) { final Specification spec = colony.getSpecification(); - List> gtl = new ArrayList<>(); - for (GoodsType t : spec.getGoodsTypeList()) { - if (t.isFoodType() && t != spec.getPrimaryFoodType()) continue; - String msg = Messages.getName(t); - gtl.add(new ChoiceItem<>(msg, t)); - } - Collections.sort(gtl); - GoodsType goodsType = freeColClient.getGUI().getChoice(true, null, - StringTemplate.template("prompt.selectGoodsType"), - null, "cancel", gtl); + GoodsType goodsType = freeColClient.getGUI().getChoice(null, + StringTemplate.template("prompt.selectGoodsType"), "cancel", + spec.getGoodsTypeList().stream() + .filter(gt -> !gt.isFoodType() || gt == spec.getPrimaryFoodType()) + .map(gt -> { + String msg = Messages.getName(gt); + return new ChoiceItem(msg, gt); + }) + .sorted().collect(Collectors.toList())); if (goodsType == null) return; - String response = freeColClient.getGUI().getInput(true, null, + String response = freeColClient.getGUI().getInput(null, StringTemplate.template("prompt.selectGoodsAmount"), Integer.toString(colony.getGoodsCount(goodsType)), "ok", "cancel"); @@ -997,13 +986,13 @@ public class DebugUtils { ServerPlayer.class); final GUI gui = freeColClient.getGUI(); - List> actions = new ArrayList<>(); - for (MonarchAction action : MonarchAction.values()) { - actions.add(new ChoiceItem<>(action)); - } - Collections.sort(actions); - MonarchAction action = gui.getChoice(true, null, monarchTitle, null, - "cancel", actions); + MonarchAction action = gui.getChoice(null, monarchTitle, + "cancel", + Arrays.stream(MonarchAction.values()) + .map(a -> new ChoiceItem(a)) + .sorted().collect(Collectors.toList())); + if (action == null) return; + server.getInGameController().setMonarchAction(sPlayer, action); } @@ -1022,15 +1011,15 @@ public class DebugUtils { final Tile sTile = sGame.getFreeColGameObject(tile.getId(), Tile.class); - List> rumours = new ArrayList<>(); - for (RumourType rumour : RumourType.values()) { - if (rumour == RumourType.NO_SUCH_RUMOUR) continue; - rumours.add(new ChoiceItem<>(rumour.toString(), rumour)); - } - Collections.sort(rumours); - RumourType rumourChoice = freeColClient.getGUI().getChoice(true, null, + RumourType rumourChoice = freeColClient.getGUI().getChoice(null, StringTemplate.template("prompt.selectLostCityRumour"), - null, "cancel", rumours); + "cancel", + Arrays.stream(RumourType.values()) + .filter(r -> r != RumourType.NO_SUCH_RUMOUR) + .map(r -> new ChoiceItem(r.toString(), r)) + .sorted().collect(Collectors.toList())); + if (rumourChoice == null) return; + tile.getTileItemContainer().getLostCityRumour().setType(rumourChoice); sTile.getTileItemContainer().getLostCityRumour() .setType(rumourChoice); @@ -1046,7 +1035,7 @@ public class DebugUtils { public static void skipTurns(FreeColClient freeColClient) { freeColClient.skipTurns(0); // Clear existing skipping - String response = freeColClient.getGUI().getInput(true, null, + String response = freeColClient.getGUI().getInput(null, StringTemplate.key("prompt.selectTurnsToSkip"), Integer.toString(10), "ok", "cancel"); if (response == null || response.isEmpty()) return; @@ -1073,7 +1062,7 @@ public class DebugUtils { boolean more = true; while (more) { int val = server.getInGameController().stepRandom(); - more = gui.confirm(true, null, StringTemplate + more = gui.confirm(null, StringTemplate .template("prompt.stepRNG") .addAmount("%value%", val), "more", "cancel"); @@ -1104,7 +1093,7 @@ public class DebugUtils { Player mostHated = sis.getMostHated(); for (Player p : sGame.getLiveEuropeanPlayers(null)) { Tension tension = sis.getAlarm(p); - lb.add(Messages.message(p.getNationName()), + lb.add(Messages.message(p.getNationLabel()), " ", ((tension == null) ? "(none)" : Integer.toString(tension.getValue())), ((mostHated == p) ? " (most hated)" : ""), diff --git a/src/net/sf/freecol/common/debug/FreeColDebugger.java b/src/net/sf/freecol/common/debug/FreeColDebugger.java index 513729de5..f01cab982 100644 --- a/src/net/sf/freecol/common/debug/FreeColDebugger.java +++ b/src/net/sf/freecol/common/debug/FreeColDebugger.java @@ -24,8 +24,10 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; +import java.util.Arrays; import java.util.Locale; import java.util.logging.Logger; +import java.util.stream.Collectors; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.common.model.Player; @@ -129,11 +131,10 @@ public class FreeColDebugger { * @return A string containing the modes as csv. */ public static String getDebugModes() { - String ret = ""; - for (DebugMode mode : DebugMode.values()) { - if (isInDebugMode(mode)) ret += "," + mode; - } - return (ret.isEmpty()) ? ret : ret.substring(1, ret.length()); + return Arrays.stream(DebugMode.values()) + .filter(m -> isInDebugMode(m)) + .map(m -> m.toString()) + .collect(Collectors.joining(",")); } /** diff --git a/src/net/sf/freecol/common/i18n/DefaultNumberRule.java b/src/net/sf/freecol/common/i18n/DefaultNumberRule.java index 6831cc457..839f13cb0 100644 --- a/src/net/sf/freecol/common/i18n/DefaultNumberRule.java +++ b/src/net/sf/freecol/common/i18n/DefaultNumberRule.java @@ -22,6 +22,8 @@ package net.sf.freecol.common.i18n; import java.util.EnumMap; import java.util.Map; +import static net.sf.freecol.common.util.CollectionUtils.*; + /** * This class handles zero or one rule for each number category. @@ -75,12 +77,8 @@ public class DefaultNumberRule extends Number { */ @Override public Category getCategory(double input) { - for (Category number : Category.values()) { - Rule r = rules.get(number); - if (r != null && r.matches(input)) { - return number; - } - } - return Category.other; + return find(Category.values(), + category -> rules.containsKey(category) + && rules.get(category).matches(input), Category.other); } } diff --git a/src/net/sf/freecol/common/i18n/Messages.java b/src/net/sf/freecol/common/i18n/Messages.java index a54fb3f57..685555d31 100644 --- a/src/net/sf/freecol/common/i18n/Messages.java +++ b/src/net/sf/freecol/common/i18n/Messages.java @@ -41,11 +41,11 @@ import net.sf.freecol.common.io.FreeColDirectories; import net.sf.freecol.common.io.FreeColDataFile; import net.sf.freecol.common.io.FreeColModFile; import net.sf.freecol.common.io.Mods; -import net.sf.freecol.common.model.FreeColObject; import net.sf.freecol.common.model.Named; import net.sf.freecol.common.model.Role; import net.sf.freecol.common.model.StringTemplate; import net.sf.freecol.common.model.StringTemplate.TemplateType; +import static net.sf.freecol.common.util.CollectionUtils.*; /** @@ -60,7 +60,7 @@ import net.sf.freecol.common.model.StringTemplate.TemplateType; * Properties class is unable to handle UTF-8 directly, this class * uses its own implementation. * - * Te individual messages may include variables, which must be + * The individual messages may include variables, which must be * delimited by percent characters (e.g. "%nation%"), and will be * replaced when the message is formatted. Furthermore, the messages * may include choice formats consisting of a tag followed by a colon @@ -416,13 +416,9 @@ public class Messages { } public static String getBestDescription(String id) { - for (String suffix : DESCRIPTION_KEYS) { - String key = id + suffix; - if (containsKey(key)) { - return message(key); - } - } - return id; + String key = find(map(DESCRIPTION_KEYS, s -> id + s), + k -> containsKey(k), null); + return (key == null) ? id : message(key); } /** @@ -874,10 +870,12 @@ public class Messages { int replacementIndex = input.indexOf('|', start); int nextOpenIndex = input.indexOf("{{", start); if (nextOpenIndex >= 0 && nextOpenIndex < replacementIndex) { - replacementIndex = input.indexOf('|', findMatchingBracket(input, nextOpenIndex + 2) + 2); + replacementIndex = input.indexOf('|', + findMatchingBracket(input, nextOpenIndex + 2) + 2); } - int end = (replacementIndex < 0 || replacementIndex > closeChoice) - ? closeChoice : replacementIndex; + int end = (replacementIndex < 0 + || replacementIndex > closeChoice) ? closeChoice + : replacementIndex; String replacement = input.substring(start, end); if (!replacement.contains("{{")) { result.append(replacement); diff --git a/src/net/sf/freecol/common/i18n/NameCache.java b/src/net/sf/freecol/common/i18n/NameCache.java index 321846676..f49eb1bb9 100644 --- a/src/net/sf/freecol/common/i18n/NameCache.java +++ b/src/net/sf/freecol/common/i18n/NameCache.java @@ -32,8 +32,8 @@ import net.sf.freecol.common.model.Player; import net.sf.freecol.common.model.Region; import net.sf.freecol.common.model.Region.RegionType; import net.sf.freecol.common.model.StringTemplate; -import net.sf.freecol.common.model.Unit; import net.sf.freecol.common.model.UnitType; + import static net.sf.freecol.common.util.RandomUtils.*; import static net.sf.freecol.common.util.StringUtils.*; @@ -423,7 +423,7 @@ public class NameCache { synchronized (regionNameLock) { index = regionIndex.get(prefix); } - StringTemplate nn = player.getNationName(); + StringTemplate nn = player.getNationLabel(); do { name = Messages.message(StringTemplate.label(" ") .addStringTemplate(nn) @@ -478,7 +478,7 @@ public class NameCache { List names = settlementNames.get(player); while (!names.isEmpty()) { String name = names.remove(0); - if (game.getSettlement(name) == null) return name; + if (game.getSettlementByName(name) == null) return name; } } @@ -486,7 +486,7 @@ public class NameCache { final String base = getFallbackSettlementName(player); int i = player.getSettlements().size() + 1; String name = null; - while (game.getSettlement(name = base + i++) != null); + while (game.getSettlementByName(name = base + i++) != null); return name; } @@ -514,10 +514,10 @@ public class NameCache { */ public static String getTradeRouteName(Player player) { String base = Messages.message("nameCache.base.tradeRoute"); - if (player.getTradeRoute(base) == null) return base; + if (player.getTradeRouteByName(base) == null) return base; String name; int i = 1; - while (player.getTradeRoute(name = base + i++) != null); + while (player.getTradeRouteByName(name = base + i++) != null); return name; } @@ -543,14 +543,14 @@ public class NameCache { List names = shipNames.get(player); while (!names.isEmpty()) { name = names.remove(0); - if (player.getUnit(name) == null) return name; + if (player.getUnitByName(name) == null) return name; } } // Get a fallback ship name final String base = Messages.message("nameCache.base.ship") + "-"; int i = 1; - while (player.getUnit(name = base + i++) != null); + while (player.getUnitByName(name = base + i++) != null); return name; } } diff --git a/src/net/sf/freecol/common/i18n/Rule.java b/src/net/sf/freecol/common/i18n/Rule.java index c9ffb030d..3b47383ac 100644 --- a/src/net/sf/freecol/common/i18n/Rule.java +++ b/src/net/sf/freecol/common/i18n/Rule.java @@ -24,6 +24,8 @@ import java.util.List; import java.util.Locale; import java.util.StringTokenizer; +import static net.sf.freecol.common.util.CollectionUtils.*; + /** * A rule consists of any number of relations combined with "and" and @@ -52,19 +54,15 @@ public class Rule { /** * Returns true if this rule matches the given number. * - * @param number a double value - * @return a boolean value + * The outer conditions are or-combined (using anyMatch), the + * inner conditions are and-combined (using allMatch). + * + * @param number The number to test. + * @return True if the number matches this rule. */ public boolean matches(double number) { - outer: for (List andCondition : conditions) { - for (Relation relation : andCondition) { - if (!relation.matches(number)) { - continue outer; - } - } - return true; - } - return false; + return any(conditions, + andConditions -> all(andConditions, r -> r.matches(number))); } /** diff --git a/src/net/sf/freecol/common/io/FreeColDataFile.java b/src/net/sf/freecol/common/io/FreeColDataFile.java index b682c9948..7e361a362 100644 --- a/src/net/sf/freecol/common/io/FreeColDataFile.java +++ b/src/net/sf/freecol/common/io/FreeColDataFile.java @@ -28,27 +28,22 @@ import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.net.URLConnection; - import java.util.ArrayList; +import java.util.Arrays; import java.util.Enumeration; import java.util.List; import java.util.Locale; import java.util.Properties; -import java.util.Set; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.logging.Level; import java.util.logging.Logger; -import net.sf.freecol.common.resources.Resource; import net.sf.freecol.common.resources.ResourceFactory; import net.sf.freecol.common.resources.ResourceMapper; import net.sf.freecol.common.resources.ResourceMapping; - -import static net.sf.freecol.common.util.CollectionUtils.*; - import net.sf.freecol.common.util.LogBuilder; - +import static net.sf.freecol.common.util.CollectionUtils.*; import static net.sf.freecol.common.util.StringUtils.*; @@ -60,8 +55,7 @@ public class FreeColDataFile { private static final Logger logger = Logger.getLogger(FreeColDataFile.class.getName()); - private static final Set FILE_ENDINGS - = makeUnmodifiableSet(".zip"); + protected static final String ZIP_FILE_EXTENSION = "zip"; private static final String RESOURCE_FILE_PREFIX = "resources"; private static final String RESOURCE_FILE_SUFFIX = ".properties"; @@ -85,38 +79,23 @@ public class FreeColDataFile { * @exception IOException if the file does not exist. */ public FreeColDataFile(File file) throws IOException { - if (!file.exists()) { - for (String ending : getFileEndings()) { - final File tempFile = new File(file.getAbsolutePath() + ending); - if (tempFile.exists()) { - file = tempFile; - break; - } - } - } if (!file.exists()) { throw new IOException("File " + file.getName() + " does not exist"); } this.file = file; - - if (file.isDirectory()) { - this.jarDirectory = null; - } else { - String jarName = file.getName().substring(0, - file.getName().lastIndexOf('.')); - this.jarDirectory = findJarDirectory(jarName, file); - } + this.jarDirectory = (file.isDirectory()) ? null + : findJarDirectory(file); } /** * Finds the directory within the zip-file in case the data file * has been renamed. * - * @param expectedName The name the directory should have. * @param file The zip-file. * @return The name of the base directory in the zip-file. */ - private static String findJarDirectory(final String expectedName, File file) { + private static String findJarDirectory(File file) { + String expected = file.getName().substring(0, file.getName().lastIndexOf('.')); try ( JarFile jf = new JarFile(file); ) { @@ -130,7 +109,7 @@ public class FreeColDataFile { return name; } catch (Exception e) { logger.log(Level.WARNING, "Exception while reading data file.", e); - return expectedName; + return expected; } } @@ -291,32 +270,23 @@ public class FreeColDataFile { } /** - * Gets a FileFilter for the accepted file endings. + * Make a FileFilter for a set of file endings. * - * @return The FileFilter. + * @param requiredFile If non-null, the filter will accept a directory + * containing this file. + * @param endings Acceptable file suffixes. + * @return A suitable FileFilter. */ - public FileFilter getFileFilter() { - return new FileFilter() { - @Override - public boolean accept(File f) { - final String name = f.getName(); - for (String ending : getFileEndings()) { - if (name.endsWith(ending)) { - return true; - } - } - return false; - } + public static FileFilter makeFileFilter(final String requiredFile, + final String... endings) { + return f -> { + final String name = f.getName(); + return (name.startsWith(".")) + ? false + : (requiredFile != null && f.isDirectory()) + ? new File(f, requiredFile).exists() + : any(endings, e -> name.endsWith("." + e) + && name.length() > e.length()); }; } - - /** - * File endings that are supported for this type of data file. - * Override in classes that accept other endings. - * - * @return An array with a single element: ".zip". - */ - protected static Set getFileEndings() { - return FILE_ENDINGS; - } } diff --git a/src/net/sf/freecol/common/io/FreeColDirectories.java b/src/net/sf/freecol/common/io/FreeColDirectories.java index 50bc4081b..ceed04ca6 100644 --- a/src/net/sf/freecol/common/io/FreeColDirectories.java +++ b/src/net/sf/freecol/common/io/FreeColDirectories.java @@ -22,6 +22,8 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; import javax.swing.filechooser.FileSystemView; @@ -431,52 +433,6 @@ public class FreeColDirectories { return null; } - /** - * Copy files/directories from one path to another. - * - * FIXME: Use Java7 copyFile and copyDirectory routines - * - * @param src The source directory. - * @param dst The destination directory. - * @return True if the copy succeeded. - */ - private static boolean copyDir(File src, File dst) { - if (!dst.mkdir()) return false; - for (String f : src.list()) { - File srcFile = new File(src, f); - File dstFile = new File(dst, f); - if (srcFile.isDirectory()) { - if (!copyDir(srcFile, dstFile)) return false; - } else if (srcFile.isFile()) { - if (!copyFile(srcFile, dstFile)) return false; - } else { - // do not copy other objects - } - } - return true; - } - - /** - * Copy a file. - * - * @param src The source File. - * @param dst The destination File. - * @return True if the copy succeeded. - */ - private static boolean copyFile(File src, File dst) { - byte[] buf = new byte[16384]; - int len; - try ( - FileInputStream in = new FileInputStream(src); - FileOutputStream out = new FileOutputStream(dst); - ) { - while ((len = in.read(buf)) > 0) out.write(buf, 0, len); - } catch (IOException ioe) { - return false; - } - return true; - } - /** * Copy directory with given name under an old directory to a new * directory. @@ -489,7 +445,13 @@ public class FreeColDirectories { File src = new File(oldDir, name); File dst = new File(newDir, name); if (src.exists() && src.isDirectory() && !dst.exists()) { - copyDir(src, dst); + try { + Files.copy(src.toPath(), dst.toPath(), + StandardCopyOption.COPY_ATTRIBUTES); + } catch (IOException ioe) { + System.err.println("Could not copy " + src.toString() + " to " + + dst.toString() + ": " + ioe.getMessage()); + } } } @@ -515,6 +477,16 @@ public class FreeColDirectories { } } + /** + * Derive the directory for the autosave files from the save directory. + */ + private static void deriveAutosaveDirectory() { + if (autosaveDirectory == null && saveDirectory != null) { + autosaveDirectory = new File(saveDirectory, AUTOSAVE_DIRECTORY); + if (!insistDirectory(autosaveDirectory)) autosaveDirectory = null; + } + } + // Main initialization/bootstrap routines. // These need to be called early before the subsidiary directory @@ -630,9 +602,7 @@ public class FreeColDirectories { saveDirectory = new File(getUserDataDirectory(), SAVE_DIRECTORY); if (!insistDirectory(saveDirectory)) return "main.userDir.fail"; } - - autosaveDirectory = new File(getSaveDirectory(), AUTOSAVE_DIRECTORY); - if (!insistDirectory(autosaveDirectory)) autosaveDirectory = null; + deriveAutosaveDirectory(); userModsDirectory = new File(getUserDataDirectory(), MODS_DIRECTORY); if (!insistDirectory(userModsDirectory)) userModsDirectory = null; @@ -644,7 +614,6 @@ public class FreeColDirectories { : null; } - // Directory accessors. // Where there are supported command line arguments there will also // be a mutator. @@ -803,15 +772,6 @@ public class FreeColDirectories { return saveDirectory; } - /** - * Set the directory where the saved games should be put. - * - * @param dir The new saved games directory. - */ - public static void setSaveDirectory(File dir) { - saveDirectory = dir; - } - /** * Gets the save game file. * @@ -821,15 +781,6 @@ public class FreeColDirectories { return savegameFile; } - /** - * Sets the save game file. - * - * @param file The new save game file. - */ - public static void setSavegameFile(File file) { - savegameFile = file; - } - /** * Sets the save game file. * @@ -842,10 +793,11 @@ public class FreeColDirectories { file = new File(getSaveDirectory(), path); if (!file.exists() || !file.isFile() || !file.canRead()) return false; } - setSavegameFile(file); - setSaveDirectory(file.getParentFile()); - File autoDirectory = new File(getSaveDirectory(), AUTOSAVE_DIRECTORY); - if (insistDirectory(autoDirectory)) autosaveDirectory = autoDirectory; + savegameFile = file; + File parent = file.getParentFile(); + if (parent == null) parent = new File("."); + saveDirectory = parent; + deriveAutosaveDirectory(); return true; } @@ -861,7 +813,7 @@ public class FreeColDirectories { for (File directory : new File[] { FreeColDirectories.getSaveDirectory(), FreeColDirectories.getAutosaveDirectory() }) { - for (File savegame : directory.listFiles(FreeCol.freeColSaveFileFilter)) { + for (File savegame : directory.listFiles(FreeColSavegameFile.getFileFilter())) { if (lastSave == null || savegame.lastModified() > lastSave.lastModified()) { lastSave = savegame; diff --git a/src/net/sf/freecol/common/io/FreeColFileFilter.java b/src/net/sf/freecol/common/io/FreeColFileFilter.java deleted file mode 100644 index bb84fbd87..000000000 --- a/src/net/sf/freecol/common/io/FreeColFileFilter.java +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Copyright (C) 2002-2015 The FreeCol Team - * - * This file is part of FreeCol. - * - * FreeCol is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * FreeCol is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with FreeCol. If not, see . - */ - -package net.sf.freecol.common.io; - -import java.io.File; - -import javax.swing.filechooser.FileFilter; - -import net.sf.freecol.FreeCol; -import net.sf.freecol.common.i18n.Messages; - - -/** - * A simple file filter with a description. - */ -public class FreeColFileFilter extends FileFilter { - - private final String[] extensions; - private final boolean allowSubdirs; - private final String description; - - /** - * Visible predefined constant filter for selected saved games or - * subdirectories. - */ - public static final FileFilter freeColSaveDirectoryFilter - = new FreeColFileFilter(FreeCol.FREECOL_SAVE_EXTENSION, true, - "filter.savedGames"); - - public static final FileFilter freeColXMLFilter - = new FreeColFileFilter(".xml", true, "filter.xml"); - - - /** - * Create a new FreeColFileFilter. - * - * @param extension An acceptable extension. - * @param allowSubdirs If true accept subdirectories. - * @param description A description for the filter. - */ - public FreeColFileFilter(String extension, boolean allowSubdirs, - String description) { - this.extensions = new String[] { extension }; - this.allowSubdirs = allowSubdirs; - this.description = Messages.message(description); - } - - - // Implement FileFilter - - /** - * {@inheritDoc} - */ - @Override - public boolean accept(File f) { - if (allowSubdirs && f.isDirectory()) return true; - if (!f.isFile()) return false; - for (String x : extensions) { - if (f.getName().endsWith(x) && f.getName().length() > x.length()) - return true; - } - return false; - } - - /** - * {@inheritDoc} - */ - @Override - public String getDescription() { - return description; - } -} diff --git a/src/net/sf/freecol/common/io/FreeColModFile.java b/src/net/sf/freecol/common/io/FreeColModFile.java index fd4eb5c0e..bcab2e9bd 100644 --- a/src/net/sf/freecol/common/io/FreeColModFile.java +++ b/src/net/sf/freecol/common/io/FreeColModFile.java @@ -20,17 +20,15 @@ package net.sf.freecol.common.io; import java.io.File; +import java.io.FileFilter; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import javax.xml.stream.XMLStreamException; -import java.util.Set; - import net.sf.freecol.common.ObjectWithId; - -import static net.sf.freecol.common.util.CollectionUtils.*; +import net.sf.freecol.common.model.Specification; /** @@ -38,12 +36,17 @@ import static net.sf.freecol.common.util.CollectionUtils.*; */ public class FreeColModFile extends FreeColDataFile implements ObjectWithId { - private static final Set FILE_ENDINGS - = makeUnmodifiableSet(".fmd", ".zip"); - public static final String SPECIFICATION_FILE = "specification.xml"; - public static final String MOD_DESCRIPTOR_FILE = "mod.xml"; + protected static final String SPECIFICATION_FILE = "specification.xml"; + protected static final String MOD_DESCRIPTOR_FILE = "mod.xml"; + /** A file filter to select mods. */ + private static final FileFilter fileFilter + = makeFileFilter(MOD_DESCRIPTOR_FILE, "fmd", ZIP_FILE_EXTENSION); + + /** The identifier for this mod. */ private String id; + + /** The identifier for the parent of this mod, if any. */ private String parent; @@ -55,9 +58,11 @@ public class FreeColModFile extends FreeColDataFile implements ObjectWithId { */ public FreeColModFile(final File file) throws IOException { super(file); + readModDescriptor(); } + /** * Gets the input stream to the specification. * @@ -74,6 +79,29 @@ public class FreeColModFile extends FreeColDataFile implements ObjectWithId { return null; } + /** + * Gets the Specification. + * + * @return The Specification, or null if none present. + * @exception IOException if an error occurs reading the specification. + */ + public Specification getSpecification() throws IOException { + try (InputStream si = getSpecificationInputStream()) { + return (si == null) ? null : new Specification(si); + } + } + + /** + * Gets the input stream to the mod meta file. + * + * @return An InputStream to the file "mod.xml" + * within this data file. + * @exception IOException if thrown while opening the input stream. + */ + private InputStream getModDescriptorInputStream() throws IOException { + return getInputStream(MOD_DESCRIPTOR_FILE); + } + /** * Reads a file object representing this mod. * @@ -92,26 +120,6 @@ public class FreeColModFile extends FreeColDataFile implements ObjectWithId { } } - /** - * Gets the input stream to the mod meta file. - * - * @return An InputStream to the file "mod.xml" - * within this data file. - * @exception IOException if thrown while opening the input stream. - */ - private InputStream getModDescriptorInputStream() throws IOException { - return getInputStream(MOD_DESCRIPTOR_FILE); - } - - /** - * File endings that are supported for this type of data file. - * - * @return A set of: ".fmd" and ".zip". - */ - protected static Set getFileEndings() { - return FILE_ENDINGS; - } - /** * Gets the object identifier of this mod. * @@ -130,4 +138,13 @@ public class FreeColModFile extends FreeColDataFile implements ObjectWithId { public String getParent() { return parent; } + + /** + * Get the file filter to select mod files. + * + * @return The mod file filter. + */ + public static FileFilter getFileFilter() { + return fileFilter; + } } diff --git a/src/net/sf/freecol/common/io/FreeColSavegameFile.java b/src/net/sf/freecol/common/io/FreeColSavegameFile.java index 6331be645..69a2e54c4 100644 --- a/src/net/sf/freecol/common/io/FreeColSavegameFile.java +++ b/src/net/sf/freecol/common/io/FreeColSavegameFile.java @@ -20,28 +20,18 @@ package net.sf.freecol.common.io; import java.io.File; +import java.io.FileFilter; import java.io.IOException; import java.io.BufferedInputStream; -import java.util.Set; -import java.util.logging.Logger; - import net.sf.freecol.FreeCol; -import static net.sf.freecol.common.util.CollectionUtils.*; - /** * Represents a FreeCol savegame. */ public class FreeColSavegameFile extends FreeColDataFile { - @SuppressWarnings("unused") - private static final Logger logger = Logger.getLogger(FreeColSavegameFile.class.getName()); - - private static final Set FILE_ENDINGS - = makeUnmodifiableSet(FreeCol.FREECOL_SAVE_EXTENSION, ".zip"); - /** The tag for the version string in the saved game. */ public static final String VERSION_TAG = "version"; @@ -72,8 +62,16 @@ public class FreeColSavegameFile extends FreeColDataFile { */ public static final String THUMBNAIL_FILE = "thumbnail.png"; + /** A file filter to select the saved game files. */ + private static final FileFilter fileFilter = makeFileFilter(SAVEGAME_FILE, + FreeCol.FREECOL_SAVE_EXTENSION, ZIP_FILE_EXTENSION); + /** + * Create a new save game file from a given file. + * + * @param file The base File. + */ public FreeColSavegameFile(File file) throws IOException { super(file); } @@ -119,10 +117,11 @@ public class FreeColSavegameFile extends FreeColDataFile { } /** - * File endings that are supported for this type of data file. - * @return An array of: ".fsg" and ".zip". + * Get the file filter to select saved game files. + * + * @return The saved game file filter. */ - protected static Set getFileEndings() { - return FILE_ENDINGS; + public static FileFilter getFileFilter() { + return fileFilter; } } diff --git a/src/net/sf/freecol/common/io/FreeColTcFile.java b/src/net/sf/freecol/common/io/FreeColTcFile.java index ce3c5075c..d5ae91a06 100644 --- a/src/net/sf/freecol/common/io/FreeColTcFile.java +++ b/src/net/sf/freecol/common/io/FreeColTcFile.java @@ -20,14 +20,10 @@ package net.sf.freecol.common.io; import java.io.File; -import java.io.InputStream; +import java.io.FileFilter; import java.io.IOException; -import java.util.Set; - -import net.sf.freecol.common.model.Specification; import net.sf.freecol.common.resources.ResourceMapping; -import static net.sf.freecol.common.util.CollectionUtils.*; /** @@ -35,8 +31,9 @@ import static net.sf.freecol.common.util.CollectionUtils.*; */ public class FreeColTcFile extends FreeColModFile { - private static final Set FILE_ENDINGS - = makeUnmodifiableSet(".ftc", ".zip"); + /** A file filter to select TCs. */ + private static final FileFilter fileFilter + = makeFileFilter(MOD_DESCRIPTOR_FILE, "ftc", ZIP_FILE_EXTENSION); /** @@ -60,22 +57,6 @@ public class FreeColTcFile extends FreeColModFile { } - /** - * Gets the Specification of this TC. - * - * @return The Specification in this TC, or null if - * none present. - * @exception IOException if an error occurs reading the specification. - */ - public Specification getSpecification() throws IOException { - Specification specification; - try (InputStream si = getSpecificationInputStream()) { - if (si == null) return null; - specification = new Specification(si); - } - return specification; - } - /** * {@inheritDoc} */ @@ -100,11 +81,11 @@ public class FreeColTcFile extends FreeColModFile { } /** - * File endings that are supported for this type of data file. + * Get the file filter to select TC files. * - * @return A set: ".ftc" and ".zip". + * @return The TC file filter. */ - protected static Set getFileEndings() { - return FILE_ENDINGS; + public static FileFilter getFileFilter() { + return fileFilter; } } diff --git a/src/net/sf/freecol/common/io/FreeColXMLReader.java b/src/net/sf/freecol/common/io/FreeColXMLReader.java index a9df9ee94..dd78a40e2 100644 --- a/src/net/sf/freecol/common/io/FreeColXMLReader.java +++ b/src/net/sf/freecol/common/io/FreeColXMLReader.java @@ -593,7 +593,6 @@ public class FreeColXMLReader extends StreamReaderDelegate * @param required If true a null result should throw an exception. * @return The FreeColGameObject found or made, or null * if the attribute was not present. - * @exception XMLStreamError if there was a problem reading the stream. */ public T makeFreeColGameObject(Game game, String attributeName, Class returnClass, diff --git a/src/net/sf/freecol/common/io/Mods.java b/src/net/sf/freecol/common/io/Mods.java index 82e3b0337..650c446d9 100644 --- a/src/net/sf/freecol/common/io/Mods.java +++ b/src/net/sf/freecol/common/io/Mods.java @@ -20,7 +20,6 @@ package net.sf.freecol.common.io; import java.io.File; -import java.io.FileFilter; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -30,6 +29,7 @@ import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; +import net.sf.freecol.common.io.FreeColModFile; import net.sf.freecol.common.util.LogBuilder; @@ -40,26 +40,6 @@ public class Mods { private static final Logger logger = Logger.getLogger(Mods.class.getName()); - private static final FileFilter MOD_FILTER = new FileFilter() { - @Override - public boolean accept(File f) { - final String name = f.getName(); - if (name.startsWith(".")) { - // Ignore `hidden' files. - return false; - } else if (f.isDirectory()) { - return true; - } else { - for (String ending : FreeColModFile.getFileEndings()) { - if (name.endsWith(ending)) { - return true; - } - } - return false; - } - } - }; - /** A cache of all the mods. */ private static final Map allMods = new HashMap<>(); @@ -74,7 +54,7 @@ public class Mods { LogBuilder lb = new LogBuilder(64); lb.add("In ", directory.getPath(), " found mod:"); lb.mark(); - for (File f : directory.listFiles(MOD_FILTER)) { + for (File f : directory.listFiles(FreeColModFile.getFileFilter())) { try { FreeColModFile fcmf = new FreeColModFile(f); allMods.put(fcmf.getId(), fcmf); @@ -137,18 +117,11 @@ public class Mods { public static List getRuleSets() { List result = new ArrayList<>(); File directory = FreeColDirectories.getRulesDirectory(); - for (File dir : directory.listFiles()) { - if (dir.isDirectory()) { - File modDescription - = new File(dir, FreeColModFile.MOD_DESCRIPTOR_FILE); - if (modDescription.exists()) { - try { - result.add(new FreeColTcFile(dir)); - } catch (IOException e) { - logger.log(Level.WARNING, "Failed to create rule set " - + dir, e); - } - } + for (File f : directory.listFiles(FreeColTcFile.getFileFilter())) { + try { + result.add(new FreeColTcFile(f)); + } catch (IOException ioe) { + logger.log(Level.WARNING, "Failed to load rule set " + f, ioe); } } return result; diff --git a/src/net/sf/freecol/common/model/AbstractGoods.java b/src/net/sf/freecol/common/model/AbstractGoods.java index 01cc99dae..59e6152d6 100644 --- a/src/net/sf/freecol/common/model/AbstractGoods.java +++ b/src/net/sf/freecol/common/model/AbstractGoods.java @@ -27,6 +27,7 @@ import javax.xml.stream.XMLStreamException; import net.sf.freecol.common.io.FreeColXMLReader; import net.sf.freecol.common.io.FreeColXMLWriter; import net.sf.freecol.common.model.GoodsType; +import static net.sf.freecol.common.util.CollectionUtils.*; import net.sf.freecol.common.util.Utils; @@ -182,10 +183,8 @@ public class AbstractGoods extends FreeColObject implements Named { * @return The AbstractGoods found, or null if not. */ public static AbstractGoods findByType(GoodsType type, - Collection goods) { - for (AbstractGoods ag : goods) { - if (ag.getType() == type) return ag; - } + Collection goods) { + for (AbstractGoods ag : goods) if (ag.getType() == type) return ag; return null; } @@ -198,11 +197,23 @@ public class AbstractGoods extends FreeColObject implements Named { * @return The goods count found, or zero if not found. */ public static int getCount(GoodsType type, - Collection goods) { + Collection goods) { AbstractGoods ag = findByType(type, goods); return (ag == null) ? 0 : ag.getAmount(); } + /** + * Does a goods collection contain an element with a given type? + * + * @param goods The Goods collection to search. + * @param type The GoodsType to search for. + * @return True if the goods type was found. + */ + public static boolean containsType(GoodsType type, + Collection goods) { + return contains(goods, ag -> ag.getType() == type); + } + /** * Evaluate goods for trade purposes. * diff --git a/src/net/sf/freecol/common/model/AbstractUnit.java b/src/net/sf/freecol/common/model/AbstractUnit.java index d0a489a71..41c86f9b9 100644 --- a/src/net/sf/freecol/common/model/AbstractUnit.java +++ b/src/net/sf/freecol/common/model/AbstractUnit.java @@ -166,7 +166,7 @@ public class AbstractUnit extends FreeColObject { * @param spec A Specification to look up. * @return The approximate offence power. */ - public float getOffence(Specification spec) { + public double getOffence(Specification spec) { int n = getNumber(); Role role = getRole(spec); UnitType type = spec.getUnitType(getId()); @@ -182,9 +182,7 @@ public class AbstractUnit extends FreeColObject { */ public static double calculateStrength(Specification spec, List units) { - float result = 0; - for (AbstractUnit au : units) result += au.getOffence(spec); - return result; + return units.stream().mapToDouble(au -> au.getOffence(spec)).sum(); } /** diff --git a/src/net/sf/freecol/common/model/BuildQueue.java b/src/net/sf/freecol/common/model/BuildQueue.java index b9e5e14d6..5d489d8c3 100644 --- a/src/net/sf/freecol/common/model/BuildQueue.java +++ b/src/net/sf/freecol/common/model/BuildQueue.java @@ -143,6 +143,7 @@ public class BuildQueue implements Consumer { this.completionAction = newCompletionAction; } + // Interface Consumer /** diff --git a/src/net/sf/freecol/common/model/BuildableType.java b/src/net/sf/freecol/common/model/BuildableType.java index 48ca6f746..5e6c3e22c 100644 --- a/src/net/sf/freecol/common/model/BuildableType.java +++ b/src/net/sf/freecol/common/model/BuildableType.java @@ -20,17 +20,20 @@ package net.sf.freecol.common.model; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.stream.Collectors; import javax.xml.stream.XMLStreamException; import net.sf.freecol.common.io.FreeColXMLReader; import net.sf.freecol.common.io.FreeColXMLWriter; import net.sf.freecol.common.model.StringTemplate; +import static net.sf.freecol.common.util.CollectionUtils.*; /** @@ -132,18 +135,9 @@ public abstract class BuildableType extends FreeColGameObjectType { * @return True if the buildable is available. */ public boolean isAvailableTo(FreeColObject... fco) { - if (requiredAbilities != null) { - FreeColObject[] objects = fco; - for (Entry entry : requiredAbilities.entrySet()) { - boolean found = false; - for (FreeColObject object : objects) { - found = object.hasAbility(entry.getKey()); - if (found) break; - } - if (found != entry.getValue()) return false; - } - } - return true; + return (requiredAbilities == null) ? true + : all(requiredAbilities.entrySet(), + e -> e.getValue() == any(fco, o -> o.hasAbility(e.getKey()))); } /** @@ -180,9 +174,7 @@ public abstract class BuildableType extends FreeColGameObjectType { * @param ag The required AbstractGoods to add. */ private void addRequiredGoods(AbstractGoods ag) { - if (requiredGoods == null) { - requiredGoods = new ArrayList<>(); - } + if (requiredGoods == null) requiredGoods = new ArrayList<>(); requiredGoods.add(ag); } diff --git a/src/net/sf/freecol/common/model/Building.java b/src/net/sf/freecol/common/model/Building.java index c2849e963..ccb30f87e 100644 --- a/src/net/sf/freecol/common/model/Building.java +++ b/src/net/sf/freecol/common/model/Building.java @@ -263,10 +263,8 @@ public class Building extends WorkLocation } else { for (AbstractGoods output : getOutputs()) { final GoodsType goodsType = output.getType(); - float production = 0f; - for (Unit u : getUnitList()) { - production += getUnitProduction(u, goodsType); - } + float production = getUnitList().stream() + .mapToInt(u -> getUnitProduction(u, goodsType)).sum(); // Unattended production always applies for buildings! production += getBaseProduction(null, goodsType, null); production = applyModifiers(production, turn, @@ -282,8 +280,8 @@ public class Building extends WorkLocation // Then reduce the minimum ratio if some input is in short supply. for (AbstractGoods input : getInputs()) { - int required = (int)Math.floor(input.getAmount() * minimumRatio); - int available = getAvailable(input.getType(), inputs); + long required = (long)Math.floor(input.getAmount() * minimumRatio); + long available = getAvailable(input.getType(), inputs); // Do not allow auto-production to go negative. if (canAutoProduce()) available = Math.max(0, available); // Experts in factory level buildings may produce a @@ -292,13 +290,10 @@ public class Building extends WorkLocation if (available < required && hasAbility(Ability.EXPERTS_USE_CONNECTIONS) && spec.getBoolean(GameOptions.EXPERTS_HAVE_CONNECTIONS)) { - int minimumGoodsInput = 0; - for (Unit unit: getUnitList()) { - if (unit.getType() == getExpertUnitType()) { - // FIXME: put magic number in specification - minimumGoodsInput += 4; - } - } + long minimumGoodsInput = 4 // FIXME: magic number + * (int)getUnitList().stream() + .filter(u -> u.getType() == getExpertUnitType()) + .count(); if (minimumGoodsInput > available) { available = minimumGoodsInput; } @@ -368,11 +363,9 @@ public class Building extends WorkLocation */ @Override public int evaluateFor(Player player) { - int result = 0; - for (AbstractGoods ag : getType().getRequiredGoods()) { - result += ag.evaluateFor(player); - } - return result + super.evaluateFor(player); + return super.evaluateFor(player) + + getType().getRequiredGoods().stream() + .mapToInt(ag -> ag.evaluateFor(player)).sum(); } @@ -388,8 +381,9 @@ public class Building extends WorkLocation // final UnitLocation.getUnitIterator // UnitLocation.getUnitList // UnitLocation.getGoodsContainer - // final WorkLocation getSettlement - // final WorkLocation getColony + // final WorkLocation.getSettlement + // final WorkLocation.getColony + // final WorkLocation.getRank /** * {@inheritDoc} @@ -459,6 +453,22 @@ public class Building extends WorkLocation : StringTemplate.key(buildingType); } + /** + * {@inheritDoc} + */ + @Override + public boolean isAvailable() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isCurrent() { + return true; + } + /** * {@inheritDoc} */ diff --git a/src/net/sf/freecol/common/model/BuildingType.java b/src/net/sf/freecol/common/model/BuildingType.java index a3eaa5789..6cc40d79f 100644 --- a/src/net/sf/freecol/common/model/BuildingType.java +++ b/src/net/sf/freecol/common/model/BuildingType.java @@ -21,6 +21,7 @@ package net.sf.freecol.common.model; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import javax.xml.stream.XMLStreamException; @@ -223,14 +224,10 @@ public final class BuildingType extends BuildableType { */ public List getAvailableProductionTypes(boolean unattended, String level) { - List result = new ArrayList<>(); - for (ProductionType productionType : productionTypes) { - if (productionType.getUnattended() == unattended - && productionType.appliesTo(level)) { - result.add(productionType); - } - } - return result; + return productionTypes.stream() + .filter(pt -> pt.getUnattended() == unattended + && pt.appliesTo(level)) + .collect(Collectors.toList()); } // @compat 0.10.6 diff --git a/src/net/sf/freecol/common/model/Colony.java b/src/net/sf/freecol/common/model/Colony.java index 735052a6e..a51da52fa 100644 --- a/src/net/sf/freecol/common/model/Colony.java +++ b/src/net/sf/freecol/common/model/Colony.java @@ -26,11 +26,12 @@ import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.xml.stream.XMLStreamException; @@ -38,7 +39,9 @@ import net.sf.freecol.common.io.FreeColXMLReader; import net.sf.freecol.common.io.FreeColXMLWriter; import net.sf.freecol.common.model.Occupation; import net.sf.freecol.common.model.Stance; + import static net.sf.freecol.common.util.CollectionUtils.*; + import net.sf.freecol.common.util.LogBuilder; import net.sf.freecol.common.util.RandomChoice; @@ -215,10 +218,7 @@ public class Colony extends Settlement implements Nameable, TradeLocation { * @return The corresponding ColonyTile, or null if not found. */ public ColonyTile getColonyTile(Tile t) { - for (ColonyTile c : colonyTiles) { - if (c.getWorkTile() == t) return c; - } - return null; + return find(colonyTiles, ct -> ct.getWorkTile() == t); } /** @@ -503,15 +503,24 @@ public class Colony extends Settlement implements Nameable, TradeLocation { // WorkLocations, Buildings, ColonyTiles + /** + * Get a stream of all the possible work locations for this colony. + * + * @return A suitable Stream. + */ + private Stream getAllWorkLocationsStream() { + return Stream.concat(colonyTiles.stream(), + buildingMap.values().stream()); + } + /** * Gets a list of every work location in this colony. * * @return The list of work locations. */ public List getAllWorkLocations() { - List result = new ArrayList(colonyTiles); - result.addAll(buildingMap.values()); - return result; + return getAllWorkLocationsStream() + .collect(Collectors.toList()); } /** @@ -521,16 +530,9 @@ public class Colony extends Settlement implements Nameable, TradeLocation { * @return The list of available WorkLocations. */ public List getAvailableWorkLocations() { - List result - = new ArrayList(buildingMap.values()); - for (ColonyTile ct : colonyTiles) { - Tile tile = ct.getWorkTile(); - if (tile.getOwningSettlement() == this - || getOwner().canClaimForSettlement(tile)) { - result.add(ct); - } - } - return result; + return getAllWorkLocationsStream() + .filter(WorkLocation::isAvailable) + .collect(Collectors.toList()); } /** @@ -539,28 +541,30 @@ public class Colony extends Settlement implements Nameable, TradeLocation { * @return The list of current WorkLocations. */ public List getCurrentWorkLocations() { - List result - = new ArrayList(buildingMap.values()); - for (ColonyTile ct : colonyTiles) { - Tile tile = ct.getWorkTile(); - if (tile.getOwningSettlement() == this) result.add(ct); - } - return result; + return getAllWorkLocationsStream() + .filter(WorkLocation::isCurrent) + .collect(Collectors.toList()); } /** * Add a Building to this Colony. * + * Lower level routine, do not use directly in-game (use buildBuilding). + * Used for serialization and public for the test suite. + * * -til: Could change the tile appearance if the building is * stockade-type * - * @param building a Building value + * @param building The Building to build. + * @return True if the building was added. */ - public void addBuilding(final Building building) { - BuildingType buildingType = building.getType().getFirstLevel(); + public boolean addBuilding(final Building building) { + if (building == null || building.getType() == null) return false; + final BuildingType buildingType = building.getType().getFirstLevel(); + if (buildingType == null || buildingType.getId() == null) return false; buildingMap.put(buildingType.getId(), building); addFeatures(building.getType()); - invalidateCache(); + return true; } /** @@ -572,14 +576,11 @@ public class Colony extends Settlement implements Nameable, TradeLocation { * @param building The Building to remove. * @return True if the building was removed. */ - public boolean removeBuilding(final Building building) { - BuildingType buildingType = building.getType().getFirstLevel(); - boolean result = buildingMap.remove(buildingType.getId()) != null; - if (result) { - removeFeatures(building.getType()); - invalidateCache(); - } - return result; + protected boolean removeBuilding(final Building building) { + final BuildingType buildingType = building.getType().getFirstLevel(); + if (buildingMap.remove(buildingType.getId()) == null) return false; + removeFeatures(building.getType()); + return true; } /** @@ -591,10 +592,8 @@ public class Colony extends Settlement implements Nameable, TradeLocation { */ public Building getBuildingForProducing(final GoodsType goodsType) { for (Building b : buildingMap.values()) { - for (AbstractGoods ag : b.getOutputs()) { - if (ag.getType() == goodsType) - return b; - } + if (AbstractGoods.findByType(goodsType, b.getOutputs()) != null) + return b; } return null; } @@ -623,13 +622,8 @@ public class Colony extends Settlement implements Nameable, TradeLocation { */ public T getWorkLocationWithAbility(String ability, Class returnClass) { - for (WorkLocation wl : getCurrentWorkLocations()) { - if (wl.hasAbility(ability)) { - try { - return returnClass.cast(wl); - } catch (ClassCastException cce) {} - } - } + WorkLocation wl = getWorkLocationWithAbility(ability); + if (wl != null) try { return returnClass.cast(wl); } catch (ClassCastException cce) {}; return null; } @@ -657,13 +651,8 @@ public class Colony extends Settlement implements Nameable, TradeLocation { */ public T getWorkLocationWithModifier(String modifier, Class returnClass) { - for (WorkLocation wl : getCurrentWorkLocations()) { - if (wl.hasModifier(modifier)) { - try { - return returnClass.cast(wl); - } catch (ClassCastException cce) {} - } - } + WorkLocation wl = getWorkLocationWithModifier(modifier); + if (wl != null) try { return returnClass.cast(wl); } catch (ClassCastException cce) {} return null; } @@ -675,13 +664,9 @@ public class Colony extends Settlement implements Nameable, TradeLocation { * the given type of goods. */ public List getWorkLocationsForConsuming(GoodsType goodsType) { - List result = new ArrayList<>(); - for (WorkLocation wl : getCurrentWorkLocations()) { - for (AbstractGoods input : wl.getInputs()) { - if (input.getType() == goodsType) result.add(wl); - } - } - return result; + return getCurrentWorkLocations().stream() + .filter(wl -> any(wl.getInputs(), ag -> ag.getType() == goodsType)) + .collect(Collectors.toList()); } /** @@ -692,13 +677,9 @@ public class Colony extends Settlement implements Nameable, TradeLocation { * the given type of goods. */ public List getWorkLocationsForProducing(GoodsType goodsType) { - List result = new ArrayList<>(); - for (WorkLocation wl : getCurrentWorkLocations()) { - for (AbstractGoods ag : wl.getOutputs()) { - if (ag.getType() == goodsType) result.add(wl); - } - } - return result; + return getCurrentWorkLocations().stream() + .filter(wl -> any(wl.getOutputs(), ag -> ag.getType() == goodsType)) + .collect(Collectors.toList()); } /** @@ -828,14 +809,9 @@ public class Colony extends Settlement implements Nameable, TradeLocation { * @return A list of buildable UnitTypes. */ public List getBuildableUnits() { - ArrayList buildableUnits = new ArrayList<>(); - List unitTypes = getSpecification().getUnitTypeList(); - for (UnitType unitType : unitTypes) { - if (unitType.needsGoodsToBuild() && canBuild(unitType)) { - buildableUnits.add(unitType); - } - } - return buildableUnits; + return getSpecification().getUnitTypeList().stream() + .filter(ut -> ut.needsGoodsToBuild() && canBuild(ut)) + .collect(Collectors.toList()); } /** @@ -977,18 +953,12 @@ public class Colony extends Settlement implements Nameable, TradeLocation { && !getTile().isCoastland()) { return NoBuildReason.COASTAL; } else { - for (Entry entry - : buildableType.getRequiredAbilities().entrySet()) { - if (hasAbility(entry.getKey()) != entry.getValue()) { - return NoBuildReason.MISSING_ABILITY; - } + if (!all(buildableType.getRequiredAbilities().entrySet(), + e -> e.getValue() == hasAbility(e.getKey()))) { + return NoBuildReason.MISSING_ABILITY; } - if (buildableType.getLimits() != null) { - for (Limit limit : buildableType.getLimits()) { - if (!limit.evaluate(this)) { - return NoBuildReason.LIMIT_EXCEEDED; - } - } + if (!all(buildableType.getLimits(), l -> l.evaluate(this))) { + return NoBuildReason.LIMIT_EXCEEDED; } } if (assumeBuilt == null) { @@ -1015,15 +985,12 @@ public class Colony extends Settlement implements Nameable, TradeLocation { } } } else if (buildableType instanceof UnitType) { - if (!buildableType.hasAbility(Ability.PERSON)) { - boolean ok = hasAbility(Ability.BUILD, buildableType); - if (!ok) { - for (BuildableType bt : assumeBuilt) { - ok = bt.hasAbility(Ability.BUILD, buildableType); - if (ok) break; - } - } - if (!ok) return NoBuildReason.MISSING_BUILD_ABILITY; + // Non-person units need a BUILD ability, present or assumed. + if (!buildableType.hasAbility(Ability.PERSON) + && !hasAbility(Ability.BUILD, buildableType) + && none(assumeBuilt, bt -> bt.hasAbility(Ability.BUILD, + buildableType))) { + return NoBuildReason.MISSING_BUILD_ABILITY; } } return NoBuildReason.NONE; @@ -1060,16 +1027,10 @@ public class Colony extends Settlement implements Nameable, TradeLocation { */ public int priceGoodsForBuilding(List required) { final Market market = getOwner().getMarket(); - int price = 0; - for (AbstractGoods ag : required) { - final GoodsType goodsType = ag.getType(); - final int amount = ag.getAmount(); - // FIXME: magic number! - price += (goodsType.isStorable()) - ? (market.getBidPrice(goodsType, amount) * 110) / 100 - : goodsType.getPrice() * amount; - } - return price; + // FIXME: magic number! + return required.stream().mapToInt(ag -> (ag.getType().isStorable()) + ? (market.getBidPrice(ag.getType(), ag.getAmount()) * 110) / 100 + : ag.getType().getPrice() * ag.getAmount()).sum(); } /** @@ -1105,8 +1066,9 @@ public class Colony extends Settlement implements Nameable, TradeLocation { * @return A list of required abstract goods. */ public List getFullRequiredGoods(BuildableType buildable) { + if (buildable == null) return Collections.emptyList(); + List required = new ArrayList<>(); - if (buildable == null) return required; for (AbstractGoods ag : buildable.getRequiredGoods()) { int amount = ag.getAmount(); GoodsType type = ag.getType(); @@ -1356,22 +1318,21 @@ public class Colony extends Settlement implements Nameable, TradeLocation { public StringTemplate getReducePopulationMessage() { if (canReducePopulation()) return null; Set modifierSet = getModifiers(Modifier.MINIMUM_COLONY_SIZE); - for (Modifier modifier : modifierSet) { - FreeColObject source = modifier.getSource(); - if (source instanceof BuildingType) { - // If the modifier source is a building type, use the - // building in the colony, which may be of a different - // level to the modifier source. - // This prevents the stockade modifier from matching a - // colony-fort, and thus the message attributing the - // failure to reduce population to a non-existing - // stockade, BR#3522055. - source = getBuilding((BuildingType)source).getType(); - } - return StringTemplate.template("model.colony.minimumColonySize") - .addName("%object%", source); + if (modifierSet.isEmpty()) return null; + Modifier modifier = modifierSet.iterator().next(); + FreeColObject source = modifier.getSource(); + if (source instanceof BuildingType) { + // If the modifier source is a building type, use the + // building in the colony, which may be of a different + // level to the modifier source. + // This prevents the stockade modifier from matching a + // colony-fort, and thus the message attributing the + // failure to reduce population to a non-existing + // stockade, BR#3522055. + source = getBuilding((BuildingType)source).getType(); } - return null; + return StringTemplate.template("model.colony.minimumColonySize") + .addName("%object%", source); } /** @@ -1637,15 +1598,11 @@ public class Colony extends Settlement implements Nameable, TradeLocation { * * @return The total defence power. */ - public float getTotalDefencePower() { - CombatModel cm = getGame().getCombatModel(); - float defence = 0.0f; - for (Unit unit : getTile().getUnitList()) { - if (unit.isDefensiveUnit()) { - defence += cm.getDefencePower(null, unit); - } - } - return defence; + public double getTotalDefencePower() { + final CombatModel cm = getGame().getCombatModel(); + return getTile().getUnitList().stream() + .filter(Unit::isDefensiveUnit) + .mapToDouble(u -> cm.getDefencePower(null, u)).sum(); } /** @@ -1684,11 +1641,8 @@ public class Colony extends Settlement implements Nameable, TradeLocation { * @return A list of burnable buildings. */ public List getBurnableBuildings() { - List buildingList = new ArrayList<>(); - for (Building building : getBuildings()) { - if (building.canBeDamaged()) buildingList.add(building); - } - return buildingList; + return getBuildings().stream() + .filter(Building::canBeDamaged).collect(Collectors.toList()); } /** @@ -1698,11 +1652,9 @@ public class Colony extends Settlement implements Nameable, TradeLocation { * @return A list of lootable goods in this colony. */ public List getLootableGoodsList() { - List goodsList = new ArrayList<>(); - for (Goods goods : getGoodsContainer().getGoods()) { - if (goods.getType().isStorable()) goodsList.add(goods); - } - return goodsList; + return getGoodsContainer().getGoods().stream() + .filter(g -> g.getType().isStorable()) + .collect(Collectors.toList()); } /** @@ -1747,23 +1699,19 @@ public class Colony extends Settlement implements Nameable, TradeLocation { && player.getNumberOfSettlements() < 5) {// FIXME: magic# return Integer.MIN_VALUE; } - int result = 0; + int result; if (player.owns(this)) { - for (WorkLocation wl : getAvailableWorkLocations()) { - result += wl.evaluateFor(player); - } - for (Unit u : getTile().getUnitList()) { - result += u.evaluateFor(player); - } - for (Goods g : getCompactGoods()) { - result += g.evaluateFor(player); - } + result = getAvailableWorkLocations().stream() + .mapToInt(wl -> wl.evaluateFor(player)).sum() + + getTile().getUnitList().stream() + .mapToInt(u -> u.evaluateFor(player)).sum() + + getCompactGoods().stream() + .mapToInt(g -> g.evaluateFor(player)).sum(); } else { // Much guesswork - result += getDisplayUnitCount() * 1000; - result += 500; // Some useful goods? - for (Tile t : getTile().getSurroundingTiles(1)) { - if (t.getOwningSettlement() == this) result += 200; - } + result = getDisplayUnitCount() * 1000 + + 500 // Some useful goods? + + 200 * (int)getTile().getSurroundingTiles(0, 1).stream() + .filter(t -> t.getOwningSettlement() == this).count(); Building stockade = getStockade(); if (stockade != null) result *= stockade.getLevel(); } @@ -1796,16 +1744,9 @@ public class Colony extends Settlement implements Nameable, TradeLocation { * @return true if this unit type could be added. */ public boolean canTrain(UnitType unitType) { - if (!hasAbility(Ability.TEACH)) { - return false; - } - - for (Building building : buildingMap.values()) { - if (building.canTeach() && building.canAddType(unitType)) { - return true; - } - } - return false; + return hasAbility(Ability.TEACH) + && any(buildingMap.values(), + b -> b.canTeach() && b.canAddType(unitType)); } /** @@ -1949,11 +1890,8 @@ public class Colony extends Settlement implements Nameable, TradeLocation { * @return an int value */ public int getFoodProduction() { - int result = 0; - for (GoodsType foodType : getSpecification().getFoodGoodsTypeList()) { - result += getTotalProductionOf(foodType); - } - return result; + return getSpecification().getFoodGoodsTypeList().stream() + .mapToInt(ft -> getTotalProductionOf(ft)).sum(); } /** @@ -2043,8 +1981,8 @@ public class Colony extends Settlement implements Nameable, TradeLocation { populationQueue }) { ProductionInfo info = productionCache.getProductionInfo(queue); if (info != null) { - AbstractGoods goods = AbstractGoods.findByType(goodsType, info.getConsumption()); - if (goods != null) result += goods.getAmount(); + result += AbstractGoods.getCount(goodsType, + info.getConsumption()); } } return result; @@ -2084,21 +2022,18 @@ public class Colony extends Settlement implements Nameable, TradeLocation { * @return True if the goods can be produced. */ public boolean canProduce(GoodsType goodsType) { - if (getNetProductionOf(goodsType) > 0) return true; // Obviously:-) + return (getNetProductionOf(goodsType) > 0) + ? true // Obviously:-) - if (goodsType.isBreedable()) { - return getGoodsCount(goodsType) >= goodsType.getBreedingNumber(); - } + // Breeding requires the breedable number to be present + : (goodsType.isBreedable()) + ? getGoodsCount(goodsType) >= goodsType.getBreedingNumber() - // Is there a work location that can produce the goods, with - // satisfied inputs and positive generic production potential? - outer: for (WorkLocation wl : getWorkLocationsForProducing(goodsType)) { - for (AbstractGoods ag : wl.getInputs()) { - if (!canProduce(ag.getType())) continue outer; - } - if (wl.getGenericPotential(goodsType) > 0) return true; - } - return false; + // Is there a work location that can produce the goods, with + // positive generic production potential and all inputs satisfied? + : any(getWorkLocationsForProducing(goodsType), + wl -> wl.getGenericPotential(goodsType) > 0 + && all(wl.getInputs(),ag -> canProduce(ag.getType()))); } @@ -2255,19 +2190,25 @@ public class Colony extends Settlement implements Nameable, TradeLocation { List result = new ArrayList<>(); final int amount = getGoodsCount(goodsType); final int production = getNetProductionOf(goodsType); - - if (goodsType.isFoodType() && goodsType.isStorable()) { - // Food is never wasted -> new settler is produced - if (amount + production < 0) { - result.add(StringTemplate - .template("model.colony.famineFeared") - .addName("%colony%", getName()) - .addAmount("%number%", 0)); - } - } else { - int waste = (amount + production - getWarehouseCapacity()); - if (waste > 0 && !getExportData(goodsType).getExported() - && !goodsType.limitIgnored()) { + int waste; + + if (goodsType.isStorable()) { + if (goodsType.limitIgnored()) { + if (goodsType.isFoodType()) { + int starve = getStarvationTurns(); + if (starve == 0) { + result.add(StringTemplate + .template("model.colony.starving") + .addName("%colony%", getName())); + } else if (starve <= Colony.FAMINE_TURNS) { + result.add(StringTemplate + .template("model.colony.famineFeared") + .addName("%colony%", getName()) + .addAmount("%number%", starve)); + } + } + } else if (!getExportData(goodsType).getExported() + && (waste = amount + production - getWarehouseCapacity()) > 0) { result.add(StringTemplate .template("model.building.warehouseSoonFull") .addNamed("%goods%", goodsType) @@ -2329,13 +2270,14 @@ public class Colony extends Settlement implements Nameable, TradeLocation { List input = info.getConsumptionDeficit(); if (input.isEmpty()) return null; - + StringTemplate label = StringTemplate.label(", "); + for (AbstractGoods ag : input) label.addStringTemplate(ag.getLabel()); + return StringTemplate.template("model.colony.insufficientProduction") .addName("%colony%", getName()) .addNamed("%outputType%", deficit.getType()) .addAmount("%outputAmount%", deficit.getAmount()) - .addNamed("%inputType%", input.get(0).getType()) - .addAmount("%inputAmount%", input.get(0).getAmount()); + .addStringTemplate("%consumptionDeficit%", label); } /** @@ -2533,10 +2475,8 @@ public class Colony extends Settlement implements Nameable, TradeLocation { @Override public boolean contains(Locatable locatable) { if (locatable instanceof Unit) { - for (WorkLocation wl : getAvailableWorkLocations()) { - if (wl.contains(locatable)) return true; - } - return false; + return any(getAvailableWorkLocations(), + wl -> wl.contains(locatable)); } return super.contains(locatable); } @@ -2546,11 +2486,8 @@ public class Colony extends Settlement implements Nameable, TradeLocation { */ @Override public int getUnitCount() { - int n = 0; - for (WorkLocation wl : getCurrentWorkLocations()) { - n += wl.getUnitCount(); - } - return n; + return getCurrentWorkLocations().stream() + .mapToInt(wl -> wl.getUnitCount()).sum(); } /** @@ -2668,9 +2605,9 @@ public class Colony extends Settlement implements Nameable, TradeLocation { List unitList = getUnitList(); Unit defender = null; - float defencePower = -1.0f; + double defencePower = -1.0; for (Unit nextUnit : unitList) { - float unitPower = getGame().getCombatModel() + double unitPower = getGame().getCombatModel() .getDefencePower(attacker, nextUnit); if (Unit.betterDefender(defender, defencePower, nextUnit, unitPower)) { @@ -2689,7 +2626,7 @@ public class Colony extends Settlement implements Nameable, TradeLocation { * {@inheritDoc} */ @Override - public float getDefenceRatio() { + public double getDefenceRatio() { return getTotalDefencePower() / (1 + getUnitCount()); } @@ -2698,7 +2635,7 @@ public class Colony extends Settlement implements Nameable, TradeLocation { */ @Override public boolean isBadlyDefended() { - return getTotalDefencePower() < 0.95f * getUnitCount() - 2.5f; + return getTotalDefencePower() < 0.95 * getUnitCount() - 2.5; } /** @@ -2727,11 +2664,8 @@ public class Colony extends Settlement implements Nameable, TradeLocation { */ @Override public int getUpkeep() { - int upkeep = 0; - for (Building building : buildingMap.values()) { - upkeep += building.getType().getUpkeep(); - } - return upkeep; + return buildingMap.values().stream() + .mapToInt(b -> b.getType().getUpkeep()).sum(); } /** @@ -2739,11 +2673,8 @@ public class Colony extends Settlement implements Nameable, TradeLocation { */ @Override public int getTotalProductionOf(GoodsType goodsType) { - int amount = 0; - for (WorkLocation workLocation : getCurrentWorkLocations()) { - amount += workLocation.getTotalProductionOf(goodsType); - } - return amount; + return getCurrentWorkLocations().stream() + .mapToInt(wl -> wl.getTotalProductionOf(goodsType)).sum(); } /** @@ -2788,7 +2719,7 @@ public class Colony extends Settlement implements Nameable, TradeLocation { public StringTemplate getAlarmLevelLabel(Player player) { Stance stance = getOwner().getStance(player); return StringTemplate.template("model.colony." + stance.getKey()) - .addStringTemplate("%nation%", getOwner().getNationName()); + .addStringTemplate("%nation%", getOwner().getNationLabel()); } diff --git a/src/net/sf/freecol/common/model/ColonyTile.java b/src/net/sf/freecol/common/model/ColonyTile.java index 3bdbf32d1..17877ac8f 100644 --- a/src/net/sf/freecol/common/model/ColonyTile.java +++ b/src/net/sf/freecol/common/model/ColonyTile.java @@ -173,10 +173,8 @@ public class ColonyTile extends WorkLocation { } else { for (AbstractGoods output : getOutputs()) { final GoodsType goodsType = output.getType(); - int amount = 0; - for (Unit u : getUnitList()) { - amount += getUnitProduction(u, goodsType); - } + int amount = getUnitList().stream() + .mapToInt(u -> getUnitProduction(u, goodsType)).sum(); if (amount > 0) { pi.addProduction(new AbstractGoods(goodsType, amount)); } @@ -210,25 +208,28 @@ public class ColonyTile extends WorkLocation { // Unattended production is the hard case. if (productionType.getUnattended()) { - if (newType != null) { // Tile type change - final List newProd - = newType.getPossibleProduction(true); - int food = 0; - // Get the current food production. Otherwise for - // goods that are being passively produced and - // consumed, check if production remains in surplus - // following a negative change. - for (AbstractGoods ag : getProduction()) { - final GoodsType goodsType = ag.getType(); - if (goodsType.isFoodType()) { - food -= ag.getAmount(); - continue; - } - if (!colony.isConsuming(goodsType)) continue; - int change = -ag.getAmount(); - AbstractGoods ng - = AbstractGoods.findByType(goodsType, newProd); - change += (ng == null) ? 0 : ng.getAmount(); + if (newType == null) { + // Tile type stays the same, return the sum of any food bonues. + return getSpecification().getFoodGoodsTypeList().stream() + .mapToInt(gt -> ti.getBonus(gt)).sum(); + } + + // Tile type change. + final List newProd + = newType.getPossibleProduction(true); + int food = newProd.stream() + .filter(ag -> ag.getType().isFoodType()) + .mapToInt(AbstractGoods::getAmount).sum(); + // Get the current food production. Otherwise for goods + // that are being passively produced and consumed, check + // if production remains in surplus following a negative change. + for (AbstractGoods ag : getProduction()) { + final GoodsType goodsType = ag.getType(); + if (goodsType.isFoodType()) { + food -= ag.getAmount(); + } else if (colony.isConsuming(goodsType)) { + int change = -ag.getAmount() + + AbstractGoods.getCount(goodsType, newProd); if (change < 0 && change + colony.getNetProductionOf(goodsType) < 0) { // The change drives the net production (more?) @@ -236,45 +237,24 @@ public class ColonyTile extends WorkLocation { return change; } } - // No production showstoppers found - // Would the passive food production be improved? - for (AbstractGoods ag : newProd) { - if (ag.getType().isFoodType()) food += ag.getAmount(); - } - return food; } - - // Tile type stays the same, return the sum of any food bonues. - int bonus = 0; - for (GoodsType gt : getSpecification().getFoodGoodsTypeList()) { - bonus += ti.getBonus(gt); - } - return bonus; + return food; } - // Units are at work here. Find out what work is being done. - GoodsType work = null; - UnitType type = null; - for (Unit u : getUnitList()) { - if (u != null && (type = u.getType()) != null - && (work = u.getWorkType()) != null) break; - } - if (work == null) return 0; // No work, no reason to improve. - - if (newType != null) { // Tile type change - // Return the production impact on the work being done. - int diff = newType.getPotentialProduction(work, type); - if (resource == null) { - diff -= oldType.getPotentialProduction(work, type); - } else { - diff -= resource.applyBonus(work, type, - oldType.getPotentialProduction(work, type)); - } - return diff; - } - - // Otherwise return any new bonus that impacts the current work. - return ti.getBonus(work); + // Units are present, see what the change would do to their work. + final GoodsType work = getCurrentWorkType(); + final UnitType unitType = getFirstUnit().getType(); + return (work == null) // No work, improvement does nothing + ? 0 + : (newType == null) // No tile change, but return the new bonus + ? ti.getBonus(work) + : (resource == null) // The tile change impact on the work + ? newType.getPotentialProduction(work, unitType) + - oldType.getPotentialProduction(work, unitType) + // The production impact with the new resource in place + : newType.getPotentialProduction(work, unitType) + - resource.applyBonus(work, unitType, + oldType.getPotentialProduction(work, unitType)); } /** @@ -285,11 +265,9 @@ public class ColonyTile extends WorkLocation { */ @Override public int evaluateFor(Player player) { - int result = 0; - for (AbstractGoods ag :getProductionInfo().getProduction()) { - result += ag.evaluateFor(player); - } - return result + super.evaluateFor(player); + return super.evaluateFor(player) + + getProductionInfo().getProduction().stream() + .mapToInt(ag -> ag.evaluateFor(player)).sum(); } @@ -307,6 +285,7 @@ public class ColonyTile extends WorkLocation { // UnitLocation.getGoodsContainer // final WorkLocation getSettlement // final WorkLocation getColony + // final int getRank /** * {@inheritDoc} @@ -371,6 +350,22 @@ public class ColonyTile extends WorkLocation { return (workTile == null) ? null : workTile.getLabel(); } + /** + * {@inheritDoc} + */ + @Override + public boolean isAvailable() { + return isCurrent() || getOwner().canClaimForSettlement(getWorkTile()); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isCurrent() { + return getWorkTile().getOwningSettlement() == getColony(); + } + /** * {@inheritDoc} */ diff --git a/src/net/sf/freecol/common/model/ColonyWas.java b/src/net/sf/freecol/common/model/ColonyWas.java index f673afa27..5ba8778fb 100644 --- a/src/net/sf/freecol/common/model/ColonyWas.java +++ b/src/net/sf/freecol/common/model/ColonyWas.java @@ -58,26 +58,34 @@ public class ColonyWas { /** * Fire any property changes resulting from actions within a * colony. + * + * @return True if something changed. */ - public void fireChanges() { + public boolean fireChanges() { + boolean ret = false; int newPopulation = colony.getUnitCount(); if (newPopulation != population) { String pc = ColonyChangeEvent.POPULATION_CHANGE.toString(); colony.firePropertyChange(pc, population, newPopulation); + ret = true; } int newProductionBonus = colony.getProductionBonus(); if (newProductionBonus != productionBonus) { String pc = ColonyChangeEvent.BONUS_CHANGE.toString(); colony.firePropertyChange(pc, productionBonus, newProductionBonus); + ret = true; } List newBuildQueue = colony.getBuildQueue(); if (!newBuildQueue.equals(buildQueue)) { String pc = ColonyChangeEvent.BUILD_QUEUE_CHANGE.toString(); colony.firePropertyChange(pc, buildQueue, newBuildQueue); + ret = true; } if (colony.getGoodsContainer() != null) { colony.getGoodsContainer().fireChanges(); + ret = true; } + return true; } } diff --git a/src/net/sf/freecol/common/model/CombatModel.java b/src/net/sf/freecol/common/model/CombatModel.java index 7cb6d1665..2791cfcb1 100644 --- a/src/net/sf/freecol/common/model/CombatModel.java +++ b/src/net/sf/freecol/common/model/CombatModel.java @@ -19,6 +19,7 @@ package net.sf.freecol.common.model; +import java.util.Comparator; import java.util.List; import java.util.Random; import java.util.Set; @@ -66,11 +67,11 @@ public abstract class CombatModel { * Odds a particular outcome will occur in combat. */ public static class CombatOdds { - public static final float UNKNOWN_ODDS = -1.0f; + public static final double UNKNOWN_ODDS = -1.0; - public final float win; + public final double win; - public CombatOdds(float win) { + public CombatOdds(double win) { this.win = win; } } @@ -180,6 +181,16 @@ public abstract class CombatModel { return false; } + /** + * Get a comparator to order units by relative military strength + * with respect to this combat model. + * + * @return A suitable unit Comparator. + */ + public final Comparator getMilitaryStrengthComparator() { + return (u1, u2) -> Double.compare(calculateCombatOdds(u1, u2).win, + calculateCombatOdds(u2, u1).win); + } /** * Calculates the chance of the outcomes of a combat. @@ -201,8 +212,8 @@ public abstract class CombatModel { * @param defender The defender. * @return The offensive power. */ - public abstract float getOffencePower(FreeColGameObject attacker, - FreeColGameObject defender); + public abstract double getOffencePower(FreeColGameObject attacker, + FreeColGameObject defender); /** * Get the defensive power of a defender wrt an attacker. @@ -211,8 +222,8 @@ public abstract class CombatModel { * @param defender The defender. * @return The defensive power. */ - public abstract float getDefencePower(FreeColGameObject attacker, - FreeColGameObject defender); + public abstract double getDefencePower(FreeColGameObject attacker, + FreeColGameObject defender); /** * Collect all the offensive modifiers that apply to an attack. diff --git a/src/net/sf/freecol/common/model/Consumer.java b/src/net/sf/freecol/common/model/Consumer.java index fa7ff5513..982cacb4a 100644 --- a/src/net/sf/freecol/common/model/Consumer.java +++ b/src/net/sf/freecol/common/model/Consumer.java @@ -32,12 +32,9 @@ import java.util.Set; */ public interface Consumer { - public static final Comparator COMPARATOR = new Comparator() { - @Override - public int compare(Consumer c1, Consumer c2) { - return c2.getPriority() - c1.getPriority(); - } - }; + /** Compare consumers by descending priority. */ + public static final Comparator COMPARATOR + = Comparator.comparingInt(Consumer::getPriority).reversed(); /** * Default consumption priority for the Colony when producing new diff --git a/src/net/sf/freecol/common/model/DiplomaticTrade.java b/src/net/sf/freecol/common/model/DiplomaticTrade.java index c28084082..4e13b6fc4 100644 --- a/src/net/sf/freecol/common/model/DiplomaticTrade.java +++ b/src/net/sf/freecol/common/model/DiplomaticTrade.java @@ -22,12 +22,14 @@ package net.sf.freecol.common.model; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.stream.Collectors; import javax.xml.stream.XMLStreamException; import net.sf.freecol.common.io.FreeColXMLReader; import net.sf.freecol.common.io.FreeColXMLWriter; import net.sf.freecol.common.model.Stance; +import static net.sf.freecol.common.util.CollectionUtils.*; import static net.sf.freecol.common.util.StringUtils.*; import org.w3c.dom.Element; @@ -207,7 +209,7 @@ public class DiplomaticTrade extends FreeColObject { return StringTemplate.template("model.diplomaticTrade.send." + getContext().getKey()) .addStringTemplate("%nation%", - settlement.getOwner().getNationName()) + settlement.getOwner().getNationLabel()) .addStringTemplate("%settlement%", settlement.getLocationLabelFor(player)); } @@ -222,7 +224,7 @@ public class DiplomaticTrade extends FreeColObject { public StringTemplate getReceiveMessage(Player player) { return StringTemplate.template("model.diplomaticTrade.receive." + getContext().getKey()) - .addStringTemplate("%nation%", player.getNationName()); + .addStringTemplate("%nation%", player.getNationLabel()); } /** @@ -311,11 +313,9 @@ public class DiplomaticTrade extends FreeColObject { * @return A list of TradeItems offered by the player. */ public List getItemsGivenBy(Player player) { - List goodsList = new ArrayList<>(); - for (TradeItem ti : items) { - if (player == ti.getSource()) goodsList.add(ti); - } - return goodsList; + return items.stream() + .filter(ti -> ti.getSource() == player) + .collect(Collectors.toList()); } /** @@ -324,12 +324,8 @@ public class DiplomaticTrade extends FreeColObject { * @return The Stance offered in this trade, or null if none. */ public Stance getStance() { - for (TradeItem ti : items) { - if (ti instanceof StanceTradeItem) { - return ti.getStance(); - } - } - return null; + TradeItem ti = find(items, i -> i instanceof StanceTradeItem); + return (ti == null) ? null : ti.getStance(); } /** @@ -354,12 +350,9 @@ public class DiplomaticTrade extends FreeColObject { * @return The gold offered in this trade. */ public int getGoldGivenBy(Player player) { - for (TradeItem ti : items) { - if (ti instanceof GoldTradeItem && player == ti.getSource()) { - return ti.getGold(); - } - } - return -1; + TradeItem ti = find(items, i -> i instanceof GoldTradeItem + && player == i.getSource()); + return (ti == null) ? -1 : ti.getGold(); } /** @@ -383,12 +376,8 @@ public class DiplomaticTrade extends FreeColObject { * @return The Player to be incited against. */ public Player getVictim() { - for (TradeItem ti : items) { - if (ti instanceof InciteTradeItem) { - return ti.getVictim(); - } - } - return null; + TradeItem ti = find(items, i -> i instanceof InciteTradeItem); + return (ti == null) ? null : ti.getVictim(); } /** diff --git a/src/net/sf/freecol/common/model/Direction.java b/src/net/sf/freecol/common/model/Direction.java index 97bd8d952..e9b851f99 100644 --- a/src/net/sf/freecol/common/model/Direction.java +++ b/src/net/sf/freecol/common/model/Direction.java @@ -91,11 +91,9 @@ public enum Direction implements Named { * @return The map position after the step. */ public Map.Position step(int x, int y) { - if((y & 1) != 0) { - return new Map.Position(x + oddDX, y + oddDY); - } else { - return new Map.Position(x + evenDX, y + evenDY); - } + return ((y & 1) != 0) + ? new Map.Position(x + oddDX, y + oddDY) + : new Map.Position(x + evenDX, y + evenDY); } /** diff --git a/src/net/sf/freecol/common/model/Disaster.java b/src/net/sf/freecol/common/model/Disaster.java index 79ed3f98b..f23307dc9 100644 --- a/src/net/sf/freecol/common/model/Disaster.java +++ b/src/net/sf/freecol/common/model/Disaster.java @@ -102,8 +102,7 @@ public class Disaster extends FreeColGameObjectType { */ private void addEffect(Effect effect) { if (effects == null) effects = new ArrayList<>(); - effects.add(new RandomChoice<>(effect, - effect.getProbability())); + effects.add(new RandomChoice<>(effect, effect.getProbability())); } diff --git a/src/net/sf/freecol/common/model/Effect.java b/src/net/sf/freecol/common/model/Effect.java index c5ac931e1..612c2d23e 100644 --- a/src/net/sf/freecol/common/model/Effect.java +++ b/src/net/sf/freecol/common/model/Effect.java @@ -27,6 +27,7 @@ import javax.xml.stream.XMLStreamException; import net.sf.freecol.common.io.FreeColXMLReader; import net.sf.freecol.common.io.FreeColXMLWriter; +import static net.sf.freecol.common.util.CollectionUtils.*; /** @@ -131,11 +132,8 @@ public class Effect extends FreeColGameObjectType { * @return True if this effect applies. */ public boolean appliesTo(final FreeColGameObjectType objectType) { - if (scopes == null || scopes.isEmpty()) return true; - for (Scope scope : scopes) { - if (scope.appliesTo(objectType)) return true; - } - return false; + return (scopes == null || scopes.isEmpty()) ? true + : any(scopes, s -> s.appliesTo(objectType)); } diff --git a/src/net/sf/freecol/common/model/Europe.java b/src/net/sf/freecol/common/model/Europe.java index 2ef0d1c27..6b8366608 100644 --- a/src/net/sf/freecol/common/model/Europe.java +++ b/src/net/sf/freecol/common/model/Europe.java @@ -257,15 +257,22 @@ public class Europe extends UnitLocation // Override FreeColObject /** - * Gets the feature container for this Europe object. - * - * @return The FeatureContainer. + * {@inheritDoc} */ @Override public FeatureContainer getFeatureContainer() { return featureContainer; } + // Override FreeColGameObject + + /** + * {@inheritDoc} + */ + @Override + public FreeColGameObject getLinkTarget(Player player) { + return (getOwner() == player) ? this : null; + } // Interface Location (from UnitLocation) // Inheriting: @@ -318,6 +325,14 @@ public class Europe extends UnitLocation return this; } + /** + * {@inheritDoc} + */ + @Override + public int getRank() { + return Location.LOCATION_RANK_EUROPE; + } + /** * {@inheritDoc} */ diff --git a/src/net/sf/freecol/common/model/EuropeWas.java b/src/net/sf/freecol/common/model/EuropeWas.java index 682702315..5bdce9430 100644 --- a/src/net/sf/freecol/common/model/EuropeWas.java +++ b/src/net/sf/freecol/common/model/EuropeWas.java @@ -68,13 +68,17 @@ public class EuropeWas { /** * Fire any property changes resulting from actions in Europe. + * + * @return True if something changed. */ - public void fireChanges() { + public boolean fireChanges() { int newUnitCount = europe.getUnitCount(); if (newUnitCount != unitCount) { europe.firePropertyChange(Europe.UNIT_CHANGE, unitCount, newUnitCount); + return true; } + return false; } } diff --git a/src/net/sf/freecol/common/model/Feature.java b/src/net/sf/freecol/common/model/Feature.java index bf18eebad..c48d60e61 100644 --- a/src/net/sf/freecol/common/model/Feature.java +++ b/src/net/sf/freecol/common/model/Feature.java @@ -28,6 +28,7 @@ import javax.xml.stream.XMLStreamException; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.io.FreeColXMLReader; import net.sf.freecol.common.io.FreeColXMLWriter; +import static net.sf.freecol.common.util.CollectionUtils.*; import net.sf.freecol.common.util.Utils; @@ -224,11 +225,8 @@ public abstract class Feature extends FreeColObject implements Named { * applicable to the object. */ public boolean appliesTo(final FreeColGameObjectType objectType) { - if (!hasScope()) return true; - for (Scope scope : scopes) { - if (scope.appliesTo(objectType)) return true; - } - return false; + return (!hasScope()) ? true + : any(scopes, s -> s.appliesTo(objectType)); } /** @@ -332,18 +330,10 @@ public abstract class Feature extends FreeColObject implements Named { } else if (feature.scopes == null) { return false; } else { - // not very efficient, but we do not expect many - // scopes - for (Scope scope : scopes) { - if (!feature.scopes.contains(scope)) { - return false; - } - } - for (Scope scope : feature.scopes) { - if (!scopes.contains(scope)) { - return false; - } - } + // Not very efficient, but we do not expect many scopes + if (!all(scopes, s -> feature.scopes.contains(s)) + || !all(feature.scopes, s -> scopes.contains(s))) + return false; } return true; } diff --git a/src/net/sf/freecol/common/model/FeatureContainer.java b/src/net/sf/freecol/common/model/FeatureContainer.java index 0039b01c9..81188b9d2 100644 --- a/src/net/sf/freecol/common/model/FeatureContainer.java +++ b/src/net/sf/freecol/common/model/FeatureContainer.java @@ -30,6 +30,8 @@ import java.util.Map.Entry; import java.util.Set; import java.util.logging.Logger; +import static net.sf.freecol.common.util.CollectionUtils.*; + /** * A container to hold abilities and modifiers for some FreeColObject-subclass. @@ -106,11 +108,9 @@ public final class FeatureContainer { * @return True if the ability set is `satisfied'. */ public static boolean hasAbility(Set abilitySet) { - if (abilitySet == null || abilitySet.isEmpty()) return false; - for (Ability ability : abilitySet) { - if (!ability.getValue()) return false; - } - return true; + return (abilitySet == null || abilitySet.isEmpty()) + ? false + : all(abilitySet, Ability::getValue); } /** diff --git a/src/net/sf/freecol/common/model/FoundingFather.java b/src/net/sf/freecol/common/model/FoundingFather.java index dd89faf2f..e3fc24298 100644 --- a/src/net/sf/freecol/common/model/FoundingFather.java +++ b/src/net/sf/freecol/common/model/FoundingFather.java @@ -29,6 +29,7 @@ import javax.xml.stream.XMLStreamException; import net.sf.freecol.common.io.FreeColXMLReader; import net.sf.freecol.common.io.FreeColXMLWriter; +import static net.sf.freecol.common.util.CollectionUtils.*; import static net.sf.freecol.common.util.StringUtils.*; @@ -276,12 +277,9 @@ public class FoundingFather extends FreeColGameObjectType { * @return True if the father is available. */ public boolean isAvailableTo(Player player) { - if (!player.isEuropean()) return false; - if (scopes == null) return true; - for (Scope scope : scopes) { - if (scope.appliesTo(player)) return true; - } - return false; + return (!player.isEuropean()) ? false + : (scopes == null) ? true + : any(scopes, s -> s.appliesTo(player)); } diff --git a/src/net/sf/freecol/common/model/FreeColGameObject.java b/src/net/sf/freecol/common/model/FreeColGameObject.java index 4f1329939..a55f79c58 100644 --- a/src/net/sf/freecol/common/model/FreeColGameObject.java +++ b/src/net/sf/freecol/common/model/FreeColGameObject.java @@ -215,6 +215,21 @@ public abstract class FreeColGameObject extends FreeColObject { return null; } + /** + * Get a suitable game object to use as a clickable link in messages + * to a player. + * + * Objects do not have links by default, hence the null return + * here. However, for example, a player's colony should return + * itself as a link target. + * + * @param player The Player to make a link for. + * @return A suitable link target if available, although usually null. + */ + public FreeColGameObject getLinkTarget(Player player) { + return null; + } + /** * Checks the integrity of this game object. * diff --git a/src/net/sf/freecol/common/model/FreeColObject.java b/src/net/sf/freecol/common/model/FreeColObject.java index a7290dd74..01c988718 100644 --- a/src/net/sf/freecol/common/model/FreeColObject.java +++ b/src/net/sf/freecol/common/model/FreeColObject.java @@ -37,6 +37,7 @@ import java.util.List; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.stream.Collectors; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -248,9 +249,7 @@ public abstract class FreeColObject * @return A sorted copy of the collection. */ public static List getSortedCopy(Collection c) { - List newC = new ArrayList<>(c); - Collections.sort(newC); // Use natural order if implemented. - return newC; + return c.stream().sorted().collect(Collectors.toList()); } /** diff --git a/src/net/sf/freecol/common/model/Game.java b/src/net/sf/freecol/common/model/Game.java index 560d402b4..06adf9ae8 100644 --- a/src/net/sf/freecol/common/model/Game.java +++ b/src/net/sf/freecol/common/model/Game.java @@ -32,6 +32,7 @@ import java.util.NoSuchElementException; import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.stream.Collectors; import javax.xml.stream.XMLStreamException; @@ -41,6 +42,7 @@ import net.sf.freecol.common.io.FreeColXMLWriter; import net.sf.freecol.common.model.NationOptions.NationState; import net.sf.freecol.common.option.OptionGroup; import net.sf.freecol.common.util.LogBuilder; +import static net.sf.freecol.common.util.CollectionUtils.*; import static net.sf.freecol.common.util.StringUtils.*; import net.sf.freecol.common.util.Utils; @@ -489,6 +491,28 @@ public class Game extends FreeColGameObject { return players; } + /** + * Get a Player identified by its nation. + * + * @param nation The Nation to search for. + * @return The Player of the given nation, or null if + * not found. + */ + public Player getPlayerByNation(Nation nation) { + return getPlayerByNationId(nation.getId()); + } + + /** + * Get a Player identified by its nation identifier. + * + * @param nationId The nation identifier to search for. + * @return The Player of the given nation, or null if + * not found. + */ + public Player getPlayerByNationId(String nationId) { + return find(players, p -> p.getNationId().equals(nationId)); + } + /** * Get live players in the game. * @@ -496,13 +520,9 @@ public class Game extends FreeColGameObject { * @return The list of live Players. */ public List getLivePlayers(Player other) { - List result = new ArrayList<>(); - for (Player player : players) { - if (player.isUnknownEnemy() || player.isDead() - || player == other) continue; - result.add(player); - } - return result; + return players.stream() + .filter(p -> !p.isUnknownEnemy() && !p.isDead() && p != other) + .collect(Collectors.toList()); } /** @@ -524,13 +544,10 @@ public class Game extends FreeColGameObject { * @return A list of live European Players in this game. */ public List getLiveEuropeanPlayers(Player other) { - List result = new ArrayList<>(); - for (Player player : players) { - if (player.isUnknownEnemy() || player.isDead() - || !player.isEuropean() || player == other) continue; - result.add(player); - } - return result; + return players.stream() + .filter(p -> !p.isUnknownEnemy() && !p.isDead() && p != other + && p.isEuropean()) + .collect(Collectors.toList()); } /** @@ -540,27 +557,10 @@ public class Game extends FreeColGameObject { * @return A list of live native Players in this game. */ public List getLiveNativePlayers(Player other) { - List result = new ArrayList<>(); - for (Player player : players) { - if (player.isUnknownEnemy() || player.isDead() - || !player.isIndian() || player == other) continue; - result.add(player); - } - return result; - } - - /** - * Get a Player identified by its nation identifier. - * - * @param nationId The nation identifier to search for. - * @return The Player of the given nation, or null if - * not found. - */ - public Player getPlayer(String nationId) { - for (Player player : players) { - if (player.getNationId().equals(nationId)) return player; - } - return null; + return players.stream() + .filter(p -> !p.isUnknownEnemy() && !p.isDead() && p != other + && p.isIndian()) + .collect(Collectors.toList()); } /** @@ -611,10 +611,7 @@ public class Game extends FreeColGameObject { * @return The Player or null if none found. */ public Player getPlayerByName(String name) { - for (Player player : players) { - if (player.getName().equals(name)) return player; - } - return null; + return find(players, p -> p.getName().equals(name)); } /** @@ -624,10 +621,7 @@ public class Game extends FreeColGameObject { * @return True if the name is already in use. */ public boolean playerNameInUse(String name) { - for (Player player : players) { - if (player.getName().equals(name)) return true; - } - return false; + return getPlayerByName(name) != null; } /** @@ -716,6 +710,15 @@ public class Game extends FreeColGameObject { return clientUserName == null; } + /** + * Is this game in revenge mode? + * + * @return True if an undead player is present. + */ + public boolean isInRevengeMode() { + return contains(getPlayers(), Player::isUndead); + } + /** * Gets the current player. * @@ -784,13 +787,10 @@ public class Game extends FreeColGameObject { * @return A vacant Nation or null if none found. */ public Nation getVacantNation() { - for (Entry entry - : nationOptions.getNations().entrySet()) { - if (entry.getValue() == NationState.AVAILABLE) { - return entry.getKey(); - } - } - return null; + Entry entry + = find(nationOptions.getNations().entrySet(), + e -> e.getValue() == NationState.AVAILABLE, null); + return (entry == null) ? null : entry.getKey(); } /** @@ -957,10 +957,7 @@ public class Game extends FreeColGameObject { * @return True if all players are ready to launch. */ public boolean allPlayersReadyToLaunch() { - for (Player player : getLivePlayers(null)) { - if (!player.isReady()) return false; - } - return true; + return all(getLivePlayers(null), Player::isReady); } /** @@ -971,7 +968,7 @@ public class Game extends FreeColGameObject { * if there is no known Settlement with the * specified name (the settlement might not be visible to a client). */ - public Settlement getSettlement(String name) { + public Settlement getSettlementByName(String name) { for (Player p : getLivePlayers(null)) { for (Settlement s : p.getSettlements()) { if (name.equals(s.getName())) return s; @@ -1135,15 +1132,19 @@ public class Game extends FreeColGameObject { Iterator iterator = getFreeColGameObjectIterator(); while (iterator.hasNext()) { FreeColGameObject fcgo = iterator.next(); - if (fcgo.isUninitialized()) { + if (fcgo == null) { + lb.add(" null-fcgo"); + } else if (fcgo.isUninitialized()) { lb.add(" ", fcgo.getId(), "(", lastPart(fcgo.getClass().getName(), "."), ")"); - if (fix) { - iterator.remove(); - result = Math.min(result, 0); - } else { - result = -1; - } + } else { + continue; + } + if (fix) { + iterator.remove(); + result = Math.min(result, 0); + } else { + result = -1; } } if (lb.grew()) { @@ -1318,7 +1319,12 @@ public class Game extends FreeColGameObject { //logger.finest("Found game tag " + tag + " id=" + xr.readId()); if (CIBOLA_TAG.equals(tag)) { - NameCache.addCityOfCibola(xr.readId()); + String cibola = xr.readId(); + // @compat 0.11.3 + final String oldPrefix = "lostCityRumour.cityName"; + if (cibola.startsWith(oldPrefix)) cibola = "nameCache." + cibola; + // end @compat 0.11.3 + NameCache.addCityOfCibola(cibola); xr.closeTag(CIBOLA_TAG); } else if (Map.getXMLElementTagName().equals(tag)) { diff --git a/src/net/sf/freecol/common/model/GoodsContainer.java b/src/net/sf/freecol/common/model/GoodsContainer.java index 9d2023c2d..48db85e4e 100644 --- a/src/net/sf/freecol/common/model/GoodsContainer.java +++ b/src/net/sf/freecol/common/model/GoodsContainer.java @@ -32,6 +32,7 @@ import javax.xml.stream.XMLStreamException; import net.sf.freecol.common.io.FreeColXMLReader; import net.sf.freecol.common.io.FreeColXMLWriter; +import static net.sf.freecol.common.util.CollectionUtils.*; import org.w3c.dom.Element; @@ -330,14 +331,9 @@ public class GoodsContainer extends FreeColGameObject implements Ownable { */ public boolean hasReachedCapacity(int amount) { synchronized (storedGoods) { - for (GoodsType goodsType : storedGoods.keySet()) { - if (goodsType.isStorable() && !goodsType.limitIgnored() - && storedGoods.get(goodsType) > amount) { - return true; - } - } + return any(storedGoods.keySet(), gt -> gt.isStorable() + && !gt.limitIgnored() && storedGoods.get(gt) > amount); } - return false; } /** @@ -347,17 +343,12 @@ public class GoodsContainer extends FreeColGameObject implements Ownable { * @return The amount of space taken by this containers goods. */ public int getSpaceTaken() { - int count = 0; synchronized (storedGoods) { - for (Integer amount : storedGoods.values()) { - if (amount % CARGO_SIZE == 0) { - count += amount/CARGO_SIZE; - } else { - count += amount/CARGO_SIZE + 1; - } - } + return storedGoods.values().stream() + .mapToInt(amount -> (amount % CARGO_SIZE == 0) + ? amount/CARGO_SIZE + : amount/CARGO_SIZE + 1).sum(); } - return count; } /** @@ -446,26 +437,27 @@ public class GoodsContainer extends FreeColGameObject implements Ownable { * @return True if the contents have changed. */ public boolean hasChanged() { - for (GoodsType type : getSpecification().getGoodsTypeList()) { - int oldCount = getOldGoodsCount(type); - int newCount = getGoodsCount(type); - if (oldCount != newCount) return true; - } - return false; + return any(getSpecification().getGoodsTypeList(), + gt -> getOldGoodsCount(gt) != getGoodsCount(gt)); } /** * Fire property changes for all goods that have seen level changes * since the last saveState(). + * + * @return True if something changed. */ - public void fireChanges() { + public boolean fireChanges() { + boolean ret = false; for (GoodsType type : getSpecification().getGoodsTypeList()) { int oldCount = getOldGoodsCount(type); int newCount = getGoodsCount(type); if (oldCount != newCount) { firePropertyChange(type.getId(), oldCount, newCount); + ret = true; } } + return ret; } // Interface Ownable diff --git a/src/net/sf/freecol/common/model/GoodsLocation.java b/src/net/sf/freecol/common/model/GoodsLocation.java index d8102b0d4..e3d98a952 100644 --- a/src/net/sf/freecol/common/model/GoodsLocation.java +++ b/src/net/sf/freecol/common/model/GoodsLocation.java @@ -29,6 +29,7 @@ import javax.xml.stream.XMLStreamException; import net.sf.freecol.common.io.FreeColXMLReader; import net.sf.freecol.common.io.FreeColXMLWriter; +import static net.sf.freecol.common.util.CollectionUtils.*; import org.w3c.dom.Element; @@ -146,10 +147,7 @@ public abstract class GoodsLocation extends UnitLocation { * @return True if the goods are all present. */ public final boolean containsGoods(List goods) { - for (AbstractGoods ag : goods) { - if (getGoodsCount(ag.getType()) < ag.getAmount()) return false; - } - return true; + return all(goods, ag -> ag.getAmount() <= getGoodsCount(ag.getType())); } /** @@ -198,6 +196,7 @@ public abstract class GoodsLocation extends UnitLocation { // UnitLocation.getUnitCount // UnitLocation.getUnitList // UnitLocation.getSettlement + // Does not implement getRank /** * {@inheritDoc} diff --git a/src/net/sf/freecol/common/model/HighScore.java b/src/net/sf/freecol/common/model/HighScore.java index abd7eeb3e..80025305b 100644 --- a/src/net/sf/freecol/common/model/HighScore.java +++ b/src/net/sf/freecol/common/model/HighScore.java @@ -265,7 +265,7 @@ public class HighScore extends FreeColObject { * * @return The independent nation name. */ - public final String getNationName() { + public final String getNationLabel() { return nationName; } diff --git a/src/net/sf/freecol/common/model/HighSeas.java b/src/net/sf/freecol/common/model/HighSeas.java index 2f5a2d6c8..b25e3a745 100644 --- a/src/net/sf/freecol/common/model/HighSeas.java +++ b/src/net/sf/freecol/common/model/HighSeas.java @@ -97,6 +97,16 @@ public class HighSeas extends UnitLocation { } + // Override FreeColGameObject + + /** + * {@inheritDoc} + */ + @Override + public FreeColGameObject getLinkTarget(Player player) { + return player.getEurope(); + } + // Interface Location (from UnitLocation) // Inherits // FreeColObject.getId @@ -127,6 +137,14 @@ public class HighSeas extends UnitLocation { return this; } + /** + * {@inheritDoc} + */ + @Override + public int getRank() { + return Location.LOCATION_RANK_HIGHSEAS; + } + /** * {@inheritDoc} */ diff --git a/src/net/sf/freecol/common/model/InciteTradeItem.java b/src/net/sf/freecol/common/model/InciteTradeItem.java index b3cde4c9b..f26a89471 100644 --- a/src/net/sf/freecol/common/model/InciteTradeItem.java +++ b/src/net/sf/freecol/common/model/InciteTradeItem.java @@ -90,7 +90,7 @@ public class InciteTradeItem extends TradeItem { @Override public StringTemplate getLabel() { return StringTemplate.template(Messages.descriptionKey("model.tradeItem.incite")) - .addStringTemplate("%nation%", victim.getNationName()); + .addStringTemplate("%nation%", victim.getNationLabel()); } /** diff --git a/src/net/sf/freecol/common/model/IndianSettlement.java b/src/net/sf/freecol/common/model/IndianSettlement.java index 79ddd527d..7dacbfac2 100644 --- a/src/net/sf/freecol/common/model/IndianSettlement.java +++ b/src/net/sf/freecol/common/model/IndianSettlement.java @@ -460,7 +460,7 @@ public class IndianSettlement extends Settlement implements TradeLocation { return (contacted) ? ((mostHated == null) ? StringTemplate.key("model.indianSettlement.mostHatedNone") - : mostHated.getNationName()) + : mostHated.getCountryLabel()) : StringTemplate.key("model.indianSettlement.mostHatedUnknown"); } @@ -556,10 +556,7 @@ public class IndianSettlement extends Settlement implements TradeLocation { * @return True if any European player has spoken with the chief. */ public boolean hasAnyScouted() { - for (Player p : contactLevels.keySet()) { - if (hasScouted(p)) return true; - } - return false; + return any(contactLevels.keySet(), p -> hasScouted(p)); } /** @@ -769,19 +766,14 @@ public class IndianSettlement extends Settlement implements TradeLocation { final Specification spec = getSpecification(); final UnitType unitType = getFirstUnit().getType(); - final Role militaryRole = Role.getAvailableRoles(getOwner(), - unitType, spec.getMilitaryRoles()).get(0); + final List militaryRoles = Role.getAvailableRoles(getOwner(), + unitType, spec.getMilitaryRoles()); - if (type.isMilitaryGoods()) { - // Retain enough goods to fully arm. - int need = 0; - for (Unit u : ownedUnits) { - if (u.getRole() == militaryRole) continue; - List required - = u.getGoodsDifference(militaryRole, 1); - need += AbstractGoods.getCount(type, required); - } - return need; + if (type.isMilitaryGoods()) { // Retain enough goods to fully arm + return ownedUnits.stream() + .filter(u -> !militaryRoles.contains(u.getRole())) + .mapToInt(u -> AbstractGoods.getCount(type, + u.getGoodsDifference(militaryRoles.get(0), 1))).sum(); } int consumption = getConsumptionOf(type); @@ -949,15 +941,11 @@ public class IndianSettlement extends Settlement implements TradeLocation { * be produced in one turn. */ public int getMaximumProduction(GoodsType goodsType) { - int amount = 0; - for (Tile workTile: getTile().getSurroundingTiles(getRadius())) { - if (workTile.getOwningSettlement() == null || workTile.getOwningSettlement() == this) { - // FIXME: make unitType brave - amount += workTile.getPotentialProduction(goodsType, null); - } - } - - return amount; + return getTile().getSurroundingTiles(0, getRadius()).stream() + .filter(t -> t.getOwningSettlement() == null + || t.getOwningSettlement() == this) + // FIXME: make unitType brave + .mapToInt(t -> t.getPotentialProduction(goodsType, null)).sum(); } @@ -1105,6 +1093,7 @@ public class IndianSettlement extends Settlement implements TradeLocation { // UnitLocation.getUnitCount // UnitLocation.getUnitList // Settlement.getSettlement + // final Settlement.getRank /** * {@inheritDoc} @@ -1189,9 +1178,9 @@ public class IndianSettlement extends Settlement implements TradeLocation { @Override public Unit getDefendingUnit(Unit attacker) { Unit defender = null; - float defencePower = -1.0f; + double defencePower = -1.0; for (Unit nextUnit : getUnitList()) { - float unitPower = attacker.getGame().getCombatModel() + double unitPower = attacker.getGame().getCombatModel() .getDefencePower(attacker, nextUnit); if (Unit.betterDefender(defender, defencePower, nextUnit, unitPower)) { @@ -1206,8 +1195,8 @@ public class IndianSettlement extends Settlement implements TradeLocation { * {@inheritDoc} */ @Override - public float getDefenceRatio() { - return getUnitCount() * 2.0f / (getType().getMinimumSize() + public double getDefenceRatio() { + return getUnitCount() * 2.0 / (getType().getMinimumSize() + getType().getMaximumSize()); } @@ -1257,9 +1246,8 @@ public class IndianSettlement extends Settlement implements TradeLocation { return getUnitCount(); } - int potential = 0; int tiles = 0; - + int potential = 0; for (Tile workTile : getOwnedTiles()) { if (workTile != getTile() && !workTile.isOccupied()) { // FIXME: make unitType brave @@ -1306,7 +1294,7 @@ public class IndianSettlement extends Settlement implements TradeLocation { ? "model.indianSettlement.tension.unknown" : "model.indianSettlement." + getAlarm(player).getKey(); return StringTemplate.template(key) - .addStringTemplate("%nation%", getOwner().getNationName()); + .addStringTemplate("%nation%", getOwner().getNationLabel()); } diff --git a/src/net/sf/freecol/common/model/LandMap.java b/src/net/sf/freecol/common/model/LandMap.java index 58deeddb3..850ab6e3b 100644 --- a/src/net/sf/freecol/common/model/LandMap.java +++ b/src/net/sf/freecol/common/model/LandMap.java @@ -20,6 +20,7 @@ package net.sf.freecol.common.model; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.logging.Logger; @@ -29,6 +30,7 @@ import net.sf.freecol.common.model.Map.Position; import net.sf.freecol.common.option.MapGeneratorOptions; import net.sf.freecol.common.option.OptionGroup; import net.sf.freecol.common.option.SelectOption; +import static net.sf.freecol.common.util.CollectionUtils.*; import static net.sf.freecol.common.util.RandomUtils.*; @@ -284,15 +286,11 @@ public class LandMap { * @param y The y coordinate to check. */ private boolean isSingleTile(int x, int y) { - Position p = new Position(x, y); - - for (Direction direction : Direction.values()) { - Position n = new Position(p, direction); - if (n.isValid(width, height) && map[n.getX()][n.getY()]) { - return false; - } - } - return true; + final Position p = new Position(x, y); + return none(Direction.values(), d -> { + Position n = new Position(p, d); + return n.isValid(width, height) && map[n.getX()][n.getY()]; + }); } /** diff --git a/src/net/sf/freecol/common/model/Location.java b/src/net/sf/freecol/common/model/Location.java index e2b5a40cb..1018de9ed 100644 --- a/src/net/sf/freecol/common/model/Location.java +++ b/src/net/sf/freecol/common/model/Location.java @@ -32,6 +32,13 @@ import net.sf.freecol.common.ObjectWithId; */ public interface Location extends ObjectWithId { + // "Rank" constants for location ordering. + // Tile ranks are distinct and non-negative. + // Other locations devolve to {europe,highseas,tile} rank. + public static final int LOCATION_RANK_NOWHERE = -3; + public static final int LOCATION_RANK_EUROPE = -2; + public static final int LOCATION_RANK_HIGHSEAS = -1; + /** * Gets the identifier of this Location. * @@ -163,10 +170,39 @@ public interface Location extends ObjectWithId { */ public Location up(); + /** + * Get a integer for this location, for the benefit of location + * comparators. + * + * @return A suitable integer. + */ + public int getRank(); + /** * Get a short description of this location. * * @return A short description. */ public String toShortString(); + + + /** + * Static frontend to up(). + * + * @param loc The Location to improve. + * @return The improved Location. + */ + public static Location upLoc(Location loc) { + return (loc == null) ? null : loc.up(); + } + + /** + * Static front end to getRank. + * + * @param loc A Location to check. + * @return The integer rank of the given location. + */ + public static int getRank(Location loc) { + return (loc == null) ? Location.LOCATION_RANK_NOWHERE : loc.getRank(); + } } diff --git a/src/net/sf/freecol/common/model/LostCityRumour.java b/src/net/sf/freecol/common/model/LostCityRumour.java index 11ddab7cb..be3023524 100644 --- a/src/net/sf/freecol/common/model/LostCityRumour.java +++ b/src/net/sf/freecol/common/model/LostCityRumour.java @@ -314,7 +314,7 @@ public class LostCityRumour extends TileItem { */ @Override public final int getZIndex() { - return RUMOUR_ZINDEX; + return Tile.RUMOUR_ZINDEX; } /** diff --git a/src/net/sf/freecol/common/model/Map.java b/src/net/sf/freecol/common/model/Map.java index d054e545e..2223b20fc 100644 --- a/src/net/sf/freecol/common/model/Map.java +++ b/src/net/sf/freecol/common/model/Map.java @@ -43,6 +43,7 @@ import net.sf.freecol.common.model.pathfinding.CostDeciders; import net.sf.freecol.common.model.pathfinding.GoalDecider; import net.sf.freecol.common.model.pathfinding.GoalDeciders; import net.sf.freecol.common.util.LogBuilder; +import static net.sf.freecol.common.util.CollectionUtils.*; import static net.sf.freecol.common.util.RandomUtils.*; // @compat 0.10.x import net.sf.freecol.server.generator.TerrainGenerator; @@ -119,14 +120,10 @@ public class Map extends FreeColGameObject implements Location { * @param direction An optional Direction to step. */ public Position(Position start, Direction direction) { - int xx = start.x, yy = start.y; - if (direction != null) { - Position step = direction.step(xx, yy); - xx = step.x; - yy = step.y; - } - this.x = xx; - this.y = yy; + Position step = (direction == null) ? start + : direction.step(start.x, start.y); + this.x = step.x; + this.y = step.y; } @@ -205,11 +202,8 @@ public class Map extends FreeColGameObject implements Location { * @return The Direction, or null if not adjacent. */ public Direction getDirection(Position other) { - for (Direction d : Direction.values()) { - Position step = d.step(x, y); - if (step.x == other.x && step.y == other.y) return d; - } - return null; + return find(Direction.values(), + d -> new Position(this, d).equals(other), null); } // Override Object @@ -394,7 +388,7 @@ public class Map extends FreeColGameObject implements Location { * @return The width of this map. */ public int getWidth() { - return (tiles == null) ? 0 : tiles.length; + return tiles.length; } /** @@ -403,7 +397,7 @@ public class Map extends FreeColGameObject implements Location { * @return The height of this map. */ public int getHeight() { - return (tiles == null) ? 0 : tiles[0].length; + return tiles[0].length; } public final Layer getLayer() { @@ -506,11 +500,8 @@ public class Map extends FreeColGameObject implements Location { * @return The region with the given name key, or null if not found. */ public Region getRegionByKey(final String key) { - if (key == null) return null; - for (Region r : regions) { - if (key.equals(r.getKey())) return r; - } - return null; + return (key == null) ? null + : find(getRegions(), r -> key.equals(r.getKey())); } /** @@ -521,11 +512,8 @@ public class Map extends FreeColGameObject implements Location { * not found. */ public Region getRegionByName(final String name) { - if (name == null) return null; - for (Region r : regions) { - if (name.equals(r.getName())) return r; - } - return null; + return (name == null) ? null + : find(getRegions(), r -> name.equals(r.getName())); } /** @@ -591,12 +579,8 @@ public class Map extends FreeColGameObject implements Location { * specified tiles are not neighbours. */ public Direction getDirection(Tile t1, Tile t2) { - for (Direction d : Direction.values()) { - Position step = d.step(t1.getX(), t1.getY()); - if (step.x == t2.getX() - && step.y == t2.getY()) return d; - } - return null; + return (t1 == null || t2 == null) ? null + : new Position(t1).getDirection(new Position(t2)); } /** @@ -626,8 +610,7 @@ public class Map extends FreeColGameObject implements Location { * direction, or null if invalid. */ public Tile getAdjacentTile(int x, int y, Direction direction) { - Position step = direction.step(x, y); - return getTile(step.x, step.y); + return getTile(direction.step(x, y)); } /** @@ -706,7 +689,7 @@ public class Map extends FreeColGameObject implements Location { * Simple interface to supply a heuristic to the A* routine. */ private interface SearchHeuristic { - public int getValue(Tile tile); + int getValue(Tile tile); } /** @@ -715,14 +698,8 @@ public class Map extends FreeColGameObject implements Location { * @param endTile The Tile to aim for. * @return A new SearchHeuristic aiming for the end tile. */ - private SearchHeuristic getManhattenHeuristic(final Tile endTile) { - return new SearchHeuristic() { - // Manhatten distance to the end tile. - @Override - public int getValue(Tile tile) { - return tile.getDistanceTo(endTile); - } - }; + private SearchHeuristic getManhattenHeuristic(Tile endTile) { + return (Tile tile) -> tile.getDistanceTo(endTile); } /** @@ -1960,6 +1937,42 @@ public class Map extends FreeColGameObject implements Location { return null; } + /** + * Iterates through a rectangular subpart of the Map. + * Intentionally avoids calling methods doing redundant checks, + * which would slow down map display. + * + * @param x X-component of the position of first tile. + * @param y Y-component of the position of first tile. + * @param w Width of the rectangle. + * @param h Height of the rectangle. + * @param consumer Provides a function to call for each tile. + */ + public void forSubMap(int x, int y, int w, int h, + java.util.function.Consumer consumer) { + if (x < 0) { + w += x; + x = 0; + } + if (y < 0) { + h += y; + y = 0; + } + if (w <= 0 || h <= 0) + return; + int width = getWidth(); + int height = getHeight(); + if (x > width || y > height) + return; + if (x+w > width) + w = width - x; + if (y+h > height) + h = height - y; + for (int yi = y; yi < y+h; ++yi) + for (int xi = x; xi < x+w; ++xi) + consumer.accept(tiles[xi][yi]); + } + /** * Flood fills from a given Position p, based on * connectivity information encoded in boolmap @@ -2410,6 +2423,14 @@ public class Map extends FreeColGameObject implements Location { return this; } + /** + * {@inheritDoc} + */ + @Override + public int getRank() { + return Location.LOCATION_RANK_NOWHERE; + } + /** * {@inheritDoc} */ diff --git a/src/net/sf/freecol/common/model/Market.java b/src/net/sf/freecol/common/model/Market.java index 9b94982c4..1ea207455 100644 --- a/src/net/sf/freecol/common/model/Market.java +++ b/src/net/sf/freecol/common/model/Market.java @@ -21,6 +21,7 @@ package net.sf.freecol.common.model; import java.util.ArrayList; import java.util.Collection; +import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.logging.Logger; @@ -415,6 +416,16 @@ public final class Market extends FreeColGameObject implements Ownable { if (data != null) data.update(); } + /** + * Get a sale price comparator for this market. + * + * @return A suitable Comparator. + */ + public Comparator getSalePriceComparator() { + return Comparator.comparingInt((T t) + -> getSalePrice(t.getType(), t.getAmount())).reversed(); + } + /** * Adds a transaction listener for notification of any transaction * @@ -466,6 +477,16 @@ public final class Market extends FreeColGameObject implements Ownable { this.owner = owner; } + // Override FreeColGameObject + + /** + * {@inheritDoc} + */ + @Override + public FreeColGameObject getLinkTarget(Player player) { + return (player == getOwner()) ? getOwner().getEurope() : null; + } + // Serialization diff --git a/src/net/sf/freecol/common/model/ModelMessage.java b/src/net/sf/freecol/common/model/ModelMessage.java index 180d3854e..3fa118434 100644 --- a/src/net/sf/freecol/common/model/ModelMessage.java +++ b/src/net/sf/freecol/common/model/ModelMessage.java @@ -19,8 +19,12 @@ package net.sf.freecol.common.model; +import java.util.ArrayList; +import java.util.List; + import javax.xml.stream.XMLStreamException; +import net.sf.freecol.client.gui.panel.Utility; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.io.FreeColXMLReader; import net.sf.freecol.common.io.FreeColXMLWriter; @@ -350,8 +354,54 @@ public class ModelMessage extends StringTemplate { } return null; } + + /** + * Split a message into a list of text and link objects. + * + * @param player The Player who will see the result. + * @return A list of strings and buttons. + */ + public List splitLinks(Player player) { + final FreeColGameObject source = player.getGame() + .getMessageSource(this); + + // Build a list of objects, initially containing just the plain + // text of the message. + List result = new ArrayList<>(); + result.add(Messages.message(this)); + + for (String key : getKeys()) { + // Then for each key, check if it can be made into a link. + // If not, ignore it. + String val = Messages.message(getReplacement(key)); + Object b = Utility.getMessageButton(key, val, player, source); + if (b == null) continue; + + // ...if so, find all instances of the replacement of the key + // in the object list texts, and replace them with buttons. + List next = new ArrayList<>(); + for (Object o : result) { + if (o instanceof String) { + String str = (String)o; + int index, start = 0; + while ((index = str.indexOf(val, start)) >= 0) { + if (index > start) { + next.add(str.substring(start, index)); + } + next.add(b); + start = index + val.length(); + } + next.add(str.substring(start, str.length())); + } else { + next.add(o); + } + } + result = next; + } + return result; + } + - // Quasi-override StringTemplate routines to return ModelMessages /** diff --git a/src/net/sf/freecol/common/model/Modifier.java b/src/net/sf/freecol/common/model/Modifier.java index be3c47481..503a93b30 100644 --- a/src/net/sf/freecol/common/model/Modifier.java +++ b/src/net/sf/freecol/common/model/Modifier.java @@ -70,6 +70,8 @@ public class Modifier extends Feature { = "model.modifier.defence"; public static final String EXPLORE_LOST_CITY_RUMOUR = "model.modifier.exploreLostCityRumour"; + public static final String EXPOSED_TILES_RADIUS + = "model.modifier.exposedTilesRadius"; public static final String FORTIFIED = "model.modifier.fortified"; public static final String IMMIGRATION diff --git a/src/net/sf/freecol/common/model/Monarch.java b/src/net/sf/freecol/common/model/Monarch.java index 62ab5b727..1fda92651 100644 --- a/src/net/sf/freecol/common/model/Monarch.java +++ b/src/net/sf/freecol/common/model/Monarch.java @@ -20,9 +20,11 @@ package net.sf.freecol.common.model; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Random; +import java.util.stream.Collectors; import java.util.logging.Logger; import javax.xml.stream.XMLStreamConstants; @@ -110,16 +112,13 @@ public final class Monarch extends FreeColGameObject implements Named { */ public final void updateSpaceAndCapacity() { final Specification spec = getSpecification(); - capacity = 0; - for (AbstractUnit nu : navalUnits) { - if (nu.getType(spec).canCarryUnits()) { - capacity += nu.getType(spec).getSpace() * nu.getNumber(); - } - } - spaceRequired = 0; - for (AbstractUnit lu : landUnits) { - spaceRequired += lu.getType(spec).getSpaceTaken() * lu.getNumber(); - } + capacity = navalUnits.stream() + .filter(nu -> nu.getType(spec).canCarryUnits()) + .mapToInt(nu -> nu.getType(spec).getSpace() + * nu.getNumber()).sum(); + spaceRequired = landUnits.stream() + .mapToInt(lu -> lu.getType(spec).getSpaceTaken() + * lu.getNumber()).sum(); } /** @@ -359,17 +358,6 @@ public final class Monarch extends FreeColGameObject implements Named { */ private Force interventionForce; - /** - * A force of mercenaries, which some random country will offer to - * send to support the player's rebellion. - */ - private Force mercenaryForce; - - /** - * A force of military units typically provided when the monarch declares - * war. - */ - private Force warSupportForce; // Caches. Do not serialize. /** The naval unit types suitable for support actions. */ @@ -404,7 +392,9 @@ public final class Monarch extends FreeColGameObject implements Named { } this.player = player; - requireForces(); + // The Forces rely on the spec, but in the client we have to + // create a player(with monarch) before the spec arrives from + // the server, so the Forces *must* be instantiated lazily. } /** @@ -418,59 +408,61 @@ public final class Monarch extends FreeColGameObject implements Named { public Monarch(Game game, String id) { super(game, id); - // @compat 0.10.7(REF), 0.11.1(Intervention,Mecenary), - // 0.11.3(War Support) - requireForces(); - // end @compat 0.11.3 + // The Forces rely on the spec, but in the client we have to + // create a player(with monarch) before the spec arrives from + // the server, so the Forces *must* be instantiated lazily. } - /** - * Various Forces have been introduced (or renamed in the case of - * the REF) at various points of FreeCol history. To ensure - * compatibility, check if they are empty and if so initialize - * from the corresponding option. - * - * Can be moved back into the main constructor in due course. - */ - private void requireForces() { - final Specification spec = getSpecification(); - UnitListOption op; - op = (UnitListOption)spec.getOption(GameOptions.REF_FORCE); - expeditionaryForce = new Force(op, Ability.REF_UNIT); - op = (UnitListOption)spec.getOption(GameOptions.MERCENARY_FORCE); - mercenaryForce = new Force(op, null); - op = (UnitListOption)spec.getOption(GameOptions.INTERVENTION_FORCE); - interventionForce = new Force(op, null); - op = (UnitListOption)spec.getOption(GameOptions.WAR_SUPPORT_FORCE); - warSupportForce = new Force(op, null); - } - /** * Get the force describing the REF. * - * @return The REF. + * @return The REF Force. */ public Force getExpeditionaryForce() { + if (expeditionaryForce == null) { + final Specification spec = getSpecification(); + expeditionaryForce = new Force((UnitListOption)spec.getOption(GameOptions.REF_FORCE), null); + } return expeditionaryForce; } /** * Get the force describing the Intervention Force. * - * @return The Intervention Force. + * @return The intervention Force. */ public Force getInterventionForce() { + if (interventionForce == null) { + final Specification spec = getSpecification(); + interventionForce = new Force((UnitListOption)spec.getOption(GameOptions.INTERVENTION_FORCE), null); + } return interventionForce; } /** * Gets the force describing the Mercenary Force. * - * @return The Mercenary Force. + * This is never updated, and directly derived from the spec. + * + * @return The mercenary Force. */ public Force getMercenaryForce() { - return mercenaryForce; + final Specification spec = getSpecification(); + return new Force((UnitListOption)spec.getOption(GameOptions.MERCENARY_FORCE), null); + } + + /** + * Get the war support force. + * + * This is never updated, and directly derived from the spec. + * + * @return The war support Force. + */ + public Force getWarSupportForce() { + final Specification spec = getSpecification(); + return new Force((UnitListOption)spec + .getOption(GameOptions.WAR_SUPPORT_FORCE), null); } /** @@ -574,22 +566,12 @@ public final class Monarch extends FreeColGameObject implements Named { * @return A list of potential enemy Players. */ public List collectPotentialEnemies() { - List enemies = new ArrayList<>(); // Benjamin Franklin puts an end to the monarch's interference - if (!player.hasAbility(Ability.IGNORE_EUROPEAN_WARS)) { - for (Player enemy : getGame().getLiveEuropeanPlayers(player)) { - if (enemy.hasAbility(Ability.IGNORE_EUROPEAN_WARS) - || enemy.isREF()) continue; - switch (player.getStance(enemy)) { - case PEACE: case CEASE_FIRE: - enemies.add(enemy); - break; - default: - break; - } - } - } - return enemies; + return (player.hasAbility(Ability.IGNORE_EUROPEAN_WARS)) + ? Collections.emptyList() + : getGame().getLiveEuropeanPlayers(player).stream() + .filter(p -> p.isPotentialEnemy(player)) + .collect(Collectors.toList()); } /** @@ -600,18 +582,9 @@ public final class Monarch extends FreeColGameObject implements Named { * @return A list of potential friendly Players. */ public List collectPotentialFriends() { - List friends = new ArrayList<>(); - for (Player enemy : getGame().getLiveEuropeanPlayers(player)) { - if (enemy.isREF()) continue; - switch (player.getStance(enemy)) { - case WAR: case CEASE_FIRE: - friends.add(enemy); - break; - default: - break; - } - } - return friends; + return getGame().getLiveEuropeanPlayers(player).stream() + .filter(p -> p.isPotentialFriend(player)) + .collect(Collectors.toList()); } /** @@ -767,8 +740,9 @@ public final class Monarch extends FreeColGameObject implements Named { // Preserve some extra naval capacity so that not all the REF // navy is completely loaded // FIXME: magic number 2.5 * Manowar-capacity = 15 - boolean needNaval = expeditionaryForce.getCapacity() - < expeditionaryForce.getSpaceRequired() + 15; + Force ref = getExpeditionaryForce(); + boolean needNaval = ref.getCapacity() + < ref.getSpaceRequired() + 15; List types = (needNaval) ? navalREFUnitTypes : landREFUnitTypes; if (types.isEmpty()) return null; @@ -784,8 +758,8 @@ public final class Monarch extends FreeColGameObject implements Named { : randomInt(logger, "Choose land#", random, 3) + 1; AbstractUnit result = new AbstractUnit(unitType, role.getId(), number); logger.info("Add to " + player.getDebugName() - + " REF: capacity=" + expeditionaryForce.getCapacity() - + " spaceRequired=" + expeditionaryForce.getSpaceRequired() + + " REF: capacity=" + ref.getCapacity() + + " spaceRequired=" + ref.getSpaceRequired() + " => " + result); return result; } @@ -799,16 +773,17 @@ public final class Monarch extends FreeColGameObject implements Named { Specification spec = getSpecification(); int interventionTurns = spec.getInteger(GameOptions.INTERVENTION_TURNS); if (interventionTurns > 0) { + Force ivf = getInterventionForce(); int updates = getGame().getTurn().getNumber() / interventionTurns; - for (AbstractUnit unit : interventionForce.getLandUnits()) { + for (AbstractUnit unit : ivf.getLandUnits()) { // add units depending on current turn int value = unit.getNumber() + updates; unit.setNumber(value); } - interventionForce.updateSpaceAndCapacity(); - while (interventionForce.getCapacity() < interventionForce.getSpaceRequired()) { + ivf.updateSpaceAndCapacity(); + while (ivf.getCapacity() < ivf.getSpaceRequired()) { boolean progress = false; - for (AbstractUnit ship : interventionForce.getNavalUnits()) { + for (AbstractUnit ship : ivf.getNavalUnits()) { // add ships until all units can be transported at once if (ship.getType(spec).canCarryUnits() && ship.getType(spec).getSpace() > 0) { @@ -818,7 +793,7 @@ public final class Monarch extends FreeColGameObject implements Named { } } if (!progress) break; - interventionForce.updateSpaceAndCapacity(); + ivf.updateSpaceAndCapacity(); } } } @@ -922,9 +897,10 @@ public final class Monarch extends FreeColGameObject implements Named { double p = 10.0 * (NOSUPPORT - strengthRatio); if (p >= 1.0 // Avoid calling randomDouble if unnecessary || (p > 0.0 && p > randomDouble(logger, "War support?", random))) { - result.addAll(warSupportForce.getUnits()); + Force wsf = getWarSupportForce(); + result.addAll(wsf.getUnits()); double supportStrength, fullRatio, strength, ratio; - supportStrength = warSupportForce.calculateStrength(false); + supportStrength = wsf.calculateStrength(false); fullRatio = Player.strengthRatio(baseStrength + supportStrength, enemyStrength); if (fullRatio < NOSUPPORT) { // Full support, some randomization @@ -1036,7 +1012,8 @@ public final class Monarch extends FreeColGameObject implements Named { // @compat 0.10.x // Detects/fixes bogus expeditionary force roles List todo = new ArrayList<>(); - Iterator it = expeditionaryForce.getLandUnits() + Force ref = getExpeditionaryForce(); + Iterator it = ref.getLandUnits() .iterator(); while (it.hasNext()) { AbstractUnit au = it.next(); @@ -1061,7 +1038,7 @@ public final class Monarch extends FreeColGameObject implements Named { } } } - for (AbstractUnit au : todo) expeditionaryForce.add(au); + for (AbstractUnit au : todo) ref.add(au); // end @compat 0.10.x return result; } @@ -1072,12 +1049,14 @@ public final class Monarch extends FreeColGameObject implements Named { private static final String DISPLEASURE_TAG = "displeasure"; private static final String EXPEDITIONARY_FORCE_TAG = "expeditionaryForce"; private static final String INTERVENTION_FORCE_TAG = "interventionForce"; - private static final String MERCENARY_FORCE_TAG = "mercenaryForce"; private static final String PLAYER_TAG = "player"; private static final String SUPPORT_SEA_TAG = "supportSea"; // @compat 0.11.1 private static final String NAME_TAG = "name"; // end @compat 0.11.1 + // @compat 0.11.5 + private static final String MERCENARY_FORCE_TAG = "mercenaryForce"; + // end @compat 0.11.5 /** @@ -1106,11 +1085,9 @@ public final class Monarch extends FreeColGameObject implements Named { if (xw.validFor(this.player)) { - expeditionaryForce.toXML(xw, EXPEDITIONARY_FORCE_TAG); + getExpeditionaryForce().toXML(xw, EXPEDITIONARY_FORCE_TAG); - interventionForce.toXML(xw, INTERVENTION_FORCE_TAG); - - mercenaryForce.toXML(xw, MERCENARY_FORCE_TAG); + getInterventionForce().toXML(xw, INTERVENTION_FORCE_TAG); } } @@ -1134,19 +1111,11 @@ public final class Monarch extends FreeColGameObject implements Named { */ @Override protected void readChildren(FreeColXMLReader xr) throws XMLStreamException { - super.readChildren(xr); + // Provide dummy forces to read into. + if (expeditionaryForce == null) expeditionaryForce = new Force(); + if (interventionForce == null) interventionForce = new Force(); - // @compat 0.10.5 - // Intervention and mercenary forces introduced here. Add - // default definitions for the benefit of earlier versions. - final Specification spec = getSpecification(); - if (interventionForce.getUnits().isEmpty()) { - interventionForce = new Force((UnitListOption)spec.getOption(GameOptions.INTERVENTION_FORCE), null); - } - if (mercenaryForce.getUnits().isEmpty()) { - mercenaryForce = new Force((UnitListOption)spec.getOption(GameOptions.MERCENARY_FORCE), null); - } - // end @compat + super.readChildren(xr); } /** @@ -1174,8 +1143,12 @@ public final class Monarch extends FreeColGameObject implements Named { } // end @compat + // @compat 0.11.5 + // Mercenary force is never updated, and lives in the spec now, so + // just read and discard it. } else if (MERCENARY_FORCE_TAG.equals(tag)) { - mercenaryForce.readFromXML(xr); + new Force().readFromXML(xr); + // end @compat 0.11.5 // @compat 0.10.5 } else if (Force.NAVAL_UNITS_TAG.equals(tag)) { diff --git a/src/net/sf/freecol/common/model/Nation.java b/src/net/sf/freecol/common/model/Nation.java index a6eae8ed7..9794a1110 100644 --- a/src/net/sf/freecol/common/model/Nation.java +++ b/src/net/sf/freecol/common/model/Nation.java @@ -173,10 +173,8 @@ public class Nation extends FreeColGameObjectType { * @return The rebel Nation, or null if not applicable. */ public final Nation getRebelNation() { - for (Nation n : getSpecification().getEuropeanNations()) { - if (n.getREFNation() == this) return n; - } - return null; + return find(getSpecification().getEuropeanNations(), + n -> n.getREFNation() == this); } /** @@ -261,7 +259,7 @@ public class Nation extends FreeColGameObjectType { for (int index = 0; index < nations; index++) { String nationId = "model.nation." + EUROPEAN_NATIONS.get((start + index) % nations); - if (game.getPlayer(nationId) == null) { + if (game.getPlayerByNationId(nationId) == null) { return Messages.nameKey(nationId); } } diff --git a/src/net/sf/freecol/common/model/NationType.java b/src/net/sf/freecol/common/model/NationType.java index 77f0724d7..47db2fa00 100644 --- a/src/net/sf/freecol/common/model/NationType.java +++ b/src/net/sf/freecol/common/model/NationType.java @@ -27,6 +27,7 @@ import javax.xml.stream.XMLStreamException; import net.sf.freecol.common.io.FreeColXMLReader; import net.sf.freecol.common.io.FreeColXMLWriter; +import static net.sf.freecol.common.util.CollectionUtils.*; import static net.sf.freecol.common.util.StringUtils.*; @@ -100,9 +101,7 @@ public abstract class NationType extends FreeColGameObjectType { * @param settlementType The SettlementType to add. */ private void addSettlementType(SettlementType settlementType) { - if (settlementTypes == null) { - settlementTypes = new ArrayList<>(); - } + if (settlementTypes == null) settlementTypes = new ArrayList<>(); settlementTypes.add(settlementType); } @@ -112,9 +111,7 @@ public abstract class NationType extends FreeColGameObjectType { * @param types A list of SettlementTypes to add. */ private void addSettlementTypes(List types) { - if (settlementTypes == null) { - settlementTypes = new ArrayList<>(); - } + if (settlementTypes == null) settlementTypes = new ArrayList<>(); settlementTypes.addAll(types); } @@ -134,12 +131,7 @@ public abstract class NationType extends FreeColGameObjectType { * @return The settlement type. */ public SettlementType getSettlementType(boolean isCapital) { - for (SettlementType settlementType : getSettlementTypes()) { - if (settlementType.isCapital() == isCapital) { - return settlementType; - } - } - return null; + return find(getSettlementTypes(), s -> s.isCapital() == isCapital); } /** @@ -149,10 +141,7 @@ public abstract class NationType extends FreeColGameObjectType { * @return The settlement type. */ public SettlementType getSettlementType(String id) { - for (SettlementType settlementType : getSettlementTypes()) { - if (id.equals(settlementType.getId())) return settlementType; - } - return null; + return find(getSettlementTypes(), s -> id.equals(s.getId())); } /** diff --git a/src/net/sf/freecol/common/model/Occupation.java b/src/net/sf/freecol/common/model/Occupation.java index 66a417040..1adb30333 100644 --- a/src/net/sf/freecol/common/model/Occupation.java +++ b/src/net/sf/freecol/common/model/Occupation.java @@ -99,26 +99,26 @@ public class Occupation { final Colony colony = wl.getColony(); for (ProductionType pt : productionTypes) { lb.add("\n try=", pt); - for (GoodsType gt : workTypes) { - if (pt.getOutput(gt) == null) continue; - int minInput = FreeColObject.INFINITY; - List inputs = pt.getInputs(); - if (pt != null) { + if (pt != null) { + for (GoodsType gt : workTypes) { + if (pt.getOutput(gt) == null) continue; + int minInput = FreeColObject.INFINITY; + List inputs = pt.getInputs(); for (AbstractGoods ag : inputs) { int input = Math.max(colony.getGoodsCount(ag.getType()), colony.getNetProductionOf(ag.getType())); minInput = Math.min(minInput, input); } - } - int potential = wl.getPotentialProduction(gt, unitType); - int amount = Math.min(minInput, potential); - lb.add(" ", gt.getSuffix(), "=", amount, "/", minInput, - "/", potential, ((bestAmount < amount) ? "!" : "")); - if (bestAmount < amount) { - bestAmount = amount; - this.workLocation = wl; - this.productionType = pt; - this.workType = gt; + int potential = wl.getPotentialProduction(gt, unitType); + int amount = Math.min(minInput, potential); + lb.add(" ", gt.getSuffix(), "=", amount, "/", minInput, + "/", potential, ((bestAmount < amount) ? "!" : "")); + if (bestAmount < amount) { + bestAmount = amount; + this.workLocation = wl; + this.productionType = pt; + this.workType = gt; + } } } } @@ -179,10 +179,10 @@ public class Occupation { @Override public String toString() { StringBuilder sb = new StringBuilder(32); - sb.append("[Occupation ").append(workLocation) + sb.append("[Occupation ").append(workLocation); //.append(" ").append(productionType) - .append(" ").append(workType.getSuffix()) - .append("]"); + if (workType != null) sb.append(" ").append(workType.getSuffix()); + sb.append("]"); return sb.toString(); } } diff --git a/src/net/sf/freecol/common/model/Operand.java b/src/net/sf/freecol/common/model/Operand.java index dcb81087b..6b8c7ca30 100644 --- a/src/net/sf/freecol/common/model/Operand.java +++ b/src/net/sf/freecol/common/model/Operand.java @@ -21,7 +21,6 @@ package net.sf.freecol.common.model; import java.util.LinkedList; import java.util.List; -import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.stream.XMLStreamException; @@ -29,7 +28,6 @@ import javax.xml.stream.XMLStreamException; import net.sf.freecol.common.io.FreeColXMLReader; import net.sf.freecol.common.io.FreeColXMLWriter; import net.sf.freecol.common.util.Utils; -import static net.sf.freecol.common.util.StringUtils.*; /** @@ -321,15 +319,12 @@ public class Operand extends Scope { */ @Override public boolean equals(Object o) { - if (this == o) return true; - if (o instanceof Operand) { - Operand op = (Operand)o; - return operandType == op.operandType - && scopeLevel == op.scopeLevel - && Utils.equals(value, op.value) - && super.equals(o); - } - return false; + return this == o + || (o instanceof Operand + && operandType == ((Operand)o).operandType + && scopeLevel == ((Operand)o).scopeLevel + && Utils.equals(value, ((Operand)o).value) + && super.equals(o)); } diff --git a/src/net/sf/freecol/common/model/Player.java b/src/net/sf/freecol/common/model/Player.java index 3b2973c7a..103ff20a0 100644 --- a/src/net/sf/freecol/common/model/Player.java +++ b/src/net/sf/freecol/common/model/Player.java @@ -33,6 +33,7 @@ import java.util.Locale; import java.util.Random; import java.util.Set; import java.util.logging.Logger; +import java.util.stream.Collectors; import javax.xml.stream.XMLStreamException; @@ -41,11 +42,11 @@ import net.sf.freecol.common.i18n.NameCache; import net.sf.freecol.common.io.FreeColXMLReader; import net.sf.freecol.common.io.FreeColXMLWriter; import net.sf.freecol.common.model.NationOptions.NationState; -import net.sf.freecol.common.model.Region.RegionType; import net.sf.freecol.common.option.OptionGroup; + import static net.sf.freecol.common.util.CollectionUtils.*; -import static net.sf.freecol.common.util.RandomUtils.*; import static net.sf.freecol.common.util.StringUtils.*; + import net.sf.freecol.common.util.Utils; import org.w3c.dom.Element; @@ -213,10 +214,9 @@ public class Player extends FreeColGameObject implements Nameable { */ private final void update() { units.clear(); - for (Unit u : owner.getUnits()) { - if (predicate.obtains(u)) units.add(u); - } - Collections.sort(units, xyComparator); + units.addAll(owner.getUnits().stream() + .filter(u -> predicate.obtains(u)) + .sorted(Unit.locComparator).collect(Collectors.toList())); } /** @@ -301,24 +301,6 @@ public class Player extends FreeColGameObject implements Nameable { // Constants // - /** - * A comparator to compare units by position, top to bottom, - * left to right. - */ - private static final Comparator xyComparator - = new Comparator() { - @Override - public int compare(Unit unit1, Unit unit2) { - Tile tile1 = unit1.getTile(); - Tile tile2 = unit2.getTile(); - int cmp = ((tile1 == null) ? 0 : tile1.getY()) - - ((tile2 == null) ? 0 : tile2.getY()); - return (cmp != 0 || tile1 == null || tile2 == null) ? cmp - : (tile1.getX() - tile2.getX()); - } - }; - - /** A comparator for ordering players. */ public static final Comparator playerComparator = new Comparator() { @@ -597,7 +579,7 @@ public class Player extends FreeColGameObject implements Nameable { return StringTemplate.label("") .add(getRulerNameKey()) .addName(" (") - .addStringTemplate(getNationName()) + .addStringTemplate(getNationLabel()) .addName(")"); } @@ -675,11 +657,11 @@ public class Player extends FreeColGameObject implements Nameable { } /** - * Gets a name key for the nation name. + * Gets a resource key for the nation name. * - * @return A nation name key. + * @return A nation resource key. */ - public String getNationNameKey() { + public String getNationResourceKey() { return lastPart(nationId, ".").toUpperCase(Locale.US); } @@ -688,13 +670,26 @@ public class Player extends FreeColGameObject implements Nameable { * * @return A template for this nation name. */ - public StringTemplate getNationName() { + public StringTemplate getNationLabel() { return (playerType == PlayerType.REBEL || playerType == PlayerType.INDEPENDENT) ? StringTemplate.name(independentNationName) : StringTemplate.key(Messages.nameKey(nationId)); } + /** + * Get a template for this players country. + * + * @return A template for this country. + */ + public StringTemplate getCountryLabel() { + return (playerType == PlayerType.REBEL + || playerType == PlayerType.INDEPENDENT) + ? StringTemplate.name(independentNationName) + : StringTemplate.template("countryName") + .addStringTemplate("%nation%", getNationLabel()); + } + /** * Get a label indicating for the national forces. * @@ -702,7 +697,7 @@ public class Player extends FreeColGameObject implements Nameable { */ public StringTemplate getForcesLabel() { return StringTemplate.template("model.player.forces") - .addStringTemplate("%nation%", getNationName()); + .addStringTemplate("%nation%", getNationLabel()); } /** @@ -712,7 +707,7 @@ public class Player extends FreeColGameObject implements Nameable { */ public StringTemplate getWaitingLabel() { return StringTemplate.template("model.player.waitingFor") - .addStringTemplate("%nation%", getNationName()); + .addStringTemplate("%nation%", getNationLabel()); } /** @@ -912,6 +907,41 @@ public class Player extends FreeColGameObject implements Nameable { return playerType == PlayerType.ROYAL; } + /** + * Is this player currently on good terms with a given player, and thus + * a suitable candidate for a random monarch war declaration? + * + * @param player The Player to possibly declare war on. + * @return True if this player is a potential enemy. + */ + public boolean isPotentialEnemy(Player player) { + if (!hasAbility(Ability.IGNORE_EUROPEAN_WARS) + && player.getREFPlayer() != this) { + switch (getStance(player)) { + case PEACE: case CEASE_FIRE: return true; + default: break; + } + } + return false; + } + + /** + * Is this player currently on bad terms with a given player, and thus + * a suitable candidate for a random monarch peace declaration? + * + * @param player The Player to possibly declare peace with. + * @return True if this player is a potential friend. + */ + public boolean isPotentialFriend(Player player) { + if (player.getREFPlayer() != this) { + switch (getStance(player)) { + case WAR: case CEASE_FIRE: return true; + default: break; + } + } + return false; + } + /** * Get the nation type of this player. * @@ -1092,10 +1122,9 @@ public class Player extends FreeColGameObject implements Nameable { * world or a nation is in rebellion against us. */ public boolean isWorkForREF() { - for (Unit u : getUnits()) { // Work to do if unit in the new world - if (u.hasTile()) return true; - } - return !getRebels().isEmpty(); + return (any(getUnits(), Unit::hasTile)) + ? true // Work to do still if there exists a unit in the new world + : !getRebels().isEmpty(); } /** @@ -1104,12 +1133,10 @@ public class Player extends FreeColGameObject implements Nameable { * @return A list of nations in rebellion against us. */ public List getRebels() { - List rebels = new ArrayList<>(); - for (Player p : getGame().getLiveEuropeanPlayers(this)) { - if (p.getREFPlayer() == this - && (p.isRebel() || p.isUndead())) rebels.add(p); - } - return rebels; + return getGame().getLiveEuropeanPlayers(this).stream() + .filter(p -> p.getREFPlayer() == this + && (p.isRebel() || p.isUndead())) + .collect(Collectors.toList()); } /** @@ -1121,7 +1148,7 @@ public class Player extends FreeColGameObject implements Nameable { */ public Player getREFPlayer() { Nation ref = getNation().getREFNation(); - return (ref == null) ? null : getGame().getPlayer(ref.getId()); + return (ref == null) ? null : getGame().getPlayerByNation(ref); } /** @@ -1359,13 +1386,11 @@ public class Player extends FreeColGameObject implements Nameable { final List immigrationGoodsTypes = getSpecification() .getImmigrationGoodsTypeList(); - int production = 0; - for (Colony colony : getColonies()) { - for (GoodsType goodsType : immigrationGoodsTypes) { - production += colony.getTotalProductionOf(goodsType); - } - } - Europe europe = getEurope(); + int production = getColonies().stream() + .mapToInt(c -> immigrationGoodsTypes.stream() + .mapToInt(gt -> c.getTotalProductionOf(gt)).sum()) + .sum(); + final Europe europe = getEurope(); if (europe != null) production += europe.getImmigration(production); return production; } @@ -1449,13 +1474,11 @@ public class Player extends FreeColGameObject implements Nameable { * Colonys will make next turn. */ public int getLibertyProductionNextTurn() { - int nextTurn = 0; - for (Colony colony : getColonies()) { - for (GoodsType libertyGoods : getSpecification() - .getLibertyGoodsTypeList()) { - nextTurn += colony.getTotalProductionOf(libertyGoods); - } - } + final Specification spec = getSpecification(); + int nextTurn = getColonies().stream() + .mapToInt(c -> spec.getLibertyGoodsTypeList().stream() + .mapToInt(gt -> c.getTotalProductionOf(gt)).sum()) + .sum(); return (int)applyModifiers((float)nextTurn, getGame().getTurn(), Modifier.LIBERTY); } @@ -1466,13 +1489,10 @@ public class Player extends FreeColGameObject implements Nameable { * @return The total percentage of rebels in all this player's colonies. */ public int getSoL() { - int sum = 0; - int number = 0; - for (Colony c : getColonies()) { - sum += c.getSoL(); - number++; - } - return (number > 0) ? sum / number : 0; + final List colonies = getColonies(); + return (colonies.isEmpty()) ? 0 + : colonies.stream().mapToInt(c -> c.getSoL()).sum() + / colonies.size(); } /** @@ -1618,16 +1638,13 @@ public class Player extends FreeColGameObject implements Nameable { public StringTemplate checkDeclareIndependence() { if (getPlayerType() != PlayerType.COLONIAL) return StringTemplate.template("model.player.colonialIndependence"); - Event event = getSpecification() + final Event event = getSpecification() .getEvent("model.event.declareIndependence"); - for (Limit limit : event.getLimits()) { - if (!limit.evaluate(this)) { - return StringTemplate.template(limit.getDescriptionKey()) - .addAmount("%limit%", - limit.getRightHandSide().getValue(getGame())); - } - } - return null; + Limit limit = find(event.getLimits(), l -> !l.evaluate(this)); + return (limit == null) ? null + : StringTemplate.template(limit.getDescriptionKey()) + .addAmount("%limit%", limit.getRightHandSide() + .getValue(getGame())); } /** @@ -1638,13 +1655,9 @@ public class Player extends FreeColGameObject implements Nameable { */ public int calculateStrength(boolean naval) { final CombatModel cm = getGame().getCombatModel(); - int s = 0; - for (Unit unit : getUnits()) { - if (unit.isNaval() == naval) { - s += cm.getOffencePower(unit, null); - } - } - return s; + return (int)getUnits().stream() + .filter(u -> u.isNaval() == naval) + .mapToDouble(u -> cm.getOffencePower(u, null)).sum(); } /** @@ -1765,22 +1778,13 @@ public class Player extends FreeColGameObject implements Nameable { * @return True if type of goods can be traded. */ public boolean canTrade(GoodsType type, Market.Access access) { - if (getMarket().getArrears(type) == 0) return true; - - if (access == Market.Access.CUSTOM_HOUSE) { - if (getSpecification().getBoolean(GameOptions.CUSTOM_IGNORE_BOYCOTT)) { - return true; - } - if (hasAbility(Ability.CUSTOM_HOUSE_TRADES_WITH_FOREIGN_COUNTRIES)) { - for (Player other : getGame().getLiveEuropeanPlayers(this)) { - if (getStance(other) == Stance.PEACE - || getStance(other) == Stance.ALLIANCE) { - return true; - } - } - } - } - return false; + return getMarket().getArrears(type) == 0 + || (access == Market.Access.CUSTOM_HOUSE + && (getSpecification().getBoolean(GameOptions.CUSTOM_IGNORE_BOYCOTT) + || (hasAbility(Ability.CUSTOM_HOUSE_TRADES_WITH_FOREIGN_COUNTRIES) + && any(getGame().getLiveEuropeanPlayers(this), + p -> getStance(p) == Stance.PEACE + || getStance(p) == Stance.ALLIANCE)))); } /** @@ -1934,18 +1938,11 @@ public class Player extends FreeColGameObject implements Nameable { */ public int getPrice(AbstractUnit au) { final Specification spec = getSpecification(); - UnitType unitType = au.getType(spec); - Role role = au.getRole(spec); - if (unitType.hasPrice()) { - int price = getEurope().getUnitPrice(unitType); - for (AbstractGoods goods : role.getRequiredGoods()) { - int amount = goods.getAmount() * role.getMaximumCount(); - price += getMarket().getBidPrice(goods.getType(), amount); - } - return price * au.getNumber(); - } else { - return INFINITY; - } + final UnitType unitType = au.getType(spec); + if (!unitType.hasPrice()) return INFINITY; + + return au.getNumber() * (getEurope().getUnitPrice(unitType) + + au.getRole(spec).getRequiredGoodsPrice(getMarket())); } /** @@ -2001,11 +1998,8 @@ public class Player extends FreeColGameObject implements Nameable { * @param name The name of the unit. * @return The unit with the given name, or null if none found. */ - public Unit getUnit(String name) { - for (Unit u : units) { - if (name.equals(u.getName())) return u; - } - return null; + public Unit getUnitByName(String name) { + return find(units, u -> name.equals(u.getName())); } /** @@ -2067,11 +2061,9 @@ public class Player extends FreeColGameObject implements Nameable { * @return A list of suitable carriers. */ public List getCarriersForUnit(Unit unit) { - List ul = new ArrayList<>(); - for (Unit u : getUnits()) { - if (u.couldCarry(unit)) ul.add(u); - } - return ul; + return getUnits().stream() + .filter(u -> u.couldCarry(unit)) + .collect(Collectors.toList()); } /** @@ -2081,11 +2073,9 @@ public class Player extends FreeColGameObject implements Nameable { * @return The number of units. */ public int getUnitCount(boolean naval) { - int ret = 0; - for (Unit u : getUnits()) { - if (u.isNaval() == naval) ret++; - } - return ret; + return (int)getUnits().stream() + .filter(u -> u.isNaval() == naval) + .count(); } /** @@ -2094,17 +2084,11 @@ public class Player extends FreeColGameObject implements Nameable { * @return The number of units */ public int getNumberOfKingLandUnits() { - int n = 0; - for (Unit unit : getUnits()) { - if (unit.hasAbility(Ability.REF_UNIT) && !unit.isNaval()) { - n++; - } - } - return n; + return (int)getUnits().stream() + .filter(u -> u.hasAbility(Ability.REF_UNIT) && !u.isNaval()) + .count(); } - - /** * Checks if this player has at least one of a given unit type. * @@ -2112,10 +2096,7 @@ public class Player extends FreeColGameObject implements Nameable { * @return True if this player owns at least one of the specified unit type. */ public boolean hasUnitType(String typeId) { - for (Unit u : getUnits()) { - if (typeId.equals(u.getType().getId())) return true; - } - return false; + return any(getUnits(), u -> typeId.equals(u.getType().getId())); } /** @@ -2215,11 +2196,8 @@ public class Player extends FreeColGameObject implements Nameable { * * @param name The trade route name. */ - public TradeRoute getTradeRoute(String name) { - for (TradeRoute t : tradeRoutes) { - if (t.getName().equals(name)) return t; - } - return null; + public TradeRoute getTradeRouteByName(String name) { + return find(tradeRoutes, t -> t.getName().equals(name)); } /** @@ -2308,12 +2286,11 @@ public class Player extends FreeColGameObject implements Nameable { * @return A list of port Colonys. */ public List getPorts() { - if (!isEuropean()) return Collections.emptyList(); - List result = new ArrayList<>(); - for (Colony colony : getColonies()) { - if (colony.isConnectedPort()) result.add(colony); - } - return result; + return (!isEuropean()) + ? Collections.emptyList() + : getColonies().stream() + .filter(Colony::isConnectedPort) + .collect(Collectors.toList()); } /** @@ -2360,9 +2337,8 @@ public class Player extends FreeColGameObject implements Nameable { * @return The sum of the units currently working in the colonies. */ public int getColoniesPopulation() { - int i = 0; - for (Colony c : getColonies()) i += c.getUnitCount(); - return i; + return getColonies().stream() + .mapToInt(c -> c.getUnitCount()).sum(); } /** @@ -2373,10 +2349,7 @@ public class Player extends FreeColGameObject implements Nameable { * not found. */ public Colony getColonyByName(String name) { - for (Colony colony : getColonies()) { - if (colony.getName().equals(name)) return colony; - } - return null; + return find(getColonies(), c -> c.getName().equals(name)); } /** @@ -2387,10 +2360,7 @@ public class Player extends FreeColGameObject implements Nameable { * or null if not found. */ public IndianSettlement getIndianSettlementByName(String name) { - for (IndianSettlement settlement : getIndianSettlements()) { - if (settlement.getName().equals(name)) return settlement; - } - return null; + return find(getIndianSettlements(), is -> is.getName().equals(name)); } /** @@ -2494,11 +2464,11 @@ public class Player extends FreeColGameObject implements Nameable { * Player. */ public List getNewModelMessages() { - List out = new ArrayList<>(); - for (ModelMessage m : getModelMessages()) { - if (!m.hasBeenDisplayed()) out.add(m); // preserve message order + synchronized (modelMessages) { + return modelMessages.stream() + .filter(m -> !m.hasBeenDisplayed()) + .collect(Collectors.toList()); } - return out; } /** @@ -2582,12 +2552,13 @@ public class Player extends FreeColGameObject implements Nameable { * Add the tutorial message for the start of the game. */ public void addStartGameMessage() { - Direction sailDirection = (getNation().startsOnEastCoast()) - ? Direction.W - : Direction.E; + Tile tile = getEntryLocation().getTile(); + String sailTag = (tile == null) ? "unknown" + : (tile.getX() < tile.getMap().getWidth() / 2) ? "east" + : "west"; addModelMessage(new ModelMessage(ModelMessage.MessageType.TUTORIAL, "model.player.startGame", this) - .addNamed("%direction%", sailDirection)); + .add("%direction%", sailTag)); } /** @@ -2635,6 +2606,21 @@ public class Player extends FreeColGameObject implements Nameable { this.entryLocation = entryLocation; } + /** + * Get a default tile to display at the start of the player turn should + * there not be any active units. + * + * Favour the first settlement, followed by the entry tile. + * + * @return A suitable Tile. + */ + public Tile getFallbackTile() { + List settlements = getSettlements(); + return (!settlements.isEmpty()) + ? settlements.get(0).getTile() + : getEntryLocation().getTile(); + } + /** * Get the players high seas. * @@ -2971,10 +2957,7 @@ public class Player extends FreeColGameObject implements Nameable { * @return True if this player is at war with any other. */ public boolean isAtWar() { - for (Player player : getGame().getLivePlayers(null)) { - if (atWarWith(player)) return true; - } - return false; + return any(getGame().getLivePlayers(null), p -> atWarWith(p)); } /** @@ -2993,10 +2976,8 @@ public class Player extends FreeColGameObject implements Nameable { * @return True if this Player has contacted any Europeans. */ public boolean hasContactedEuropeans() { - for (Player other : getGame().getLiveEuropeanPlayers(this)) { - if (hasContacted(other)) return true; - } - return false; + return any(getGame().getLiveEuropeanPlayers(this), + p -> hasContacted(p)); } /** @@ -3005,10 +2986,8 @@ public class Player extends FreeColGameObject implements Nameable { * @return True if this Player has contacted any natives. */ public boolean hasContactedIndians() { - for (Player other : getGame().getLiveNativePlayers(this)) { - if (hasContacted(other)) return true; - } - return false; + return any(getGame().getLiveNativePlayers(this), + p -> hasContacted(p)); } /** @@ -3036,7 +3015,6 @@ public class Player extends FreeColGameObject implements Nameable { public int getLandPrice(Tile tile) { final Specification spec = getSpecification(); Player nationOwner = tile.getOwner(); - int price = 0; if (nationOwner == null || nationOwner == this) { return 0; // Freely available @@ -3050,15 +3028,12 @@ public class Player extends FreeColGameObject implements Nameable { return 0; // Claim abandoned or only by tile improvement } } // Else, native ownership - for (GoodsType type : spec.getGoodsTypeList()) { - if (type == spec.getPrimaryFoodType()) { + int price = spec.getInteger(GameOptions.LAND_PRICE_FACTOR) + * spec.getGoodsTypeList().stream() // Only consider specific food types, not the aggregation. - continue; - } - price += tile.getPotentialProduction(type, null); - } - price *= spec.getInteger(GameOptions.LAND_PRICE_FACTOR); - price += 100; + .filter(gt -> gt != spec.getPrimaryFoodType()) + .mapToInt(gt -> tile.getPotentialProduction(gt, null)).sum() + + 100; return (int)applyModifiers(price, getGame().getTurn(), Modifier.LAND_PAYMENT_MODIFIER); } @@ -3181,13 +3156,10 @@ public class Player extends FreeColGameObject implements Nameable { * @return The reason why/not the tile can be owned by this player. */ private NoClaimReason canOwnTileReason(Tile tile) { - for (Unit u : tile.getUnitList()) { - Player owner = u.getOwner(); - if (owner == this) break; // Not hostile - // If the unit is military, the tile is held against us. - if (u.isOffensiveUnit()) return NoClaimReason.OCCUPIED; - } - return (isEuropean()) + return (any(tile.getUnitList(), + u -> u.getOwner() != this && u.isOffensiveUnit())) + ? NoClaimReason.OCCUPIED // The tile is held against us + : (isEuropean()) ? ((tile.hasLostCityRumour()) ? NoClaimReason.RUMOUR : NoClaimReason.NONE) @@ -3780,10 +3752,8 @@ public class Player extends FreeColGameObject implements Nameable { Specification spec = getSpecification(); for (UnitType unitType : spec.getUnitTypeList()) { if (unitType.isAvailableTo(this)) { - int foodConsumption = 0; - for (GoodsType foodType : spec.getFoodGoodsTypeList()) { - foodConsumption += unitType.getConsumptionOf(foodType); - } + int foodConsumption = spec.getFoodGoodsTypeList().stream() + .mapToInt(ft -> unitType.getConsumptionOf(ft)).sum(); if (foodConsumption > maximumFoodConsumption) { maximumFoodConsumption = foodConsumption; } diff --git a/src/net/sf/freecol/common/model/ProductionCache.java b/src/net/sf/freecol/common/model/ProductionCache.java index cda6bbfcf..2bff866c2 100644 --- a/src/net/sf/freecol/common/model/ProductionCache.java +++ b/src/net/sf/freecol/common/model/ProductionCache.java @@ -26,6 +26,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import static net.sf.freecol.common.util.CollectionUtils.*; + /** * The ProductionCache is contains all relevant @@ -217,11 +219,8 @@ public class ProductionCache { */ public boolean isProducing(GoodsType goodsType) { update(); - for (ProductionInfo pi : productionAndConsumption.values()) { - if (AbstractGoods.findByType(goodsType, pi.getProduction()) != null) - return true; - } - return false; + return any(productionAndConsumption.values(), + pi -> AbstractGoods.containsType(goodsType, pi.getProduction())); } /** @@ -232,11 +231,8 @@ public class ProductionCache { */ public boolean isConsuming(GoodsType goodsType) { update(); - for (ProductionInfo pi : productionAndConsumption.values()) { - if (AbstractGoods.findByType(goodsType, pi.getConsumption()) != null) - return true; - } - return false; + return any(productionAndConsumption.values(), + pi -> AbstractGoods.containsType(goodsType, pi.getConsumption())); } /** diff --git a/src/net/sf/freecol/common/model/ProductionType.java b/src/net/sf/freecol/common/model/ProductionType.java index 9f04f4780..50a3e75d7 100644 --- a/src/net/sf/freecol/common/model/ProductionType.java +++ b/src/net/sf/freecol/common/model/ProductionType.java @@ -289,12 +289,8 @@ public class ProductionType extends FreeColObject { */ public static boolean canProduce(GoodsType goodsType, Collection types) { - for (ProductionType productionType : types) { - AbstractGoods output = AbstractGoods.findByType(goodsType, - productionType.getOutputs()); - if (output != null) return true; - } - return false; + return any(types, pt -> AbstractGoods.containsType(goodsType, + pt.getOutputs())); } /** @@ -311,12 +307,9 @@ public class ProductionType extends FreeColObject { ProductionType best = null; int bestSum = 0; for (ProductionType pt : types) { - int sum = 0; - for (AbstractGoods output : pt.getOutputs()) { - if (goodsType == null || goodsType == output.getType()) { - sum += output.getAmount(); - } - } + int sum = pt.getOutputs().stream() + .filter(o -> goodsType == null || goodsType == o.getType()) + .mapToInt(AbstractGoods::getAmount).sum(); if (bestSum < sum) { bestSum = sum; best = pt; diff --git a/src/net/sf/freecol/common/model/RandomRange.java b/src/net/sf/freecol/common/model/RandomRange.java index 07ff63b7b..6c109ee10 100644 --- a/src/net/sf/freecol/common/model/RandomRange.java +++ b/src/net/sf/freecol/common/model/RandomRange.java @@ -30,6 +30,7 @@ import javax.xml.stream.XMLStreamException; import net.sf.freecol.common.io.FreeColXMLReader; import net.sf.freecol.common.io.FreeColXMLWriter; +import static net.sf.freecol.common.util.CollectionUtils.*; import static net.sf.freecol.common.util.RandomUtils.*; @@ -147,7 +148,17 @@ public class RandomRange { scopes.add(scope); } - + /** + * Does an object satisfy the scopes? + * + * @param fco The FreeColObject to test. + * @return True if the scopes are satisfied. + */ + public boolean appliesTo(FreeColObject fco) { + List scs = getScopes(); + return scs.isEmpty() || any(scs, s -> s.appliesTo(fco)); + } + /** * Gets a random value from this range. * diff --git a/src/net/sf/freecol/common/model/Resource.java b/src/net/sf/freecol/common/model/Resource.java index 035727fa4..dfc54216a 100644 --- a/src/net/sf/freecol/common/model/Resource.java +++ b/src/net/sf/freecol/common/model/Resource.java @@ -193,7 +193,7 @@ public class Resource extends TileItem { */ @Override public final int getZIndex() { - return RESOURCE_ZINDEX; + return Tile.RESOURCE_ZINDEX; } /** diff --git a/src/net/sf/freecol/common/model/Role.java b/src/net/sf/freecol/common/model/Role.java index 3b2fa9dbb..5be1b0b5d 100644 --- a/src/net/sf/freecol/common/model/Role.java +++ b/src/net/sf/freecol/common/model/Role.java @@ -25,12 +25,12 @@ import java.util.Comparator; import java.util.List; import java.util.Locale; import java.util.Map.Entry; +import java.util.stream.Collectors; import javax.xml.stream.XMLStreamException; import net.sf.freecol.common.io.FreeColXMLReader; import net.sf.freecol.common.io.FreeColXMLWriter; - import static net.sf.freecol.common.util.StringUtils.*; @@ -64,42 +64,8 @@ public class Role extends BuildableType { * effectiveness. */ public static final Comparator militaryComparator - = new Comparator() { - @Override - public int compare(Role role1, Role role2) { - float amount1 = role1.getOffence() + role1.getDefence(); - float amount2 = role2.getOffence() + role2.getDefence(); - return (amount1 < amount2) ? 1 - : (amount1 > amount2) ? -1 - : 0; - } - }; - - /** A comparator to sort roles by descending defensive power. */ - public static final Comparator defensiveComparator - = new Comparator() { - @Override - public int compare(Role role1, Role role2) { - float defence1 = role1.getDefence(); - float defence2 = role2.getDefence(); - return (defence1 > defence2) ? 1 - : (defence1 < defence2) ? -1 - : 0; - } - }; - - /** A comparator to sort roles by descending offensive power. */ - public static final Comparator offensiveComparator - = new Comparator() { - @Override - public int compare(Role role1, Role role2) { - float offence1 = role1.getOffence(); - float offence2 = role2.getOffence(); - return (offence1 > offence2) ? 1 - : (offence1 < offence2) ? -1 - : 0; - } - }; + = Comparator.comparingDouble((Role r) -> + r.getOffence() + r.getDefence()).reversed(); /** * The Role to downgrade to after losing a battle. Defaults to @@ -258,6 +224,18 @@ public class Role extends BuildableType { return result; } + /** + * Get the price of the required goods in a given market. + * + * @param market The Market to evaluate in. + * @return The price of the goods for this role. + */ + public int getRequiredGoodsPrice(Market market) { + return getRequiredGoods().stream() + .mapToInt(ag -> market.getBidPrice(ag.getType(), + ag.getAmount() * getMaximumCount())).sum(); + } + /** * Get the role changes that can allow a unit to assume this role. * @@ -284,8 +262,8 @@ public class Role extends BuildableType { * * @return The offense value. */ - public float getOffence() { - return applyModifiers(0f, null, Modifier.OFFENCE); + public double getOffence() { + return applyModifiers(0.0f, null, Modifier.OFFENCE); } /** @@ -302,8 +280,8 @@ public class Role extends BuildableType { * * @return The defence value. */ - private float getDefence() { - return applyModifiers(0f, null, Modifier.DEFENCE); + private double getDefence() { + return applyModifiers(0.0f, null, Modifier.DEFENCE); } /** @@ -374,7 +352,7 @@ public class Role extends BuildableType { } } for (AbstractGoods ag : fromGoods) { - if (AbstractGoods.findByType(ag.getType(), toGoods) == null) { + if (!AbstractGoods.containsType(ag.getType(), toGoods)) { result.add(new AbstractGoods(ag.getType(), -ag.getAmount())); } } @@ -402,11 +380,9 @@ public class Role extends BuildableType { */ public static List getAvailableRoles(Player player, UnitType type, List roles) { - List result = new ArrayList<>(); - for (Role r : roles) { - if (r.isAvailableTo(player, type)) result.add(r); - } - return result; + return roles.stream() + .filter(r -> r.isAvailableTo(player, type)) + .collect(Collectors.toList()); } /** diff --git a/src/net/sf/freecol/common/model/Scope.java b/src/net/sf/freecol/common/model/Scope.java index bef6440d4..7edbc441d 100644 --- a/src/net/sf/freecol/common/model/Scope.java +++ b/src/net/sf/freecol/common/model/Scope.java @@ -76,6 +76,18 @@ public class Scope extends FreeColObject { } + /** + * Get a key to display this scope with. + * + * @return A suitable key, or null if none found. + */ + public String getKey() { + return (getType() != null) ? getType() + : (getAbilityId() != null) ? getAbilityId() + : (getMethodName() != null) ? "scope.method." + getMethodName() + : null; + } + /** * Does this scope match null? * diff --git a/src/net/sf/freecol/common/model/Settlement.java b/src/net/sf/freecol/common/model/Settlement.java index 938e1c7b8..11a497e40 100644 --- a/src/net/sf/freecol/common/model/Settlement.java +++ b/src/net/sf/freecol/common/model/Settlement.java @@ -30,6 +30,7 @@ import javax.xml.stream.XMLStreamException; import net.sf.freecol.common.io.FreeColXMLReader; import net.sf.freecol.common.io.FreeColXMLWriter; +import static net.sf.freecol.common.util.CollectionUtils.*; /** @@ -233,7 +234,7 @@ public abstract class Settlement extends GoodsLocation for (Tile t : tiles) { t.changeOwnership(owner, this);//-vis(owner,this),-til } - if (this instanceof Colony && !tile.hasRoad()) { + if (!tile.hasRoad()) { TileImprovement road = tile.addRoad(); road.setTurnsToComplete(0); road.setVirtual(true); @@ -298,10 +299,8 @@ public abstract class Settlement extends GoodsLocation * @return True if the settlement is connected to the high seas. */ public boolean isConnectedPort() { - for (Tile t : getTile().getSurroundingTiles(1)) { - if (!t.isLand() && t.isHighSeasConnected()) return true; - } - return false; + return any(getTile().getSurroundingTiles(1, 1), + t -> !t.isLand() && t.isHighSeasConnected()); } /** @@ -329,11 +328,8 @@ public abstract class Settlement extends GoodsLocation * @return an int value */ public int getConsumptionOf(GoodsType goodsType) { - int result = 0; - for (Unit unit : getUnitList()) { - result += unit.getType().getConsumptionOf(goodsType); - } - return Math.max(0, result); + return Math.max(0, getUnitList().stream() + .mapToInt(u -> u.getType().getConsumptionOf(goodsType)).sum()); } /** @@ -344,13 +340,9 @@ public abstract class Settlement extends GoodsLocation * @return an int value */ public int getConsumptionOf(List goodsTypes) { - int result = 0; - if (goodsTypes != null) { - for (GoodsType goodsType : goodsTypes) { - result += getConsumptionOf(goodsType); - } - } - return result; + return (goodsTypes == null) ? 0 + : goodsTypes.stream() + .mapToInt(gt -> getConsumptionOf(gt)).sum(); } /** @@ -371,16 +363,14 @@ public abstract class Settlement extends GoodsLocation * @return True if the settlement can provide the equipment. */ public boolean canProvideGoods(List goods) { - for (AbstractGoods ag : goods) { - int available = getGoodsCount(ag.getType()); - - int breedingNumber = ag.getType().getBreedingNumber(); - if (breedingNumber != GoodsType.INFINITY) { - available -= breedingNumber; - } - if (available < ag.getAmount()) return false; - } - return true; + return all(goods, ag -> { + int available = getGoodsCount(ag.getType()); + int breedingNumber = ag.getType().getBreedingNumber(); + if (breedingNumber != GoodsType.INFINITY) { + available -= breedingNumber; + } + return available >= ag.getAmount(); + }); } /** @@ -423,13 +413,21 @@ public abstract class Settlement extends GoodsLocation // To succeed, there must exist an available role for the unit // where the extra equipment for the role is present. - for (Role r : unit.getAvailableRoles(military)) { - if (canProvideGoods(unit.getGoodsDifference(r, 1))) return r; - } - return null; + return find(unit.getAvailableRoles(military), + r -> canProvideGoods(unit.getGoodsDifference(r, 1))); } + // Override FreeColGameObject + + /** + * {@inheritDoc} + */ + @Override + public FreeColGameObject getLinkTarget(Player player) { + return (player == getOwner()) ? this : getTile(); + } + // Override FreeColObject /** @@ -540,6 +538,15 @@ public abstract class Settlement extends GoodsLocation return this; } + /** + * {@inheritDoc} + */ + @Override + public final int getRank() { + return Location.getRank(getTile()); + } + + // Interface UnitLocation // Inherits // UnitLocation.getSpaceTaken @@ -571,10 +578,9 @@ public abstract class Settlement extends GoodsLocation */ @Override public int priceGoods(List goods) { - for (AbstractGoods ag : goods) { - if (getGoodsCount(ag.getType()) < ag.getAmount()) return -1; - } - return 0; + return (any(goods, + ag -> getGoodsCount(ag.getType()) < ag.getAmount())) ? -1 + : 0; } /** @@ -634,7 +640,7 @@ public abstract class Settlement extends GoodsLocation * * @return A ratio of defence power to settlement size. */ - public abstract float getDefenceRatio(); + public abstract double getDefenceRatio(); /** * Is this settlement insufficiently defended? diff --git a/src/net/sf/freecol/common/model/SettlementType.java b/src/net/sf/freecol/common/model/SettlementType.java index 07cdb920e..5ee3c2de4 100644 --- a/src/net/sf/freecol/common/model/SettlementType.java +++ b/src/net/sf/freecol/common/model/SettlementType.java @@ -26,6 +26,7 @@ import javax.xml.stream.XMLStreamException; import net.sf.freecol.common.io.FreeColXMLReader; import net.sf.freecol.common.io.FreeColXMLWriter; +import static net.sf.freecol.common.util.CollectionUtils.*; /** @@ -212,16 +213,8 @@ public class SettlementType extends FreeColGameObjectType { * @return The plunder range, or null if none applicable. */ public final RandomRange getPlunderRange(Unit unit) { - if (plunder == null) return null; - - for (RandomRange range : plunder) { - List scopes = range.getScopes(); - if (scopes.isEmpty()) return range; - for (Scope scope : scopes) { - if (scope.appliesTo(unit)) return range; - } - } - return null; + return (plunder == null) ? null + : find(plunder, p -> p.appliesTo(unit)); } /** @@ -231,16 +224,8 @@ public class SettlementType extends FreeColGameObjectType { * @return A range of gifts, or null if none applicable. */ public final RandomRange getGifts(Unit unit) { - if (gifts == null) return null; - - for (RandomRange range : gifts) { - List scopes = range.getScopes(); - if (scopes.isEmpty()) return range; - for (Scope scope : scopes) { - if (scope.appliesTo(unit)) return range; - } - } - return null; + return (gifts == null) ? null + : find(gifts, g -> g.appliesTo(unit)); } diff --git a/src/net/sf/freecol/common/model/SimpleCombatModel.java b/src/net/sf/freecol/common/model/SimpleCombatModel.java index 994d76c6d..784edd5e9 100644 --- a/src/net/sf/freecol/common/model/SimpleCombatModel.java +++ b/src/net/sf/freecol/common/model/SimpleCombatModel.java @@ -20,16 +20,17 @@ package net.sf.freecol.common.model; import java.util.ArrayList; -import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Random; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.stream.Collectors; import net.sf.freecol.common.model.Modifier.ModifierType; import net.sf.freecol.common.model.UnitTypeChange.ChangeType; +import static net.sf.freecol.common.util.CollectionUtils.*; import net.sf.freecol.common.util.LogBuilder; import static net.sf.freecol.common.util.RandomUtils.*; @@ -94,14 +95,14 @@ public class SimpleCombatModel extends CombatModel { } if (lb != null) lb.add(" attacker=", attacker, " "); - float attackPower = getOffencePower(attacker, defender, lb); + double attackPower = getOffencePower(attacker, defender, lb); if (lb != null) lb.add(" defender=", defender, " "); - float defencePower = getDefencePower(attacker, defender, lb); - if (attackPower == 0.0f && defencePower == 0.0f) { + double defencePower = getDefencePower(attacker, defender, lb); + if (attackPower == 0.0 && defencePower == 0.0) { if (lb != null) lb.add(" odds=unknown"); return new CombatOdds(CombatOdds.UNKNOWN_ODDS); } - float victory = attackPower / (attackPower + defencePower); + double victory = attackPower / (attackPower + defencePower); if (lb != null) lb.add(" odds=", victory); return new CombatOdds(victory); } @@ -114,8 +115,8 @@ public class SimpleCombatModel extends CombatModel { * @return The offensive power. */ @Override - public float getOffencePower(FreeColGameObject attacker, - FreeColGameObject defender) { + public double getOffencePower(FreeColGameObject attacker, + FreeColGameObject defender) { return getOffencePower(attacker, defender, null); } @@ -126,10 +127,8 @@ public class SimpleCombatModel extends CombatModel { * @param modSet A set of Modifiers to log. */ private void logModifiers(LogBuilder lb, Set modSet) { - List modList = new ArrayList<>(); - modList.addAll(modSet); - Collections.sort(modList); - lb.addCollection(" ", modList); + lb.addCollection(" ", modSet.stream() + .sorted().collect(Collectors.toList())); } /** @@ -140,10 +139,10 @@ public class SimpleCombatModel extends CombatModel { * @param lb An optional LogBuilder to log to. * @return The offensive power. */ - private float getOffencePower(FreeColGameObject attacker, - FreeColGameObject defender, - LogBuilder lb) { - float result = 0.0f; + private double getOffencePower(FreeColGameObject attacker, + FreeColGameObject defender, + LogBuilder lb) { + double result = 0.0; if (attacker == null) { throw new IllegalStateException("Null attacker"); @@ -161,11 +160,9 @@ public class SimpleCombatModel extends CombatModel { } else if (combatIsBombard(attacker, defender)) { Settlement attackerSettlement = (Settlement) attacker; if (attackerSettlement.hasAbility(Ability.BOMBARD_SHIPS)) { - for (Unit unit : attackerSettlement.getTile().getUnitList()) { - if (unit.hasAbility(Ability.BOMBARD)) { - result += unit.getType().getOffence(); - } - } + result += attackerSettlement.getTile().getUnitList().stream() + .filter(u -> u.hasAbility(Ability.BOMBARD)) + .mapToDouble(u -> u.getType().getOffence()).sum(); } if (result > MAXIMUM_BOMBARD_POWER) result = MAXIMUM_BOMBARD_POWER; if (lb != null) lb.add(" bombard=", result); @@ -184,8 +181,8 @@ public class SimpleCombatModel extends CombatModel { * @return The defensive power. */ @Override - public float getDefencePower(FreeColGameObject attacker, - FreeColGameObject defender) { + public double getDefencePower(FreeColGameObject attacker, + FreeColGameObject defender) { return getDefencePower(attacker, defender, null); } @@ -197,10 +194,10 @@ public class SimpleCombatModel extends CombatModel { * @param lb An optional LogBuilder to log to. * @return The defensive power. */ - public float getDefencePower(FreeColGameObject attacker, - FreeColGameObject defender, - LogBuilder lb) { - float result; + public double getDefencePower(FreeColGameObject attacker, + FreeColGameObject defender, + LogBuilder lb) { + double result; if (combatIsDefenceMeasurement(attacker, defender) || combatIsAttack(attacker, defender) || combatIsSettlementAttack(attacker, defender) @@ -512,13 +509,9 @@ public class SimpleCombatModel extends CombatModel { * @return True if a strong defence bonus is present. */ private boolean hasStrongDefenceModifier(FreeColObject fco) { - for (Modifier m : fco.getDefenceModifiers()) { - if (m.getType() == ModifierType.PERCENTAGE - && m.getValue() >= STRONG_DEFENCE_THRESHOLD) { - return true; - } - } - return false; + return any(fco.getDefenceModifiers(), + m -> m.getType() == ModifierType.PERCENTAGE + && m.getValue() >= STRONG_DEFENCE_THRESHOLD); } /** @@ -541,9 +534,12 @@ public class SimpleCombatModel extends CombatModel { // Tile defence bonus disableFortified |= hasStrongDefenceModifier(tile.getType()); - result.addAll(tile.getType().getDefenceModifiers()); if (settlement == null) { + // PF#73 demonstrated that tile modifiers do not apply + // for colonies + result.addAll(tile.getType().getDefenceModifiers()); + // Artillery in the Open penalty if (defender.hasAbility(Ability.BOMBARD) && defender.getState() != Unit.UnitState.FORTIFIED) { @@ -599,7 +595,7 @@ public class SimpleCombatModel extends CombatModel { lb.add("Combat"); ArrayList crs = new ArrayList<>(); CombatOdds odds = calculateCombatOdds(attacker, defender, lb); - float r = randomFloat(logger, "AttackResult", random); + double r = randomDouble(logger, "AttackResult", random); lb.add(" random(1.0)=", r); boolean great = false; // Great win or loss? String action; @@ -609,7 +605,7 @@ public class SimpleCombatModel extends CombatModel { Unit defenderUnit = (Unit) defender; action = "Attack"; - // For random float 0 <= r < 1.0: + // For random double 0 <= r < 1.0: // Partition this range into wins < odds.win and losses above. // Within the 0 <= r < odds.win range, partition the first 10% // to be great wins and the rest to be ordinary wins. @@ -625,22 +621,22 @@ public class SimpleCombatModel extends CombatModel { // else => great loss // ...and beached ships always lose. if (r < odds.win || defenderUnit.isBeached()) { - great = r < 0.1f * odds.win; // Great Win + great = r < 0.1 * odds.win; // Great Win crs.add(CombatResult.WIN); resolveAttack(attackerUnit, defenderUnit, great, // Rescale to 0 <= r < 1 - r / (0.1f * odds.win), crs); - } else if (r < 0.8f * odds.win + 0.2f + r / (0.1 * odds.win), crs); + } else if (r < 0.8 * odds.win + 0.2 && defenderUnit.hasAbility(Ability.EVADE_ATTACK)) { crs.add(CombatResult.NO_RESULT); crs.add(CombatResult.EVADE_ATTACK); } else { - great = r >= 0.1f * odds.win + 0.9f; // Great Loss + great = r >= 0.1 * odds.win + 0.9; // Great Loss crs.add(CombatResult.LOSE); resolveAttack(defenderUnit, attackerUnit, great, // Rescaling to 0 <= r < 1 // (rearrange: 0.8 * odds.win + 0.2 <= r < 1.0) - (1.25f * r - 0.25f - odds.win)/(1.0f - odds.win), crs); + (1.25 * r - 0.25 - odds.win)/(1.0 - odds.win), crs); } } else if (combatIsBombard(attacker, defender)) { @@ -658,9 +654,9 @@ public class SimpleCombatModel extends CombatModel { // Great wins occur at most in 1 in 3 of successful bombards, // Good defences reduce this proportion. - float offencePower = getOffencePower(attacker, defender); - float defencePower = getDefencePower(attacker, defender); - float diff = Math.max(3f, defencePower * 2f - offencePower); + double offencePower = getOffencePower(attacker, defender); + double defencePower = getDefencePower(attacker, defender); + double diff = Math.max(3.0, defencePower * 2.0 - offencePower); great = r < odds.win / diff; // Sink the defender on great wins or lack of repair @@ -703,7 +699,7 @@ public class SimpleCombatModel extends CombatModel { * @param crs A list of CombatResults to add to. */ private void resolveAttack(Unit winner, Unit loser, boolean great, - float r, List crs) { + double r, List crs) { Player loserPlayer = loser.getOwner(); Tile tile = loser.getTile(); Player winnerPlayer = winner.getOwner(); @@ -802,13 +798,10 @@ public class SimpleCombatModel extends CombatModel { crs.add(CombatResult.CAPTURE_CONVERT); lose++; } - } else if (r >= 1.0f - winner.getBurnProbability()) { - for (IndianSettlement s - : loserPlayer.getIndianSettlements()) { - if (s.hasMissionary(winnerPlayer)) { - crs.add(CombatResult.BURN_MISSIONS); - break; - } + } else if (r >= 1.0 - winner.getBurnProbability()) { + if (any(loserPlayer.getIndianSettlements(), + s -> s.hasMissionary(winnerPlayer))) { + crs.add(CombatResult.BURN_MISSIONS); } } } diff --git a/src/net/sf/freecol/common/model/Specification.java b/src/net/sf/freecol/common/model/Specification.java index a147d6aa5..733133473 100644 --- a/src/net/sf/freecol/common/model/Specification.java +++ b/src/net/sf/freecol/common/model/Specification.java @@ -25,6 +25,7 @@ import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Constructor; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -32,20 +33,20 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.function.Predicate; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; -import net.sf.freecol.FreeCol; import net.sf.freecol.common.io.FreeColDirectories; import net.sf.freecol.common.io.FreeColModFile; import net.sf.freecol.common.io.FreeColTcFile; import net.sf.freecol.common.io.FreeColXMLReader; import net.sf.freecol.common.io.FreeColXMLWriter; -import net.sf.freecol.common.i18n.Messages; -import net.sf.freecol.common.i18n.NameCache; import net.sf.freecol.common.model.NationOptions.Advantages; import net.sf.freecol.common.option.AbstractOption; import net.sf.freecol.common.option.AbstractUnitOption; @@ -58,7 +59,7 @@ import net.sf.freecol.common.option.RangeOption; import net.sf.freecol.common.option.StringOption; import net.sf.freecol.common.option.TextOption; import net.sf.freecol.common.option.UnitListOption; - +import static net.sf.freecol.common.util.CollectionUtils.*; import static net.sf.freecol.common.util.StringUtils.*; @@ -145,6 +146,22 @@ public final class Specification { = new Source("model.source.shipTradePenalty"); public static final Source SOL_MODIFIER_SOURCE = new Source("model.source.solModifier"); + /** All the special static sources. */ + private static final Source[] sources = new Source[] { + MOVEMENT_PENALTY_SOURCE, + ARTILLERY_PENALTY_SOURCE, + ATTACK_BONUS_SOURCE, + FORTIFICATION_BONUS_SOURCE, + INDIAN_RAID_BONUS_SOURCE, + AMPHIBIOUS_ATTACK_PENALTY_SOURCE, + BASE_OFFENCE_SOURCE, + BASE_DEFENCE_SOURCE, + CARGO_PENALTY_SOURCE, + AMBUSH_BONUS_SOURCE, + COLONY_GOODS_PARTY_SOURCE, + SHIP_TRADE_PENALTY_SOURCE, + SOL_MODIFIER_SOURCE + }; /** A map from specification element to a reader for that element. */ @@ -253,23 +270,7 @@ public final class Specification { */ public Specification() { logger.fine("Initializing Specification"); - for (Source source : new Source[] { - MOVEMENT_PENALTY_SOURCE, - ARTILLERY_PENALTY_SOURCE, - ATTACK_BONUS_SOURCE, - FORTIFICATION_BONUS_SOURCE, - INDIAN_RAID_BONUS_SOURCE, - AMPHIBIOUS_ATTACK_PENALTY_SOURCE, - BASE_OFFENCE_SOURCE, - BASE_DEFENCE_SOURCE, - CARGO_PENALTY_SOURCE, - AMBUSH_BONUS_SOURCE, - COLONY_GOODS_PARTY_SOURCE, - SHIP_TRADE_PENALTY_SOURCE, - SOL_MODIFIER_SOURCE - }) { - allTypes.put(source.getId(), source); - } + for (Source source : sources) allTypes.put(source.getId(), source); readerMap.put(BUILDING_TYPES_TAG, new TypeReader<>(BuildingType.class, buildingTypeList)); @@ -1304,22 +1305,18 @@ public final class Specification { * @return The free colonist unit type. */ public UnitType getDefaultUnitType(NationType nationType) { - for (UnitType ut : defaultUnitTypes) { - if (nationType == null) { // European is default - if (!ut.hasAbility(Ability.BORN_IN_INDIAN_SETTLEMENT) - && !ut.hasAbility(Ability.REF_UNIT)) return ut; - } else if (nationType.isIndian()) { - if (ut.hasAbility(Ability.BORN_IN_INDIAN_SETTLEMENT) - && !ut.hasAbility(Ability.REF_UNIT)) return ut; - } else if (nationType.isREF()) { - if (!ut.hasAbility(Ability.BORN_IN_INDIAN_SETTLEMENT) - && ut.hasAbility(Ability.REF_UNIT)) return ut; - } else { // European - if (!ut.hasAbility(Ability.BORN_IN_INDIAN_SETTLEMENT) - && !ut.hasAbility(Ability.REF_UNIT)) return ut; - } - } - return getDefaultUnitType(); + Predicate p = (nationType == null) + ? ut -> !ut.hasAbility(Ability.BORN_IN_INDIAN_SETTLEMENT) + && !ut.hasAbility(Ability.REF_UNIT) + : (nationType.isIndian()) + ? ut -> ut.hasAbility(Ability.BORN_IN_INDIAN_SETTLEMENT) + && !ut.hasAbility(Ability.REF_UNIT) + : (nationType.isREF()) + ? ut -> !ut.hasAbility(Ability.BORN_IN_INDIAN_SETTLEMENT) + && ut.hasAbility(Ability.REF_UNIT) + : ut -> !ut.hasAbility(Ability.BORN_IN_INDIAN_SETTLEMENT) + && !ut.hasAbility(Ability.REF_UNIT); + return find(defaultUnitTypes, p, getDefaultUnitType()); } /** @@ -1412,11 +1409,9 @@ public final class Specification { * @param naval If true, choose naval units, if not, land units. */ public List getREFUnitTypes(boolean naval) { - List types = new ArrayList<>(); - for (UnitType ut : getUnitTypesWithAbility(Ability.REF_UNIT)) { - if (naval == ut.isNaval()) types.add(ut); - } - return types; + return getUnitTypesWithAbility(Ability.REF_UNIT).stream() + .filter(ut -> ut.isNaval() == naval) + .collect(Collectors.toList()); } /** @@ -1548,12 +1543,11 @@ public final class Specification { */ public List getMilitaryRoles() { if (militaryRoles == null) { - List mr = new ArrayList<>(); - for (Role role : roles) { - if (role.isOffensive()) mr.add(role); - } - Collections.sort(mr, Role.militaryComparator); - this.militaryRoles = Collections.unmodifiableList(mr); + this.militaryRoles + = Collections.unmodifiableList(roles.stream() + .filter(Role::isOffensive) + .sorted(Role.militaryComparator) + .collect(Collectors.toList())); } return militaryRoles; } @@ -1568,11 +1562,7 @@ public final class Specification { * ability, or null if none found. */ public Role getRoleWithAbility(String id, List roles) { - if (roles == null) roles = getRoles(); - for (Role r : roles) { - if (r.hasAbility(id)) return r; - } - return null; + return find(getRoles(), r -> r.hasAbility(id)); } /** @@ -1608,15 +1598,11 @@ public final class Specification { * @param naval If true, choose roles for naval units, if not, land units. */ public List getREFRoles(boolean naval) { - List roles = new ArrayList<>(); - if (naval) { - roles.add(getDefaultRole()); - } else { - for (Role r : getMilitaryRoles()) { - if (r.requiresAbility(Ability.REF_UNIT)) roles.add(r); - } - } - return roles; + return ((naval) + ? Stream.of(getDefaultRole()) + : getMilitaryRoles().stream() + .filter(r -> r.requiresAbility(Ability.REF_UNIT))) + .collect(Collectors.toList()); } @@ -1855,18 +1841,11 @@ public final class Specification { public List getTypesWithAbility(Class resultType, String... abilities) { - List result = new ArrayList<>(); - for (FreeColGameObjectType type : allTypes.values()) { - if (resultType.isInstance(type)) { - for (String ability : abilities) { - if (type.hasAbility(ability)) { - result.add(resultType.cast(type)); - break; - } - } - } - } - return result; + return allTypes.values().stream() + .filter(type -> resultType.isInstance(type) + && any(abilities, a -> type.hasAbility(a))) + .map(type -> resultType.cast(type)) + .collect(Collectors.toList()); } /** @@ -1879,16 +1858,11 @@ public final class Specification { public List getTypesWithoutAbility(Class resultType, String... abilities) { - List result = new ArrayList<>(); - type: for (FreeColGameObjectType type : allTypes.values()) { - if (resultType.isInstance(type)) { - for (String ability : abilities) { - if (type.hasAbility(ability)) continue type; - } - result.add(resultType.cast(type)); - } - } - return result; + return allTypes.values().stream() + .filter(type -> resultType.isInstance(type) + && none(abilities, a -> type.hasAbility(a))) + .map(type -> resultType.cast(type)) + .collect(Collectors.toList()); } @@ -1931,10 +1905,11 @@ public final class Specification { logger.log(Level.WARNING, "Failed to load remedial roles.", e); return; } - List roles = new ArrayList<>(); - for (Role r : getRoles()) roles.add(r.getId()); + logger.info("Loading role backward compatibility fragment: " - + ROLES_COMPAT_FILE_NAME + " with roles: " + join(" ", roles)); + + ROLES_COMPAT_FILE_NAME + " with roles: " + + getRoles().stream() + .map(Role::getId).collect(Collectors.joining())); } // end @compat 0.10.x @@ -1964,10 +1939,11 @@ public final class Specification { } } - // Coronado gained an ability + // Coronado gained an ability in freecol FoundingFather coronado = getFoundingFather("model.foundingFather.franciscoDeCoronado"); - if (!coronado.hasAbility(Ability.SEE_ALL_COLONIES)) { + if ("freecol".equals(getId()) + && !coronado.hasAbility(Ability.SEE_ALL_COLONIES)) { coronado.addAbility(new Ability(Ability.SEE_ALL_COLONIES, coronado, true)); } @@ -2019,8 +1995,7 @@ public final class Specification { } // Fix all other UnitListOptions - List