Игорь Пашев - Post a comment

Mar. 9th, 2009

[info]igorpashev

11:13 pm - Многоязыковой исходник

Задача: иметь несколько файлов для разной «целевой аудитории» (на разных языках человеческих). Файлы большие, перевод построчный — желательно иметь соот. строки перед глазами для правок.

Решение: делаем файл "test"

all langs
ru:Только русский
en:English only
Ещё раз для всех
!ru:not for russian
eo:Esperanto!
и программу на перле:

 1 #!/usr/bin/perl -T
 2
 3 use utf8;
 4 use strict;
 5 use warnings;
 6 use integer;
 7 use open qw( :utf8 :std :encoding(UTF-8) );
 8 use Getopt::Long qw(:config bundling);
 9
10 my @LANGS = ();
11 my $opt_LANGS = '';
12 my $opt_SEP = ':';
13
14 GetOptions(
15     'language|l=s'  => \$opt_LANGS,
16     'separator|s=s' => \$opt_SEP,
17     'delimiter|d=s' => \$opt_SEP
18 );
19
20 @LANGS = split(/[, ]/, $opt_LANGS);
21
22 sub have_shared
23 {
24     my ($array, $ARRAY) = @_;
25     foreach my $a (@$array)
26     {
27         return $a if (grep($a eq $_, @$ARRAY));
28     }
29     return '';
30 }
31
32 while (my $line = <STDIN>)
33 {
34     # en, eo: Text => $lang_spec = 'en, eo'; $pure_line = Text;
35     my ($lang_spec, $pure_line) = split(/[$opt_SEP]/, $line, 2);
36     if (!$pure_line) {$pure_line = $lang_spec; $lang_spec = ''};
37     
38     # ! в начале строки - не выводить строку для указанных языков
39     my $pos = 0;
40     $lang_spec =~ s,^\s*(\!),,; # заодно удаляем !
41     $pos ||= $1;
42
43     # Список языков для строки
44     my @langs = split(/[, ]/, $lang_spec);
45
46     # первый общий элемент или пустая строка, если нет общих
47     my $matches = have_shared(\@langs, \@LANGS);
48     
49     if ((!$pos && $matches) || ($pos && !$matches) || !$lang_spec)
50         {print $pure_line};
51 }
52
53 exit 0;
54

Проверяем:

# ./babelgrep -l ru < test
all langs
Только русский
Ещё раз для всех

# ./babelgrep -l en < test
all langs
English only
Ещё раз для всех
not for russian

# ./babelgrep -l en,ru < test
all langs
Только русский
English only
Ещё раз для всех

# ./babelgrep -l eo < test
all langs
Ещё раз для всех
not for russian
Esperanto!

Read Comments

Reply:

From:
(will be screened)
Identity URL: 
имя пользователя:    
Вы должны предварительно войти в LiveJournal.com
 
E-mail для ответов: 
Вы сможете оставлять комментарии, даже если не введете e-mail.
Но вы не сможете получать уведомления об ответах на ваши комментарии!
Внимание: на указанный адрес будет выслано подтверждение.
Username:
Password:
Subject:
No HTML allowed in subject
Message: