Skip to content

Instantly share code, notes, and snippets.

@u3games
Last active January 23, 2016 13:52
Show Gist options
  • Save u3games/1b1d61f7f7abb58eb4b0 to your computer and use it in GitHub Desktop.
Save u3games/1b1d61f7f7abb58eb4b0 to your computer and use it in GitHub Desktop.
Language System (for console messages)
Index: dist/game/config/Language/lang_en.xml
===================================================================
--- dist/game/config/Language/lang_en.xml (revision 0)
+++ dist/game/config/Language/lang_en.xml (working copy)
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<localization lang="English">
+
+ <!-- Seven Signs -->
+ <message id="ss_teleported_nearest_seal" text="You have been teleported to the nearest town due to the beginning of the Seal Validation period."/>
+ <message id="ss_teleported_nearest_cabal" text="You have been teleported to the nearest town because you have not signed for any cabal."/>
+ <message id="ss_festival_ended" text="The festival has ended. Your party leader must now register your score before the next festival takes place."/>
+ <message id="ss_remove_player" text="You have been removed from the festival arena."/>
+
+</localization>
\ No newline at end of file
Index: src/main/java/com/l2jserver/gameserver/datatables/LanguageData.java
===================================================================
--- src/main/java/com/l2jserver/gameserver/datatables/LanguageData.java (revision 0)
+++ src/main/java/com/l2jserver/gameserver/datatables/LanguageData.java (working copy)
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2015-2015 L2J EventEngine
+ *
+ * This file is part of L2J EventEngine.
+ *
+ * L2J EventEngine 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * L2J EventEngine 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 this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.datatables;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+import java.util.logging.Logger;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ * @author U3Games
+ */
+
+public final class LanguageData
+{
+ // Logger
+ private static final Logger LOGGER = Logger.getLogger(LanguageData.class.getName());
+
+ // Default
+ private static final String DIRECTORY = "config/Language";
+ private static final String DEFAULT_LANG = "en";
+
+ // Maps
+ private final Map<L2PcInstance, String> _playerCurrentLang = new HashMap<>();
+ private final Map<String, String> _msgMap = new HashMap<>();
+ private final Map<String, String> _languages = new HashMap<>();
+
+ public LanguageData()
+ {
+ load();
+ }
+
+ private void load()
+ {
+ try
+ {
+ File dir = new File(DIRECTORY);
+
+ for (File file : dir.listFiles((FileFilter) pathname ->
+ {
+ if (pathname.getName().endsWith(".xml"))
+ {
+ return true;
+ }
+ return false;
+ }))
+ {
+ if (file.getName().startsWith("lang_"))
+ {
+ loadXml(file, file.getName().substring(5, file.getName().indexOf(".xml")));
+ }
+ }
+
+ LOGGER.info(LanguageData.class.getSimpleName() + ": Loaded " + _languages.size() + " languages.");
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning(LanguageData.class.getSimpleName() + ": -> Error while loading language files: " + e);
+ e.printStackTrace();
+ }
+ }
+
+ private void loadXml(File file, String lang)
+ {
+ int count = 0;
+ String langName = "";
+
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ factory.setValidating(false);
+ factory.setIgnoringComments(true);
+ Document doc = null;
+ if (file.exists())
+ {
+ try
+ {
+ doc = factory.newDocumentBuilder().parse(file);
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning(LanguageData.class.getSimpleName() + ": -> Could not load language (" + lang + ") file for event engine: " + e);
+ e.printStackTrace();
+ }
+
+ Node n = doc.getFirstChild();
+ NamedNodeMap docAttr = n.getAttributes();
+ if (docAttr.getNamedItem("lang") != null)
+ {
+ langName = docAttr.getNamedItem("lang").getNodeValue();
+ }
+
+ if (!_languages.containsKey(lang))
+ {
+ _languages.put(lang, langName);
+ }
+
+ for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
+ {
+ if (d.getNodeName().equals("message"))
+ {
+ NamedNodeMap attrs = d.getAttributes();
+ String id = attrs.getNamedItem("id").getNodeValue();
+ String text = attrs.getNamedItem("text").getNodeValue();
+
+ _msgMap.put(lang + "_" + id, text);
+ count++;
+ }
+ }
+ }
+
+ LOGGER.info("Loaded language file for language " + lang + " " + count + " messages.");
+ }
+
+ /**
+ * @param player
+ * @param text
+ * @return String
+ */
+ public String getMsgByLang(L2PcInstance player, String text)
+ {
+ String lang = getLanguage(player);
+
+ StringBuilder msg = new StringBuilder(50);
+ StringTokenizer st = new StringTokenizer(text, " ");
+
+ while (st.hasMoreTokens())
+ {
+ String textLang = st.nextToken();
+ if (_msgMap.containsKey(lang + "_" + textLang))
+ {
+ msg.append(_msgMap.get(lang + "_" + textLang));
+ }
+ else if (_msgMap.containsKey(lang + "_" + textLang))
+ {
+ msg.append(_msgMap.get("en_" + textLang));
+ }
+ else
+ {
+ msg.append(textLang);
+ }
+ }
+
+ return msg.toString();
+ }
+
+ /**
+ * @param player
+ * @param lang
+ */
+ public void setLanguage(L2PcInstance player, String lang)
+ {
+ _playerCurrentLang.put(player, lang);
+ }
+
+ /**
+ * @param player
+ * @return String
+ */
+ public String getLanguage(L2PcInstance player)
+ {
+ if (_playerCurrentLang.containsKey(player))
+ {
+ return _playerCurrentLang.get(player);
+
+ }
+ return DEFAULT_LANG;
+ }
+
+ /**
+ * @return
+ */
+ public Map<String, String> getLanguages()
+ {
+ return _languages;
+ }
+
+ public static LanguageData getInstance()
+ {
+ return SingletonHolder._instance;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final LanguageData _instance = new LanguageData();
+ }
+}
Index: src/main/java/com/l2jserver/gameserver/GameServer.java
===================================================================
--- src/main/java/com/l2jserver/gameserver/GameServer.java (revision 20878)
+++ src/main/java/com/l2jserver/gameserver/GameServer.java (working copy)
@@ -84,6 +84,7 @@
import com.l2jserver.gameserver.datatables.BotReportTable;
import com.l2jserver.gameserver.datatables.EventDroplist;
import com.l2jserver.gameserver.datatables.ItemTable;
+import com.l2jserver.gameserver.datatables.LanguageData;
import com.l2jserver.gameserver.datatables.MerchantPriceConfigTable;
import com.l2jserver.gameserver.datatables.SkillData;
import com.l2jserver.gameserver.datatables.SpawnTable;
@@ -216,6 +217,9 @@
FishingRodsData.getInstance();
HennaData.getInstance();
+ printSection("Languages");
+ LanguageData.getInstance();
+
printSection("Characters");
ClassListData.getInstance();
InitialEquipmentData.getInstance();
Index: src/main/java/com/l2jserver/gameserver/SevenSigns.java
===================================================================
--- src/main/java/com/l2jserver/gameserver/SevenSigns.java (revision 20878)
+++ src/main/java/com/l2jserver/gameserver/SevenSigns.java (working copy)
@@ -34,6 +34,7 @@
import com.l2jserver.Config;
import com.l2jserver.commons.database.pool.impl.ConnectionFactory;
+import com.l2jserver.gameserver.datatables.LanguageData;
import com.l2jserver.gameserver.instancemanager.CastleManager;
import com.l2jserver.gameserver.model.AutoSpawnHandler;
import com.l2jserver.gameserver.model.AutoSpawnHandler.AutoSpawnInstance;
@@ -1419,7 +1420,7 @@
{
player.teleToLocation(TeleportWhereType.TOWN);
player.setIsIn7sDungeon(false);
- player.sendMessage("You have been teleported to the nearest town due to the beginning of the Seal Validation period.");
+ player.sendMessage(LanguageData.getInstance().getMsgByLang(player, "ss_teleported_nearest_seal"));
}
}
else
@@ -1428,7 +1429,7 @@
{
player.teleToLocation(TeleportWhereType.TOWN);
player.setIsIn7sDungeon(false);
- player.sendMessage("You have been teleported to the nearest town because you have not signed for any cabal.");
+ player.sendMessage(LanguageData.getInstance().getMsgByLang(player, "ss_teleported_nearest_cabal"));
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment