Last active
January 23, 2016 13:52
-
-
Save u3games/1b1d61f7f7abb58eb4b0 to your computer and use it in GitHub Desktop.
Language System (for console messages)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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