package org.openedit.entermedia.modules; import java.io.BufferedReader; import java.io.StringReader; import java.io.StringWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Properties; import javax.servlet.http.HttpServletRequest; import com.openedit.OpenEditException; import com.openedit.WebPageRequest; import com.openedit.modules.BaseModule; import com.openedit.modules.translations.Language; import com.openedit.modules.translations.Translation; import com.openedit.modules.translations.TranslationSearcher; import com.openedit.page.Page; import com.openedit.page.PageProperty; import com.openedit.page.PageRequestKeys; import com.openedit.web.Browser; public class TranslationModule extends BaseModule { String[] languages = new String[] { "af", "sq", "ar-DZ", "ar", "hy", "az", "eu", "bs", "bg", "ca", "zh-HK", "zh-CN", "zh-TW", "hr", "cs", "da", "nl-BE", "nl", "en-AU", "en-NZ", "en-GB", "eo", "et", "fo", "fa", "fi", "fr", "fr-CH", "gl", "ge", "de", "el", "he", "hi", "hu", "is", "id", "it", "ja", "kk", "km", "ko", "lv", "lt", "lb", "mk", "ml", "ms", "no", "pl", "pt", "pt-BR", "rm", "ro", "ru", "sr", "sr-SR", "sk", "sl", "es", "sv", "ta", "th", "tj", "tr", "uk", "vi", "cy-GB" }; Collection list = Arrays.asList(languages); public void listFilesInBase(WebPageRequest inReq) { // get a list String path = "/WEB-INF/base/"; String lang = inReq.getRequestParameter("lang"); List translations = gatherTranslations(path, lang); StringBuffer out = new StringBuffer(); for (Iterator iterator = translations.iterator(); iterator.hasNext();) { path = (String) iterator.next(); Page page = getPageManager().getPage(path); out.append(path); out.append("\n"); out.append(page.getContent()); out.append("\n===\n"); } inReq.putPageValue("translations", out.toString()); } public List gatherTranslations(String inPath, String inlang) { List translations = new ArrayList(); List children = getPageManager().getChildrenPaths(inPath); for (Iterator iterator = children.iterator(); iterator.hasNext();) { String path = (String) iterator.next(); if (path.contains("/.versions")) { continue; } if (path.endsWith("_text_" + inlang + ".txt")) { translations.add(path); continue; } // System.out.println("Trying to get page for path: " + path); Page page = getPageManager().getPage(path); if (page.isFolder()) { translations.addAll(gatherTranslations(path, inlang)); } } return translations; } public void saveFiles(WebPageRequest inReq) throws Exception { // take the text and save it String text = inReq.getRequestParameter("translations"); if (text != null) { boolean addnew = Boolean.parseBoolean(inReq .findValue("mergenewcontent")); BufferedReader read = new BufferedReader(new StringReader(text)); String line = null; String filepath = read.readLine(); StringBuffer textout = new StringBuffer(); int c = 0; while ((line = read.readLine()) != null) { if (line.equals("===")) { // save off the last stuff and get ready for next file Page page = getPageManager().getPage(filepath); // dont save to folders that do not exists if (!getPageManager().getPage(page.getParentPath()) .exists()) { continue; } String existing = ""; if (page.exists()) { existing = page.getContent() + "\n"; } String newcontent = textout.toString(); if (!newcontent.equals(existing)) { if (addnew) { // merge together old and new Properties existingprops = new Properties(); existingprops.load(new StringReader(existing)); existingprops.load(new StringReader(newcontent)); StringWriter out = new StringWriter(); existingprops.store(out, null); newcontent = out.toString(); } getPageManager().saveContent(page, inReq.getUser(), newcontent, null); c++; } textout.setLength(0); line = read.readLine(); if (line == null) { break; } filepath = line; } else { textout.append(line); textout.append('\n'); } } inReq.putPageValue("count", String.valueOf(c)); } } public static final String PROPERTIES_FROM_MARKUP = "properties_from_markup"; public Translation getTranslations(WebPageRequest inReq) throws OpenEditException { Translation trans = new Translation(); // get the languages init(inReq, trans); inReq.putPageValue("pageManager", getPageManager()); inReq.putPageValue("translations", trans); return trans; } protected void init(WebPageRequest inReq, Translation inTrans) throws OpenEditException { // #set( $languages = $page.getPageSettings().getProperty("languages") ) PageProperty prop = inReq.getPage().getPageSettings() .getProperty("languages"); if (prop != null) { for (Iterator iter = prop.getValues().keySet().iterator(); iter .hasNext();) { String locale = (String) iter.next(); String name = (String) prop.getValues().get(locale); Language lang = new Language(); lang.setPageManager(getPageManager()); if (locale.length() == 0) { lang.setId("default"); lang.setRootDirectory(""); } else { lang.setId(locale); lang.setRootDirectory("/translations/" + locale); } lang.setName(name); inTrans.addLanguage(lang); } inTrans.sort(); Language browser = createBrowserLang(inReq); inTrans.getLanguages().add(0, browser); } // This is for transition for people who do not have languages setup yet // or upgrades if (inTrans.getLanguages().size() == 0) { Language browser = createBrowserLang(inReq); inTrans.getLanguages().add(browser); Language lang = new Language(); lang.setPageManager(getPageManager()); lang.setId("default"); lang.setName("Language: Use Default"); lang.setRootDirectory(""); inTrans.addLanguage(lang); // TODO: remove this section String done = (String) inReq.getSessionValue("defaultset"); if (done == null) { inReq.putSessionValue("sessionlocale", "default"); inReq.putSessionValue("defaultset", "true"); } } String selectedLang = inReq.getLanguage(); inTrans.setSelectedLang(selectedLang); } protected Language createBrowserLang(WebPageRequest inReq) { Language lang = new Language(); lang.setPageManager(getPageManager()); lang.setId("browser"); Browser browser = (Browser) inReq.getPageValue("browser"); if (browser != null) { lang.setName("Language: " + browser.getLocale()); } lang.setRootDirectory(""); return lang; } public void changeLanguage(WebPageRequest inReq) throws Exception { String newlang = inReq.getRequestParameter("newlang"); getTranslations(inReq); if (newlang != null) { if (newlang.equals("locale_browser")) { inReq.removeSessionValue("sessionlocale"); } else { String locale = newlang.substring("locale_".length()); inReq.putSessionValue("sessionlocale", locale); } String orig = inReq.findValue("origURL"); if (orig != null) { inReq.redirect(orig); } } } // for editing protected Language getEditingLanguage(WebPageRequest inReq) { String id = (String) inReq.getSessionValue("editinglanguage"); Translation trans = (Translation) inReq.getPageValue("translations"); return trans.getLanguage(id); } public void selectElement(WebPageRequest inReq) throws Exception { String eid = inReq.getRequestParameter("elementid"); if (eid != null) { Translation trans = (Translation) inReq .getPageValue("translations"); Language lang = trans.getLanguage(eid); inReq.putSessionValue("editinglanguage", lang.getId()); } } public void loadTranslations(WebPageRequest inReq) { String translationid = inReq.findValue("translationsid"); TranslationSearcher searcher = (TranslationSearcher) getSearcherManager() .getSearcher(translationid, "translation"); inReq.putPageValue("translations", searcher); String locale = inReq.getLocale(); if (locale != null) { if (locale.contains("_")) { locale = locale.substring(0, locale.indexOf("_")); } inReq.putPageValue("lang", locale); } } public void loadBrowserLanguage(WebPageRequest inReq) { HttpServletRequest req = inReq.getRequest(); if (req != null) { Browser browser = new Browser(req.getHeader("User-Agent")); browser.setHttpServletRequest(req); browser.setLocale(req.getLocale()); inReq.putPageValue(PageRequestKeys.BROWSER, browser); } if (inReq.getLocale() != null && req != null && req.getLocale() != null) { String temp = req.getLocale().toString(); temp = temp.replace("_", "-").toLowerCase(); String[] split = temp.split("-"); String browserlanguage = null; if (split.length == 1) { browserlanguage = split[0]; } else { browserlanguage = split[0] + "-" + split[1].toUpperCase(); } if (list.contains(browserlanguage)) { inReq.putPageValue("browserlanguage", browserlanguage); } } } }