diff --git a/docs/upgrades/packages-7.8.1/root_import_macro_picklanguage.wgpkg b/docs/upgrades/packages-7.8.1/root_import_macro_picklanguage.wgpkg new file mode 100644 index 000000000..30ba71727 Binary files /dev/null and b/docs/upgrades/packages-7.8.1/root_import_macro_picklanguage.wgpkg differ diff --git a/etc/WebGUI.conf.original b/etc/WebGUI.conf.original index 392c75f9a..b074415c1 100644 --- a/etc/WebGUI.conf.original +++ b/etc/WebGUI.conf.original @@ -811,6 +811,7 @@ "Page" : "Page", "PageTitle" : "PageTitle", "PageUrl" : "PageUrl", + "PickLanguage" : "PickLanguage", "RandomAssetProxy" : "RandomAssetProxy", "RandomThread" : "RandomThread", "RootTitle" : "RootTitle", @@ -968,6 +969,7 @@ "WebGUI::Content::AssetManager", "WebGUI::Content::AssetDiscovery", "WebGUI::Content::PassiveAnalytics", + "WebGUI::Content::SetLanguage", "WebGUI::Content::AjaxI18N", "WebGUI::Content::Account", "WebGUI::Content::AssetHistory", diff --git a/lib/WebGUI/Content/SetLanguage.pm b/lib/WebGUI/Content/SetLanguage.pm new file mode 100644 index 000000000..651ad10e0 --- /dev/null +++ b/lib/WebGUI/Content/SetLanguage.pm @@ -0,0 +1,83 @@ +package WebGUI::Content::SetLanguage; + +=head1 LEGAL + + ------------------------------------------------------------------- + WebGUI is Copyright 2001-2009 Plain Black Corporation. + ------------------------------------------------------------------- + Please read the legal notices (docs/legal.txt) and the license + (docs/license.txt) that came with this distribution before using + this software. + ------------------------------------------------------------------- + http://www.plainblack.com info@plainblack.com + ------------------------------------------------------------------- + +=cut + + +use strict; +use WebGUI::Session; +use WebGUI::International; + +=head1 NAME + +Package WebGUI::Content::SetLanguage + +=head1 DESCRIPTION + +Sets or delete an scratch variable that overrides the profile field language + +=head1 SYNOPSIS + +use WebGUI::Content::SetLanguage; +WebGUI::Content::SetLanguage::handler(); + +=head1 SUBROUTINES + +These subroutines are available from this package: + +handler + +=cut + +#------------------------------------------------------------- + +=head2 handler ( session, op, setLanguage ) + +sets or delete scratch variable in a session and returns undef + +=head3 session + +The current WebGUI::Session object. + +=head3 op + +op should be setLanguage to call the handler + +=head3 language + +language should be an installed language or delete + +=cut + + +sub handler { + my ($session) = @_; + return undef unless $session->form->get('op') eq 'setLanguage'; + my $language = $session->form->get('language'); + #check whether a language has been given in the url + if (!$language) { + $session->log->error('There is no language given to this method'); + return undef; + } + #make it possible to delete the language scratch variable from the session + if ($language eq 'delete' ) { + $session->scratch->removeLanguageOverride; + return undef; + } + #set a scratch variable language or throw error if language is not installed + else { + return $session->scratch->setLanguageOverride($language); + } +} +1; diff --git a/lib/WebGUI/Help/Macro_PickLanguage.pm b/lib/WebGUI/Help/Macro_PickLanguage.pm new file mode 100644 index 000000000..f5bb02f61 --- /dev/null +++ b/lib/WebGUI/Help/Macro_PickLanguage.pm @@ -0,0 +1,37 @@ +package WebGUI::Help::Macro_PickLanguage; + +use strict; + + +our $HELP = { + 'template variables' => { + title => 'picklanguage title', + body => '', + fields =>[], + 'variables' => [ + { + name => "lang_loop", + variables => [ + { + name => "language_lang", + }, + { + name => "language_langAbbr", + }, + { + name => "language_langAbbrLoc", + }, + { + name => "language_langEng", + }, + ], + }, + ], + related => [ + ], + }, + +}; + +1; ##All perl modules must return true +#vim:ft=perl diff --git a/lib/WebGUI/International.pm b/lib/WebGUI/International.pm index 900fb9160..942517db0 100644 --- a/lib/WebGUI/International.pm +++ b/lib/WebGUI/International.pm @@ -284,7 +284,7 @@ Specify a default language. Defaults to user preference or "English". sub new { my ($class, $session, $namespace, $language) = @_; $namespace ||= 'WebGUI'; - $language ||= $session->user->profileField('language'); + $language ||= $session->scratch->getLanguageOverride() || $session->user->profileField('language'); my $self = bless { _session => $session, diff --git a/lib/WebGUI/Macro/PickLanguage.pm b/lib/WebGUI/Macro/PickLanguage.pm new file mode 100644 index 000000000..306f4f183 --- /dev/null +++ b/lib/WebGUI/Macro/PickLanguage.pm @@ -0,0 +1,65 @@ +package WebGUI::Macro::PickLanguage; # edit this line to match your own macro name + +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2009 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use strict; + +=head1 NAME + +Package WebGUI::Macro::PickLanguage + +=head1 DESCRIPTION + +This macro makes a link for each installed language so when clicked the SetLanguage contetntHandler is called and sets the language in the scratch. The link text is the label from the language. + +=head2 process( $session ) + +The main macro class, Macro.pm, will call this subroutine and pass it + +=over 4 + +=item * + +A session variable + +=item templateId + +This macro takes a templateId to show the links + +=back + +=cut + + +#------------------------------------------------------------------- +sub process { + my $session = shift; + my $templateId = shift || "_aE16Rr1-bXBf8SIaLZjCg"; + my $template = WebGUI::Asset::Template->new($session, $templateId); + return "Could not instanciate template with id [$templateId]" unless $template; + my $i18n = WebGUI::International->new($session); + my $languages = $i18n->getLanguages(); + my $vars = {'lang_loop' => []}; + foreach my $language ( keys %$languages ) { + my $langVars = {}; + $langVars->{ 'language_url' } = '?op=setLanguage;language=' . $language ; + $langVars->{ 'language_lang' } = $i18n->getLanguage($language , 'label'); + $langVars->{ 'language_langAbbr' } = $i18n->getLanguage($language, 'languageAbbreviation'); + $langVars->{ 'language_langAbbrLoc' } = $i18n->getLanguage($language, 'locale'); + $langVars->{ 'language_langEng' } = $language; + push(@{$vars->{lang_loop}}, $langVars); + } + return $template->process($vars); +} + +1; + +#vim:ft=perl diff --git a/lib/WebGUI/Session/Scratch.pm b/lib/WebGUI/Session/Scratch.pm index fb6add7d3..d069fd694 100644 --- a/lib/WebGUI/Session/Scratch.pm +++ b/lib/WebGUI/Session/Scratch.pm @@ -15,6 +15,7 @@ package WebGUI::Session::Scratch; =cut use strict; +use WebGUI::International; =head1 NAME @@ -160,6 +161,19 @@ sub get { return $self->{_data}{$var}; } +#------------------------------------------------------------------- + +=head2 getLanguageOverride () + +Retrieves the language of the session scratch + +=cut + +sub getLanguageOverride { + my $self = shift; + my $languageOverride = $self->session->scratch->get('language'); + return $languageOverride; +} #------------------------------------------------------------------- @@ -180,7 +194,18 @@ sub new { bless {_session=>$session, _data=>$data}, $class; } +#------------------------------------------------------------------- +=head2 removeLanguageOverride() + +Removes the language scratch variable from the session + +=cut + +sub removeLanguageOverride { + my $self = shift; + $self->session->scratch->delete('language'); +} #------------------------------------------------------------------- =head2 session ( ) @@ -220,5 +245,30 @@ sub set { $self->session->db->write("insert into userSessionScratch (sessionId, name, value) values (?,?,?) on duplicate key update value=VALUES(value)", [$self->session->getId, $name, $value]); } +#---------------------------------------------------------------------- + +=head2 setLanguageOverride ( language ) + +Sets a scratch variable language in the session if the language is installed + +=head3 language + +The language that should be set into the session + +=cut + +sub setLanguageOverride { + my $self = shift; + my $language = shift; + my $i18n = WebGUI::International->new($self->session); + if($i18n->getLanguages()->{$language}) { + $self->session->scratch->set("language",$language); + return undef; + } + else { + $self->session->log->error("Language $language is not installed in this site"); + return undef; + } +} 1; diff --git a/lib/WebGUI/i18n/English/Macro_PickLanguage.pm b/lib/WebGUI/i18n/English/Macro_PickLanguage.pm new file mode 100644 index 000000000..a4f1cc78c --- /dev/null +++ b/lib/WebGUI/i18n/English/Macro_PickLanguage.pm @@ -0,0 +1,48 @@ +package WebGUI::i18n::English::Macro_PickLanguage; ##Be sure to change the package name to match the filename + +use strict; ##Required for all good Perl::Critic compliant code + +our $I18N = { ##hashref of hashes + 'picklanguage title' => { + message => q|PickLanguage macro template variables|, + lastUpdated => 1131394070, + context => q|Title of the help object| + }, + 'lang_loop' => { ##key that will be used to reference this entry. Do not translate this. + message => q|A loop that contains all installed languages|, + lastUpdated => 1131394070, #seconds from the epoch + context => q|A template loop| + }, + + 'language_lang' => { + message => q|The name of the language in that language.|, + lastUpdated => 1131394072, + context => q|A template variable to show the name of the language| + }, + + 'language_langAbbr' => { + message => q|An standard code for the language, for instance "en".|, + lastUpdated => 1131394072, + context => q|A label of the language to use in the template| + }, + 'language_langAbbrLoc' => { + message => q|An standard abbreviated label for the language, for instance "US".|, + lastUpdated => 1131394072, + context => q|A label of the language to use in the template| + }, + 'language_langEng' => { + message => q|The English name of the language.|, + lastUpdated => 1131394072, + context => q|A label of the language to use in the template| + }, + 'language_url' => { + message => q|The url that sets the WebGUI language to the selected language.|, + lastUpdated => 1131394072, + context => q|The url to change languages| + }, + + +}; + +1; +#vim:ft=perl diff --git a/t/Content/SetLanguage.t b/t/Content/SetLanguage.t new file mode 100644 index 000000000..20f6978fd --- /dev/null +++ b/t/Content/SetLanguage.t @@ -0,0 +1,55 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2009 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../lib"; +use WebGUI::Test; +use WebGUI::Session; +use WebGUI::Content::SetLanguage; + +# load your modules here + +use Test::More tests => 5; # increment this value for each test you create + +my $session = WebGUI::Test->session; + +# put your tests here +my $formvariables = { + 'op' =>'setLanguage', + 'language' => 'English' +}; +#test 1 +$session->request->setup_body($formvariables); +WebGUI::Content::SetLanguage::handler($session); +is($session->scratch->getLanguageOverride, 'English', 'the language was not set'); +#test2 +$formvariables->{'language'} = 'delete'; +$session->request->setup_body($formvariables); +WebGUI::Content::SetLanguage::handler($session); +is($session->scratch->getLanguageOverride, undef, 'language delete should remove the scratch variable'); +#test3 +$formvariables->{'op'} = 'SetLanguage'; +$formvariables->{'language'} = 'English'; +$session->request->setup_body($formvariables); +WebGUI::Content::SetLanguage::handler($session); +is($session->scratch->getLanguageOverride, undef, 'Naming the method wrongly should not change anything'); +#test4 +$formvariables->{'op'} = 'setLanguage'; +$formvariables->{'language'} = 'MyImaginaryLanguageThatIsNotInstalled'; +$session->request->setup_body($formvariables); +WebGUI::Content::SetLanguage::handler($session); +is($session->scratch->getLanguageOverride, undef, 'Giving a non installed language should not change anything'); +#test5 +$formvariables->{'language'} = undef; +$session->request->setup_body($formvariables); +WebGUI::Content::SetLanguage::handler($session); +is($session->scratch->getLanguageOverride, undef, 'Passing an empty language variable should return undef'); + diff --git a/t/International.t b/t/International.t index 2ed665dda..b608efe59 100644 --- a/t/International.t +++ b/t/International.t @@ -16,12 +16,13 @@ use WebGUI::Session; use Test::More; # increment this value for each test you create use File::Copy; use File::Spec; +use WebGUI::Content::SetLanguage; my $session = WebGUI::Test->session; my $numTests = 1; ##For conditional load check my $langTests = 4; ##For language look-up tests -$numTests += 12 + $langTests; +$numTests += 20 + $langTests; plan tests => $numTests; @@ -50,6 +51,16 @@ is($i18n->get('topicName', 'WebGUI'), 'WebGUI', 'get: test manual namespace over installPigLatin(); +#tests for sub new +my $i18nNew1 = WebGUI::International->new($session); +is($i18nNew1->{_language}, 'English', 'Calling new without parameters should return object with language English'); +is($i18nNew1->{_namespace}, 'WebGUI', 'Calling without parameters should give namespace WebgUI'); +my $i18nNew2 = WebGUI::International->new($session, 'WebGUI::Asset'); +is($i18nNew2->{_language}, 'English', 'Calling new with only namespace parameter should return object with language English'); +is($i18nNew2->{_namespace}, 'WebGUI::Asset', 'Calling with only parameter namespace should give requested namespace'); +my $i18nNew3 = WebGUI::International->new($session, undef , 'PigLatin'); +is($i18nNew3->{_language}, 'PigLatin', 'Calling new with only language parameter should return object with language PigLatin'); +is($i18nNew3->{_namespace}, 'WebGUI', 'Calling with only parameter namespace should give WebGUI '); my $languages = $i18n->getLanguages(); my $gotPigLatin = exists $languages->{PigLatin}; @@ -102,6 +113,24 @@ sub installPigLatin { ); } +#test for sub new with language overridden by scratch +my $formvariables = { + 'op' =>'setLanguage', + 'language' => 'PigLatin' +}; +$session->request->setup_body($formvariables); +WebGUI::Content::SetLanguage::handler($session); +my $newi18n = WebGUI::International->new($session); + is( + $newi18n->get('webgui','WebGUI','PigLatin'), + 'ebGUIWay', + 'if the piglatin language is in the scratch that messages should be retrieved' +); + is( + $newi18n->get('104','Asset','PigLatin'), + $newi18n->get('104', 'WebGUI', 'English'), + 'Language check after SetLanguage contentHandler : key from missing file return English key' +); END { unlink File::Spec->catfile(WebGUI::Test->lib, qw/WebGUI i18n PigLatin WebGUI.pm/); unlink File::Spec->catfile(WebGUI::Test->lib, qw/WebGUI i18n PigLatin.pm/); diff --git a/t/Macro/PickLanguage.t b/t/Macro/PickLanguage.t new file mode 100644 index 000000000..ad93afb6a --- /dev/null +++ b/t/Macro/PickLanguage.t @@ -0,0 +1,125 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2009 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- +use FindBin; +use strict; +use lib "$FindBin::Bin/../lib"; + +use WebGUI::Test; +use WebGUI::Session; +use WebGUI::Asset::Template; + +use Test::More; # increment this value for each test you create +use Test::Deep; +use Test::MockObject; +use Test::MockObject::Extends; + +my $session = WebGUI::Test->session; + +my $numTests = 3; + +$numTests += 1; #For the use_ok + +plan tests => $numTests; + +my $macro = 'WebGUI::Macro::PickLanguage'; +my $loaded = use_ok($macro); + +my $macroMock = Test::MockObject->new({}); +$macroMock->set_isa('WebGUI::Macro::PickLanguage'); +$macroMock->set_true('process'); + +#test for normal use + +my $templateId = 'PICKLANGUAGE_TEMPLATE_'; + +my $templateMock = Test::MockObject->new({}); +$templateMock->set_isa('WebGUI::Asset::Template'); +$templateMock->set_always('getId', $templateId); +my $templateVars; +$templateMock->mock('process', sub { $templateVars = $_[1]; } ); + + +{ + WebGUI::Test->mockAssetId($templateId, $templateMock); + WebGUI::Macro::PickLanguage::process($session,$templateMock->getId); + + cmp_deeply( + $templateVars, + { + lang_loop => [ + { 'language_url' => '?op=setLanguage;language=English', + 'language_lang' => 'English', + 'language_langAbbr' => 'en', + 'language_langAbbrLoc' => 'US', + 'language_langEng' => 'English' + }, + ], + }, + 'some template variables are created' + ); + WebGUI::Test->unmockAssetId($templateId); +} + +#test when template Id is left empty + +$templateId = ''; +my $templateNoId = $templateMock->mock('process',''); +$templateMock->set_always('getId', $templateId); +$templateMock->mock('process', sub { $templateVars = $_[1]; } ); + +{ + + WebGUI::Test->mockAssetId($templateId, $templateMock); + WebGUI::Macro::PickLanguage::process($session,$templateMock->getId); + + cmp_deeply( + $templateVars, + { + lang_loop => [ + { 'language_url' => '?op=setLanguage;language=English', + 'language_lang' => 'English', + 'language_langAbbr' => 'en', + 'language_langAbbrLoc' => 'US', + 'language_langEng' => 'English' + }, + ], + }, + 'some template variables are created, when no templateId is passed on with the macro' + ); + WebGUI::Test->unmockAssetId($templateId); +} + + +#{ +# WebGUI::Test->mockAssetId($templateNoId, $templateMock); +# $error = WebGUI::Macro::PickLanguage::process($session,$templateMock->getId); +# +# is($error,'Could not instanciate template with id []',"Empty template Id should return error"); +# +# WebGUI::Test->unmockAssetId($templateNoId); +#} + +#test for an incorrect template Id + +$templateId = '1234567890123456789012'; +my $templateWrongId = $templateMock->mock('process',''); +$templateMock->set_always('getId', $templateId); +$templateMock->mock('process', sub { $templateVars = $_[1]; } ); +my $error; + + +{ + WebGUI::Test->mockAssetId($templateWrongId, $templateMock); + $error = WebGUI::Macro::PickLanguage::process($session,$templateMock->getId); + + is($error,'Could not instanciate template with id [1234567890123456789012]',"Template from the wrong namespace should not be initiated"); + WebGUI::Test->unmockAssetId($templateWrongId); +} + diff --git a/t/Session/Scratch.t b/t/Session/Scratch.t index 1b56afcbd..948e5bdf8 100644 --- a/t/Session/Scratch.t +++ b/t/Session/Scratch.t @@ -15,7 +15,7 @@ use lib "$FindBin::Bin/../lib"; use WebGUI::Test; use WebGUI::Session; -use Test::More tests => 58; # increment this value for each test you create +use Test::More tests => 62; # increment this value for each test you create use Test::Deep; my $session = WebGUI::Test->session; @@ -117,6 +117,16 @@ is($sessionBank[0]->scratch->deleteNameByValue('',''), undef, 'deleteNameByValue is($sessionBank[3]->scratch->deleteNameByValue('falseValue','0'), 1, 'deleteNameByValue will delete values that are false (0)'); is($sessionBank[2]->scratch->deleteNameByValue('falseValue',''), 1, "deleteNameByValue will delete values that are false ('')"); +$scratch->setLanguageOverride('English'); +is($scratch->getLanguageOverride, 'English', 'session scratch language is not correctly set'); +$scratch->removeLanguageOverride; +is($scratch->getLanguageOverride, undef, 'The session scratch variable language is not removed'); +$scratch->setLanguageOverride('myimmaginarylanguagethatisnotinstalled'); +is($scratch->getLanguageOverride, undef, 'A non-existing language is set'); +$scratch->setLanguageOverride('English'); +$scratch->setLanguageOverride(); +is($scratch->getLanguageOverride, 'English', 'A empty string is falsely recognised as a language'); + END { $session->scratch->deleteAll; foreach my $wgSess ($newSession, @sessionBank) {