Hola Josep, he llegit el correu despr�s d'haver enviat l'anterior. M'he
mirat molt per sobre (est� molt ben documentada i t� fins l'�ltim
detall) la seq��ncia del Xavier. No s� si est� plantejat diferent o no
ho s� veure, per� crec que no hi ha implementat un criteri per dividir
que sigui agrupar per """seccions""". La import�ncia d'aquest criteri
l'he intentat explicar al correu anterior, tot i que nom�s era una
proposta.
Qu� us sembla a vosaltres ?
Xavier: La seq��ncia que proposes implementa el que comentava ? ..Ho
implementa impl�citament pq les cadenes del .po segueix un ordre per
""seccions""" (independentment de si despr�s queda tallat pel n�mero de
l�nies especificat com a argument de la seq��ncia). Si no �s el cas,
potser et puc donar un cop de m� o si m�s no la idea pq ho puguis
implementar a la teva seq��ncia.
On dl, 2004-01-26 at 14:20, Josep Puigdemont wrote:
> On Mon, 2004-01-26 at 12:47, Enric Balletb� i Serra wrote:
> > Hola a tots, em sembla perfecte, seria ideal poder partir el fitxer en
> > diversos trossos i assignar-lo a diferents persones, crec que alg� havia
> > dit que tenia un script o alguna cosa semblant per fer-ho, despr�s crec
>
> Us passo un programa que va fer en Xavier Conde Rueda per partir (i
> ajuntar) fitxers po, molt bo!
>
> Cal tenir el perl instal�lat. No s� si hi ha una versi� nova, Xavier?
> El mateix programa incorpora ajuda si no li passeu par�metres.
>
> > que faltaria falta que una o dues persones per revisar els diversos
> > fitxers perqu� quedi una cosa coherent, com ho veus Aleix? tu que ets el
> > que �ltimament est� m�s actiu te'n pot encarregar de coordinar-ho?
>
> ----
>
> #!/usr/bin/perl -w
>
> # Aix� �s programari lliure; podeu redistribuir-lo i/o\n"
> # modificar-lo sota els termes de la Llic�ncia P�blica General GNU tal i\n"
> # com ha estat publicada per la Free Software Foundation; b� sota la\n"
> # versi� 2 de la Llic�ncia.
> #
> # Aquest programa es distribueix amb l'expectativa de que ser� �til
> # per� SENSE CAP GARANTIA; ni tan sols la garantia impl�cita de
> # COMERCIABILITAT o ADEQUACI� PER UN PROP�SIT PARTICULAR. Vegeu la
> # Llic�ncia P�blica General GNU per obtenir-ne
> # m�s detalls.
> #
> # Copyright 2003 Free Software Foundation
> # Xavier Conde Rueda (xaviconde a eresmas.com)
>
> # Aquesta fitxer de seq��ncia agafa un fitxer PO (o una part feta amb aquest)
> # fitxer de sequencia) i en fa N trossos, on cada tros t� aproximadament
> # el mateix nombre de cadenes tradu�bles.
> # A m�s, permet agafar m�ltiples fitxers PO fragmentats i fer-ne un complet.
>
> # Parsegem l'entrada:
>
> # Quants par�metres d'entrada hi ha?
>
> $numParam = scalar @ARGV;
>
> # Qu� vol fer l'usuari:
> # 1. --parts: es separa un fitxer en parts
> # 2. --fusio: es fusionen les parts d'un fitxer
> # 3. No res: escriu l'ajuda
>
> if ($numParam < 2)
> {
> &escriuAjuda ();
> }
> else
> {
> if ($ARGV[0] eq "--parts")
> {
> # L'usuari vol tallar un fitxer
>
> $numParts = $ARGV[1];
>
> if (2 <= (scalar $numParts))
> {
> if (($numParam >= 4) && ($ARGV[2] eq "--entrada"))
> {
> $nomFitxer = $ARGV[3];
> print STDERR "Es tallara el fitxer $nomFitxer en $numParts parts\n";
> &fesParts ($numParts, $nomFitxer);
>
> if (($numParam == 5) &&
> ($ARGV[4] eq "--esborra"))
> {
> # No ho esborrar� ben b�, per�
> unlink $nomFitxer;
> print STDERR "S'ha esborrat el fitxer $nomFitxer\n";
> }
>
> print STDERR "Fet\n";
> }
> else
> {
> print STDERR "Heu d'especificar un fitxer d'entrada amb --entrada\n";
> }
> }
> else
> {
> print STDERR "Nomes es poden fer 2 o mes parts\n";
> }
> }
> elsif ($ARGV[0] eq "--fusio")
> {
> # Hem d'esborrar els fitxers d'entrada?
>
> if ($ARGV[$numParam - 1] eq "--esborra")
> {
> pop (@ARGV);
> $numParam = scalar @ARGV;
> $esborra = 1;
> }
> else
> {
> $esborra = 0;
> }
>
> # L'usuari vol fusionar N parts en un fitxer
>
> if ($ARGV[$numParam - 2] eq "--sortida")
> {
> # S'especifica un fitxer de sortida
>
> $sortida = pop (@ARGV);
>
> # Traiem els elements que no siguin fitxers
>
> pop (@ARGV);
> shift (@ARGV);
>
> # Llista de fitxers que es fusionaran
>
> @fitxersParts = @ARGV;
>
> if (scalar @fitxersParts > 1)
> {
> print STDERR "Es fusionaran ", scalar @fitxersParts, " fitxers\n";
> &fusionaParts ($sortida, @fitxersParts);
>
> if ($esborra)
> {
> print STDERR "S'esborraran els fitxers @fitxersParts\n";
> unlink (@fitxersParts);
> }
>
> print STDERR "Fet\n";
> }
> else
> {
> print STDERR "S'han d'especificar mes d'un fitxer d'entrada\n";
> }
> }
> else
> {
> print STDERR "No s'ha especificat cap fitxer amb --sortida\n";
> }
> }
> else
> {
> &escriuAjuda ();
> }
> }
>
> # fesParts (numParts, nomFitxer)
>
> sub fesParts
> {
> my $numParts = $_[0];
> my $nomFitxer = $_[1];
> my $numCadenesTotals;
>
> if (!open ENTRADA, "<$nomFitxer")
> {
> print STDERR "No s'ha pogut obrir el fitxer $nomFitxer\n";
> exit 0;
> }
>
> # Donat que els fitxers PO no son massa grans, es factible
> # construir una llista i tenir-la en mem�ria per treballar-hi
>
> my @entrada = <ENTRADA>;
> close ENTRADA;
>
> # Hem de comptar quants missatges hi ha al fitxer d'entrada
>
> foreach $linia (@entrada)
> {
> if ($linia=~/^(\s)*msgid(\s)+/)
> {
> $numCadenesTotals ++;
> }
> }
>
> # Tallem els missatges en $numCadenes com a m�xim
>
> my $numCadenes;
>
> if (($numCadenesTotals % $numParts) == 0)
> {
> $numCadenes = $numCadenesTotals / $numParts;
> }
> else
> {
> $numCadenes = ($numCadenesTotals / $numParts) + 1;
> }
>
> if ($numCadenes < $numParts)
> {
> print STDERR "No hi han suficients missatges per fer $numParts parts\n";
> exit 0;
> }
>
> # Per a cada part...
>
> for (; $numParts != 0; $numParts--)
> {
> # Creem un nou fitxer...
>
> my $nomFitxerPart = $nomFitxer.".".$numParts;
> my $textFitxer = "";
>
> # Recorrem el fitxer del final al principi
> # Trobem $numCadenes vegades (o les que quedin)...
>
> for ($i = $numCadenes;
> ($numCadenesTotals > 0) && ($i > 0) && (scalar @entrada > 0);
> $i --,
> $numCadenesTotals--)
> {
> # ...una cadena traduible
>
> for ($trobada = 0; !$trobada;)
> {
> $linia = pop (@entrada);
> $textFitxer = $linia.$textFitxer;
>
> if ($linia=~/^(\s)*msgid(\s)+/)
> {
> $trobada = 1;
> }
> }
> }
>
> # Quan trobem la darrera cadena traduible, no agafem
> # els comentaris que pugui tenir (en les altres s�)
> # Ho fem ara:
>
> for ($trobada = 0;
> !$trobada &&
> (scalar @entrada) >0; )
> {
> $linia = $entrada[(scalar @entrada) - 1];
>
> if ($linia=~/^(\s)*#/)
> {
> $textFitxer = (pop (@entrada)).$textFitxer;
> }
> else
> {
> $trobada = 1;
> }
> }
>
> # Ja podem escriure el fitxer de sortida
>
> if (!open PART, ">$nomFitxerPart")
> {
> print STDERR "No s'ha pogut obrir el fitxer $nomFitxerPart\n";
> exit 0;
> }
> print PART "$textFitxer";
> close PART;
>
> print STDERR "S'ha escrit el fitxer $nomFitxerPart\n";
> }
> }
>
> # fusionaParts ($sortida, @fitxersParts)
>
> sub fusionaParts()
> {
> my $sortida = $_[0];
> my $fitxersParts = \$_[1];
> my $primer = 0;
> my @fitxerSortida;
>
> # Per a cada fitxer d'entrada...
>
> foreach $nomFitxer (@fitxersParts)
> {
> if (!open ENTRADA, "<$nomFitxer")
> {
> print STDERR "No s'ha pogut obrir el fitxer $nomFitxer\n";
> exit 0;
> }
> my @fitxer = <ENTRADA>;
> close ENTRADA;
>
> # Hem de saber quin �s el primer fitxer pq cont� la cap�alera
> # No importa que els altres no estiguin ordenats
>
> for ($i = 0; $i < (scalar @fitxer - 2) && !$primer; $i ++)
> {
> $linia = $fitxer[$i];
>
> if ($linia=~/^(\s)*msgid(\s)+""/)
> {
> # Tenim un candidat a ser cap�alera
>
> $linia = $fitxer[$i + 1];
>
> if ($linia=~/^(\s)*msgstr(\s)+""/)
> {
> $primer = 1;
>
> # Com ha de ser el primer, canviem l'ordre
> # de les dues llistes perque el push ho faci b�
>
> @aux = @fitxerSortida;
> @fitxerSortida = @fitxer;
> @fitxer = @aux;
> }
> }
> }
>
> # Actualitzem la llista de sortida
> push (@fitxerSortida, @fitxer);
> }
>
> if (!open SORTIDA, ">$sortida")
> {
> print STDERR "No s'ha pogut obrir el fitxer $sortida\n";
> exit 0;
> }
>
> # Escrivim la llista en la sortida
>
> foreach $linia (@fitxerSortida)
> {
> print SORTIDA $linia;
> }
>
> close SORTIDA;
> }
>
> # escriuAjuda ()
>
> sub escriuAjuda
> {
> print STDERR "Un fitxer de sequencia per tallar un fitxer PO en N parts\n";
> print STDERR "en que cada part te aproximadament el mateix nombre de
> traduccions.\n";
> print STDERR "\n";
> print STDERR "Us: retalla opcio\n";
> print STDERR "opcio es una d'aquestes dues:\n";
> print STDERR "--parts numParts --entrada nomFitxer\tSepara el fitxer d'entrada
> en numParts parts\n";
> print STDERR "\t\t\t\tS'afegira l'extensio .1, .2, ..., .numParts\n";
> print STDERR "\t\t\t\tCompte: es sobreescriuran els fitxers generats\n";
> print STDERR "--fusio fitxers --sortida nomFitxer\tCrea un unic fitxer dels
> fitxers d'entrada\n";
> print STDERR "\t\t\t\tNo cal que els fitxers estiguin ordenats\n";
> print STDERR "\t\t\t\tCompte: es sobreescriura el fitxer de sortida\n";
> print STDERR "\n";
> print STDERR "El modificador per a --parts es:\n";
> print STDERR "--entrada nomFitxer\t\tEspecifica un fitxer PO d'entrada.\n";
> print STDERR "\t\t\t\tNo es pot fer servir l'entrada estandard.\n";
> print STDERR "El modificador per a --fusio es:\n";
> print STDERR "--sortida nomFitxer\t\tEscriu la sortida en el fitxer
> nomFitxer.\n";
> print STDERR "\t\t\t\tSi s'especifica \"-\", s'escriura el fitxer per la sortida
> estandard.\n";
> print STDERR "\n";
> print STDERR "Un modificador final comu a tots dos es:\n";
> print STDERR "--esborra\t\t\tOpcional. S'esborrara el fitxer PO d'entrada.\n";
> print STDERR "\t\t\t\tUtil per no tenir duplicats entre parts i subparts.\n";
> print STDERR "\t\t\t\tNo es recomenable esborrar el PO orginal.\n";
> }
----------------------------------------------------------------
Podeu consultar els arxius d'aquesta llista o canviar la vostra
subscripci� a http://www.softcatala.org/llistes/
----------------------------------------------------------------