Locale::Maketext::Lexicon не загружается (Windows): разрешение запрещено

У меня проблема с подпрограммой I18N, которая вызывает Locale:: Maketext:: Lexicon. Вызываемая подпрограмма (из CatalystX:: I18N:: Maketext) приведена ниже:

sub load_lexicon {
my ( $class, %params ) = @_;

my $locales = $params{locales} || [];
my $directories = $params{directories};
my $gettext_style = defined $params{gettext_style} ? $params{gettext_style} : 1;
my $inheritance = $params{inheritance} || {};

$directories = [ $directories ]
    if defined $directories
    && ref $directories ne 'ARRAY';
$directories ||= [];
$locales = [ $locales ]
    unless ref $locales eq 'ARRAY';

die "Invalid locales"
    unless defined $locales
    && scalar @$locales > 0
    && ! grep {  $_ !~ $CatalystX::I18N::TypeConstraints::LOCALE_RE } @$locales;

{
    no strict 'refs';
    my $lexicon_loaded = ${$class.'::LEXICON_LOADED'};
    if (defined $lexicon_loaded
        && $lexicon_loaded == 1) {
        warn "Lexicon has already been loaded for $class";
        return;
    }
}

my $lexicondata = {
    _decode => 1,
};
$lexicondata->{_style} = 'gettext'
    if $gettext_style;

my %locale_loaded;

# Loop all directories
foreach my $directory (@$directories) {
    next 
        unless defined $directory;

    $directory = Path::Class::Dir->new($directory)
        unless ref $directory eq 'Path::Class::Dir';

    next
        unless -d $directory->stringify && -e _ && -r _;

    my @directory_content =  $directory->children();

    # Load all avaliable message files
    foreach my $locale (@$locales) {
        my $lc_locale = lc($locale);
        $lc_locale =~ s/-/_/g;
        my @locale_lexicon;
        foreach my $content (@directory_content) {
            if ($content->is_dir) {
                push(@locale_lexicon,'Slurp',$content->stringify)
                    if $content->basename eq $locale;
            } else {
                my $filename = $content->basename;
                if ($filename =~ m/^$locale\.(mo|po)$/i) {
                    push(@locale_lexicon,'Gettext',$content->stringify);
                } elsif ($filename =~ m/^$locale\.m$/i) {
                    push(@locale_lexicon,'Msgcat',$content->stringify);
                } elsif($filename =~ m/^$locale\.db$/i) {
                    push(@locale_lexicon,'Tie',[ $class, $content->stringify ]);
                } elsif ($filename =~ m/^$lc_locale\.pm$/) {
                    $locale_loaded{$locale} = 1;
                    require $content->stringify;
                    # TODO transform maketext -> gettext syntax if flag is set
                    # Locale::Maketext::Lexicon::Gettext::_gettext_to_maketext
                }
            }
        }
        $lexicondata->{$locale} = \@locale_lexicon
            if scalar @locale_lexicon;
    }
}

# Fallback lexicon
foreach my $locale (@$locales) {
    next
        if exists $inheritance->{$locale};
    next
        if exists $locale_loaded{$locale};
    $lexicondata->{$locale} ||= ['Auto'];
}

eval qq[
    package $class;
    our \$LEXICON_LOADED = 1;
    Locale::Maketext::Lexicon->import(\$lexicondata)
];

while (my ($locale,$inherit) = each %$inheritance) {
    my $locale_class = lc($locale);
    my $inherit_class = lc($inherit);
    $locale_class =~ s/-/_/g;
    $inherit_class =~ s/-/_/g;
    $locale_class = $class.'::'.$locale_class;
    $inherit_class = $class.'::'.$inherit_class;
    no strict 'refs';
    push(@{$locale_class.'::ISA'},$inherit_class);
}

die("Could not load Locale::Maketext::Lexicon") if $@;
return;

}

Я думаю, что проблема в том, что я пытаюсь загрузить несколько файлов в каталоги, названные в соответствии с локалями (т. Е. Каталог en_GB будет содержать несколько файлов с сообщениями перевода). Я считаю, что это приводит к выполнению push(@locale_lexicon,'Slurp',$content->stringify).

Когда я временно изменил сообщение die в нижней части, чтобы добавить значение $@, я получил следующее:

"Could not load Locale::Maketext::Lexicon: Cannot read D:\WAMP\Apache\Apache2\htdocs\TopTable\Test\TopTable\root\locale\en_GB (called by TopTable::Maketext): Permission denied at D:/WAMP/Perl/perl/site/lib/Catalyst/ScriptRunner.pm line 50.

Я в растерянности относительно того, почему это сообщение останавливает его; процесс perl выполняется во время сеанса, в котором я вошел, и я могу без проблем получить доступ к каталогу и файлам в нем; Я также (временно) предоставил доступ "Все" к каталогу (хотя я уверен, что его нужно только читать), и это никак не повлияло.

У кого-нибудь есть предложения? Это работает, если я храню все свои переводы в одном файле en_gb.po, но это становится чрезвычайно громоздким, и я хотел бы выделить сообщения, если смогу.

Обратите внимание, тот факт, что он работает в каталоге Apache, объясняется тем, что именно там я и размещаю свои веб-материалы - он просто работает на моем ноутбуке, а внешний мир не имеет доступа (я разрабатываю веб-сайт Catalyst, который в конечном итоге будет работать на CentOS). На данный момент он работает через встроенный веб-сервер Catalyst (используя HTTP::Server::PSGI). Я запускаю это непосредственно под своим собственным именем пользователя, поэтому никакие сервисы не работают под отдельными учетными записями.

Большое спасибо

0 ответов

Другие вопросы по тегам