]> www.infradead.org Git - users/mchehab/andors-trail.git/commitdiff
Bumped version to v0.6.11dev.
authoroskar.wiksten <oskar.wiksten@08aca716-68be-ccc6-4d58-36f5abd142ac>
Sun, 30 Oct 2011 11:56:46 +0000 (11:56 +0000)
committeroskar.wiksten <oskar.wiksten@08aca716-68be-ccc6-4d58-36f5abd142ac>
Sun, 30 Oct 2011 11:56:46 +0000 (11:56 +0000)
Added initial implementation of translation validator.

git-svn-id: https://andors-trail.googlecode.com/svn/trunk@193 08aca716-68be-ccc6-4d58-36f5abd142ac

AndorsTrail/.classpath
AndorsTrail/AndroidManifest.xml
AndorsTrail/project.properties [new file with mode: 0644]
AndorsTrail/src/com/gpl/rpg/AndorsTrail/AndorsTrailApplication.java
AndorsTrailEdit/AndorsTrailTranslations.js [new file with mode: 0644]
AndorsTrailEdit/editor.html
AndorsTrailEdit/styles2.css
AndorsTrailEdit/translations.html [new file with mode: 0644]

index 609aa00ebc435903afc092a93454eba658531c0f..6c635c01d50ff53eac279f3c78174168e37a7517 100644 (file)
@@ -3,5 +3,5 @@
        <classpathentry kind="src" path="src"/>
        <classpathentry kind="src" path="gen"/>
        <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-       <classpathentry kind="output" path="bin"/>
+       <classpathentry kind="output" path="bin/classes"/>
 </classpath>
index 84a26f9aaa95083ab6134d6a971f5c69c55459c7..c31745213145d89f2fd2dd3cfe650686a8592d4d 100644 (file)
@@ -4,7 +4,7 @@
        xmlns:android="http://schemas.android.com/apk/res/android" 
        package="com.gpl.rpg.AndorsTrail"
        android:versionCode="25"
-       android:versionName="0.6.10"
+       android:versionName="0.6.11dev"
        android:installLocation="auto"
        >
        <uses-sdk 
