+package IkiWiki::PageSpec;
+
+sub match_istranslation ($;@) { #{{{
+ my $page=shift;
+ my $wanted=shift;
+
+ my %params=@_;
+ my $file=exists $params{file} ? $params{file} : $IkiWiki::pagesources{$page};
+ if (! defined $file) {
+ return IkiWiki::FailReason->new("no file specified");
+ }
+
+ if (! IkiWiki::pagetype($page) eq 'po') {
+ return IkiWiki::FailReason->new("is not a PO file");
+ }
+
+ my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/);
+ if (! defined $masterpage || ! defined $lang
+ || ! (length($masterpage) > 0) || ! (length($lang) > 0)) {
+ return IkiWiki::FailReason->new("is not named like a translation file");
+ }
+
+ if (! defined $IkiWiki::pagesources{$masterpage}) {
+ return IkiWiki::FailReason->new("the master page does not exist");
+ }
+
+ if (! defined $IkiWiki::config{po_supported_languages}{$lang}) {
+ return IkiWiki::FailReason->new("language $lang is not supported");
+ }
+
+ return IkiWiki::SuccessReason->new("page $page is a translation");
+
+} #}}}
+