2017-03-06 2 views
-1

ich Datei habe versucht, eine ICU4C file von einem gettext erstellen mit einem sed Skript wie folgt .po Datei:Convert .po Datei in ICU4C .txt

/^#/ d       /* delete comments */ 
:a;/"$/{N;s/"\n"//;ba}   /* merge quoted lines in loop */ 
/^msgid /s/msgid (.*)/\1/   /* convert msgids */ 
s/msgstr "(.*)"/\{ "\1" }/  /* convert msgstrs */ 

und es funktioniert schon recht gut (abgesehen von Pluralformen), aber aus irgendeinem Grund konvertiert es nicht das letzte msgid/msgstr-Paar, es sei denn, ich füge die Anführungszeichen nicht zweimal zusammen. Aber dann wird die Syntax für die anderen Sachen falsch. Irgendwelche Ideen? Muss sed nicht verwenden.

Diese ICU-Dateien sind die einzigen, die von genrb akzeptiert werden, und ich möchte das ResourceBundle in PHP verwenden.

+0

Ich glaube, nach dem 'N' haben Sie wahrscheinlich' quoteline \ nmsgid' im Musterraum, und '^' wird nur dann übereinstimmen, wenn 'msgid' am Anfang des Musterbereichs steht. Es passt '\ 0msgid' nicht' \ nmsgid' – stevesliva

Antwort

0

Ich habe mein Ziel durch ein Shell-Skript erreicht. Hier ist die grobe Idee:

#!/usr/bin/env bash 

# remove comments 
sed -r -e '/^#/ d' <de.po>de.icu.txt 
# merge strings 
sed -i de.icu.txt -r -e ':L;/"$/{N;s/"\n"//;b L}' 
# delete gettext header 
sed -i -e '1,2 d' de.icu.txt 
# convert into ICU format 
sed -i de.icu.txt -r -e ' 
# delete untranslated 
/msgid ".+"/{ 
    N 
    /msgstr ""/{ 
     N;s/msgid ".+"\nmsgstr ""\n// 
    } 
} 
# generate ICU txt 
/msgid /s/msgid (.*)/\1/ 
s/msgstr "(.*)"/\{ "\1" }/' 
sed -i -e '1i de {' -e '$ a\\n}' de.icu.txt 

Es gibt wahrscheinlich einen schöneren Weg, aber es macht den Job.