diff --git a/AndorsTrail/project.properties b/AndorsTrail/project.properties
new file mode 100644 (file)
index 0000000..f049142
--- /dev/null
@@ -0,0 +1,11 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system use,
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+
+# Project target.
+target=android-10
index 754d978a7003b0ffed1ce5a67dc64c3a5fe26c7e..2ecf4e6d45573efc6b20d397d237f28719f41a69 100644 (file)
@@ -20,7 +20,7 @@ public final class AndorsTrailApplication extends Application {
        public static final boolean DEVELOPMENT_VALIDATEDATA = false;\r
        public static final boolean DEVELOPMENT_DEBUGMESSAGES = false;\r
        public static final int CURRENT_VERSION = 25;\r
-       public static final String CURRENT_VERSION_DISPLAY = "0.6.10";\r
+       public static final String CURRENT_VERSION_DISPLAY = "0.6.11dev";\r
        \r
        public final WorldContext world = new WorldContext();\r
        public final WorldSetup setup = new WorldSetup(world, this);\r
diff --git a/AndorsTrailEdit/AndorsTrailTranslations.js b/AndorsTrailEdit/AndorsTrailTranslations.js
new file mode 100644 (file)
index 0000000..418fd30
--- /dev/null
@@ -0,0 +1,255 @@
+function IncludeJavascript(jsFile) {
+       document.write('<script type="text/javascript" src="' + jsFile + '"></scr' + 'ipt>'); 
+}
+
+IncludeJavascript("FieldList.js");
+IncludeJavascript("DataStore.js");
+
+var translateFiles = [ 
+       'strings.xml', 
+       'content_actorconditions.xml',
+       'content_conversationlist.xml',
+       'content_droplist.xml',
+       'content_itemlist.xml',
+       'content_monsterlist.xml',
+       'content_questlist.xml'
+];
+var translations = [ 
+       { name: 'French', id: 'values-fr', files: [ 
+               'content_actorconditions.xml', 
+               'content_conversationlist.xml', 
+               'content_itemlist.xml', 
+               'content_questlist.xml',
+               'strings.xml'
+       ]},
+       { name: 'Italian', id: 'values-it', files: [ 
+               'content_actorconditions.xml', 
+               'content_conversationlist.xml', 
+               'content_itemlist.xml', 
+               'content_questlist.xml',
+               'strings.xml'
+       ]},
+       { name: 'German', id: 'values-de', files: [ 
+               'content_actorconditions.xml', 
+               'content_itemlist.xml', 
+               'strings.xml'
+       ]},
+       { name: 'Hebrew', id: 'values-iw', files: [ 
+               'strings.xml'
+       ]},
+       { name: 'Russian', id: 'values-ru', files: [ 
+               'content_conversationlist.xml', 
+               'content_itemlist.xml', 
+               'content_questlist.xml',
+               'strings.xml'
+       ]}
+];
+
+function stepRight(divToHide, divToShow, onComplete) {
+       $(divToHide).hide('slow');
+       $(divToShow).fadeIn('slow', onComplete);
+}
+function stepLeft(divToHide, divToShow) {
+       $(divToHide).fadeOut('slow');
+       $(divToShow).show('slow');
+}
+
+function loadResourceFile(filename, onSuccess) {
+       var url = document.location.href;
+       url = url.substring(0, url.lastIndexOf('/'));
+       url = url.substring(0, url.lastIndexOf('/'));
+       url += "/AndorsTrail/res/" + filename;
+       //var url = "http://andors-trail.googlecode.com/svn/trunk/AndorsTrail/res/" + filename;
+       $.get(url, function(data) {
+               onSuccess(data);
+       }, 'text');
+}
+
+function addSelectOption(sel, val, text) {
+       if (!text) { text = val; }
+       sel.append($("<option/>").attr("value", val).text(text));
+}
+
+function addSelectOptions(sel, array) {
+       array.forEach(function(obj) { addSelectOption( sel , obj); } );
+}
+
+function loadStep2() {
+       var possibleExistingFiles = [];
+       var selectedSourceFile = $("#englishFiles").val();
+       translations.forEach(function(t) {
+               if ($.inArray(selectedSourceFile, t.files) > -1) {
+                       possibleExistingFiles.push(t.id + "/" + selectedSourceFile);
+               }
+       });
+       $("#compareToExisting").empty();
+       addSelectOptions( $("#compareToExisting"), possibleExistingFiles );
+       stepRight("#validate1", "#validate2"); 
+}
+
+function pushMessage(res, msg) {
+       res.class2 = "yellow"; 
+       res.messages.push(msg);
+       return res;
+}
+
+function compareAndorsTrailResourceRow(result, fieldList, id, obj1, obj2) {
+       for (var i = 0; i < fieldList._fields.length; ++i) {
+               var f = fieldList._fields[i];
+               var fieldName = fieldList.getFieldName(i);
+               if (f instanceof FieldList) {
+                       fieldName = f._name;
+               }
+               var isTranslatableField = (fieldName == "name" || fieldName == "logText" || fieldName == "message" || fieldName == "text");
+               var f1 = obj1[fieldName];
+               var f2 = obj2[fieldName];
+               
+               if (f instanceof FieldList) {
+                       if (!f2) { f2 = []; }
+                       if (f1.length != f2.length) {
+                               pushMessage(result, "Row \"" + id + "\", field \"" + fieldName + "\" was expected to contain " + f1.length + " sub-entries, but only " + f2.length + " was found.");
+                               continue;
+                       }
+                       $.each(f1, function(i, obj) {
+                               var id_ = id + ":" + obj[f._fields[0]];
+                               compareAndorsTrailResourceRow(result, f, id_, f1[i], f2[i]);
+                       });
+               } else {
+                       if (isTranslatableField && f1.length > 1) {
+                               if (f1 == f2) {
+                                       pushMessage(result, "Row \"" + id + "\", field \"" + fieldName + "\" does not seem to be translated. Both texts are \"" + f1 + "\".");
+                               }
+                       } else {
+                               if (f1 != f2) {
+                                       pushMessage(result, "Row \"" + id + "\", field \"" + fieldName + "\" was expected to contain \"" + f1 + "\", but \"" + f2 + "\" was found.");
+                               }
+                       }
+               }
+       }
+}
+
+function compareAndorsTrailResourceFormat(text1, text2) {
+       var result = { isResource: true, class1: "ok", class2: "ok", messages: [] };
+       
+       var header1 = findHeader(text1);
+       if (!header1) { return { isResource: false }; }
+       
+       var header2 = findHeader(text2);
+       if (!header2) { result.class2 = "red"; return result; }
+       
+       var ds1 = new DataStore({});
+       var ds2 = new DataStore({});
+       ds1.deserialize(text1);
+       ds2.deserialize(text2);
+       $.each(ds1.items, function(i, obj) {
+               var obj1 = obj;
+               var obj2 = ds2.get(i);
+               var id1 = obj1[header1._fields[0]];
+               if (!obj2) { return pushMessage(result, "Row " + i + ": expected to find an object with id \"" + id1 + "\", but such row was found."); }
+               var id2 = obj2[header1._fields[0]];
+               if (id2 != id1) { return pushMessage(result, "Row " + i + ": Expected to find id \"" + id1 + "\", but found \"" + id2 + "\" instead."); }
+               
+               compareAndorsTrailResourceRow(result, header1, id1, obj1, obj2);
+       });
+       return result;
+}
+
+function appendOutputRow(outputTable, name, data1, data2) {
+       if ($("#" + name, outputTable).size() > 0) return;
+       
+       var text1 = data1.find("string[name=\"" + name + "\"]").text();
+       var text2 = data2.find("string[name=\"" + name + "\"]").text();
+       var class1 = text1 ? "ok" : "red";
+       var class2 = text2 ? "ok" : "red";
+       var tdTranslated = $("<td />");
+       if (text1 && text2) {
+               var resourceComparison = compareAndorsTrailResourceFormat(text1, text2);
+               if (resourceComparison.isResource) {
+                       class1 = resourceComparison.class1;
+                       class2 = resourceComparison.class2;
+                       if (resourceComparison.messages.length > 0) {
+                               var errorList = $("<ul />").attr("id", "validationWarnings");
+                               $.each(resourceComparison.messages, function(i, msg) {
+                                       errorList.append($("<li />").text(msg));
+                               });
+                               var d = $("<span />").attr("id", "showValidationWarnings").text("Expand");
+                               d.click(function() {
+                                       d.hide();
+                                       errorList.show();
+                               });
+                               tdTranslated.append(d);
+                               tdTranslated.append(errorList);
+                               errorList.hide();
+                       }
+               }
+       }
+       
+       outputTable.append(
+               $("<tr />")
+                       .attr("id", name)
+                       .append($("<td />").text(name))
+                       .append($("<td />").attr("class", class1))
+                       .append(tdTranslated.attr("class", class2))
+       );
+}
+
+function validateTranslation_(englishData) {
+       $("#englishData").text(englishData);
+       var compareData1 = $( englishData );
+       var compareData2 = $( $("#compareToInput").val() );
+       
+       var resultTable = $("#validateResultContent table");
+       var outputTable = $("tbody", resultTable );
+       outputTable.empty();
+       
+       compareData1.find("string").each(function() {
+               appendOutputRow(outputTable, $(this).attr("name"), compareData1, compareData2);
+       });
+       compareData2.find("string").each(function() {
+               appendOutputRow(outputTable, $(this).attr("name"), compareData1, compareData2);
+       });
+       
+       var sectionCount = $("tr", outputTable).size();
+       var errors1 = sectionCount - $("td:nth-child(2).ok", outputTable).size();
+       var errors2 = sectionCount - $("td:nth-child(3).ok", outputTable).size();;
+       $("th #count1", resultTable).text( (errors1 > 0) ? " (" + errors1 + ")" : "" );
+       $("th #count2", resultTable).text( (errors2 > 0) ? " (" + errors2 + ")" : "" );
+       
+       $("#validateResultContent #loading").hide();
+       $("#validateResultContent #result").show();
+}
+function validateTranslation(englishData) {
+       try {
+               validateTranslation_(englishData);
+       } catch (err) {
+               alert(err);
+       }
+}
+
+
+function loadStep3() {
+       var compareToContent = $("#compareToInput").val();
+       if (compareToContent.length <= 0) {
+               alert("You must enter (or import) some translated content to compare.");
+               return;
+       }
+       
+       $("#validateResultContent #loading").show();
+       $("#validateResultContent #result").hide();
+       stepRight("#validate2", "#validateResult", function() { 
+               loadResourceFile( "values/" + $("#englishFiles").val() , validateTranslation )
+       });
+}
+
+function startTranslationValidator() {
+       addSelectOptions( $("#englishFiles"), translateFiles );
+       
+       $("#next1").button({ icons: {primary:'ui-icon-arrowthick-1-e'} }).click(loadStep2);
+       $("#prev2").button({ icons: {primary:'ui-icon-arrowthick-1-w'} }).click(function() { stepLeft("#validate2", "#validate1"); });
+       $("#btnImportFromSVN").button().click(function() {
+               $("#compareToInput").val("Loading...");
+               loadResourceFile( $("#compareToExisting").val(), function(data) { $("#compareToInput").val(data); } );
+       });
+       $("#next2").button({ icons: {primary:'ui-icon-arrowthick-1-e'} }).click(loadStep3);
+       $("#prev3").button({ icons: {primary:'ui-icon-arrowthick-1-w'} }).click(function() { stepLeft("#validateResult", "#validate2"); });
+}
index a0651e19590c20e5b7926a707f2520b9e197eb2b..e3fdfed1248fae75c95132dd42ef4dcce67919f9 100644 (file)
@@ -2,7 +2,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml">\r
 <head>\r
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\r
-       <link rel="shortcut icon" href="http://andors.techby2guys.com/favicon.ico"/>    \r
+       <link rel="shortcut icon" href="http://andorstrail.com/favicon.ico"/>   \r
        <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.11/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>\r
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>\r
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.11/jquery-ui.min.js"></script>\r
index db77b637a30b7059557f67934ece894744693fa2..60bd7a9e6173fb28bba2c5fc21415324cc07bd11 100644 (file)
@@ -9,6 +9,7 @@ html,body                                       { margin:0; padding:0; height: 100%; font-size: 0.9em; }
 #screen #left                          { width: 250px; padding: 0px; font-size: 1em; }
 #screen #center                        { left: 256px; right: 0; }
 #screen #center #tabs          { border: 0px; padding: 0px; }
+#screen #centerwide            { left: 0px; right: 0; }
 
 .ui-icon-close                                 { float: left; margin: 0.4em 0.2em 0 0; cursor: pointer; }
 .hidden                                        { display: none; }
@@ -40,3 +41,16 @@ input[readonly]                              { color: #888; }
 .imageButton                           { padding: 5px; }
 .importexport-description      { padding: 15px; text-align: right; }
 .tools-buttons                         { padding-bottom: 10px; }
+
+.validateStep                          { border: 1px #d7d7ff solid; background-color: white; padding: 1em; margin: 2em; float: left; }
+.validateStep h1                       { font-size: 1.1em; }
+.validateStep h1 .number       { font-size: 1.3em; font-weight: bold; text-shadow: rgba(0, 0, 0, 0.3) 1px 1px 1px; }
+.validateStep .buttons         { padding-top: 10px; }
+#validateResultContent table                                                   { border-collapse: collapse; margin-bottom: 1ex; }      
+#validateResultContent table th,td                                             { border: 1px #ccc solid; text-align: left; }
+#validateResultContent table tbody tr:nth-child(even)  { background-color: #eee }
+#validateResultContent table .ok                                               { background-color: green; }
+#validateResultContent table .red                                              { background-color: red; }
+#validateResultContent table .yellow                                   { background-color: yellow; }
+#showValidationWarnings                        { cursor: pointer; }
+#showValidationWarnings:hover  { background-color: #d7d7ff; }
diff --git a/AndorsTrailEdit/translations.html b/AndorsTrailEdit/translations.html
new file mode 100644 (file)
index 0000000..6bd78ec
--- /dev/null
@@ -0,0 +1,91 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\r
+       <link rel="shortcut icon" href="http://andorstrail.com/favicon.ico"/>   \r
+       <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.11/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>\r
+       <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>\r
+       <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.11/jquery-ui.min.js"></script>\r
+       \r
+       <link rel="stylesheet" type="text/css" href="styles2.css" />\r
+       <link rel="stylesheet" type="text/css" href="inc/ui.dynatree.css" />\r
+       <script type="text/javascript" src="AndorsTrailTranslations.js"></script>\r
+       <title>Andor's Trail Translation validator</title>\r
+</head>\r
+<body>\r
+\r
+<div id="screen">\r
+<div id="top">\r
+       <div class="andorsTrailLogo" id="title">\r
+               Andor's Trail Translation validator\r
+               <span id="version">\r
+                       v0.6.10dev1\r
+               </span>\r
+       </div>\r
+</div>\r
+\r
+<div id="centerwide" class="workarea">\r
+\r
+       <div id="validate1" class="validateStep">\r
+               <h1><span class="number">1.</span> Select source file</h1>\r
+               \r
+               <p>Select (English) file to compare against.</p>\r
+               <select id="englishFiles"></select>\r
+               <input type="hidden" id="englishData" />\r
+               \r
+               <div class="buttons">\r
+                       <span id="next1">Next</span>\r
+               </div>\r
+       </div>\r
+       \r
+       <div id="validate2" class="validateStep" style="display: none;">\r
+               <h1><span class="number">2.</span> Compare to</h1>\r
+               \r
+               <p>Select translation to validate</p>\r
+               <p>Import existing file from SVN, or manually paste the content you want to validate.</p>\r
+               \r
+               <div id="importFromSVN">\r
+                       Import from SVN\r
+                       <select id="compareToExisting"></select>\r
+                       <span id="btnImportFromSVN">Import</span>\r
+               </div>\r
+               \r
+               <p>Content to validate:</p>\r
+               <textarea id="compareToInput" rows="6" cols="50"></textarea>\r
+               \r
+               <div class="buttons">\r
+                       <span id="prev2">Back</span>\r
+                       <span id="next2">Validate</span>\r
+               </div>\r
+       </div>\r
+       \r
+       <div id="validateResult" class="validateStep" style="display: none;">\r
+               <h1><span class="number">3.</span> Results</h1>\r
+       \r
+               <div id="validateResultContent">\r
+                       <div id="loading">Loading &amp; validating</div>\r
+                       <table id="result">\r
+                               <thead><tr>\r
+                                       <th>id</th>\r
+                                       <th>English<span id="count1" /></th>\r
+                                       <th>Translated<span id="count2" /></th>\r
+                               </tr></thead>\r
+                               <tbody>\r
+                               </tbody>\r
+                       </table>\r
+               </div>\r
+               \r
+               <div class="buttons">\r
+                       <span id="prev3">Back</span>\r
+               </div>\r
+       </div>\r
+</div>\r
+\r
+</div>\r
+\r
+<script type="text/javascript">\r
+$(document).ready(startTranslationValidator);\r
+</script>\r
+\r
+</body>\r
+</html>\r