From eca2dbe67f7c2ce9f5a53765ea73227fdad0ad28 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 21 Jul 2009 11:31:51 +0200 Subject: [PATCH] po: Add support for mo files in underlays In order to support translated basewiki and other underlays, we need support for mo files in underlays. The code did not allow this before, because if a mo file was in an underlay, then it might try to update it, and its pot, and write to the underlay, which is guaranteed to either fail due to permissions, or be undesirable. To fix, my approach is to just detect if a mo or pot file that is about to be updated is in an underlay, and skip updating it. This seems to work well: - If the mo is out of date in the underlay, it won't get updated, but this would probably be due to a problem in the underlay, or more likely, the wiki is being rebuilt and so it *thinks* the mo is out of date, but it's really not (and it would be a waste of time to rebuild it anyway). - If a page from the basewiki is edited, it is saved to the srcdir, which causes generation of an updated mo and pot also in the srcdir; the underlay stops being used for that page, and everything seems to work. Note that I am not including an underlay search directory for pot files. They *seem* to be unnecessary for the underlay, since the mo files in there never need to be updated. --- IkiWiki/Plugin/po.pm | 42 +++++++++++++++++++++++++++++------------- doc/plugins/po.mdwn | 33 --------------------------------- 2 files changed, 29 insertions(+), 46 deletions(-) diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index 124164da7..cf801c827 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -151,11 +151,24 @@ sub checkconfig () { push @{$config{wiki_file_prune_regexps}}, qr/\.pot$/; - if ($config{po_master_language}{code} ne 'en') { - # use translated underlay directories in preference - # to the untranslated ones - foreach my $underlay ('basewiki', reverse @{$config{underlaydirs}}) { - add_underlay("locale/".$config{po_master_language}{code}."/".$underlay); + # Translated versions of the underlays are added if available. + foreach my $underlay ("basewiki", map { m/^\Q$config{underlaydirbase}\E\/*(.*)/ } reverse @{$config{underlaydirs}}) { + next if $underlay=~/^locale\//; + + # Add underlay containing the pot files. + #add_underlay("locale/pot/$underlay") + # if -d "$config{underlaydirbase}/locale/pot/$underlay"; + + # Add underlays containing the po files for slave languages. + foreach my $ll (keys %{$config{po_slave_languages}}) { + add_underlay("locale/mo/$underlay") + if -d "$config{underlaydirbase}/locale/mo/$underlay"; + } + + if ($config{po_master_language}{code} ne 'en') { + # Add underlay containing translated source files + # for the master language. + add_underlay("locale/$config{po_master_language}{code}/$underlay"); } } } @@ -377,22 +390,26 @@ sub change (@) { my $updated_po_files=0; # Refresh/create POT and PO files as needed. + # (But avoid doing so if they are in an underlay directory.) foreach my $file (grep {istranslatablefile($_)} @rendered) { - my $page=pagename($file); my $masterfile=srcfile($file); + my $page=pagename($file); my $updated_pot_file=0; - # Only refresh Pot file if it does not exist, or if + # Only refresh POT file if it does not exist, or if # $pagesources{$page} was changed: don't if only the HTML was # refreshed, e.g. because of a dependency. - if ((grep { $_ eq $pagesources{$page} } @origneedsbuild) - || ! -e potfile($masterfile)) { + if ($masterfile eq "$config{srcdir}/$file" && + ((grep { $_ eq $pagesources{$page} } @origneedsbuild) + || ! -e potfile($masterfile))) { refreshpot($masterfile); $updated_pot_file=1; } my @pofiles; - map { - push @pofiles, $_ if ($updated_pot_file || ! -e $_); - } (pofiles($masterfile)); + foreach my $po (pofiles($masterfile)) { + next if ! $updated_pot_file && ! -e $po; + next if grep { $po=~/\Q$_\E/ } @{$config{underlaydirs}}; + push @pofiles, $po; + } if (@pofiles) { refreshpofiles($masterfile, @pofiles); map { IkiWiki::rcs_add($_) } @pofiles if $config{rcs}; @@ -666,7 +683,6 @@ sub istranslatablefile ($) { my $type=pagetype($file); return 0 if ! defined $type || $type eq 'po'; return 0 if $file =~ /\.pot$/; - return 0 unless -e "$config{srcdir}/$file"; # underlay dirs may be read-only return 1 if pagespec_match(pagename($file), $config{po_translatable_pages}); return; } diff --git a/doc/plugins/po.mdwn b/doc/plugins/po.mdwn index 8e87e2638..36b44cd7f 100644 --- a/doc/plugins/po.mdwn +++ b/doc/plugins/po.mdwn @@ -250,7 +250,6 @@ once [[intrigeri]]'s `meta` branch is merged. An integration branch, called `meta-po`, merges [[intrigeri]]'s `po` and `meta` branches, and thus has thise additional features. - Language display order ---------------------- @@ -260,38 +259,6 @@ order, as `po_slave_languages` is a hash. It would need to be converted to an array to support this. (If twere done, twere best done quickly.) --[[Joey]] -po files in underlay --------------------- - -I think this plugin doesn't yet allow po files to be present in an -underlay to translate files also from the underlay. - -In `istranslatablefile`, it specifically checks that -the file is present in srcdir. - -Problem with this is that it precludes using po to translate -the basewiki (work which is well under way for Danish BTW), -since the translated po files cannot really be used. - -A further problem comes if one wants to use a non-English language as the -`po_master_language`. It would be good to get a translated -basewiki, taking po files from the underlay and using them as the primary -page sources, but this plugin doesn't yet support that. - -And, maybe it shouldn't? A user would not expect to see a po file when -editing the index page of their wiki, just because they're using a -different language. Instead, we might want to build localized .mdwn files -for the basewiki, and then ikiwiki would just use that translated underlay. -The when the user edits index, they get a nice mdwn file to start from. - -So, we seem to have two cases, in one po files from the underlay should be -used, in the other not. Hmm. Support both? - -> Update -- I've written po2wiki, which can spit out translated underlays -> in markdown format, and made the po plugin enable use of such underlays -> when the master language is not `en`. ---[[Joey]] - Duplicate %links ? ------------------ -- 2.26.2