Өөрчлөлт хийсний дараа хуанли дээр саруудын нэр алга байв. Герман хэл мэддэггүй зочид намайг хуанли дахь саруудын нэрсийг хэрхэн засч янзалж байсныг бас сонирхож магадгүй юм. Машин орчуулга нь хөгжилтэй бас ойлгомжтой байх гэж найдаж байна. Энд би скриптүүдийн чухал хэсгүүдийг үзүүлэв. Бүрэн баримтжуулсан скриптүүд удахгүй хуанлийн програм хангамжийн тодорхойлолт дээр гарах болно, гэхдээ зөвхөн герман хэл дээр.
DOCROOT/local/local.xml.LANG.
файлууд дахь хэлнээс хамааралтай текстүүдийн танигчийг өөрчилсөн. Саруудын нэрс нь хэлнээс хамааралтай текстүүдэд хамаарах боловч хуучин танигч нь хуанлийн үндсэн өгөгдөл DOCROOT/kal/b/YEAR/COUNTRY.xml.
ба DOCROOT/kal/b/YEAR/a.xml.LANG.
дээр байсаар байна. Тэд шинэ үнэмлэхээр солигдох ёстой. Энэ алдаанаас болж хуанлийн дотор саруудын нэр алга байна.
Үүнд би Perl скрипт ашигладаг.
Хуучин танигчдыг үндсэн өгөгдлийн файл бүрт ашигладаг. Би үүнийг DOCROOT/kal/b/2020/de.xml.
-ээс уншсан. Оролтыг файлд <l:ph id="ID"/>
хэлбэрээр агуулсан болно. Энэ файлд зөвхөн тухайн жилийн төдийгүй өмнөх жилийн 12, дараа оны 1-р сарын хуанлийн өгөгдлийг багтаасан болно. Сар бүрийн өгөгдөлд ихэвчлэн тухайн сарын нэрний орлуулагчийг хэд хэдэн удаа агуулдаг. Дараахь Perl код нь хуучин үнэмлэхийг уншдаг.
my $oldids = []; my $fn = "DOCROOT/kal/b/2020/de.xml."; my $verb = 1; my $h; if (!open ($h, "<", $fn)) { print STDERR "Kann Datei \"$fn\" nicht öffnen\n"; return; } my $d; { local $INPUT_RECORD_SEPARATOR; $d = <$h>; close $h; } my $pid = ""; my $id = ""; while ( $d =~ /<l:ph id="([a-z0-9]+)"\/>/g ) { $id = $1; if ($id ne $pid) { push (@$oldids, $id); $pid = $id; } } if ($verb) { $pid = 0; for $id (@$oldids) { print "$pid $id\n"; ++$pid; } }
Би DOCROOT/local/local.xml.de.
файлын үнэмлэхний текстийг герман тексттэй хамт уншсан. Эдгээр нь <t id="ID">TEXT</t>
хэлбэрээр агуулагддаг. Би бүх текстүүдийн ID-г $newids -> {"TEXT"} = "ID"
гэж хадгалдаг.
my $newids = {}; $fn = "DOCROOT/local/local.xml.de."; $h = undef; if (!open ($h, "<:encoding(utf-8)", $fn)) { print STDERR "Kann Datei \"$fn\" nicht öffnen\n"; return; } { local $INPUT_RECORD_SEPARATOR; $d = <$h>; close $h; } # <t id="cr">Januar</t> while ( $d =~ /<t id="([a-z0-9]+)">([^>]+)<\/t>/g ) { $newids -> {$2} = $1; } my $names = [ "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember", ], if ($verb) { my $nm; my $i = 0; for $nm (@$names) { ++$i; print "$i $nm ", $newids -> {$nm}, "\n"; } }
Одоо би шинэ ID-г хуучин ID-д $idmap -> {"OLD_ID"} = "NEW_ID"}
хэлбэрээр оноож өгч байна.
Хуучин танигчдын жагсаалтад оруулсан эхний тэмдэг нь өмнөх оны арванхоёрдугаар сарын нэрийг тодорхойлох тэмдэг юм. Би энэ оруулгыг үл тоомсорлож байна. Жагсаалтын дараагийн арван хоёр бичилт нь 1-р сараас 12-р сар хүртэлх саруудын нэрс юм. Даалгавар нь энгийн:
my $idmap = {}; shift @$oldids; my $nm; while (@$names) { $nm = shift @$names; $id = shift @$oldids; $idmap -> {$id} = $newids -> {$nm}; }
Би одоо хуанлийн өгөгдлийн файлд хуучин ID-г шинэ ID-ээр солих функцийг бий болгож байна. Ердийн илэрхийлэл нь <l:ph id="ID"/>
хэлбэрийн бүх орлуулагчдыг олдог. Хуучин ID
нь ердийн илэрхийлэлтэй $1
анхны тохирох бүлэг юм. Туслах функц нь байршуулагчийг шинэ ID-ээр хангадаг: <l:ph id="NEWID"/>
. Шинэ ID өгөөгүй хуучин ID хэвээр байна (өөрөөр хэлбэл сарны нэр байхгүй).
my $subst = sub { $id = $idmap -> {$1} || $1; return "<l:ph id=\"$id\"/>"; };
Файлыг боловсруулах функц нь хоёр параметрийг авдаг: $in
бол хуучин ID-тай оролтын файлын файлын зам, $out
бол шинэ ID-тай гаралтын файлын файлын зам юм.
my $proc_file = sub { my ($in, $out) = @_; print "$in -> $out\n" if $verb; $h = undef; if (!open ($h, "<:encoding(utf-8)", $in)) { print STDERR "Kann Datei \"$in\" nicht öffnen\n"; return; } { local $INPUT_RECORD_SEPARATOR; $d = <$h>; close $h; } $d =~ s/<l:ph id="([a-z0-9]+)"\/>/$subst -> ($idmap, $1)/ge ; $h = undef; if (!open ($h, ">:encoding(utf-8)", $out)) { print STDERR "Kann Ausgabedatei \"$out\" nicht öffnen\n"; return; } print $h $d; close $h; };
DOCROOT/kal/b/YEAR/COUNTRY.xml.
ба DOCROOT/kal/b/YEAR/a.xml.LANG.
бүх үндсэн өгөгдлийн файлуудыг засах шаардлагатай. Залруулсан файлуудын хувьд би DOCROOT/kal/b
(DOCROOT/kal/bnew
-ийн оронд өөр замын угтварыг сонгодог. Би DOCROOT/kal/b
лавлах болон YEAR
дэд директоруудыг уншаад үндсэн өгөгдлийн файлуудыг боловсруулдаг.
use File::Spec::Functions qw(catdir catfile); use File::Path qw(make_path); my $indir = "DOCROOT/kal/b"; my $outdir = "DOCROOT/kal/bnew"; my ($dh, $sdh); my ($de, $sde); my $dp; my $od; opendir ($dh, $indir); while (defined ($de = readdir ($dh))) { next unless $de =~ /^20\d\d$/; $dp = catdir ($indir, $de); next unless -d $dp; $sdh = undef; opendir ($sdh, $dp) $od = catdir ($outdir, $de); make_path ($od); while (defined ($sde = readdir ($sdh))) { next unless $sde =~ /\.xml(?:\..+)?\.$/; $proc_file -> (catfile ($dp, $sde), catfile ($od, $sde)); } closedir $sdh; } closedir $dh;
Би үндсэн өгөгдлийн файл бүрт .gz
дагавар бүхий gzip шахсан файл нэмж оруулав. Үүнийг хийхийн тулд би bash скриптийг ашигладаг.
#!/bin/bash b=$(realpath $0); b=${b%/src/*}; dir=$b/docroot/kal/bnew; for sd in $dir/*; do echo "subdir $sd"; f=${sd#$dir/}; [[ $f =~ ^20[0-9][0-9]$ ]] || continue; [[ -d $sd ]] || continue; for f in $sd/*xml*\. ; do echo $f; gzip --best --stdout $f > ${f}gz ; done; done;