blob: df14fef228c02f29503f1cb202a84d3863919f70 [file] [log] [blame]
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*******************************************************************************/
package org.apache.ofbiz.common;
import java.io.File;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.apache.commons.io.FileUtils;
import org.apache.ofbiz.base.util.Debug;
import org.apache.ofbiz.base.util.FileUtil;
import org.apache.ofbiz.base.util.UtilMisc;
import org.apache.ofbiz.base.util.UtilProperties;
import org.apache.ofbiz.base.util.template.FreeMarkerWorker;
import org.apache.ofbiz.service.DispatchContext;
import org.apache.ofbiz.service.ServiceUtil;
// Use the createJsLanguageFileMapping service to create or update the JsLanguageFilesMapping.java. You will still need to compile thereafter
public class JsLanguageFileMappingCreator {
private static final String module = JsLanguageFileMappingCreator.class.getName();
public static Map<String, Object> createJsLanguageFileMapping(DispatchContext ctx, Map<String, ?> context) {
Map<String, Object> result = ServiceUtil.returnSuccess();
String encoding = (String) context.get("encoding"); // default value: UTF-8
List<Locale> localeList = UtilMisc.availableLocales();
Map<String, Object> jQueryLocaleFile = new LinkedHashMap<String, Object>();
Map<String, String> dateJsLocaleFile = new LinkedHashMap<String, String>();
Map<String, String> validationLocaleFile = new LinkedHashMap<String, String>();
Map<String, String> dateTimePickerLocaleFile = new LinkedHashMap<String, String>();
// setup some variables to locate the js files
String componentRoot = "component://images/webapp";
String jqueryUiLocaleRelPath = "/images/jquery/ui/i18n/";
String dateJsLocaleRelPath = "/images/jquery/plugins/datejs/";
String validateRelPath = "/images/jquery/plugins/validate/localization/";
String dateTimePickerJsLocaleRelPath = "/images/jquery/plugins/datetimepicker/localization/";
String jsFilePostFix = ".js";
String dateJsLocalePrefix = "date-";
String validateLocalePrefix = "messages_";
String jqueryUiLocalePrefix = "jquery.ui.datepicker-";
String dateTimePickerPrefix = "jquery-ui-timepicker-";
String defaultLocaleDateJs = "en-US";
String defaultLocaleJquery = "en"; // Beware to keep the OFBiz specific jquery.ui.datepicker-en.js file when upgrading...
for (Locale locale : localeList) {
String displayCountry = locale.toString();
String modifiedDisplayCountry = null;
String modifiedDisplayCountryForValidation = null;
if (displayCountry.contains("_")) {
modifiedDisplayCountry = displayCountry.replace("_", "-");
modifiedDisplayCountryForValidation = displayCountry; // messages*.js use "_" not "-" as others
} else {
modifiedDisplayCountry = displayCountry;
}
String strippedLocale = locale.getLanguage();
File file = null;
String fileUrl = null;
/*
* Try to open the date-js language file
*/
String fileName = componentRoot + dateJsLocaleRelPath + dateJsLocalePrefix + modifiedDisplayCountry + jsFilePostFix;
file = FileUtil.getFile(fileName);
if (file.exists()) {
fileUrl = dateJsLocaleRelPath + dateJsLocalePrefix + modifiedDisplayCountry + jsFilePostFix;
} else {
// Try to guess a language
String tmpLocale = strippedLocale + "-" + strippedLocale.toUpperCase();
fileName = componentRoot + dateJsLocaleRelPath + dateJsLocalePrefix + tmpLocale + jsFilePostFix;
file = FileUtil.getFile(fileName);
if (file.exists()) {
fileUrl = dateJsLocaleRelPath + dateJsLocalePrefix + tmpLocale + jsFilePostFix;
} else {
// use language en-US as fallback
fileUrl = dateJsLocaleRelPath + dateJsLocalePrefix + defaultLocaleDateJs + jsFilePostFix;
}
}
dateJsLocaleFile.put(displayCountry, fileUrl);
/*
* Try to open the jquery validation language file
*/
if (modifiedDisplayCountryForValidation != null) { // Try 1st lang_country
fileName = componentRoot + validateRelPath + validateLocalePrefix + modifiedDisplayCountryForValidation + jsFilePostFix;
file = FileUtil.getFile(fileName);
if (file.exists()) {
fileUrl = validateRelPath + validateLocalePrefix + modifiedDisplayCountryForValidation + jsFilePostFix;
} else { // lang only
fileName = componentRoot + validateRelPath + validateLocalePrefix + strippedLocale + jsFilePostFix;
file = FileUtil.getFile(fileName);
if (file.exists()) {
fileUrl = validateRelPath + validateLocalePrefix + strippedLocale + jsFilePostFix;
} else {
// use default language en as fallback
fileUrl = validateRelPath + validateLocalePrefix + defaultLocaleJquery + jsFilePostFix;
}
}
} else { // Then try lang only
fileName = componentRoot + validateRelPath + validateLocalePrefix + strippedLocale + jsFilePostFix;
file = FileUtil.getFile(fileName);
if (file.exists()) {
fileUrl = validateRelPath + validateLocalePrefix + strippedLocale + jsFilePostFix;
} else {
// use default language en as fallback
fileUrl = validateRelPath + validateLocalePrefix + defaultLocaleJquery + jsFilePostFix;
}
}
validationLocaleFile.put(displayCountry, fileUrl);
/*
* Try to open the jquery timepicker language file
*/
fileName = componentRoot + jqueryUiLocaleRelPath + jqueryUiLocalePrefix + strippedLocale + jsFilePostFix;
file = FileUtil.getFile(fileName);
if (file.exists()) {
fileUrl = jqueryUiLocaleRelPath + jqueryUiLocalePrefix + strippedLocale + jsFilePostFix;
} else {
// Try to guess a language
fileName = componentRoot + jqueryUiLocaleRelPath + jqueryUiLocalePrefix + modifiedDisplayCountry + jsFilePostFix;
file = FileUtil.getFile(fileName);
if (file.exists()) {
fileUrl = jqueryUiLocaleRelPath + jqueryUiLocalePrefix + modifiedDisplayCountry + jsFilePostFix;
} else {
// use default language en as fallback
fileUrl = jqueryUiLocaleRelPath + jqueryUiLocalePrefix + defaultLocaleJquery + jsFilePostFix;
}
}
jQueryLocaleFile.put(displayCountry, fileUrl);
/*
* Try to open the datetimepicker language file
*/
fileName = componentRoot + dateTimePickerJsLocaleRelPath + dateTimePickerPrefix + strippedLocale + jsFilePostFix;
file = FileUtil.getFile(fileName);
if (file.exists()) {
fileUrl = dateTimePickerJsLocaleRelPath + dateTimePickerPrefix + strippedLocale + jsFilePostFix;
} else {
// Try to guess a language
fileName = componentRoot + dateTimePickerJsLocaleRelPath + dateTimePickerPrefix + modifiedDisplayCountry + jsFilePostFix;
file = FileUtil.getFile(fileName);
if (file.exists()) {
fileUrl = dateTimePickerJsLocaleRelPath + dateTimePickerPrefix + modifiedDisplayCountry + jsFilePostFix;
} else {
// use default language en as fallback
fileUrl = dateTimePickerJsLocaleRelPath + dateTimePickerPrefix + defaultLocaleJquery + jsFilePostFix;
}
}
dateTimePickerLocaleFile.put(displayCountry, fileUrl);
}
// check the template file
String template = "framework/common/template/JsLanguageFilesMapping.ftl";
String output = "framework/common/src/org/apache/ofbiz/common/JsLanguageFilesMapping.java";
Map<String, Object> mapWrapper = new HashMap<String, Object>();
mapWrapper.put("datejs", dateJsLocaleFile);
mapWrapper.put("jquery", jQueryLocaleFile);
mapWrapper.put("validation", validationLocaleFile);
mapWrapper.put("dateTime", dateTimePickerLocaleFile);
// some magic to create a new java file: render it as FTL
Writer writer = new StringWriter();
try {
FreeMarkerWorker.renderTemplate(template, mapWrapper, writer);
// write it as a Java file
File file = new File(output);
FileUtils.writeStringToFile(file, writer.toString(), encoding);
}
catch (Exception e) {
Debug.logError(e, module);
return ServiceUtil.returnError(UtilProperties.getMessage("CommonUiLabels", "CommonOutputFileCouldNotBeCreated", UtilMisc.toMap("errorString", e.getMessage()), (Locale)context.get("locale")));
}
return result;
}
}