2011-11-04 36 views
3

我有一個谷歌電子表格的所有我的strings.xml資源的翻譯。每種語言都是一列。第一列是字符串資源ID。你是否知道我可以使用的工具(或宏或任何其他工具),這些工具可以讓我將我的電子表格重新導出爲具有適當區域後綴的strings.xml格式? (後綴是電子表格的第一行)自動化電子表格到strings.xml進行本地化

感謝

+1

我想出的解決方案是將電子表格導出爲CSV格式,然後編寫一個動作程序,將CSV分解爲XML並將其保存到每個區域的文件中。翻譯中包含逗號時出現了一些問題。但是這隻剩下大約5個字段,而不是76個。 –

+0

我想你可以在你導出excel時選擇分隔字符。我知道它確實支持tab作爲分隔符,這會讓你圍繞逗號問題。 – FoamyGuy

回答

0

我想出了一個解決方案,將在很多情況下工作。你可能會有所不同。

  1. 我導出爲CSV(逗號分隔值)。
  2. 我將CSV作爲文本導入到Flash動畫中。
  3. 我通過在新行上切分文本文件,將CSV的每一行解析爲一個數組。 「\ n」
  4. 然後我循環遍歷行,獲取每種語言的值。

我的電子表格的列標題是

name,plural value,en,fr,de,it,es,ja 

下面是我使用的代碼。它有兩個缺點,您可能需要將其應用於自己的電子表格。首先,它不處理複數值。它只是使重複的字符串條目,然後您需要返回並手動編輯。其次,如果正在翻譯的文本包含逗號,則actionscript會將這些字符串拆分爲這些逗號而不是每個節的末尾。之後我注意到,如果Excel包含逗號,則用雙引號包裝值。但不知道如果它們包含逗號和雙引號會怎麼做。如果你的文本有這樣的情況,你需要添加一些代碼來處理這些情況。但下面是我使用的Actionscript代碼。

當您編譯並運行swf時,會出現一個黃色按鈕。點擊它,它會提供保存一種語言。每次點擊它將省去不同的語言。如果你繼續點擊等,它會循環回到第一種語言。

但是,最終輸出應該非常接近完美的翻譯字符串。XML

主類:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 
    import flash.net.FileReference; 
    import flash.utils.ByteArray; 

    /** 
    * ... 
    * @author Plastic Sturgeon 
    */ 
    public class Main extends Sprite 
    { 
     private var rows:Array; 
     private var en:XML = <resources></resources>; 
     private var fr:XML = <resources></resources>; 
     private var de:XML = <resources></resources>; 
     private var it:XML = <resources></resources>; 
     private var es:XML = <resources></resources>; 
     private var xmls:Vector.<XML> = new Vector.<XML>; 

     private var counter:uint = 0; 
     public function Main():void 
     { 
      xmls.push(en); 
      xmls.push(fr); 
      xmls.push(de); 
      xmls.push(it); 
      xmls.push(es); 

      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 
      // entry point 
      dumpIt(); 
      graphics.beginFill(0xFFCC00); 
      graphics.drawRect(0, 0, 100, 100); 
      stage.addEventListener(MouseEvent.CLICK, onMouseClick); 
     } 

     private function onMouseClick(e:MouseEvent):void 
     { 
      var language:int = counter % 5; 
      var suffixes:Array = new Array("en", "fr", "de", "it", "es"); 
      var fr:FileReference = new FileReference(); 
      var ba:ByteArray = new ByteArray(); 
      ba.writeObject('<?xml version="1.0" encoding="utf-8"?>\r'+xmls[language].toXMLString());  
      fr.save(ba, "strings-"+suffixes[language]+".xml"); 
      counter++ 
     } 
     public function dumpIt():void 
     { 
      var obj:EmbeddedText = new EmbeddedText(); 
      //txt.text = obj.toString(); 
      rows = obj.toString().split("\r"); 
      trace(rows.length); 
      for (var i:uint = 0; i < rows.length; i++) { 
       var row:Array = String(rows[i]).split(","); 
       for (var j:uint = 0; j < xmls.length; j++) { 
        var name:String = row[0] 
        name = name.substring(1); 
        var value:String = row[2 + j];     
        var node:XML = new XML('<string name="' + name + '">' + value + '</string>'); 
        //trace('<string name="' + name + '">' + value + '</string>'); 
        xmls[j].appendChild(node); 
       } 
      } 
      trace("en",en); 
     } 
    } 

} 

的嵌入式文本類編譯您的文本文件到SWF:

package 
{ 
    import flash.utils.ByteArray; 

    /** 
    * ... 
    * @author Plastic Sturgeon 
    */ 
    [Embed(source="translateion_csv.txt", mimeType="application/octet-stream")] 
    public class EmbeddedText extends ByteArray 
    { 

     public function EmbeddedText() 
     { 

     } 

    } 
} 

最後:這裏是文字的採樣我翻譯,供你自己測試:

