Update Lang.java so it can support other languages.

Also translated phase/step names
This commit is contained in:
Lyu Zong-Hong
2021-02-22 19:55:05 +09:00
parent 43b12c3289
commit e1f68bd06c
29 changed files with 345 additions and 82 deletions

View File

@@ -6,6 +6,8 @@ import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
import forge.util.lang.*;
import com.google.common.base.Function;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
@@ -13,12 +15,39 @@ import com.google.common.collect.Lists;
/**
* Static library containing language-related utility methods.
*/
public final class Lang {
public abstract class Lang {
/**
* Private constructor to prevent instantiation.
*/
private Lang() {
private static Lang instance;
protected String languageCode;
protected String countryCode;
public static void createInstance(String localeID) {
String[] splitLocale = localeID.split("-");
String language = splitLocale[0];
String country = splitLocale[1];
if (language.equals("de")) {
instance = new LangGerman();
} else if (language.equals("es")) {
instance = new LangSpanish();
} else if (language.equals("it")) {
instance = new LangItalian();
} else if (language.equals("zh")) {
instance = new LangChinese();
} else if (language.equals("ja")) {
instance = new LangJapanese();
} else { // default is English
instance = new LangEnglish();
}
instance.languageCode = language;
instance.countryCode = country;
}
public static Lang getInstance() {
return instance;
}
protected Lang() {
}
/**
@@ -29,17 +58,7 @@ public final class Lang {
* the number to get the ordinal suffix for.
* @return a string containing two characters.
*/
public static String getOrdinal(final int position) {
final String[] sufixes = new String[] { "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th" };
switch (position % 100) {
case 11:
case 12:
case 13:
return position + "th";
default:
return position + sufixes[position % 10];
}
}
public abstract String getOrdinal(final int position);
public static String joinHomogenous(final String s1, final String s2) {
final boolean has1 = StringUtils.isNotBlank(s1);
@@ -121,16 +140,8 @@ public final class Lang {
}
}
public static String getPossesive(final String name) {
if ("You".equalsIgnoreCase(name)) {
return name + "r"; // to get "your"
}
return name.endsWith("s") ? name + "'" : name + "'s";
}
public static String getPossessedObject(final String owner, final String object) {
return getPossesive(owner) + " " + object;
}
public abstract String getPossesive(final String name);
public abstract String getPossessedObject(final String owner, final String object);
public static boolean startsWithVowel(final String word) {
return isVowel(word.trim().charAt(0));

View File

@@ -0,0 +1,22 @@
package forge.util.lang;
import forge.util.Lang;
public class LangChinese extends Lang {
@Override
public String getOrdinal(final int position) {
return "" + position;
}
@Override
public String getPossesive(final String name) {
return name + "";
}
@Override
public String getPossessedObject(final String owner, final String object) {
return getPossesive(owner) + object;
}
}

View File

@@ -0,0 +1,33 @@
package forge.util.lang;
import forge.util.Lang;
public class LangEnglish extends Lang {
@Override
public String getOrdinal(final int position) {
final String[] sufixes = new String[] { "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th" };
switch (position % 100) {
case 11:
case 12:
case 13:
return position + "th";
default:
return position + sufixes[position % 10];
}
}
@Override
public String getPossesive(final String name) {
if ("You".equalsIgnoreCase(name)) {
return name + "r"; // to get "your"
}
return name.endsWith("s") ? name + "'" : name + "'s";
}
@Override
public String getPossessedObject(final String owner, final String object) {
return getPossesive(owner) + " " + object;
}
}

View File

@@ -0,0 +1,29 @@
package forge.util.lang;
import forge.util.Lang;
public class LangGerman extends Lang {
@Override
public String getOrdinal(final int position) {
if (position < 20) {
return position + "te";
}
return position + "ste";
}
// TODO: Please update this when you modified lblYou in de-DE.properties
@Override
public String getPossesive(final String name) {
if ("You".equalsIgnoreCase(name)) {
return name + "r"; // to get "your"
}
return name.endsWith("s") ? name + "'" : name + "'s";
}
@Override
public String getPossessedObject(final String owner, final String object) {
return getPossesive(owner) + " " + object;
}
}

View File

@@ -0,0 +1,26 @@
package forge.util.lang;
import forge.util.Lang;
public class LangItalian extends Lang {
@Override
public String getOrdinal(final int position) {
return position + "º";
}
// TODO: Please update this when you modified lblYou in it-IT.properties
@Override
public String getPossesive(final String name) {
if ("You".equalsIgnoreCase(name)) {
return name + "r"; // to get "your"
}
return name.endsWith("s") ? name + "'" : name + "'s";
}
@Override
public String getPossessedObject(final String owner, final String object) {
return getPossesive(owner) + " " + object;
}
}

View File

@@ -0,0 +1,22 @@
package forge.util.lang;
import forge.util.Lang;
public class LangJapanese extends Lang {
@Override
public String getOrdinal(final int position) {
return position + "";
}
@Override
public String getPossesive(final String name) {
return name + "";
}
@Override
public String getPossessedObject(final String owner, final String object) {
return getPossesive(owner) + object;
}
}

View File

@@ -0,0 +1,26 @@
package forge.util.lang;
import forge.util.Lang;
public class LangSpanish extends Lang {
@Override
public String getOrdinal(final int position) {
return position + "º";
}
// TODO: Please update this when you modified lblYou in es-ES.properties
@Override
public String getPossesive(final String name) {
if ("You".equalsIgnoreCase(name)) {
return name + "r"; // to get "your"
}
return name.endsWith("s") ? name + "'" : name + "'s";
}
@Override
public String getPossessedObject(final String owner, final String object) {
return getPossesive(owner) + " " + object;
}
}

View File

@@ -172,7 +172,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
@Override
public GameLogEntry visit(GameEventTurnPhase ev) {
Player p = ev.playerTurn;
return new GameLogEntry(GameLogEntryType.PHASE, ev.phaseDesc + Lang.getPossesive(p.getName()) + " " + ev.phase.nameForUi);
return new GameLogEntry(GameLogEntryType.PHASE, ev.phaseDesc + Lang.getInstance().getPossesive(p.getName()) + " " + ev.phase.nameForUi);
}
@Override

View File

@@ -46,7 +46,7 @@ public class DigEffect extends SpellAbilityEffect {
}
else {
for (final Player p : tgtPlayers) {
sb.append(Lang.getPossesive(p.getName())).append(" ");
sb.append(Lang.getInstance().getPossesive(p.getName())).append(" ");
}
}
sb.append("library.");

View File

@@ -37,7 +37,7 @@ public class RearrangeTopOfLibraryEffect extends SpellAbilityEffect {
ret.append(numCards);
ret.append(" cards of ");
for (final Player p : tgtPlayers) {
ret.append(Lang.getPossesive(p.getName()));
ret.append(Lang.getInstance().getPossesive(p.getName()));
ret.append(" & ");
}
ret.delete(ret.length() - 3, ret.length());

View File

@@ -30,6 +30,6 @@ public class GameEventManaPool extends GameEvent {
*/
@Override
public String toString() {
return TextUtil.concatWithSpace(Lang.getPossesive(player.getName()),"mana pool", mode.toString(), "-", TextUtil.addSuffix(mana.toString()," "));
return TextUtil.concatWithSpace(Lang.getInstance().getPossesive(player.getName()),"mana pool", mode.toString(), "-", TextUtil.addSuffix(mana.toString()," "));
}
}

View File

@@ -22,6 +22,6 @@ public class GameEventPlayerLivesChanged extends GameEvent {
@Override
public String toString() {
return TextUtil.concatWithSpace(Lang.getPossesive(player.getName()),"lives changed:", String.valueOf(oldLives),"->", String.valueOf(newLives));
return TextUtil.concatWithSpace(Lang.getInstance().getPossesive(player.getName()),"lives changed:", String.valueOf(oldLives),"->", String.valueOf(newLives));
}
}

View File

@@ -27,7 +27,7 @@ public class GameEventTurnPhase extends GameEvent {
@Override
public String toString() {
String playerName = Lang.getPossesive(playerTurn.getName());
String playerName = Lang.getInstance().getPossesive(playerTurn.getName());
return TextUtil.concatWithSpace(playerName,"turn,", phaseDesc+phase.nameForUi, "phase");
}
}

View File

@@ -35,7 +35,7 @@ public class GameEventZone extends GameEvent {
*/
@Override
public String toString() {
String owners = player == null ? "Game" : Lang.getPossesive(player.getName());
String owners = player == null ? "Game" : Lang.getInstance().getPossesive(player.getName());
return card == null
? TextUtil.concatWithSpace(owners, zoneType.toString(), ":", mode.toString())
: TextUtil.concatWithSpace(owners, zoneType.toString(), ":", mode.toString(), card.toString()

View File

@@ -3,23 +3,25 @@ package forge.game.phase;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringUtils;
import forge.util.Localizer;
import java.util.*;
public enum PhaseType {
UNTAP("Untap"),
UPKEEP("Upkeep"),
DRAW("Draw"),
MAIN1("Main, precombat", "Main1"),
COMBAT_BEGIN("Begin Combat", "BeginCombat"),
COMBAT_DECLARE_ATTACKERS("Declare Attackers"),
COMBAT_DECLARE_BLOCKERS("Declare Blockers"),
COMBAT_FIRST_STRIKE_DAMAGE("First Strike Damage"),
COMBAT_DAMAGE("Combat Damage"),
COMBAT_END("End Combat", "EndCombat"),
MAIN2("Main, postcombat", "Main2"),
END_OF_TURN("End of Turn"),
CLEANUP("Cleanup");
UNTAP("lblUntapStep", "Untap"),
UPKEEP("lblUpkeepStep", "Upkeep"),
DRAW("lblDrawStep", "Draw"),
MAIN1("lblMainPhase1", "Main1"),
COMBAT_BEGIN("lblCombatBeginStep", "BeginCombat"),
COMBAT_DECLARE_ATTACKERS("lblCombatDeclareAttackersStep", "Declare Attackers"),
COMBAT_DECLARE_BLOCKERS("lblCombatDeclareBlockersStep", "Declare Blockers"),
COMBAT_FIRST_STRIKE_DAMAGE("lblCombatFirstStrikeDamageStep", "First Strike Damage"),
COMBAT_DAMAGE("lblCombatDamageStep", "Combat Damage"),
COMBAT_END("lblCombatEndStep", "EndCombat"),
MAIN2("lblMainPhase2", "Main2"),
END_OF_TURN("lblEndStep", "End of Turn"),
CLEANUP("lblCleanupStep", "Cleanup");
public static final List<List<PhaseType>> PHASE_GROUPS = Arrays.asList(
Arrays.asList(UNTAP, UPKEEP, DRAW),
@@ -50,11 +52,8 @@ public enum PhaseType {
public final String nameForUi;
public final String nameForScripts;
PhaseType(String name) {
this(name, name);
}
PhaseType(String name, String name_for_scripts) {
nameForUi = name;
nameForUi = Localizer.getInstance().getMessage(name);
nameForScripts = name_for_scripts;
}

View File

@@ -215,7 +215,7 @@ public class Player extends GameEntity implements Comparable<Player> {
if (!haveDuplicates) {
return nameCandidate;
}
nameCandidate = Lang.getOrdinal(i) + " " + originalName;
nameCandidate = Lang.getInstance().getOrdinal(i) + " " + originalName;
}
return nameCandidate;
}
@@ -3131,7 +3131,7 @@ public class Player extends GameEntity implements Comparable<Player> {
}
public static DetachedCardEffect createCompanionEffect(Game game, Card companion) {
final String name = Lang.getPossesive(companion.getName()) + " Companion Effect";
final String name = Lang.getInstance().getPossesive(companion.getName()) + " Companion Effect";
DetachedCardEffect eff = new DetachedCardEffect(companion, name);
String addToHandAbility = "Mode$ Continuous | EffectZone$ Command | Affected$ Card.YouOwn+EffectSource | AffectedZone$ Command | AddAbility$ MoveToHand";
@@ -3144,7 +3144,7 @@ public class Player extends GameEntity implements Comparable<Player> {
}
public static DetachedCardEffect createCommanderEffect(Game game, Card commander) {
final String name = Lang.getPossesive(commander.getName()) + " Commander Effect";
final String name = Lang.getInstance().getPossesive(commander.getName()) + " Commander Effect";
DetachedCardEffect eff = new DetachedCardEffect(commander, name);
if (game.getRules().hasAppliedVariant(GameType.Oathbreaker) && commander.getRules().canBeSignatureSpell()) {

View File

@@ -102,7 +102,7 @@ public class PlayerZone extends Zone {
@Override
public final String toString() {
return TextUtil.concatWithSpace(Lang.getPossesive(player.toString()), zoneType.toString());
return TextUtil.concatWithSpace(Lang.getInstance().getPossesive(player.toString()), zoneType.toString());
}
public CardCollectionView getCardsPlayerCanActivate(Player who) {

View File

@@ -14,7 +14,7 @@ public class MessageUtil {
public static String formatMessage(String message, Player player, Object related) {
if (related instanceof Player && message.indexOf("{player") >= 0) {
String noun = mayBeYou(player, related);
message = TextUtil.fastReplace(TextUtil.fastReplace(message, "{player}", noun),"{player's}", Lang.getPossesive(noun));
message = TextUtil.fastReplace(TextUtil.fastReplace(message, "{player}", noun),"{player's}", Lang.getInstance().getPossesive(noun));
}
return message;
}
@@ -22,7 +22,7 @@ public class MessageUtil {
public static String formatMessage(String message, PlayerView player, Object related) {
if (related instanceof PlayerView && message.indexOf("{player") >= 0) {
String noun = mayBeYou(player, related);
message = TextUtil.fastReplace(TextUtil.fastReplace(message, "{player}", noun),"{player's}", Lang.getPossesive(noun));
message = TextUtil.fastReplace(TextUtil.fastReplace(message, "{player}", noun),"{player's}", Lang.getInstance().getPossesive(noun));
}
return message;
}
@@ -48,7 +48,7 @@ public class MessageUtil {
case FlipACoin:
String flipper = StringUtils.capitalize(mayBeYou(player, target));
return sa.hasParam("NoCall")
? Localizer.getInstance().getMessage("lblPlayerFlipComesUpValue", Lang.getPossesive(flipper), value)
? Localizer.getInstance().getMessage("lblPlayerFlipComesUpValue", Lang.getInstance().getPossesive(flipper), value)
: Localizer.getInstance().getMessage("lblPlayerActionFlip", flipper, Lang.joinVerb(flipper, value));
case Protection:
return Localizer.getInstance().getMessage("lblPlayerChooseValue", choser, value);
@@ -66,9 +66,9 @@ public class MessageUtil {
}
public static String mayBeYou(Player player, Object what) {
return what == null ? "(null)" : what == player ? "you" : what.toString();
return what == null ? "(null)" : what == player ? Localizer.getInstance().getMessage("lblYou") : what.toString();
}
public static String mayBeYou(PlayerView player, Object what) {
return what == null ? "(null)" : what == player ? "you" : what.toString();
return what == null ? "(null)" : what == player ? Localizer.getInstance().getMessage("lblYou") : what.toString();
}
}

View File

@@ -81,7 +81,7 @@ public class CCombat implements ICDoc {
if (defender instanceof CardView) {
final PlayerView controller = ((CardView) defender).getController();
display.append(Lang.getPossesive(controller.getName())).append(" ");
display.append(Lang.getInstance().getPossesive(controller.getName())).append(" ");
}
display.append(defender).append(" is attacked by:\n");

View File

@@ -1944,6 +1944,20 @@ lblRepeatAddCard=Wiederhole letztes Karten-hinzufügen
lblRemoveFromGame=Entferne Karte aus dem Spiel
lblRiggedRoll=Gezinkter Weltenwürfelwurf
lblWalkTo=Weltenwandere zu
#PhaseType.java
lblUntapStep=Untap step
lblUpkeepStep=Upkeep step
lblDrawStep=Draw step
lblMainPhase1=Main phase, precombat
lblCombatBeginStep=Beginning of Combat Step
lblCombatDeclareAttackersStep=Declare Attackers Step
lblCombatDeclareBlockersStep=Declare Blockers Step
lblCombatFirstStrikeDamageStep=First Strike Damage Step
lblCombatDamageStep=Combat Damage Step
lblCombatEndStep=End of Combat Step
lblMainPhase2=Main phase, postcombat
lblEndStep=End step
lblCleanupStep=Cleanup step
#ZoneType.java
lblHandZone=Hand
lblLibraryZone=Bibliothek
@@ -2052,6 +2066,8 @@ lblPlayerChooseValue={0} wähle {1}
lblPlayerVoteValue={0} stimme für {1}
lblCardEffectValueIs=Der Wert von {0}s Effekt ist {1}
lblCardEffectToTargetValueIs=Der Wert von {0}s Effekt für {1} ist {2}
# TODO: If below is changed, also need to modify LangGerman.getPossesive() function
lblYou=you
#CardListChooser.java
lblAreYouSureWantPickCard=Willst du wirklich "{0}" nehmen?
lblSelectThisCardConfirm=Wähle diese Karte?

View File

@@ -1944,6 +1944,20 @@ lblRepeatAddCard=Repeat Last Add Card
lblRemoveFromGame=Remove Card from Game
lblRiggedRoll=Rigged Planar Roll
lblWalkTo=Planeswalk to
#PhaseType.java
lblUntapStep=Untap step
lblUpkeepStep=Upkeep step
lblDrawStep=Draw step
lblMainPhase1=Main phase, precombat
lblCombatBeginStep=Beginning of Combat Step
lblCombatDeclareAttackersStep=Declare Attackers Step
lblCombatDeclareBlockersStep=Declare Blockers Step
lblCombatFirstStrikeDamageStep=First Strike Damage Step
lblCombatDamageStep=Combat Damage Step
lblCombatEndStep=End of Combat Step
lblMainPhase2=Main phase, postcombat
lblEndStep=End step
lblCleanupStep=Cleanup step
#ZoneType.java
lblHandZone=hand
lblLibraryZone=library
@@ -2052,6 +2066,7 @@ lblPlayerChooseValue={0} choose {1}
lblPlayerVoteValue={0} vote {1}
lblCardEffectValueIs={0} effect''s value is {1}
lblCardEffectToTargetValueIs={0} effect''s value for {1} is {2}
lblYou=you
#CardListChooser.java
lblAreYouSureWantPickCard=Are you sure you want to pick ''{0}'' ?
lblSelectThisCardConfirm=Select this card?

View File

@@ -1942,6 +1942,20 @@ lblRepeatAddCard=Repetir añadir última carta
lblRemoveFromGame=Quitar carta del juego
lblRiggedRoll=Rollo Plano montado
lblWalkTo=Planeswalk a
#PhaseType.java
lblUntapStep=Untap step
lblUpkeepStep=Upkeep step
lblDrawStep=Draw step
lblMainPhase1=Main phase, precombat
lblCombatBeginStep=Beginning of Combat Step
lblCombatDeclareAttackersStep=Declare Attackers Step
lblCombatDeclareBlockersStep=Declare Blockers Step
lblCombatFirstStrikeDamageStep=First Strike Damage Step
lblCombatDamageStep=Combat Damage Step
lblCombatEndStep=End of Combat Step
lblMainPhase2=Main phase, postcombat
lblEndStep=End step
lblCleanupStep=Cleanup step
#ZoneType.java
lblHandZone=mano
lblLibraryZone=biblioteca
@@ -2050,6 +2064,8 @@ lblPlayerChooseValue={0} elige {1}
lblPlayerVoteValue={0} vota {1}
lblCardEffectValueIs=El valor del efecto de {0} es {1}
lblCardEffectToTargetValueIs=El valor del efecto de {0} para {1} es {2}
# TODO: If below is changed, also need to modify LangSpanish.getPossesive() function
lblYou=you
#CardListChooser.java
lblAreYouSureWantPickCard=¿Estás seguro de que quieres elegir ''{0}''?
lblSelectThisCardConfirm=¿Selecciona esta carta?

View File

@@ -1944,6 +1944,20 @@ lblRepeatAddCard=Repeat Last Add Card
lblRemoveFromGame=Remove Card from Game
lblRiggedRoll=Rigged Planar Roll
lblWalkTo=Planeswalk to
#PhaseType.java
lblUntapStep=Untap step
lblUpkeepStep=Upkeep step
lblDrawStep=Draw step
lblMainPhase1=Main phase, precombat
lblCombatBeginStep=Beginning of Combat Step
lblCombatDeclareAttackersStep=Declare Attackers Step
lblCombatDeclareBlockersStep=Declare Blockers Step
lblCombatFirstStrikeDamageStep=First Strike Damage Step
lblCombatDamageStep=Combat Damage Step
lblCombatEndStep=End of Combat Step
lblMainPhase2=Main phase, postcombat
lblEndStep=End step
lblCleanupStep=Cleanup step
#ZoneType.java
lblHandZone=hand
lblLibraryZone=library
@@ -2052,6 +2066,8 @@ lblPlayerChooseValue={0} choose {1}
lblPlayerVoteValue={0} vote {1}
lblCardEffectValueIs={0} effect''s value is {1}
lblCardEffectToTargetValueIs={0} effect''s value for {1} is {2}
# TODO: If below is changed, also need to modify LangItalian.getPossesive() function
lblYou=you
#CardListChooser.java
lblAreYouSureWantPickCard=Are you sure you want to pick ''{0}'' ?
lblSelectThisCardConfirm=Select this card?

View File

@@ -337,10 +337,10 @@ lblTeam=チーム
lblKeep=キープ
lblYouAreGoingFirst=あなたが先攻です
lblIsGoingFirst=が先攻です
lblYouAreGoing=あなたは後攻です
lblYouAreGoing=あなたの順番
lblMulligan=マリガン
lblDoYouWantToKeepYourHand=手札をキープしますか?
lblReturnForLondon=ライブラリの一番下に %d枚カードをしてください
lblReturnForLondon=ライブラリの一番下に %d枚カードをしてください
lblOk=Ok
lblReset=リセット
lblAuto=自動
@@ -1158,7 +1158,7 @@ lblPriority=優先権
lblTurn=ターン
lblPhase=フェイズ
lblEmpty=なし
lbltoResolve=に対して解決する
lbltoResolve=つ解決中
lblStormCount=ストームカウント
#InputAttack.java
lblCallBack=呼び戻す
@@ -1304,9 +1304,9 @@ lblErrorEntityWithId=Error: Entity with ID
lblNotFound=not found
lblChooseAnnounceForCard={1}の{0}を選ぶ
lblSacrifice=生け贄
lblLookCardInPlayerZone={0}{1}のカードを見る
lblLookCardInPlayerZone={0} {1}のカードを見る
lblPlayerZone={0} {1}
lblActionFromPlayerDeck={1}デッキから{0}
lblActionFromPlayerDeck={1}デッキから{0}
#AbstractGuiGame.java
lblConcedeCurrentGame=これは現在のゲームを投了し、負けます。とにかく投了しますか?
lblConcedeTitle=ゲームを投了する?
@@ -1384,24 +1384,24 @@ lblLogSurveiledToLibraryGraveyard={0}は諜報で {1}枚のカードをカード
lblLogSurveiledToLibrary={0}は諜報で {1}枚のカードをカードをライブラリーのトップに置きました
lblLogSurveiledToGraveyard={0}は諜報で {1}枚のカードを墓地に置きました
lblLogCardAbilityFizzles={0}の能力が立ち消えしました
lblCast=唱え
lblTriggered=誘発された
lblActivated=起動され
lblLogPlayerActionObjectWitchTarget={3}を対象に{0} {1} {2}
lblLogPlayerActionObject={0} {1} {2}
lblCast=唱え
lblTriggered=誘発された
lblActivated=起動
lblLogPlayerActionObjectWitchTarget={0} {3}を対象に {2} {1}
lblLogPlayerActionObject={0} {2} {1}
lblLogPlayerChosenModeForCard={0}は {2}の {1}を選択しました。
lblLogPlayerHasRestoredControlThemself={0}は自身の制御が戻りました
lblLogPlayerControlledTargetPlayer={0}は {1}によって制御されます
lblDeathtouch=接死
lblAsM1M1Counters=同等の -1/-1カウンター
lblRemovingNLoyaltyCounter={0}個忠誠カウンターを除去
lblSourceDealsNDamageToDest={0}は {3}に対して {1}のダメージ({2})。
lblSourceDealsNDamageToDest={0}は {3}に対して {1}のダメージ({2})。
lblLogPlayerPlayedLand={0}が {1}を置きました
lblLogTurnNOwnerByPlayer=ターン{0}{1}
lblLogAsPoisonCounters=(同等の毒カウンター)
lblCombat=戦闘
lblNonCombat=非戦闘
lblLogSourceDealsNDamageOfTypeToDest={0}は {3}{4}に対して{1} {2}のダメージを与えました。
lblLogSourceDealsNDamageOfTypeToDest={0}は {3}{4}に対して{1} {2}のダメージを与えました。
lblLogPlayerReceivesNPosionCounterFrom={0}は {2}から {1}個毒カウンターを貰いました。
lblLogPlayerAssignedAttackerToAttackTarget={0}は {1}を {2}の攻撃に指定しました。
lblLogPlayerDidntBlockAttacker={0}が {1}をブロックしていません。
@@ -1736,14 +1736,14 @@ lblChooseColorReplace=置き換える色を表す単語を選ぶ
lblChooseNewColor=別の色の単語を選ぶ
#ChangeZoneEffect.java
lblDoYouWantMoveTargetFromOriToDest={0}を {1}から {2}へ移動しますか?
lblPutThatCardFromPlayerOriginToDestination=カードを {0} {1}から {2}へ移動します
lblSearchPlayerZoneConfirm={0} {1}を探しますか?
lblPutThatCardFromPlayerOriginToDestination=カードを {0} {1}から {2}へ移動します
lblSearchPlayerZoneConfirm={0} {1}を探しますか?
lblCardMatchSearchingTypeInAlternateZones=枚もう一つの領域のカードが探すタイプと一致します。
lblLookingCardIn=カードを見る
lblDoYouWantPlayCard={0}をプレイしますか?
lblSelectCardFromPlayerZone={0} {1}から 1枚のカードを選ぶ
lblSelectUpToNumCardFromPlayerZone={1} {2}から最大 {0}枚のカードを選ぶ
lblSelectCardsFromPlayerZone={0} {1}からカードを選ぶ
lblSelectCardFromPlayerZone={0} {1}から 1枚のカードを選ぶ
lblSelectUpToNumCardFromPlayerZone={1} {2}から最大 {0}枚のカードを選ぶ
lblSelectCardsFromPlayerZone={0} {1}からカードを選ぶ
lblCancelSearchUpToSelectNumCards=探しを中止しますか? あと {0}枚までカードを選びます。
#ChangeZoneAllEffect.java
lblMoveTargetFromOriginToDestination={0}を {1}から {2}へ移動しますか?
@@ -1754,7 +1754,7 @@ lblTotalPowerNum=パワーの合計:{0}
lblCancelChooseConfirm=選びを中止しますか?
#ChooseCardNameEffect.java
lblChooseACardName=カード名 1つを選ぶ
lblChooseASpecificCard={0}カード名 1つを選ぶ
lblChooseASpecificCard={0}カード名 1つを選ぶ
lblPlayerPickedChosen={0}が {1}を選択した
#ChooseColorEffect.java
lblChooseAColor=色 1色を選ぶ
@@ -1944,6 +1944,20 @@ lblRepeatAddCard=Repeat Last Add Card
lblRemoveFromGame=Remove Card from Game
lblRiggedRoll=Rigged Planar Roll
lblWalkTo=Planeswalk to
#PhaseType.java
lblUntapStep=アンタップ・ステップ
lblUpkeepStep=アップキープ・ステップ
lblDrawStep=ドロー・ステップ
lblMainPhase1=戦闘前メイン・フェイズ
lblCombatBeginStep=戦闘開始ステップ
lblCombatDeclareAttackersStep=攻撃クリーチャー指定ステップ
lblCombatDeclareBlockersStep=ブロック・クリーチャー指定ステップ
lblCombatFirstStrikeDamageStep=先制戦闘ダメージ・ステップ
lblCombatDamageStep=通常戦闘ダメージ・ステップ
lblCombatEndStep=戦闘終了ステップ
lblMainPhase2=戦闘後メイン・フェイズ
lblEndStep=終了ステップ
lblCleanupStep=クリンナップ・ステップ
#ZoneType.java
lblHandZone=手札
lblLibraryZone=ライブラリー
@@ -2052,6 +2066,7 @@ lblPlayerChooseValue={0}は{1}を選択します
lblPlayerVoteValue={0}は{1}票を投票した
lblCardEffectValueIs={0}の効果の値は{1}です
lblCardEffectToTargetValueIs={1}の{0}効果の値は{2}です
lblYou=あなた
#CardListChooser.java
lblAreYouSureWantPickCard=「{0}」選択してもいいですか?
lblSelectThisCardConfirm=このカードを選択しますか?

View File

@@ -336,7 +336,7 @@ lblTeam=团队
lblKeep=保留
lblYouAreGoingFirst=你先手
lblIsGoingFirst=是先手
lblYouAreGoing=
lblYouAreGoing=
lblMulligan=调度
lblDoYouWantToKeepYourHand=你想保留这个手牌吗?
lblReturnForLondon=放回%d张牌到牌库底
@@ -1942,6 +1942,20 @@ lblRepeatAddCard=重复上一张添加的牌
lblRemoveFromGame=从游戏中删除牌
lblRiggedRoll=触发时空骰
lblWalkTo=时空换入
#PhaseType.java
lblUntapStep=Untap step
lblUpkeepStep=Upkeep step
lblDrawStep=Draw step
lblMainPhase1=Main phase, precombat
lblCombatBeginStep=Beginning of Combat Step
lblCombatDeclareAttackersStep=Declare Attackers Step
lblCombatDeclareBlockersStep=Declare Blockers Step
lblCombatFirstStrikeDamageStep=First Strike Damage Step
lblCombatDamageStep=Combat Damage Step
lblCombatEndStep=End of Combat Step
lblMainPhase2=Main phase, postcombat
lblEndStep=End step
lblCleanupStep=Cleanup step
#ZoneType.java
lblHandZone=手牌
lblLibraryZone=牌库
@@ -2050,6 +2064,7 @@ lblPlayerChooseValue={0}选择{1}
lblPlayerVoteValue={0}投票给{1}
lblCardEffectValueIs={0}效应的值为{1}
lblCardEffectToTargetValueIs={0}对{1}的影响的值为{2}
lblYou=
#CardListChooser.java
lblAreYouSureWantPickCard=确定要选择''{0}''吗?
lblSelectThisCardConfirm=选择这张牌?

View File

@@ -198,7 +198,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
final List<CardView> options = Lists.newArrayList();
for (final Entry<Player, Card> kv : ev.cards.entries()) {
//use fake card so real cards appear with proper formatting
final CardView fakeCard = new CardView(-1, null, " -- From " + Lang.getPossesive(kv.getKey().getName()) + " deck --");
final CardView fakeCard = new CardView(-1, null, " -- From " + Lang.getInstance().getPossesive(kv.getKey().getName()) + " deck --");
options.add(fakeCard);
options.add(kv.getValue().getView());
}

View File

@@ -67,7 +67,7 @@ public class InputConfirmMulligan extends InputSyncronizedBase {
}
else {
sb.append(startingPlayer.getName()).append(" ").append(localizer.getMessage("lblIsGoingFirst")).append(".\n");
sb.append(player).append(", ").append(localizer.getMessage("lblYouAreGoing")).append(" ").append(Lang.getOrdinal(game.getPosition(player, startingPlayer))).append(".\n\n");
sb.append(player).append(", ").append(localizer.getMessage("lblYouAreGoing")).append(" ").append(Lang.getInstance().getOrdinal(game.getPosition(player, startingPlayer))).append(".\n\n");
}
getController().getGui().updateButtons(getOwner(), localizer.getMessage("lblKeep"), localizer.getMessage("lblMulligan"), true, true, true);

View File

@@ -52,6 +52,7 @@ import forge.quest.data.QuestPreferences;
import forge.tournament.TournamentData;
import forge.util.CardTranslation;
import forge.util.FileUtil;
import forge.util.Lang;
import forge.util.Localizer;
import forge.util.storage.IStorage;
import forge.util.storage.StorageBase;
@@ -126,6 +127,7 @@ public final class FModel {
throw new RuntimeException(exn);
}
Lang.createInstance(FModel.getPreferences().getPref(FPref.UI_LANGUAGE));
Localizer.getInstance().initialize(FModel.getPreferences().getPref(FPref.UI_LANGUAGE), ForgeConstants.LANG_DIR);
final ProgressObserver progressBarBridge = (progressBar == null) ?

View File

@@ -1874,7 +1874,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont
@Override
public void revealAnte(final String message, final Multimap<Player, PaperCard> removedAnteCards) {
for (final Player p : removedAnteCards.keySet()) {
getGui().reveal(localizer.getMessage("lblActionFromPlayerDeck", message, Lang.getPossessedObject(MessageUtil.mayBeYou(player, p), "")),
getGui().reveal(localizer.getMessage("lblActionFromPlayerDeck", message, Lang.getInstance().getPossessedObject(MessageUtil.mayBeYou(player, p), "")),
ImmutableList.copyOf(removedAnteCards.get(p)));
}
}