Jump to content

Recommended Posts

Posted

For my current Project, I've allowed translators to change the localization for their main language on a nice website. I've provided an API call to generate a .lang file from the strings in the database.

 

I now want to automatically update the .lang files for the requested language whenever the language is changed or the mod is restarted. Therefore, I've registered the following IResourceManagerReloadListener:

 

((SimpleReloadableResourceManager)mc.getResourceManager()).registerReloadListener(new IResourceManagerReloadListener() {
            @Override
            public void onResourceManagerReload(IResourceManager resourceManager) {
                SimpleReloadableResourceManager rm = (SimpleReloadableResourceManager) resourceManager;
                Language current = mc.getLanguageManager().getCurrentLanguage();
                String languageCode = current.getLanguageCode();

                try {
                    File file = new File("./" + languageCode + ".lang");
                    file.createNewFile();
                    apiClient.downloadTranslation(languageCode, file);

                    ArrayList arraylist = Lists.newArrayList(new String[]{"en_US"});

                    if(!"en_US".equals(languageCode)) {
                        arraylist.add(languageCode);
                    }

                    Properties prop = new Properties();
                    prop.load(new FileInputStream(file));

                    HashMap<String, String> lang_prop = StringTranslate.parseLangFile(new FileInputStream(file));

                    net.minecraftforge.fml.common.registry.LanguageRegistry.instance().mergeLanguageTable(lang_prop, languageCode);

                    for(Map.Entry e : lang_prop.entrySet()) {
                        System.out.println(e.getKey() + " => " + e.getValue());
                    }

                    StringTranslate.replaceWith(lang_prop);

                    System.out.println("Written to " + file.getAbsolutePath());
                } catch(Exception e) {
                    e.printStackTrace();
                }
            }
        });

 

The mappings in the lang_prop Map are correct (thus the debug output), but it doesn't translate the localized Strings from the mod.

And yes, my localization is properly implemented using I18n.format();

 

Any suggestions?

 

Thanks in advance,

CrushedPixel

Posted
  On 4/27/2015 at 9:53 PM, diesieben07 said:

Make it WAY less complicated.

Implement IResourcePack. For a given language, emulate an "langcode.lang" file (e.g. en_US.lang) via the getInputStream method in IResourcePack (to convert a string use ByteArrayInputStream with String.getBytes(Charsets.UTF8)).

 

Then put the IResourcePack into the default resource packs (Minecraft#defaultResourcePacks, you need reflection).

 

Done, leave all the language loading to MC.

 

Should I have any physical Resource Pack on the Hard Drive? Or is everything just emulated by the mod itself?

I think I need a code example for the getInputStream Method to get started.

Posted
  On 4/28/2015 at 2:33 PM, diesieben07 said:

Example implementation that adds a translation in english from "foo" to "bar":

 

 

  Reveal hidden contents

 

 

Untested.

As for needing files on disk, that depends on your usecase. Minecraft just wants an InputStream. Whether that reads from a constant String, downloads a File from the internet or whatever does not matter.

 

I've got everything to work. Thank you so much!

Guest
This topic is now closed to further replies.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • When you name a method like that, with no return value, it is a constructor. The constructor must have the same name as the class it constructs, in this case, ModItems. I would strongly advise reading up on some basic Java tutorials, because you will definitely be running into a lot more issues as you go along without the basics. *I should also add that the Forge documentation is a reference, not a tutorial. Even following tutorials, you should know Java basics, otherwise the smallest of mistakes will trip you up as you copy someone elses code.
    • so, I'm starting modding and I'm following the official documantation for forge: https://docs.minecraftforge.net, but in the registries part it is not working as it is in the docs:   public class ModItems { private static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, DarkStarvation.MOD_ID); public static final RegistryObject<Item> TEST_ITEM = ITEMS.register("test_item", () -> new Item(new Item.Properties())); public DarkStarvation(FMLJavaModLoadingContext context) { ITEMS.register(context.getModEventBus()); } } in 'public DarkStarvation(...' the DarkStarvation has this error: Invalid method declaration; return type required and the getModEventBus(): Cannot resolve method 'getModEventBus' in 'FMLJavaModLoadingContext' please help, I asked gpt but it is saying that I'm using an old method, but I'm following the latest version of Forge Docs???
    • I merged your second post with the original , there is no need to post a new thread asking for an answer. If someone sees your post and can help, they will reply. If you are seeking a quicker response, you could try asking in the Minecraft Forge diacord.
    • Create a new instance and start with cobblemon - if this works, add the rest of your mods in groups   Maybe another mod is conflicting - like Sodium/Iris or Radical Cobblemon Trainers
    • https://forums.minecraftforge.net/topic/157393-1201-forge-rocket-flame-particle-trail-moves-up-and-crashes-into-the-rocket-during-flight/#comment-584134
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.