/**************************************************************************
OmegaT - Computer Assisted Translation (CAT) tool
with fuzzy matching, translation memory, keyword search,
glossaries, and translation leveraging into updated projects.
Copyright (C) 2000-2006 Keith Godfrey, Maxym Mykhalchuk,
Sandra Jean Chua, and Henry Pijffers
2007 Didier Briel
2009 Alex Buloichik
2015 Aaron Madlon-Kay
Home page: http://www.omegat.org/
Support center: http://groups.yahoo.com/group/OmegaT/
This file is part of OmegaT.
OmegaT 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.
OmegaT 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 org.omegat.help;
import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Paths;
import java.util.Locale;
import java.util.Properties;
import java.util.Random;
import org.omegat.util.OConsts;
import org.omegat.util.OStrings;
import org.omegat.util.StaticUtils;
/**
* A utility class for accessing bundled local or online documentation.
*
* @author Keith Godfrey
* @author Sandra Jean Chua - sachachua at users.sourceforge.net
* @author Maxym Mykhalchuk
* @author Henry Pijffers (henry.pijffers@saxnot.com)
* @author Alex Buloichik (alex73mail@gmail.com)
* @author Aaron Madlon-Kay
*/
public class Help {
/**
* URL for the online manual.
*/
public static final String ONLINE_HELP_URL = OStrings.IS_BETA
? "http://omegat.sourceforge.net/manual-latest/"
: "http://omegat.sourceforge.net/manual-standard/";
public static final String ONLINE_JAVADOC_URL = OStrings.IS_BETA
? "https://omegat.ci.cloudbees.com/job/omegat-javadoc/javadoc/"
: "https://omegat.ci.cloudbees.com/job/omegat-stable-javadoc/javadoc/";
public static void showJavadoc() throws IOException {
URI uri = URI.create(ONLINE_JAVADOC_URL);
Desktop.getDesktop().browse(uri);
}
/**
* Shows help in the system browser.
*
* @throws IOException
*/
public static void showHelp() throws IOException {
String lang = detectHelpLanguage();
URI uri = getHelpFileURI(lang, OConsts.HELP_HOME);
if (uri == null) {
uri = URI.create(ONLINE_HELP_URL);
}
Desktop.getDesktop().browse(uri);
}
public static URI getHelpFileURI(String filename) {
return getHelpFileURI(null, filename);
}
public static URI getHelpFileURI(String lang, String filename) {
// find in install dir
String path = lang == null ? filename : lang + File.separator + filename;
File file = Paths.get(StaticUtils.installDir(), OConsts.HELP_DIR, path).toFile();
if (file.isFile()) {
return file.toURI();
}
// find in classpath
path = lang == null ? filename : lang + '/' + filename;
URL url = Help.class.getResource('/' + OConsts.HELP_DIR + '/' + path);
if (url != null) {
try {
return url.toURI();
} catch (URISyntaxException ex) {
// Ignore
}
}
return null;
}
// immortalize the BeOS 404 messages (some modified a bit for context)
public static String errorHaiku() {
int id = new Random().nextInt(11) + 1;
return OStrings.getString("HF_HAIKU_" + id);
}
/**
* Detects the documentation language to use.
*
* If the latest manual is not available in the system locale language, it
* returns null, i.e. show a language selection screen.
*/
private static String detectHelpLanguage() {
// Get the system locale (language and country)
String language = Locale.getDefault().getLanguage().toLowerCase(Locale.ENGLISH);
String country = Locale.getDefault().getCountry().toUpperCase(Locale.ENGLISH);
// Check if there's a translation for the full locale (lang + country)
String locale = language + "_" + country;
String version = getDocVersion(locale);
if (OStrings.VERSION.equals(version)) {
return locale;
}
// Check if there's a translation for the language only
version = getDocVersion(language);
if (OStrings.VERSION.equals(version)) {
return language;
}
// No suitable translation found
return null;
}
/**
* Returns the version of (a translation of) the user manual. If there is no
* translation for the specified locale, null is returned.
*/
private static String getDocVersion(String locale) {
// Check if there's a manual for the specified locale
// (Assume yes if the index file is there)
if (getHelpFileURI(locale, OConsts.HELP_HOME) == null) {
return null;
}
// Load the property file containing the doc version
Properties prop = new Properties();
InputStream in = null;
try {
URI u = getHelpFileURI(locale, "version.properties");
prop.load(u.toURL().openStream());
} catch (IOException ex) {
return null;
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ex) {
}
}
}
// Get the doc version and return it
// (null if the version entry is not present)
return prop.getProperty("version");
}
}