diff options
author | miozune <miozune@gmail.com> | 2024-02-28 14:04:43 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-27 23:04:43 -0600 |
commit | 32c93da1d788e23672733c7c4db89c66632d8ba4 (patch) | |
tree | 82d908ebcd7a4d19ec924fe31f29bbb80d8d861a /src/main/java/gregtech/api | |
parent | 8117f9fb1ddc6b30f459483420ce269973ecb53e (diff) | |
download | GT5-Unofficial-32c93da1d788e23672733c7c4db89c66632d8ba4.tar.gz GT5-Unofficial-32c93da1d788e23672733c7c4db89c66632d8ba4.tar.bz2 GT5-Unofficial-32c93da1d788e23672733c7c4db89c66632d8ba4.zip |
Add locale code support for lang manager (#2511)
* Add locale code support for lang manager
* Deprecate a method with aWriteIntoLangFile
Diffstat (limited to 'src/main/java/gregtech/api')
8 files changed, 105 insertions, 108 deletions
diff --git a/src/main/java/gregtech/api/GregTech_API.java b/src/main/java/gregtech/api/GregTech_API.java index 043cd0b763..2e39cd2181 100644 --- a/src/main/java/gregtech/api/GregTech_API.java +++ b/src/main/java/gregtech/api/GregTech_API.java @@ -481,8 +481,7 @@ public class GregTech_API { return new gregtech.api.items.GT_Generic_Item( aUnlocalized, aEnglish, - "Doesn't work as intended, this is a Bug", - false); + "Doesn't work as intended, this is a Bug"); } /** @@ -528,8 +527,7 @@ public class GregTech_API { return new gregtech.api.items.GT_Generic_Item( aUnlocalized, aEnglish, - "Doesn't work as intended, this is a Bug", - false); + "Doesn't work as intended, this is a Bug"); } /** @@ -552,8 +550,7 @@ public class GregTech_API { return new gregtech.api.items.GT_Generic_Item( aUnlocalized, aEnglish, - "Doesn't work as intended, this is a Bug", - false); + "Doesn't work as intended, this is a Bug"); } /** diff --git a/src/main/java/gregtech/api/items/GT_Generic_Item.java b/src/main/java/gregtech/api/items/GT_Generic_Item.java index 4410eccc26..a1e01c92c7 100644 --- a/src/main/java/gregtech/api/items/GT_Generic_Item.java +++ b/src/main/java/gregtech/api/items/GT_Generic_Item.java @@ -40,16 +40,11 @@ public class GT_Generic_Item extends Item implements IProjectileItem { protected IIcon mIcon; public GT_Generic_Item(String aUnlocalized, String aEnglish, String aEnglishTooltip) { - this(aUnlocalized, aEnglish, aEnglishTooltip, true); - } - - public GT_Generic_Item(String aUnlocalized, String aEnglish, String aEnglishTooltip, - boolean aWriteToolTipIntoLangFile) { super(); mName = "gt." + aUnlocalized; GT_LanguageManager.addStringLocalization(mName + ".name", aEnglish); - if (GT_Utility.isStringValid(aEnglishTooltip)) GT_LanguageManager - .addStringLocalization(mTooltip = mName + ".tooltip_main", aEnglishTooltip, aWriteToolTipIntoLangFile); + if (GT_Utility.isStringValid(aEnglishTooltip)) + GT_LanguageManager.addStringLocalization(mTooltip = mName + ".tooltip_main", aEnglishTooltip); else mTooltip = null; setCreativeTab(GregTech_API.TAB_GREGTECH); GameRegistry.registerItem(this, mName, GregTech.ID); @@ -154,7 +149,7 @@ public class GT_Generic_Item extends Item implements IProjectileItem { } public String transItem(String aKey, String aEnglish) { - return GT_LanguageManager.addStringLocalization("Item_DESCRIPTION_Index_" + aKey, aEnglish, false); + return GT_LanguageManager.addStringLocalization("Item_DESCRIPTION_Index_" + aKey, aEnglish); } public static class GT_Item_Dispense extends BehaviorProjectileDispense { diff --git a/src/main/java/gregtech/api/items/GT_MetaBase_Item.java b/src/main/java/gregtech/api/items/GT_MetaBase_Item.java index 8a65fbc841..481c0b5a08 100644 --- a/src/main/java/gregtech/api/items/GT_MetaBase_Item.java +++ b/src/main/java/gregtech/api/items/GT_MetaBase_Item.java @@ -46,7 +46,7 @@ public abstract class GT_MetaBase_Item extends GT_Generic_Item * @param aUnlocalized The Unlocalized Name of this Item. */ public GT_MetaBase_Item(String aUnlocalized) { - super(aUnlocalized, "Generated Item", null, false); + super(aUnlocalized, "Generated Item", null); setHasSubtypes(true); setMaxDamage(0); } diff --git a/src/main/java/gregtech/api/items/GT_Tool_Item.java b/src/main/java/gregtech/api/items/GT_Tool_Item.java index be38896685..9f78bdc3fc 100644 --- a/src/main/java/gregtech/api/items/GT_Tool_Item.java +++ b/src/main/java/gregtech/api/items/GT_Tool_Item.java @@ -31,11 +31,7 @@ public class GT_Tool_Item extends GT_Generic_Item { public GT_Tool_Item(String aUnlocalized, String aEnglish, String aTooltip, int aMaxDamage, int aEntityDamage, boolean aSwingIfUsed, int aChargedGTID, int aDisChargedGTID, int aToolQuality, float aToolStrength) { - super( - aUnlocalized, - aEnglish, - aTooltip, - aTooltip != null && !aTooltip.equals("Doesn't work as intended, this is a Bug")); + super(aUnlocalized, aEnglish, aTooltip); setMaxDamage(aMaxDamage); setMaxStackSize(1); setNoRepair(); diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java index a5e30fb76c..3392d1ab41 100644 --- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java +++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java @@ -147,8 +147,7 @@ public class MultiTileEntityRegistry { return null; } - GT_LanguageManager - .addStringLocalization(mNameInternal + "." + aClassContainer.mID + ".name", aLocalised, false); + GT_LanguageManager.addStringLocalization(mNameInternal + "." + aClassContainer.mID + ".name", aLocalised); mRegistry.put(aClassContainer.mID, aClassContainer); mLastRegisteredID = aClassContainer.mID; mRegistrations.add(aClassContainer); diff --git a/src/main/java/gregtech/api/util/GT_Assemblyline_Server.java b/src/main/java/gregtech/api/util/GT_Assemblyline_Server.java index 1881ab015a..4c0348683a 100644 --- a/src/main/java/gregtech/api/util/GT_Assemblyline_Server.java +++ b/src/main/java/gregtech/api/util/GT_Assemblyline_Server.java @@ -1,6 +1,5 @@ package gregtech.api.util; -import java.io.File; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; @@ -22,24 +21,13 @@ public class GT_Assemblyline_Server { private static HashMap<String, Property> internal = new HashMap<>(); public static void fillMap(FMLPreInitializationEvent aEvent) { - - String s = aEvent.getModConfigurationDirectory() - .getAbsolutePath(); - s = s.substring( - 0, - aEvent.getModConfigurationDirectory() - .getAbsolutePath() - .length() - 6); - s = s + "GregTech.lang"; - File f = new File(s); - s = ""; - Configuration conf = new Configuration(f); + Configuration conf = GT_LanguageManager.sEnglishFile; ConfigCategory cat = conf.getCategory("languagefile"); internal.putAll(cat.getValues()); for (Map.Entry<String, Property> entry : internal.entrySet()) { try { - s = entry.getValue() + String s = entry.getValue() .getString() .replaceAll("%", ""); diff --git a/src/main/java/gregtech/api/util/GT_LanguageManager.java b/src/main/java/gregtech/api/util/GT_LanguageManager.java index 2ef251c599..f2c5e2a2d4 100644 --- a/src/main/java/gregtech/api/util/GT_LanguageManager.java +++ b/src/main/java/gregtech/api/util/GT_LanguageManager.java @@ -19,12 +19,31 @@ import gregtech.api.GregTech_API; public class GT_LanguageManager { - public static final HashMap<String, String> TEMPMAP = new HashMap<>(), BUFFERMAP = new HashMap<>(), - LANGMAP = new HashMap<>(); + /** + * Buffer to reduce memory allocation when injecting data to LanguageRegistry. + */ + private static final HashMap<String, String> TEMPMAP = new HashMap<>(); + /** + * Buffer used when something is trying to add new lang entry while config file is not set up yet. + */ + public static final Map<String, String> BUFFERMAP = new HashMap<>(); + /** + * Map containing all the translation data coming into this class. + */ + private static final Map<String, String> LANGMAP = new HashMap<>(); + /** + * Config file handler bound to GregTech.lang or GregTech_(locale_name).lang. Even though it says English file, + * it's not necessarily English, but on system it's always treated as English (as in, "default" language.) + */ public static Configuration sEnglishFile; - public static String sLanguage = "en_US"; - public static boolean sUseEnglishFile = false; + /** + * If placeholder like %material should be used for writing lang entries to file. + */ public static boolean i18nPlaceholder = true; + /** + * If there's any lang entry that is not found on lang file and waiting to be written. + */ + private static boolean hasUnsavedEntry = false; // TODO: convert to enum public static String FACE_ANY = "gt.lang.face.any", FACE_BOTTOM = "gt.lang.face.bottom", @@ -33,7 +52,10 @@ public class GT_LanguageManager { public static String[] FACES = { FACE_BOTTOM, FACE_TOP, FACE_LEFT, FACE_FRONT, FACE_RIGHT, FACE_BACK, FACE_NONE }; - private static Map<String, String> stringTranslateLanguageList = null; + /** + * Map referencing private field of StringTranslate, used by StatCollector. Used to inject lang entries there. + */ + private static final Map<String, String> stringTranslateLanguageList; static { try { @@ -45,88 +67,87 @@ public class GT_LanguageManager { stringTranslateLanguageList = (Map<String, String>) fieldStringTranslateLanguageList .get(fieldStringTranslateInstance.get(null)); } catch (Exception e) { - e.printStackTrace(); + throw new RuntimeException(e); } } - public static String addStringLocalization(String aKey, String aEnglish) { - return addStringLocalization(aKey, aEnglish, true); + /** + * @deprecated Parameter aWriteIntoLangFile is no longer used, + * use {@link #addStringLocalization(String, String)} or consider migrating to MC lang system instead. + */ + @Deprecated + public static synchronized String addStringLocalization(String aKey, String aEnglish, boolean aWriteIntoLangFile) { + return addStringLocalization(aKey, aEnglish); } - public static synchronized String addStringLocalization(String aKey, String aEnglish, boolean aWriteIntoLangFile) { - if (aKey == null) return E; - if (aWriteIntoLangFile && (!LANGMAP.containsKey(aKey) || (sEnglishFile != null && !BUFFERMAP.isEmpty()))) { - aEnglish = writeToLangFile(aKey, aEnglish); - if (!LANGMAP.containsKey(aKey)) { - LANGMAP.put(aKey, aEnglish); - addToMCLangList(aKey, aEnglish); + /** + * If you newly use this method, please consider using MC lang system instead. + */ + public static synchronized String addStringLocalization(String aKey, String aEnglish) { + String trimmedKey = aKey != null ? aKey.trim() : ""; + if (trimmedKey.isEmpty()) return E; // RIP cascading class loading, don't use GT_Utility here + if (sEnglishFile == null) { + // Lang file is not set up yet + BUFFERMAP.put(trimmedKey, aEnglish); + return aEnglish; + } + if (!BUFFERMAP.isEmpty()) { + // Lang file is now set up, resolve all the buffers + // This won't be visited twice + for (Entry<String, String> tEntry : BUFFERMAP.entrySet()) { + writeToLangFile(tEntry.getKey(), tEntry.getValue()); } + BUFFERMAP.clear(); } - TEMPMAP.put(aKey.trim(), aEnglish); - LanguageRegistry.instance() - .injectLanguage(sLanguage, TEMPMAP); - TEMPMAP.clear(); - if (sUseEnglishFile && !aWriteIntoLangFile) { - if (!LANGMAP.containsKey(aKey)) { - Property tProperty = sEnglishFile.get("LanguageFile", aKey, aEnglish); - aEnglish = tProperty.getString(); - LANGMAP.put(aKey, aEnglish); - addToMCLangList(aKey, aEnglish); - } else aEnglish = LANGMAP.get(aKey); + + if (!LANGMAP.containsKey(trimmedKey)) { + String translation = writeToLangFile(trimmedKey, aEnglish); + LANGMAP.put(trimmedKey, translation); + addToMCLangList(trimmedKey, translation); + TEMPMAP.put(trimmedKey, translation); + LanguageRegistry.instance() + // If we use the actual user configured locale here, switching lang to others while running game + // turns everything into unlocalized string. So we make it "default" and call it a day. + .injectLanguage("en_US", TEMPMAP); + TEMPMAP.clear(); + return translation; } - return aEnglish; + return LANGMAP.get(trimmedKey); } - private static synchronized String writeToLangFile(String aKey, String aEnglish) { - if (aKey == null) return E; - if (sEnglishFile == null) { - BUFFERMAP.put(aKey.trim(), aEnglish); - } else { - if (!BUFFERMAP.isEmpty()) { - for (Entry<String, String> tEntry : BUFFERMAP.entrySet()) { - Property tProperty = sEnglishFile.get("LanguageFile", tEntry.getKey(), tEntry.getValue()); - if (!tProperty.wasRead() && GregTech_API.sPostloadFinished) sEnglishFile.save(); - } - BUFFERMAP.clear(); - } - Property tProperty = sEnglishFile.get("LanguageFile", aKey.trim(), aEnglish); - if (!tProperty.wasRead() && GregTech_API.sPostloadFinished) sEnglishFile.save(); - if (sEnglishFile.get("EnableLangFile", "UseThisFileAsLanguageFile", false) - .getBoolean(false)) { - aEnglish = tProperty.getString(); - sUseEnglishFile = true; + private static synchronized String writeToLangFile(String trimmedKey, String aEnglish) { + Property tProperty = sEnglishFile.get("LanguageFile", trimmedKey, aEnglish); + if (hasUnsavedEntry && GregTech_API.sPostloadFinished) { + sEnglishFile.save(); + hasUnsavedEntry = false; + } + if (!tProperty.wasRead()) { + if (GregTech_API.sPostloadFinished) { + sEnglishFile.save(); + } else { + hasUnsavedEntry = true; } } - return aEnglish; + return tProperty.getString(); } public static String getTranslation(String aKey) { - if (aKey == null) return E; - String tTrimmedKey = aKey.trim(), rTranslation; - if (sUseEnglishFile) { - rTranslation = LanguageRegistry.instance() - .getStringLocalization(tTrimmedKey); + String tTrimmedKey = aKey != null ? aKey.trim() : ""; + if (tTrimmedKey.isEmpty()) return E; + + if (StatCollector.canTranslate(tTrimmedKey)) { + return StatCollector.translateToLocal(tTrimmedKey); + } + String anotherKeyToTry; + if (tTrimmedKey.endsWith(".name")) { + anotherKeyToTry = tTrimmedKey.substring(0, tTrimmedKey.length() - 5); } else { - rTranslation = StatCollector.translateToLocal(tTrimmedKey); + anotherKeyToTry = tTrimmedKey + ".name"; } - if (GT_Utility.isStringInvalid(rTranslation)) { - rTranslation = StatCollector.translateToLocal(tTrimmedKey); - if (GT_Utility.isStringInvalid(rTranslation) || tTrimmedKey.equals(rTranslation)) { - if (aKey.endsWith(".name")) { - String trimmedKeyNoName = tTrimmedKey.substring(0, tTrimmedKey.length() - 5); - rTranslation = StatCollector.translateToLocal(trimmedKeyNoName); - if (GT_Utility.isStringInvalid(rTranslation) || trimmedKeyNoName.equals(rTranslation)) { - return aKey; - } - } else { - rTranslation = StatCollector.translateToLocal(tTrimmedKey + ".name"); - if (GT_Utility.isStringInvalid(rTranslation) || (tTrimmedKey + ".name").equals(rTranslation)) { - return aKey; - } - } - } + if (StatCollector.canTranslate(anotherKeyToTry)) { + return StatCollector.translateToLocal(anotherKeyToTry); } - return rTranslation; + return tTrimmedKey; } public static String getTranslation(String aKey, String aSeperator) { @@ -140,6 +161,7 @@ public class GT_LanguageManager { return rTranslation; } + @SuppressWarnings("unused") public static String getTranslateableItemStackName(ItemStack aStack) { if (GT_Utility.isStackInvalid(aStack)) return "null"; NBTTagCompound tNBT = aStack.getTagCompound(); @@ -550,9 +572,9 @@ public class GT_LanguageManager { addStringLocalization(FACE_NONE, "None"); } - private static void addToMCLangList(String aKey, String aEnglish) { + private static void addToMCLangList(String aKey, String translation) { if (stringTranslateLanguageList != null) { - stringTranslateLanguageList.put(aKey, aEnglish); + stringTranslateLanguageList.put(aKey, translation); } } } diff --git a/src/main/java/gregtech/api/util/GT_Utility.java b/src/main/java/gregtech/api/util/GT_Utility.java index 64010efb99..4f2d13dd04 100644 --- a/src/main/java/gregtech/api/util/GT_Utility.java +++ b/src/main/java/gregtech/api/util/GT_Utility.java @@ -3866,7 +3866,7 @@ public class GT_Utility { } public static String trans(String aKey, String aEnglish) { - return GT_LanguageManager.addStringLocalization("Interaction_DESCRIPTION_Index_" + aKey, aEnglish, false); + return GT_LanguageManager.addStringLocalization("Interaction_DESCRIPTION_Index_" + aKey, aEnglish); } public static String getTrans(String aKey) { |