Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dashboard internationalization #217

Merged
merged 6 commits into from Nov 18, 2017
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
30 changes: 30 additions & 0 deletions bundles/org.openhab.ui.dashboard/ESH-INF/i18n/dashboard.properties
@@ -0,0 +1,30 @@
index.welcome = Welcome to openHAB 2
index.location-info = If you allow your browser to access your location, openHAB will use it for weather and astro information.
index.your-location = Your location:

setup.subtitle = Setup
setup.welcome = Welcome to openHAB 2 - Initial Setup
setup.intro = openHAB comes with many different add-ons. To allow an easy start, there are four pre-defined packages available that are a good starting point.
setup.check-doc = Check out the online documentation for a <a href="http://docs.openhab.org/configuration/packages.html" target="_blank">detailed description of those packages</a>.
setup.choose-package = Please choose a package:
setup.package-simple-overlay = Simple
setup.package-simple-footer = Purely UI
setup.package-standard-overlay = Standard
setup.package-standard-footer = Recommended setup
setup.package-expert-overlay = Expert
setup.package-expert-footer = Best for 1.x users
setup.package-demo-overlay = Demo
setup.package-demo-footer = Sample setup
setup.skip-package = Skip the package selection...

common.getting-started = Getting started? Please refer to the <a href="http://docs.openhab.org/" target="_blank">online documentation</a>.

entry.no-ui-installed = No user interfaces installed.
entry.install-running = Please stand by while UIs are being installed. This can take several minutes.

warn.exposed = WARNING - YOUR HOME IS EXPOSED!
warn.explanation = It seems that you have configured your network in a way that you can remotely access your openHAB server. Unfortunately, it is not just you - almost <b>everybody on the Internet can access it!</b>
warn.advice = If this wasn't your plan, please act immediately. Stop the port forwarding of your router or make sure that you have a secure authentication mechanism in place, e.g. by using NGINX as a reverse proxy inbetween.
warn.understood-before = If you have read and understood this message and you have taken appropriate actions, please
warn.understood-click = click here
warn.understood-after = to make this message disappear again.
@@ -0,0 +1,30 @@
index.welcome = Bienvenue dans openHAB 2
index.location-info = Si vous autorisez votre navigateur � acc�der � votre position, openHAB l'utilisera par exemple pour les donn�es m�t�o locales.
index.your-location = Votre position:

setup.subtitle = Configuration
setup.welcome = Bienvenue dans openHAB 2 - Configuration initiale
setup.intro = openHAB est fourni avec de nombreuses extensions. Pour permettre un d�marrage facile, quatre paquets d'extensions pr�-d�finis sont disponibles et constituent un bon point de d�part.
setup.check-doc = Consulter la documentation en ligne pour une <a href="http://docs.openhab.org/configuration/packages.html" target="_blank">description d�taill�e de ces paquets</a>.
setup.choose-package = Merci de choisir un paquet:
setup.package-simple-overlay = Simple
setup.package-simple-footer = Purement UI
setup.package-standard-overlay = Standard
setup.package-standard-footer = Configuration recommand�e
setup.package-expert-overlay = Expert
setup.package-expert-footer = Pour les utilisateurs 1.x
setup.package-demo-overlay = D�mo
setup.package-demo-footer = Configuration de d�mo
setup.skip-package = Sauter l'�tape de s�lection d'un paquet...

common.getting-started = D�marrage ? Merci de vous r�f�rer � la <a href="http://docs.openhab.org/" target="_blank">documentation en ligne</a>.

entry.no-ui-installed = Aucune interface utilisateur install�e.
entry.install-running = Merci de patienter pendant l'installation. Cela peut prendre plusieurs minutes.

warn.exposed = ATTENTION - VOTRE MAISON EST EXPOS�E !
warn.explanation = Il semble que vous ayez configur� votre r�seau de mani�re � pouvoir acc�der � distance � votre serveur openHAB. Malheureusement, ce n'est pas seulement vous mais pratiquement <b>tout le monde sur Internet qui peut y acc�der !</b>
warn.advice = Si ce n'�tait pas votre objectif, veuillez agir imm�diatement. Arr�tez le renvoi de port de votre routeur ou assurez-vous que vous disposez d'un m�canisme d'authentification s�curis�, par exemple en utilisant NGINX comme reverse proxy entre Internet et votre serveur openHAB.
warn.understood-before = Si vous avez lu et compris ce message et que vous avez pris les mesures appropri�es, merci de
warn.understood-click = cliquez ici
warn.understood-after = pour faire dispara�tre ce message.
1 change: 1 addition & 0 deletions bundles/org.openhab.ui.dashboard/META-INF/MANIFEST.MF
Expand Up @@ -12,6 +12,7 @@ Import-Package:
javax.servlet.http,
org.apache.commons.io,
org.eclipse.jdt.annotation;resolution:=optional,
org.eclipse.smarthome.core.i18n,
org.eclipse.smarthome.core.net,
org.openhab.core,
org.osgi.framework,
Expand Down
Expand Up @@ -19,6 +19,9 @@
import javax.servlet.http.HttpServlet;

import org.apache.commons.io.IOUtils;
import org.eclipse.smarthome.core.i18n.I18nUtil;
import org.eclipse.smarthome.core.i18n.LocaleProvider;
import org.eclipse.smarthome.core.i18n.TranslationProvider;
import org.eclipse.smarthome.core.net.HttpServiceUtil;
import org.eclipse.smarthome.core.net.NetworkAddressService;
import org.openhab.ui.dashboard.DashboardTile;
Expand All @@ -40,6 +43,7 @@
* This component registers the dashboard resources.
*
* @author Kai Kreuzer - Initial contribution
* @author Laurent Garnier - internationalization
*/
@Component(service = DashboardService.class, immediate = true, name = "org.openhab.dashboard")
public class DashboardService {
Expand All @@ -54,6 +58,8 @@ public class DashboardService {
protected HttpService httpService;
protected ConfigurationAdmin configurationAdmin;
protected NetworkAddressService networkAddressService;
protected TranslationProvider i18nProvider;
protected LocaleProvider localeProvider;

protected Set<DashboardTile> tiles = new CopyOnWriteArraySet<>();

Expand Down Expand Up @@ -120,6 +126,24 @@ protected void unsetNetworkAddressService(NetworkAddressService networkAddressSe
this.networkAddressService = null;
}

@Reference
protected void setLocaleProvider(final LocaleProvider localeProvider) {
this.localeProvider = localeProvider;
}

protected void unsetLocaleProvider(final LocaleProvider localeProvider) {
this.localeProvider = null;
}

@Reference
public void setTranslationProvider(TranslationProvider i18nProvider) {
this.i18nProvider = i18nProvider;
}

public void unsetTranslationProvider(TranslationProvider i18nProvider) {
this.i18nProvider = null;
}

@Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
protected void addDashboardTile(DashboardTile tile) {
tiles.add(tile);
Expand Down Expand Up @@ -180,7 +204,7 @@ protected HttpServlet createServlet() {
}

return new DashboardServlet(configurationAdmin, indexTemplate, entryTemplate, warnTemplate, setupTemplate,
tiles);
tiles, this);
}

private void addTilesForExternalServices(Map<String, Object> properties) {
Expand All @@ -202,4 +226,34 @@ private void addTilesForExternalServices(Map<String, Object> properties) {
}
}
}

/**
* Get a localized text considering the current locale (language)
*
* @param key the key starting with &#64;text/ of to the localization string, e.g &#64;text/index.welcome
*
* @return the localized text if the key is found, or an empty string if not
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"or an empty string if not" 😲
This can't be the solution. Strings will be added over time and if the Japanese language file is not updated right away, please present the english string as a fallback.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes or course the English text is returned for a key that is not present in the Japanese file.
Empty string is returned in the case the entry is not defined in the default English file too. This case should never happened except if there is a bug in the code.

*/
public String localizeText(String key) {
String result = "";
if (I18nUtil.isConstant(key)) {
result = i18nProvider.getText(bundleContext.getBundle(), I18nUtil.stripConstant(key), "",
localeProvider.getLocale());
}
return result;
}

/**
* Check if a translation file is provided for the current local (language)
*
* @return the language code if the file exists, null if not
*/
public String getUsedLanguage() {
String lang = null;
if (bundleContext.getBundle().getEntry(
"ESH-INF/i18n/dashboard_" + localeProvider.getLocale().getLanguage() + ".properties") != null) {
lang = localeProvider.getLocale().getLanguage();
}
return lang;
}
}
Expand Up @@ -30,6 +30,7 @@
* that are registered as a service.
*
* @author Kai Kreuzer
* @author Laurent Garnier - internationalization
*
*/
public class DashboardServlet extends HttpServlet {
Expand All @@ -50,14 +51,17 @@ public class DashboardServlet extends HttpServlet {

private Set<DashboardTile> tiles;

private DashboardService dashboardService;

public DashboardServlet(ConfigurationAdmin configurationAdmin, String indexTemplate, String entryTemplate,
String warnTemplate, String setupTemplate, Set<DashboardTile> tiles) {
String warnTemplate, String setupTemplate, Set<DashboardTile> tiles, DashboardService dashboardService) {
this.configurationAdmin = configurationAdmin;
this.indexTemplate = indexTemplate;
this.entryTemplate = entryTemplate;
this.warnTemplate = warnTemplate;
this.setupTemplate = setupTemplate;
this.tiles = tiles;
this.dashboardService = dashboardService;
isExposed(null);
}

Expand All @@ -71,7 +75,14 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se
}

private void serveDashboard(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String index = indexTemplate.replace("<!--version-->", OpenHAB.getVersion() + " " + OpenHAB.buildString());
String language = dashboardService.getUsedLanguage();
String index = indexTemplate.replace("<!--language-->", language == null ? "en" : language);
index = index.replace("<!--version-->", OpenHAB.getVersion() + " " + OpenHAB.buildString());
index = index.replace("<!--index.welcome-->", dashboardService.localizeText("@text/index.welcome"));
index = index.replace("<!--index.location-info-->", dashboardService.localizeText("@text/index.location-info"));
index = index.replace("<!--index.your-location-->", dashboardService.localizeText("@text/index.your-location"));
index = index.replace("<!--common.getting-started-->",
dashboardService.localizeText("@text/common.getting-started"));
StringBuilder entries = new StringBuilder();
for (DashboardTile tile : tiles) {
String entry = entryTemplate.replace("<!--name-->", tile.getName());
Expand All @@ -86,14 +97,25 @@ private void serveDashboard(HttpServletRequest req, HttpServletResponse resp) th
if (tiles.size() == 0) {
if ("minimal".equals(getPackage())) {
entries.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
entries.append("No user interfaces installed.");
entries.append(dashboardService.localizeText("@text/entry.no-ui-installed"));
} else {
entries.append(
"&nbsp;&nbsp;&nbsp;&nbsp;<div class=\"spinner spinner--steps\"><img src=\"img/spinner.svg\"></div>&nbsp;&nbsp;");
entries.append("Please stand by while UIs are being installed. This can take several minutes.");
entries.append(dashboardService.localizeText("@text/entry.install-running"));
}
}
String warn = isExposed(req) ? warnTemplate : "";
String warn = "";
if (isExposed(req)) {
warn = warnTemplate.replace("<!--warn.exposed-->", dashboardService.localizeText("@text/warn.exposed"));
warn = warn.replace("<!--warn.explanation-->", dashboardService.localizeText("@text/warn.explanation"));
warn = warn.replace("<!--warn.advice-->", dashboardService.localizeText("@text/warn.advice"));
warn = warn.replace("<!--warn.understood-before-->",
dashboardService.localizeText("@text/warn.understood-before"));
warn = warn.replace("<!--warn.understood-click-->",
dashboardService.localizeText("@text/warn.understood-click"));
warn = warn.replace("<!--warn.understood-after-->",
dashboardService.localizeText("@text/warn.understood-after"));
}
resp.getWriter().append(index.replace("<!--entries-->", entries.toString()).replace("<!--warn-->", warn));
resp.getWriter().close();
}
Expand All @@ -103,9 +125,37 @@ private void serveSetup(HttpServletRequest req, HttpServletResponse resp) throws
setPackage(req.getParameter("type"));
resp.sendRedirect(req.getRequestURI());
} else {
String language = dashboardService.getUsedLanguage();
String setup = setupTemplate.replace("<!--language-->", language == null ? "en" : language);
setup = setup.replace("<!--version-->", OpenHAB.getVersion() + " " + OpenHAB.buildString());
setup = setup.replace("<!--setup.subtitle-->", dashboardService.localizeText("@text/setup.subtitle"));
setup = setup.replace("<!--setup.welcome-->", dashboardService.localizeText("@text/setup.welcome"));
setup = setup.replace("<!--setup.intro-->", dashboardService.localizeText("@text/setup.intro"));
setup = setup.replace("<!--setup.check-doc-->", dashboardService.localizeText("@text/setup.check-doc"));
setup = setup.replace("<!--setup.choose-package-->",
dashboardService.localizeText("@text/setup.choose-package"));
setup = setup.replace("<!--setup.package-simple-overlay-->",
dashboardService.localizeText("@text/setup.package-simple-overlay"));
setup = setup.replace("<!--setup.package-simple-footer-->",
dashboardService.localizeText("@text/setup.package-simple-footer"));
setup = setup.replace("<!--setup.package-standard-overlay-->",
dashboardService.localizeText("@text/setup.package-standard-overlay"));
setup = setup.replace("<!--setup.package-standard-footer-->",
dashboardService.localizeText("@text/setup.package-standard-footer"));
setup = setup.replace("<!--setup.package-expert-overlay-->",
dashboardService.localizeText("@text/setup.package-expert-overlay"));
setup = setup.replace("<!--setup.package-expert-footer-->",
dashboardService.localizeText("@text/setup.package-expert-footer"));
setup = setup.replace("<!--setup.package-demo-overlay-->",
dashboardService.localizeText("@text/setup.package-demo-overlay"));
setup = setup.replace("<!--setup.package-demo-footer-->",
dashboardService.localizeText("@text/setup.package-demo-footer"));
setup = setup.replace("<!--setup.skip-package-->",
dashboardService.localizeText("@text/setup.skip-package"));
setup = setup.replace("<!--common.getting-started-->",
dashboardService.localizeText("@text/common.getting-started"));
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().append(
setupTemplate.replace("<!--version-->", OpenHAB.getVersion() + " " + OpenHAB.buildString()));
resp.getWriter().append(setup);
resp.getWriter().close();
}
}
Expand Down
10 changes: 5 additions & 5 deletions bundles/org.openhab.ui.dashboard/templates/index.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en">
<html lang="<!--language-->">
<head>

<meta charset="utf-8" />
Expand All @@ -23,7 +23,7 @@
</div>
</header>
<section class="container">
<h1>Welcome to openHAB 2</h1>
<h1><!--index.welcome--></h1>
<div class="line">
<div class="decorator"></div>
<hr />
Expand All @@ -36,13 +36,13 @@ <h1>Welcome to openHAB 2</h1>
<div class="geolocation">
<div class="decorator"></div>
<hr />
<p>If you allow your browser to access your location, openHAB will use it for weather and astro information.</p>
<p><span>Your location: </span><span id="geolocation"></span></p>
<p><!--index.location-info--></p>
<p><span><!--index.your-location--> </span><span id="geolocation"></span></p>
</div>
<div class="decorator"></div>
<hr />
</div>
Getting started? Please refer to the <a href="http://docs.openhab.org/">online documentation</a>.
<!--common.getting-started-->
</section>
<footer>
<p>openHAB <!--version--></p>
Expand Down