123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- use strict;
- use v5.10;
- AddModuleDescription('translation-links.pl', 'Translation Links');
- our ($q, %Action, %Page, $OpenPageName, %Translate, %Languages, $LinkPattern, $FreeLinks, $FreeLinkPattern, $WikiLinks, @MyRules, @MyInitVariables, $FS);
- our ($TranslationLinkPattern, %TranslationLinkTarget,
- $TranslationLinkHelpPage);
- $TranslationLinkHelpPage = 'TranslationHelp';
- push(@MyInitVariables, \&TranslationLinkInit);
- my %TranslationLinkData;
- sub TranslationLinkInit {
- $TranslationLinkPattern = '\[\[(' . join('|', keys %Languages) . '):(';
- $TranslationLinkPattern .= $FreeLinkPattern if $FreeLinks;
- $TranslationLinkPattern .= '|' if $FreeLinks or $WikiLinks;
- $TranslationLinkPattern .= $LinkPattern if $WikiLinks;
- $TranslationLinkPattern .= ')\]\]';
- %TranslationLinkData = ();
- }
- push(@MyRules, \&TranslationLinkRule);
- sub TranslationLinkRule {
- if (m/\G$TranslationLinkPattern/cg) {
- $TranslationLinkData{$1} = $2;
- $Page{translations} = join($FS, %TranslationLinkData);
- return '';
- }
- return;
- }
- *TranslationLinkOldGetFooterLinks = \&GetFooterLinks;
- *GetFooterLinks = \&TranslationLinkNewGetFooterLinks;
- sub TranslationLinkNewGetFooterLinks {
- my $html = TranslationLinkOldGetFooterLinks(@_);
- my ($id, $rev) = @_;
- if ($id and not $rev) {
- OpenPage($id);
- my $bar;
- my %translations;
- if ($Page{translations}) {
- %translations = split(/$FS/, $Page{translations});
- $bar = join(' ', map {
- my $url;
- if ($TranslationLinkTarget{$_}) {
- $url = $TranslationLinkTarget{$_};
- $url =~ s/\%s/$translations{$_}/g or $url .= $translations{$_};
- } else {
- $url = ScriptUrl($translations{$_});
- }
- $q->a({-href=>$url, -class=>"translation $_"}, T($_));
- } keys %translations);
- }
- my %missing;
- foreach (keys %Languages) {
- if (not $translations{$_}) {
- $missing{$_} = 1;
- }
- }
-
-
-
- my @current = split(/,/, $Page{languages});
- if ($#current == 0) {
- delete $missing{$current[0]};
- }
- if (scalar keys %missing) {
- $bar .= ' ' . ScriptLink("action=translate;id=$id;missing="
- . join('_', sort keys %missing),
- T('Add Translation'), 'translation new');
- }
- $html = $q->span({-class=>'translation bar'}, $q->br(), $bar) . $html;
- }
- return $html;
- }
- $Action{translate} = \&DoTranslationLink;
- sub DoTranslationLink {
- my $source = shift;
- my $target = FreeToNormal(GetParam('target', ''));
- my $error = ValidId($target)
- || ($source eq $target and T("Please provide a different page name for the translation."));
- my $lang = GetParam('translation', '');
- if (not $error and $lang) {
-
- if (my $rule = BannedContent(NormalToFree($source)) || BannedContent(NormalToFree($target))) {
- ReportError(T('Edit Denied'), '403 FORBIDDEN', undef, $q->p(T('The page contains banned text.')),
- $q->p(T('Contact the wiki administrator for more information.')), $q->p($rule));
- }
- OpenPage(FreeToNormal($source));
- Save($OpenPageName, "[[$lang:$target]]\n" . $Page{text},
- Tss('Added translation: %1 (%2)',
- NormalToFree($target), T($lang)), 1);
- DoEdit($target);
- } else {
- my @missing = split(/_/, GetParam('missing', ''));
- print GetHeader(undef, Ts('Translate %s', NormalToFree($source)));
- print $q->start_div({-class=>'content translate'}), GetFormStart();
- print $q->p(Ts('Thank you for writing a translation of %s.', $source),
- T('Please indicate what language you will be using.'));
- if (defined $q->param('target') and not $lang) {
- print $q->div({-class=>'message'}, $q->p(T('Language is missing')));
- }
- print $q->p(T('Suggested languages:')),
- $q->p($q->radio_group(-name=>'translation',
- -values=>\@missing,
- -linebreak=>'true',
- -labels=>\%Translate));
- print $q->p(Ts('Please indicate a page name for the translation of %s.',
- $source),
- Ts('More help may be available here: %s.',
- GetPageLink($TranslationLinkHelpPage)));
- if (defined $q->param('target') and $error) {
- print $q->div({-class=>'message'}, $q->p($error));
- }
- print $q->p($q->label({-for=>'target'}, T('Translated page:')), ' ',
- $q->textfield('target', '', 40),
-
- $q->input({-type=>'hidden', -name=>'id',
- -value=>$source}),
- $q->input({-type=>'hidden', -name=>'action',
- -value=>'translate'}),
- $q->input({-type=>'hidden', -name=>'missing',
- -value=>GetParam('missing', '')}),
- $q->submit('dotranslate', T('Go!')));
- print $q->end_form, $q->end_div();
- PrintFooter();
- }
- }
|