diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/i18n/I18nBundle.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/i18n/I18nBundle.java index c2060d99b..030edaf84 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/i18n/I18nBundle.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/i18n/I18nBundle.java @@ -25,7 +25,7 @@ public class I18nBundle { private static final Log log = LogFactory.getLog(I18nBundle.class); private static final String startSep = "\u25a4"; private static final String endSep = "\u25a5"; - private static final String intSep = "\u25a6"; + public static final String intSep = "\u25a6"; private static final String MESSAGE_BUNDLE_NOT_FOUND = "Text bundle ''{0}'' not found."; private static final String MESSAGE_KEY_NOT_FOUND = "Text bundle ''{0}'' has no text for ''{1}''"; @@ -91,6 +91,7 @@ public class I18nBundle { for (int i = 0; i < parameters.length; i++) { separatedArgs += parameters[i] + intSep; } + return startSep + key + intSep + textString + intSep + separatedArgs + message + endSep; } else { return message; diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/i18n/freemarker/I18nStringTemplateModel.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/i18n/freemarker/I18nStringTemplateModel.java index c7b129349..6132a55dc 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/i18n/freemarker/I18nStringTemplateModel.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/i18n/freemarker/I18nStringTemplateModel.java @@ -3,11 +3,15 @@ package edu.cornell.mannlib.vitro.webapp.i18n.freemarker; import java.text.MessageFormat; +import java.util.Arrays; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import edu.cornell.mannlib.vitro.webapp.i18n.I18nBundle; +import edu.cornell.mannlib.vitro.webapp.utils.developer.DeveloperSettings; +import edu.cornell.mannlib.vitro.webapp.utils.developer.Key; import freemarker.template.TemplateMethodModelEx; import freemarker.template.TemplateModel; import freemarker.template.TemplateModelException; @@ -65,7 +69,11 @@ public class I18nStringTemplateModel implements TemplateMethodModelEx, .get(i)); } try { - return MessageFormat.format(textString, unwrappedArgs); + if(isOnlineTranslationsEnabled()) { + return getOnlineTranslationsFormattedMessage(textString, unwrappedArgs); + } else { + return MessageFormat.format(textString, unwrappedArgs); + } } catch (Exception e) { String message = "Can't format '" + key + "' from bundle '" + bundleName + "', wrong argument types: " + args @@ -75,5 +83,29 @@ public class I18nStringTemplateModel implements TemplateMethodModelEx, } } } + + /** + * Splits preProcessed string, formats message with arguments, lists arguments before message + * and combines preProcessed string back to be used with online translations. + * Substitutes arguments in message which is a part of preProcessed string + * @param preProcessed String "startSep + key + intSep + textString + intSep + message + endSep" + * @param arguments that should be listed before message and substituted in the message itself + * @return + */ + private String getOnlineTranslationsFormattedMessage(String preProcessed, Object[] unwrappedArgs) { + String[] parts = preProcessed.split(I18nBundle.intSep); + final int messageIndex = parts.length -1; + String message = MessageFormat.format(parts[messageIndex], unwrappedArgs); + String[] arguments = Arrays.copyOf(unwrappedArgs, unwrappedArgs.length, String[].class); + parts[messageIndex] = ""; + String result = String.join(I18nBundle.intSep, parts) + + String.join(I18nBundle.intSep, arguments) + + I18nBundle.intSep + message ; + return result; + } + + private static boolean isOnlineTranslationsEnabled() { + return DeveloperSettings.getInstance().getBoolean(Key.I18N_ONLINE_TRANSLATION); + } }