Skip to content

Instantly share code, notes, and snippets.

@SanAndreaP
Created September 24, 2012 10:11
Show Gist options
  • Save SanAndreaP/3775312 to your computer and use it in GitHub Desktop.
Save SanAndreaP/3775312 to your computer and use it in GitHub Desktop.
A language file manager for mods using MC Forge.
package SanAndreasP.mods;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import net.minecraft.client.Minecraft;
import net.minecraft.server.MinecraftServer;
import net.minecraft.src.Block;
import net.minecraft.src.Entity;
import net.minecraft.src.EntityList;
import net.minecraft.src.Item;
import net.minecraft.src.ItemStack;
import net.minecraft.src.StringTranslate;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.FMLLog;
import cpw.mods.fml.common.registry.LanguageRegistry;
public class SAP_LanguageManager {
private HashMap<String, File> langFiles = new HashMap<String, File>();
private File path;
private String version, modname;
public SAP_LanguageManager(String par1Path, String par2LangVer, String par3Mod) {
try {
String cfgpath = "minecraft/config/langs"+par1Path;
path = getModDir(cfgpath);
if(!(path.exists()))
path.mkdirs();
} catch(Throwable e) {
e.printStackTrace();
}
File[] files = path.listFiles(new LangFileFilter());
for(File langFile : files) {
String lang = langFile.getName().replaceAll(".(txt|lang|SAPlang)", "");
if(StringTranslate.getInstance().getLanguageList().containsKey(lang))
langFiles.put(lang, langFile);
}
version = par2LangVer;
modname = par3Mod;
}
private File getModDir(String par1Path) {
if(FMLCommonHandler.instance().getSide().isClient())
return Minecraft.getAppDir(par1Path);
else
return MinecraftServer.getServer().getFile(par1Path);
}
public void loadLangPropertyStr(String property, String defName) {
LanguageRegistry.instance().addStringLocalization(property, "en_US", defName);
boolean langRead = false;
String[] langs = langFiles.keySet().toArray(new String[langFiles.size()]);
for(String cLang : langs) {
File cFile = langFiles.get(cLang);
if(!cFile.canRead())
continue;
try {
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(cFile), "UTF-8"));
do {
String s = in.readLine();
if(s == null || s.isEmpty())
continue;
s = s.replaceAll("\uFEFF", "");
if(s.matches("[ ]{0,}"+property+".*?=.*") ) {
LanguageRegistry.instance().addStringLocalization(property, cLang, s.replaceAll(".*?=[ ]{0,}", ""));
langRead = true;
break;
}
} while(in.ready());
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if(!langRead) {
FMLLog.warning("Cannot find translated name for [%s] in %s lang file %s. pre-defined name is used.", property.replaceAll(".name", ""), modname, cLang);
}
}
}
public void loadLangProperty(Object obj, String defName) {
String objectName;
if(obj == null)
throw new IllegalArgumentException(String.format("Illegal object for naming %s",obj));
if (obj instanceof String) {
objectName=(String)obj;
this.loadLangPropertyStr(objectName, defName);
return;
} else if (obj instanceof Item) {
objectName=((Item)obj).getItemName();
} else if (obj instanceof Block) {
objectName=((Block)obj).getBlockName();
} else if (obj instanceof ItemStack) {
objectName=((ItemStack)obj).getItem().getItemNameIS((ItemStack)obj);
} else if (obj instanceof Class && (Entity.class.isAssignableFrom((Class)obj))){
objectName="entity."+((String)EntityList.classToStringMapping.get((Class)obj));
} else {
throw new IllegalArgumentException(String.format("Illegal object for naming %s",obj));
}
objectName+=".name";
this.loadLangPropertyStr(objectName, defName);
}
}
class LangFileFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
if(name.endsWith(".txt") || name.endsWith(".SAPlang") || name.endsWith(".lang"))
return true;
else return false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment