/*
* This program 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.
*
* This program 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 .
*/
package com.l2jserver.tools.ngl;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.util.Formatter;
import java.util.Locale;
import java.util.Scanner;
import com.l2jserver.util.osnative.CodePage;
import com.l2jserver.util.osnative.WinConsole;
import com.sun.jna.Platform;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
/**
* @author mrTJO
*/
public class ConsoleLocalizator extends LocalizationParser
{
private WinConsole _wcon;
private Pointer _stdout;
private static PrintStream _out;
Scanner _scn = new Scanner(System.in);
String _baseName = "NGLConsole";
/**
* Load ConsoleLocalizator by using Default Locale
*
* @param dir
* @param baseName
*/
public ConsoleLocalizator(String dir, String baseName)
{
this(dir, baseName, Locale.getDefault());
}
/**
* Load ConsoleLocalizator by using a specified Locale
*
* @param dir
* @param baseName
* @param locale
*/
public ConsoleLocalizator(String dir, String baseName, Locale locale)
{
super(dir, baseName, locale);
loadConsole();
}
/**
* Load ConsoleLocalizator by using a custom xml file
* ../languages/
/_.xml
*
* @param dir
* @param baseName
* @param locale
*/
public ConsoleLocalizator(String dir, String baseName, String locale)
{
super(dir, baseName, locale);
loadConsole();
}
/**
* Choose the appropriate output stream for console
*/
private void loadConsole()
{
if (Platform.isWindows())
{
try
{
_wcon = WinConsole.INSTANCE;
if (_wcon.GetConsoleOutputCP() != 0)
{
// Set Console Output to UTF8
_wcon.SetConsoleOutputCP(CodePage.CP_UTF8);
// Set Output to STDOUT
_stdout = _wcon.GetStdHandle(-11);
}
else
{
// Not running from windows console
_wcon = null;
}
}
catch (Exception e)
{
// Missing function in Kernel32
_wcon = null;
}
}
if (_wcon == null) // Not running windows console
{
try
{
// UTF-8 Print Stream
_out = new PrintStream(System.out, true, "UTF-8");
}
catch (UnsupportedEncodingException e)
{
// UTF-8 Not Supported
_out = new PrintStream(System.out, true);
directPrint("Your system doesn't support UTF-8 encoding\n");
}
}
}
/**
* Get string from translation, add arguments
* and write it to console.
*
* @param id
* @param args
*/
public void print(String id, Object... args)
{
String msg = getStringFromId(id);
if (msg == null)
msg = formatText("Untranslated id: %s", id);
else
msg = formatText(msg, args);
directPrint(msg);
}
/**
* Write a new line
*/
public void println()
{
directPrint("\n");
}
/**
* Get string from translation, add arguments
* and write it to console with a newline at the
* end of string.
*
* @param id
* @param args
*/
public void println(String id, Object... args)
{
String msg = getStringFromId(id);
if (msg == null)
msg = formatText("Untranslated id: %s\n", id);
else
msg = formatText(msg+"\n", args);
directPrint(msg);
}
/**
* Get string from translation, add arguments
* and write it to console.
* Wait for an input and return in form of string.
*
* @param id
* @param args
* @return Input String
*/
public String inputString(String id, Object... args)
{
print(id, args);
directPrint(": ");
String ret = _scn.next();
return ret;
}
/**
* Read string from translation file and append
* arguments.
*
* @param id
* @param args
* @return
*/
public String getString(String id, Object... args)
{
String msg = getStringFromId(id);
if (msg == null)
return formatText("Untranslated id: %s", id);
return formatText(msg, args);
}
/**
* Append arguments to specified string.
*
* @param text
* @param args
* @return
*/
private String formatText(String text, Object... args)
{
Formatter form = new Formatter();
return form.format(text, args).toString();
}
/**
* Write the text into console by using UTF-8
* PrintStream under UNIX environment, and
* Kernel32.dll under Windows.
*
* @param message
*/
private void directPrint(String message)
{
if (_wcon == null)
_out.print(message);
else
_wcon.WriteConsoleW(_stdout, message.toCharArray(),
message.length(), new IntByReference(), null);
}
}