[Jrisk-cvs] SF.net SVN: jrisk:[546] XcodeTranslationTool/src/net/yura
Brought to you by:
yuranet
From: <yu...@us...> - 2011-10-13 18:03:39
|
Revision: 546 http://jrisk.svn.sourceforge.net/jrisk/?rev=546&view=rev Author: yuranet Date: 2011-10-13 18:03:29 +0000 (Thu, 13 Oct 2011) Log Message: ----------- export to android added Modified Paths: -------------- XcodeTranslationTool/src/net/yura/translation/plugins/xcode/Project.java XcodeTranslationTool/src/net/yura/translation/plugins/xcode/XcodeComm.java XcodeTranslationTool/src/net/yura/translation/plugins/xcode/XcodeTranslationTool.java Added Paths: ----------- XcodeTranslationTool/src/net/yura/util/AndroidExport.java Modified: XcodeTranslationTool/src/net/yura/translation/plugins/xcode/Project.java =================================================================== --- XcodeTranslationTool/src/net/yura/translation/plugins/xcode/Project.java 2011-10-10 10:02:13 UTC (rev 545) +++ XcodeTranslationTool/src/net/yura/translation/plugins/xcode/Project.java 2011-10-13 18:03:29 UTC (rev 546) @@ -11,11 +11,14 @@ import java.io.IOException; import java.io.InputStreamReader; import java.nio.channels.FileChannel; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Comparator; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Vector; @@ -31,6 +34,7 @@ class Project { public static final Locale SCREEN_LOCALE = new Locale("screens"); + private final Locale DEFAULT; private final File file, screen; private final PropertyListConfiguration properties = new PropertyListConfiguration(); private final HashMap<Locale, Localization> map = new HashMap(); @@ -38,6 +42,18 @@ private long lastKeyAdded; public Project(File xcodeproj, File lproj) throws IOException { + + String name = lproj.getName(); + name = name.substring(0, name.length()-6); + + String[] names = name.split("-"); + switch (names.length) { + case 1: DEFAULT = new Locale(names[0]); break; + case 2: DEFAULT = new Locale(names[0],names[1]); break; + case 3: DEFAULT = new Locale(names[0],names[1],names[2]); break; + default: throw new RuntimeException(); + } + this.file = new File(xcodeproj, "project.pbxproj"); this.screen = new File(xcodeproj.getParent() + "/translation", "screens.strings"); new File(screen.getParentFile(), "screens/").mkdirs(); @@ -201,23 +217,36 @@ String key = fileAdded(file); properties.setProperty("objects." + key + ".lastKnownFileType", "file.xib"); } + + public Locale[] getLocales() { - public static Locale[] getLocales() { + List alist = new ArrayList( Arrays.asList( Locale.getAvailableLocales() ) ); + + Locale tl = new Locale("tl"); // Tagalog + if (!alist.contains(tl)) { + alist.add(tl); + } - Locale[] a = Locale.getAvailableLocales(); - Arrays.sort(a, new Comparator() { - + // if we have the default in this list, then remove it + alist.remove(DEFAULT); + + // sort + Collections.sort(alist, new Comparator() { public int compare(Object o1, Object o2) { - + // put screens locale at the end + //if (o1 == SCREEN_LOCALE && o2 == SCREEN_LOCALE) return 0; + //if (o1 == SCREEN_LOCALE) return 1; + //if (o2 == SCREEN_LOCALE) return -1; return o1.toString().compareToIgnoreCase(o2.toString()); - } }); - Locale l[] = new Locale[a.length + 1]; - System.arraycopy(a, 0, l, 0, a.length); - l[a.length] = SCREEN_LOCALE; + + alist.add(SCREEN_LOCALE); + + // add screens locale to the end + Locale l[] = new Locale[alist.size()]; + alist.toArray(l); return l; - } /** Modified: XcodeTranslationTool/src/net/yura/translation/plugins/xcode/XcodeComm.java =================================================================== --- XcodeTranslationTool/src/net/yura/translation/plugins/xcode/XcodeComm.java 2011-10-10 10:02:13 UTC (rev 545) +++ XcodeTranslationTool/src/net/yura/translation/plugins/xcode/XcodeComm.java 2011-10-13 18:03:29 UTC (rev 546) @@ -87,7 +87,7 @@ } //TODO: Badoo.xcodeproj specific - File file = new File(selectedFile.getParentFile(), "en.lproj"); + File file = new File(selectedFile.getParentFile(), "en.lproj"); // default to english //default to english if possible if (file.exists()) { project = new Project(selectedFile, file); @@ -196,7 +196,7 @@ } public Locale[] getLocales() { - return Project.getLocales(); + return project.getLocales(); } public Result[] search(String s) throws Exception { Modified: XcodeTranslationTool/src/net/yura/translation/plugins/xcode/XcodeTranslationTool.java =================================================================== --- XcodeTranslationTool/src/net/yura/translation/plugins/xcode/XcodeTranslationTool.java 2011-10-10 10:02:13 UTC (rev 545) +++ XcodeTranslationTool/src/net/yura/translation/plugins/xcode/XcodeTranslationTool.java 2011-10-13 18:03:29 UTC (rev 546) @@ -1,21 +1,28 @@ package net.yura.translation.plugins.xcode; +import net.yura.util.AndroidExport; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; import java.util.Iterator; import java.util.List; +import java.util.Locale; import java.util.regex.Pattern; import javax.swing.ImageIcon; +import javax.swing.JButton; import javax.swing.JComponent; +import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JList; +import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; @@ -25,6 +32,7 @@ import javax.swing.event.ListSelectionListener; import javax.swing.event.TreeSelectionEvent; import net.yura.translation.MessageTool; +import net.yura.translation.Mtcomm; import net.yura.translation.MyNode; /** @@ -194,7 +202,7 @@ public static void main(String[] args) { String myName = "Xcode"; - String myVer= "1.5"; + String myVer= "1.6"; // crazy hack for OS X to not spam my email // Failed to create resources from application bundle. Using Java-based resources. @@ -208,7 +216,7 @@ System.out.println("failed to load Grasshopper"); } - XcodeTranslationTool tt = new XcodeTranslationTool(); + final XcodeTranslationTool tt = new XcodeTranslationTool(); final JFrame frame = new JFrame( tt.getName()+ " "+myName+" "+myVer); frame.getContentPane().add(tt.getToolBar(), BorderLayout.NORTH); //frame.getContentPane().add( tt ); @@ -216,6 +224,49 @@ frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(new BorderLayout()); + + + + + JButton button = new JButton("Export for Android"); + button.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + Mtcomm comms = tt.getPlugin(); + + if (comms!=null) { + + JFileChooser chooser = new JFileChooser(); + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + + int result = chooser.showSaveDialog(frame); + + if (result == JFileChooser.APPROVE_OPTION) { + + try { + + Locale[] a = comms.getLocales(); + + // remove last SCREEN_LOCALE + Locale l[] = new Locale[a.length - 1]; + System.arraycopy(a, 0, l, 0, l.length); + + AndroidExport.export(comms, chooser.getSelectedFile() , l); + + JOptionPane.showMessageDialog(frame, "Done"); + } + catch (Exception ex) { + ex.printStackTrace(); + } + + } + + } + } + }); + + + + panel.add(button, BorderLayout.NORTH); panel.add(new JScrollPane(tt.list)); panel.add(tt.preview, BorderLayout.SOUTH); //panel.setMinimumSize( new Dimension(50, 50) ); Added: XcodeTranslationTool/src/net/yura/util/AndroidExport.java =================================================================== --- XcodeTranslationTool/src/net/yura/util/AndroidExport.java (rev 0) +++ XcodeTranslationTool/src/net/yura/util/AndroidExport.java 2011-10-13 18:03:29 UTC (rev 546) @@ -0,0 +1,148 @@ +package net.yura.util; + +import java.io.File; +import java.io.FileOutputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import net.yura.mobile.io.kxml2.KXmlSerializer; +import org.xmlpull.v1.XmlSerializer; +import net.yura.translation.Mtcomm; +import net.yura.translation.MyNode; + +/** + * @author Yura + */ +public class AndroidExport { + + public static final String resources = "resources"; + public static final String string = "string"; + public static final String name = "name"; + + public static void export(Mtcomm comms, File resDir, Locale[] locales) throws Exception { + + MyNode root = new MyNode("ROOT", false, true); + //root.loadChildren(comms, locales[0]); // TODO just pass any loacle in here??? + + // export default locale + export(null, root, comms, resDir); + + // export all other locales + for (int c=0;c<locales.length;c++) { + export(locales[c], root, comms, resDir); + } + } + + static void export(Locale l,MyNode root,Mtcomm comms,File resDir) throws Exception { + + Map map = new HashMap(); + addToMap(root, map, comms, l); + + if (map.size() > 0) { + + File file = new File(resDir,"values"+(l==null?"":"-"+toString(l))+"/strings.xml"); + + export(map, file); + } + + } + + static void addToMap(MyNode node,Map map,Mtcomm comms, Locale locale) throws Exception { + + if (node.hasMessage()) { + //String message = node.getMessage(comms, null, locale); + String message = comms.getMessage(node, null, locale); + if (message!=null) { + + // we need to conver %@ and %a to {1} + String oldMessage; + int c=0; + do { + oldMessage = message; // TODO does not support %2.2f + message = message.replaceFirst("%[A-Za-z@]", "{"+(c++)+"}"); + + } while (!message.equals(oldMessage)); + + map.put(node.getName(), message); + } + } + if (node.hasChildren()) { + + node.loadChildren(comms, locale); + + //if (locale==null) { // TODO ??? only for default locale + // //comms.addChildren(node); // this is not good enough as does not remove dummy node + //} + + int count = node.getChildCount(); + for (int c=0;c<count;c++) { + MyNode child = (MyNode)node.getChildAt(c); + + addToMap(child, map, comms, locale); + } + } + + } + + + static void export(Map map, File outFile) throws Exception { + + + outFile.getParentFile().mkdirs(); + outFile.createNewFile(); + + FileOutputStream output = new FileOutputStream(outFile); + + List keys = new ArrayList( map.keySet() ); + Collections.sort(keys); + + XmlSerializer serializer = new KXmlSerializer(); + serializer.setOutput(output,"UTF-8"); + serializer.startDocument("UTF-8", null); + + serializer.startTag(null,resources); + + for (Iterator e = keys.iterator(); e.hasNext();) { + String key = String.valueOf( e.next() ); + + serializer.startTag(null,string); + serializer.attribute(null, name, key ); + serializer.text( String.valueOf( map.get(key) ) ); + serializer.endTag(null,string); + + } + + serializer.endTag(null,resources); + + serializer.endDocument(); + serializer.flush(); + + + } + + + /** + * Android uses "en-rGB" and not "_" + */ + public static String toString(Locale locale) { + String language = locale.getLanguage(); + String country = locale.getCountry(); + String variant = locale.getVariant(); + boolean l = language.length() != 0; + boolean c = country.length() != 0; + boolean v = variant.length() != 0; + StringBuilder result = new StringBuilder(language); + if (c||(l&&v)) { + result.append("-r").append(country); // This may just append '_' + } + if (v&&(l||c)) { + result.append("-v").append(variant); // TODO Android does not support variant + } + return result.toString(); + } + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |