Sziasztok!
A fenti témában szeretnék némi segítséget kapni. Adott közel 2500 .desktop fájl amiben meg kellene vizsgálni, hogy van e benne [hu] és 3 vagy 4 fajta tag bejegyzés. Minden esetben elérési úttal együtt fel kellene jegyezni a fájl nevét kiterjesztéssel egy txt-be, majd alá a fájlban ha van - a teljes sort jegyezze be, akár comment[hu], Generic[hu], Name[hu] akár mást talál. Ha csak egyik vagy másikat talál, de nincs [hu] bejegyzés a sorok között, akkor dobja ki a megfelelő 'Comment[hu]=', vagy 'Generic[hu]=' tagot a az elérési út alá és folytassa a keresést.
Ha ezzel végzett a progi legyen képes visszaolvasni a fájlt és írja be a bejegyzéseket, ahol ugyanazt a bejegyzést írná vissza, azt hagyja ki - és a változásokról készítsen egy reportot, és írja ki egy külön txt-be.
Remélem érthető voltam.
Bővebb info - hopparz at gmail.com vagy skype-on.
- 2008 megtekintés
Hozzászólások
ez remek
és hol akadtál el?
t
- A hozzászóláshoz be kell jelentkezni
Nem tudom hogyan alkossam meg a szkriptet. Grep és pipe hasonlók tuti hogy kellenek, de soha sem csináltam még ilyent.
A progi viszont kellene, mert a rendszer fordításhoz elengedhetetlen. Tudsz segíteni?
- A hozzászóláshoz be kell jelentkezni
Ugye nem azt akarod, hogy ezt most irja meg neked valaki? Mert az mar had ne mondjam mi lenne. De ha nem igy van, akkor miert nem irtad le, hogy mi nem megy, es miben kellene segiteni?
- A hozzászóláshoz be kell jelentkezni
Nem kell azonnal és elég ha valaki segít abban hogy hogyan tudok egy futtatható fájlt összerakni. Dobáljatok meg, valahogy muszáj megtanulnom, hogy hogyan csinálhatom meg, vagy valaki aki rámsóz egy weblinket - hogy nesze, így kell.
A nyelv mindegy, csak menjen.
- A hozzászóláshoz be kell jelentkezni
google gyorsan dobalja a linkeket is. Itt egy pelda
- A hozzászóláshoz be kell jelentkezni
Köszi. Van még perl vagy pytonra is?
- A hozzászóláshoz be kell jelentkezni
Nem nagyon értem mit kéne csinálni, de én így kezdenék hozzá:
#!/usr/bin/perl
use strict;
sub file_list {
my($dir) = @_;
opendir( my $d, $dir);
my @fn = grep { !/^\.\.?$/ } readdir($d);
closedir($d);
my @res;
while( my $fn = shift(@fn) ){
$fn = $dir.'/'.$fn;
push( @res, file_list( $fn ) ) if( -d $fn );
push( @res, $fn ) if( -f $fn && $fn =~ /\.desktop$/i );
}
return @res;
}
#
open( OUT, '>:utf8', 'desktop.out' ); print OUT "\x{feff}";
my @files = file_list('.');
while( my $fn = shift(@files) ){
print OUT 'fajl: ', $fn, "\n";
open( IN, '<:utf8', $fn );
while( my $sor = <IN> ){
chomp($sor);
next unless( $sor =~ /\[hu\]/i );
print OUT 'sor: "', $sor, '"', "\n";
}
close(IN);
}
close( OUT );
Feldolgozás helyett csak kiírja '.desktop' fájlneveket, és a fájlok "[hu]"-t tartalmazó sorait egy fájlba.
- A hozzászóláshoz be kell jelentkezni
Millió köszönet!
Közben én is beszélgettem több emberrel, hogy hogyan lehetne ezt jól megoldani, és a KDE-sektől azt a tippet kaptam, h össze kell fűzni az egyes típusokat (pl. 'Comment[hu]=fordítás'egy-egy po-vá és lefordítani, majd ezt splittelni és csak a fordítást visszaírni.
A így a megjegyzésbe (# után) mehet az elérési út, alá a msgid és a msgstr a fordítással.
Azt hiszem így korrektebb, és érthetőbb.
Az elérési utakat fájlostól el tudtam menteni kfind-dal így ez talán felhasználható forrásként oda vissza....
zamboriz: Mégegyszer köszi!
- A hozzászóláshoz be kell jelentkezni
Nem esett le a tantusz, hogy mire lenne jó 2500 .desktop fájlból "egy-egy" (<=2500) .po fájlt gyártani.
Fejlesszem tovább a szkriptet, vagy mostmár menni fog neked is?
- A hozzászóláshoz be kell jelentkezni
Szia!
Az arra lenne jó, hogy szekciókra bontva kapnál több po fájlt, amit Kbabellel egyetlen menetben simán lefordíthasz, esetleg ha elég nagy a fordítási adatbázis - gyorsfordítással még hamarabb végezhetsz. Plusz ha frissítésre kerülne a rendszer könnyebb magyarítani, a hiányzókat pótolni és bővíteni s minden fordító profitálna belőle.
Tehát. Adott a rendszerben sok .desktop fájl. Ezek ugye leíró fájlok, amit viszontlát az ember sok helyen, asztalon - K menüben.
Alapvetően ami kell(ene): csak az eredeti és a HU szekció mindegyik .desktop fájlból. Így a generált (merge) szöveges fájlban, mint szópárok lehetnének. Msgid "azeredeti" majd ha van Msgstr "afordítás", ha nincs akkor csak Msgstr "".
Pl Name=eredetiangolnév -> a NAME.po-ban Msgid "eredetiangolnév"
Name[hu]=fordítás -> a NAME.po-ban Msgstr "fordítás" lenne.
S ez egy .desktop fájl. Ez kellene az összes .desktop fájllal eljátszani.
Tehát: Az első szkript összefűzés után 3 po fájt gyárt. Egy Name, egy comment, és egy genericname.
A második szkript ezekből a po-ból írja vissza az msgstr részét mindegyik .desktop fájlba.
A szkripted nagyon jó, sokat tanultam belőle. Tudnál továbbra is segíteni?
- A hozzászóláshoz be kell jelentkezni
Az új szkript kiírja a fordítandó sorokat. Ezt a kimenetet lehetne feldolgozni, hogy .po fájlok jöjjenek létre.
Írd le a megadott példát alapul véve, hogy mik legyenek a létrehozandó .po fájlok nevei, és az egyes .po fájlok tartalma, én pedig megírom az átalakító szkriptet.
- A hozzászóláshoz be kell jelentkezni
#!/usr/bin/perl
use strict;
sub file_list {
my($dir) = @_;
opendir( my $d, $dir);
my @fn = grep { !/^\.\.?$/ } readdir($d);
closedir($d);
my @res;
while( my $fn = shift(@fn) ){
$fn = $dir.'/'.$fn;
push( @res, file_list( $fn ) ) if( -d $fn );
push( @res, $fn ) if( -f $fn && $fn =~ /\.desktop$/i );
}
return @res;
}
#
open( OUT, '>:utf8', 'desktop.out' ); print OUT "\x{feff}";
my @files = file_list('.');
while( my $fn = shift(@files) ){
# print STDERR 'fajl: ', $fn, "\n";
open( IN, '<:utf8', $fn );
my %text = ();
my $sect = '';
while( my $sor = <IN> ){
chomp($sor);
if( $sor =~ /^\[([^\]]*)\]\s*$/ ){
$sect = $1;
}
elsif( $sor =~ /^(Comment|Generic.*?|Name)(\[[^\]]*\])?=(.*)$/i ){
my ( $field, $lang, $val ) = ( $1, $2 || '', $3 );
if( $lang =~ /^(\[hu\])?$/i ){
$text{$sect}{$field}{$lang} = $val;
}
}
}
my $fn_print = 1;
foreach my $s (sort keys %text){
my $s_print = 1;
foreach my $f (sort keys %{$text{$s}}){
if( !exists( $text{$s}{$f}{'[hu]'} ) ){
print OUT "file: $fn\n" if( $fn_print ); $fn_print = 0;
print OUT "[$s]\n" if( $s_print ); $s_print = 0;
print OUT $f, '=', $text{$s}{$f}{''}, "\n";
}
}
print OUT "\n" unless( $s_print );
}
close(IN);
}
close( OUT );
#
Ilyen fájlt állít elő:
file: /usr/share/applications/fedora-abiword.desktop
[Desktop Entry]
Comment=AbiWord Word Processor
GenericName=Word Processor
Name=AbiWord
file: /usr/share/applications/fedora-beryl-manager.desktop
[Desktop Entry]
Comment=Setup Beryl
Name=Beryl Manager
file: /usr/share/apps/kipiplugin_htmlexport/themes/classic/classic.desktop
[Desktop Entry]
Comment=A port of the old HTML Export plugin theme
Name=Classic
[X-HTMLExport Author]
Name=AurĂclien Gâteau
[X-HTMLExport Parameter bgColor]
Name=Background Color
[X-HTMLExport Parameter fgColor]
Name=Foreground Color
[X-HTMLExport Parameter fontSize]
Name=Font Size
[X-HTMLExport Parameter imgBorderColor]
Name=Image Border Color
[X-HTMLExport Parameter imgBorderSize]
Name=Image Border Size
[X-HTMLExport Parameter linkColor]
Name=Link Color
[X-HTMLExport Parameter thumbnailPerRow]
Name=Thumbnails per row
[X-HTMLExport Parameter visitedLinkColor]
Name=Visited Link Color
A szövegek módosítás után visszaírhatóak az eredeti fájlokba, persze '[hu]' jelöléssel ellátva.
- A hozzászóláshoz be kell jelentkezni
3 po fájl kell.
Name.po
Genericname.po
Comment.po
A po-k fejléce a következő.
---------------------------------------------------------------
# translation of pofájlneve.po to Hungarian
# Generated by a progi neve, copyright under GPL, ateneved, 2007.
#
msgid ""
msgstr ""
"Project-Id-Version: pofájlneve\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: év-hó-nap+0200\n"
"PO-Revision-Date: év-hó-nap+0200\n"
"Last-Translator: \n"
"Language-Team:\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: \n"
"Plural-Forms: nplurals=1; plural=0;\n" - magyar beállítások, itt fejlécnek vége
üres sor és
msgid "eredetiangolul"
msgstr "fordításmagyarul"
üres sor és
msgid "eredetiangolul"
msgid "" - ha nincs, és fordítani kell
üres sor és... így tovább.
-------------------------------------------------
- A hozzászóláshoz be kell jelentkezni
hajra, ird meg
- A hozzászóláshoz be kell jelentkezni
#!/usr/bin/perl
use strict;
my %mezok;
sub print_fields {
my ( $fn, $field ) = @_;
open( OUT, '>:utf8', $fn );
print OUT <<EOH;
\x{feff}# translation of ${fn} to Hungarian
# Generated by a progi neve, copyright under GPL, ateneved, 2007.
#
msgid ""
msgstr ""
Project-Id-Version: ${fn}
Report-Msgid-Bugs-To:
POT-Creation-Date: 2007-07-21+0200
PO-Revision-Date: 2007-07-21+0200
Last-Translator:
Language-Team:
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Generator:
Plural-Forms: nplurals=1; plural=0;
EOH
foreach my $s (sort keys %{$mezok{$field}}){
print OUT 'msgid "', esc( $s ), '"', "\n", 'msgstr ""', "\n\n";
}
close( OUT );
}
sub esc {
my ($str) = @_;
$str =~ s/"/\\"/g;
return $str;
}
#
open( IN, '<:utf8', 'desktop.out' );
while( my $sor=<IN> ){
chomp($sor);
next unless( $sor =~ /^(Comment|GenericName|Name)=(.*)$/ );
$mezok{$1}{$2}++;
}
print_fields( 'comment.po', 'Comment' );
print_fields( 'generic.po', 'GenericName' );
print_fields( 'name.po', 'Name' );
- A hozzászóláshoz be kell jelentkezni
Hálásan köszi a szkripteket. 3 apró változtatás azonban még kellene.
Az egyik, hogy amikor állítja össze a .po fájt akkor a msgid elé megjegyzésben kellene az elérési út, hogy melyik desktop fájlból származik. Így ez felhasználható lenne a visszaíráskor.
Így akkor így néz ki egy desktop fáj üzenet pár:
-------------
# elérésiút/xy.desktop
msgid ""
msgstr ""
-------------
A másik, hogy meghatározható legyen hogy hol, vagy egyszerűen rekurzívan mindenhol keressen. Ha ez megoldható, akkor az előállított po-kat ez szerint nevezze meg. (etc-name.po, home-name.po, usr-name.po)
A szkript valamiért nálam csak abban a mappában megy végig ahol van.
A harmadik: Kérlek a neved mindenképp legyen bennt a generált anyagban, és a szkriptekben.
Ui: Visszaírási lehetőség?
Ui2: Minden fordító, lokalizáló nevében köszi. Remélem mindenkinek hasznára lesz ez a pár perl .pl fájl.
- A hozzászóláshoz be kell jelentkezni
Zoli, tényleg érdemes lenne inkább elmerülnöd az adott nyelvekben, és nem pedig a kész megoldást átvenni. Máskor is szükséged lehet ilyesmire és nem biztos hogy lesz egy zamboriz aki megcsinálja neked. Nem tudom miért nem válaszoltál az ezt firtató kérdésekre, nem is érdekel. De fontold legalább meg.
- A hozzászóláshoz be kell jelentkezni
Már leszedtem több perl leckét, és tanulom, könyvet vettem és igyekszem legközelebb magam megoldani, felbőviteni. Tudom, hogy nem lesz mindig egy zamboriz, vagy más hogy segíthessen, de ezeket a progikat azt hiszem nem öncélúan magamnak kértem, és mindenkinek hasznára válhat aki fordít, magyarít. De egyébként sem kérhetem hogy más "pelenkázzon". Egyébként desktop fájlok fordítására-karbantartására (tudtommal) nincs semmilyen eszköz, de ezekkel legalább esélyt kaphat a fordító rá. Nem lehetek elég hálás, hogy megtette helyettem, amit nekem kellett volna, de így tudom folytani az pclinuxos-ben még hátralévő töménytelen részt. Bocs, amiért nem válaszoltam, de nem egyszerű, egyszerre fordítani, fórumot vezetni, dokumentációt összevágni, wikit szerkeszteni - úgy hogy csak a szabadidőd van. Még egyszer elnézést mindenkitől, de perl programozásban még nagyon zöldfülü vagyok.
Zoltán
- A hozzászóláshoz be kell jelentkezni
ok. kicsit durva voltam, de sajnos tényleg rengeteg ember van aki csak készmunkákat akar dolgozni meg nem. Télleg sorry.
Perl-t programozni én a Perl mesteri szinten 21 nap alatt c. könyvből tanultam (Laura Lemay, ISBN 963 9301 51 5, Kiskapu kiadónál 6860 Ft.)
- A hozzászóláshoz be kell jelentkezni
Larry Wall:Programming Perl. (O'Reilly)
Simon ... ? : Beginning Perl (Wrox)
man perl
- A hozzászóláshoz be kell jelentkezni
> Így ez felhasználható lenne a visszaíráskor.
Ha az eredeti szöveg (msgid) nem változik, akkor visszaírható a fordítás.
> A szkript valamiért csak abban a mappában megy végig ahol van.
my @files = file_list('.');
helyett
my @files = file_list( '/akarmilyen/masik/konyvtar' );
> a neved mindenképp legyen bennt
Nekem nem hiányzik.
> Utoljára: Visszaírási lehetőség?
Hogy szeretnéd? Az eredeti fájlok felülírásával, vagy inkább új fájlok létrehozásával?
- A hozzászóláshoz be kell jelentkezni
Ok, már látom. a - file_list('.'); adja meg a helyet.
A visszaírási lehetőséget meg lehet oldani úgy hogy mint szöveget beszúrja, hozzáadja a fájlban?
tehát pl name.po-ban lévő elem:
msgid "akármi"
msgstr "akármi lefordítva"
és visszaírja ugyanabba a desktop fájlba mint Name[hu]=akármi lefordítva. Lehet?
- A hozzászóláshoz be kell jelentkezni
Ilyen lett a visszaírás:
#!/usr/bin/perl
use strict;
my %forditas;
sub noesc {
my ($str) = @_;
$str =~ s/\\"/"/g;
return $str;
}
sub PO_betoltes {
my ( $po_fn, $mezo ) = @_;
open( PO, '<:raw', $po_fn );
my $msgid;
while( my $sor = <PO> ){
chomp($sor);
if( $sor =~ /^msgid "(.+)"/ ){
$msgid = noesc($1);
}
elsif( $sor =~ /^msgstr "(.+)"/ ){
$forditas{$mezo}{$msgid} = noesc($1);
}
}
close( PO );
}
sub file_list {
my($dir) = @_;
opendir( my $d, $dir);
my @fn = grep { !/^\.\.?$/ } readdir($d);
closedir($d);
my @res;
while( my $fn = shift(@fn) ){
$fn = $dir.'/'.$fn;
push( @res, file_list( $fn ) ) if( -d $fn );
push( @res, $fn ) if( -f $fn && $fn =~ /\.desktop$/i );
}
return @res;
}
#
PO_betoltes( 'comment.po', 'Comment' );
PO_betoltes( 'generic.po', 'GenericName' );
PO_betoltes( 'name.po', 'Name' );
my @files = file_list('.');
while( my $fn = shift(@files) ){
open( IN, '<:raw', $fn );
my $szoveg = join( '', <IN> );
close(IN);
my @szoveg = split( /(^\[.*\])/, $szoveg );
shift(@szoveg) if( length($szoveg[0]) < 1 );
my $valtozott = 0;
foreach $szoveg ( @szoveg ){
foreach my $mezo ( keys %forditas ){
foreach my $msgid ( keys %{$forditas{$mezo}} ){
if( $szoveg =~ /\Q${mezo}=$msgid\E/im &&
$szoveg !~ /\Q${mezo}[hu]=\E/im ){
$szoveg =~ s/(\Q${mezo}=$msgid\E)/$1\n${mezo}[hu]=$forditas{$mezo}{$msgid}/im;
$valtozott = 1;
}
}
}
}
if( $valtozott ){
printf "forditas: $fn\n";
open( OUT, '>:raw', $fn ); binmode(OUT);
print OUT join( '', @szoveg );
close(OUT);
}
}
A három .po fájlból összeállít egy belső "szótárat", és végignézi a .desktop fájlokat, hogy lát-e bennük a szótárban szereplő még nem lefordított szöveget.
Mivel felülírja a .desktop fájlokat, ezért óvatosan kezelendő!
- A hozzászóláshoz be kell jelentkezni