name,plural value,en,fr,de,it,es,ja 
homescreen_new_button,,NEW TOURNAMENT,NOUVEAU TOURNOI,NEUES TURNIER,NUOVO TORNEO,NUEVO TORNEO, 
homescreen_current_button,,VIEW CURRENT BRACKET,VOIR LE TABLEAU ACTUEL,AKTUELLER TURNIERSTAND,VISUALIZZA GRIGLIA,VER NIVEL ACTUAL, 
tournament_type_title,,TOURNAMENT SETTINGS,PARAMÈTRES DU TOURNOI,TURNIER-EINSTELLUNGEN,IMPOSTAZIONI TORNEO,CONFIGURACIÓN DE TORNEO, 
tournament_type_gaming_stations,,HOW MANY GAMING STATIONS,COMBIEN DE POSTES,WIE VIELE SPIELGERÄTE,NUMERO DI POSTAZIONI DI GIOCO,NÚMERO DE MÁQUINAS DE JUEGO, 
tournament_type_tournament_type,,TOURNAMENT TYPE,TYPE DE TOURNOI,TURNIERART,TIPO DI TORNEO,TIPO DE TORNEO, 
tournament_type_tournament_type_single,,SINGLE ELIMINATION,ÉLIMINATION DIRECTE,EINFACHE ELIMINIERUNG,ELIMINAZIONE SINGOLA,ELIMINACIÓN INDIVIDUAL, 
tournament_type_tournament_type_double,,DOUBLE ELIMINATION,DOUBLE ÉLIMINATION,DOPPELTE ELIMINIERUNG,ELIMINAZIONE DOPPIA,ELIMINACIÓN DOBLE, 
tournament_type_back_warning_title,,WARNING,AVERTISSEMENT,ACHTUNG,AVVISO,ATENCIÓN, 
tournament_type_back_warning_message,,Going back to the home screen will clear all information.\nDo you want to continue?,Retourner à l\'écran d\'accueil effacera toutes les données.\nVoulez-vous continuer ?,Durch die Rückkehr zum Home-Bildschirm werden alle Informationen gelöscht.\nWirklich fortfahren?,Tornando alla schermata iniziale perderai tutte le informazioni.\nVuoi continuare?,"Si vuelves a la pantalla principal, se borrará toda la información.\n¿Continuar?", 
tournament_type_back_warning_confirm,,OK,OK,OK,OK,Aceptar, 
tournament_type_back_warning_cancel,,Cancel,Annuler,Abbrechen,Annulla,Cancelar, 
tournament_type_help_single,,Players are eliminated after their first loss.,Les joueurs sont éliminés dès la première défaite.,Spieler scheiden nach ihrer ersten Niederlage aus.,I giocatori vengono eliminati dopo la prima sconfitta.,Los jugadores quedan eliminados a la primera derrota., 
tournament_type_help_double,,"After a player loses once, they enter the Loser\'s bracket. They are eliminated if they lose a second time.","Après une première défaite, le joueur intègre le tableau des perdants. Il est éliminé s\'il perd une seconde fois.",Nach einer ersten Niederlage nimmt der Spieler an der Verliererrunde teil. Bei einer zweiten Niederlage scheidet er aus.,"Dopo una sconfitta, i giocatori vengono inseriti nella griglia sconfitti. Vengono eliminati se perdono per la seconda volta.","Al perder una vez, pasan al nivel de perdedores. Si pierden una segunda vez, quedan eliminados.", 
add_players_title,,ADD PLAYERS,AJOUTER DES JOUEURS,SPIELER HINZUFÜGEN,AGGIUNGI GIOCATORI,AÑADIR JUGADORES, 
add_players_seed,,SEED,CLASSER,SETZEN,TESTA DI SERIE,CABEZA DE SERIE, 
add_players_delete,,DELETE,SUPPRIMER,LÖSCHEN,CANCELLA,QUITAR, 
add_players_default_value,,PLAYER NAME,NOM DU JOUEUR,SPIELERNAME,NOME GIOCATORE,NOMBRE DE JUGADOR, 
add_players_dialog_title,,ADD PLAYER,AJOUTER UN JOUEUR,SPIELER HINZUFÜGEN,AGGIUNGI GIOCATORE,AÑADIR JUGADOR, 
add_players_dialog_message,,ENTER THE PLAYER NAME,ENTRER LE NOM DU JOUEUR,SPIELERNAMEN EINGEBEN,INSERISCI IL NOME DEL GIOCATORE,ESCRIBE EL NOMBRE DE JUGADOR, 
add_players_dialog_OK,,OK,OK,OK,OK,ACEPTAR, 
add_players_dialog_ok_and_add,,OK + ADD ANOTHER,OK + EN AJOUTER UN AUTRE,OK + MEHR HINZUFÜGEN,OK + AGGIUNGI ALTRO,ACEPTAR Y AÑADIR OTRO, 
add_players_dialog_cancel,,CANCEL,ANNULER,ABBRECHEN,ANNULLA,CANCELAR, 
add_players_dialog_name_taken,,Name Already Taken,Nom déjà utilisé,Name bereits vergeben,Nome già in uso,Nombre ya utilizado, 
add_players_dialog_name_added,,Player Added,Joueur ajouté,Spieler hinzugefügt,Giocatore aggiunto,Jugador añadido, 
add_players_delete_confirm,,DELETE,SUPPRIMER,LÖSCHEN,CANCELLA,QUITAR, 
add_players_delete_cancel,,DONE,TERMINÉ,FERTIG,FATTO,HECHO, 
0

這些步驟:

  1. 導出電子表格開放式辦公
  2. 將它解壓縮
  3. 得到content.xml文件
  4. 解析和/或翻譯它
  5. 生成不同的strings.xml文件

或者,您可以使用PyUNO從OOo文檔中提取內容。

+0

第4步我會比手工完成更多的工作,我擔心。但是謝謝你花時間回答。 –