diff --git a/htroot/TransNews_p.html b/htroot/TransNews_p.html index e2efd38f6..d5b755c02 100644 --- a/htroot/TransNews_p.html +++ b/htroot/TransNews_p.html @@ -17,6 +17,7 @@   You can check your outgoing messages here

+ #(errmsg)#::

Please activate a different language here

#(/errmsg)# #{results}# diff --git a/htroot/TransNews_p.java b/htroot/TransNews_p.java index 829c0d488..5a2ab53aa 100644 --- a/htroot/TransNews_p.java +++ b/htroot/TransNews_p.java @@ -52,15 +52,28 @@ public class TransNews_p { String currentlang = sb.getConfig("locale.language", "default"); prop.put("currentlang", currentlang); - TranslatorXliff transx = new TranslatorXliff(); - File langFile = transx.getScratchFile(new File(currentlang + ".lng")); - TranslationManager trans = new TranslationManager(langFile); - prop.put("transsize", trans.size()); + if ("default".equals(currentlang) || "browser".equals(currentlang)) { + prop.put("errmsg", 1); // msg: activate diff lng + prop.put("transsize", 0); + return prop; + } else { + prop.put("errmsg", 0); + } + + TranslationManager transMgr = new TranslationManager(); + File locallangFile = transMgr.getScratchFile(new File(currentlang + ".lng")); + Map> localTrans = transMgr.loadTranslationsLists(locallangFile); + // calculate size of local translations list + int size = 0; + for (Map lst : localTrans.values()) { + size += lst.size(); + } + prop.put("transsize", size); + // read voting if ((post != null) && post.containsKey("publishtranslation")) { - Map> localTrans = trans.loadTranslationsLists(langFile); Iterator filenameit = localTrans.keySet().iterator(); while (filenameit.hasNext()) { String file = filenameit.next(); @@ -77,7 +90,7 @@ public class TransNews_p { continue; } if (NewsPool.CATEGORY_TRANSLATION_ADD.equals(rtmp.category())) { - String tmplng = rtmp.attribute("language", null); + //String tmplng = rtmp.attribute("language", null); String tmpfile = rtmp.attribute("file", null); String tmpsource = rtmp.attribute("source", null); String tmptarget = rtmp.attribute("target", null); @@ -143,22 +156,22 @@ public class TransNews_p { } if ((post != null) && ((refid = post.get("votePositive", null)) != null)) { - if (!sb.verifyAuthentication(header)) { - prop.authenticationRequired(); - return prop; - } - // add to local translation extension - if (trans.addTranslation(post.get("filename"), post.get("source"), post.get("target"))) { - File f = new File(currentlang + ".lng"); - f = trans.getScratchFile(f); - trans.saveLng(currentlang, f); - } + + final String filename = post.get("filename"); + + File lngfile = new File(sb.getAppPath("locale.source", "locales"), currentlang + ".lng"); + transMgr = new TranslationManager(lngfile); // load full language for check if entry is new (globally) + if (transMgr.addTranslation(filename, post.get("source"), post.get("target"))) { + // add to local translation extension + transMgr.addTranslation(localTrans, filename, post.get("source"), post.get("target")); + transMgr.saveAsLngFile(currentlang, locallangFile, localTrans); // save local-trans to local-file + transMgr.translateFile(filename); // ad-hoc translate file with new/added text + } // TODO: shall we post voting if translation is not new ? // make new news message with voting final HashMap map = new HashMap(); - map.put("language", currentlang); - map.put("file", crypt.simpleDecode(post.get("filename", ""))); + map.put("file", crypt.simpleDecode(filename)); map.put("source", crypt.simpleDecode(post.get("source", ""))); map.put("target", crypt.simpleDecode(post.get("target", ""))); map.put("vote", "positive"); @@ -168,6 +181,7 @@ public class TransNews_p { sb.peers.newsPool.moveOff(NewsPool.INCOMING_DB, refid); } catch (IOException | SpaceExceededException ex) { } + } // create Translation voting list @@ -187,7 +201,7 @@ public class TransNews_p { String target; while (k.hasNext()) { - String existingtarget = null; + refid = k.next(); if (refid == null) { continue; @@ -206,7 +220,12 @@ public class TransNews_p { continue; } - existingtarget = trans.getTranslation(filename, source); + + String existingtarget = null; //transMgr.getTranslation(filename, source); + Map tmpMap = localTrans.get(filename); + if (tmpMap != null) { + existingtarget = tmpMap.get(source); + } boolean altexist = existingtarget != null && !target.isEmpty() && !existingtarget.isEmpty() && !existingtarget.equals(target); diff --git a/source/net/yacy/utils/translation/TranslationManager.java b/source/net/yacy/utils/translation/TranslationManager.java index 8cd1fd6f8..afc2fba67 100644 --- a/source/net/yacy/utils/translation/TranslationManager.java +++ b/source/net/yacy/utils/translation/TranslationManager.java @@ -40,6 +40,8 @@ import java.util.Map; import java.util.TreeMap; import net.yacy.cora.util.ConcurrentLog; import net.yacy.data.Translator; +import net.yacy.search.Switchboard; +import net.yacy.search.SwitchboardConstants; /** * Utility to create a translation master file from all existing translation @@ -50,6 +52,7 @@ import net.yacy.data.Translator; public class TranslationManager extends TranslatorXliff { protected Map> mainTransLists; // current translation entries for one language + protected String loadedLng; // language loaded in mainTransLists (2-letter code) public TranslationManager() { super(); @@ -57,6 +60,10 @@ public class TranslationManager extends TranslatorXliff { public TranslationManager(final File langfile) { mainTransLists = loadTranslationsLists(langfile); + int pos = langfile.getName().indexOf('.'); + if (pos >= 0) { + loadedLng = langfile.getName().substring(0, pos); + } } /** @@ -125,6 +132,35 @@ public class TranslationManager extends TranslatorXliff { return null; } + /** + * Translates one file. The relFilepath is the file name as given in the + * translation source lists. The source (english) file is expected under + * htroot path. The destination file is under DATA/LOCALE and calculated + * using the language of loaded data. + * + * @param relFilepath file name releative to htroot + * @return true on success + */ + public boolean translateFile(String relFilepath) { + assert loadedLng != null; + assert mainTransLists != null; + + boolean result = false; + if (mainTransLists.containsKey(relFilepath)) { + Switchboard sb = Switchboard.getSwitchboard(); + if (sb != null) { + final String htRootPath = sb.getConfig(SwitchboardConstants.HTROOT_PATH, SwitchboardConstants.HTROOT_PATH_DEFAULT); + final File sourceDir = new File(sb.getAppPath(), htRootPath); + final File destDir = new File(sb.getDataPath("locale.translated_html", "DATA/LOCALE/htroot"), loadedLng); + // get absolute file by adding relative filename + final File sourceFile = new File(sourceDir, relFilepath); + final File destFile = new File(destDir, relFilepath); + result = translateFile(sourceFile, destFile, mainTransLists.get(relFilepath)); // do the translation + } + } + return result; + } + /** * Create a master translation list by reading all translation files * If a masterOutputFile exists, content is preserved (loaded first) @@ -256,33 +292,4 @@ public class TranslationManager extends TranslatorXliff { } return i; } - - /** - * for testing to create on master and joined translation results for all lang's - * - * @param args - */ - public static void main(String args[]) { - File outputdirectory = new File("test/DATA"); - if (!outputdirectory.exists()) { - outputdirectory.mkdir(); - } - File xlfmaster = new File(outputdirectory, "master.lng.xlf"); - TranslationManager ctm = new TranslationManager(xlfmaster); - try { - ctm.createMasterTranslationLists(xlfmaster); // write the language neutral translation master as xliff - - List lngFiles = Translator.langFiles(new File("locales")); - for (String filename : lngFiles) { - Map> lngmaster = ctm.joinMasterTranslationLists(xlfmaster, new File("locales", filename)); // create individual language translation files from master - File xlftmp = new File(outputdirectory, filename + ".xlf"); - System.out.println("output new master translation file " + xlftmp.toString() + " and " + filename); - ctm.saveAsXliff(filename.substring(0, 2), xlftmp, lngmaster); - ctm.saveAsLngFile(filename.substring(0, 2), new File(outputdirectory, filename), lngmaster); - } - } catch (IOException ex) { - ConcurrentLog.logException(ex); - } - ConcurrentLog.shutdown(); - } }