#
# This file is part of Dancer-Plugin-Locale-Wolowitz
#
# This software is copyright (c) 2016 by Natal Ngétal.
#
# This is free software; you can redistribute it and/or modify it under
# the same terms as the Perl 5 programming language system itself.
#
package Dancer::Plugin::Locale::Wolowitz;
$Dancer::Plugin::Locale::Wolowitz::VERSION = '0.160190';
use strict;
use warnings;
use 5.010;
use Dancer ':syntax';
use Dancer::Plugin;
use Dancer::Exception qw(:all);
use Locale::Wolowitz;
#ABSTRACT: Internationalization for Dancer
my $w;
#Register exception
register_exception('DirectoryNotFound',
message_pattern => "Wolowitz internationalization directory not found: %s"
);
add_hook(
before_template => sub {
$_[0]->{l} = sub { _loc(@_); };
}
);
register loc => sub {
_loc(@_);
};
sub _loc {
# my ( $str, $args, $force_lang ) = @_;
$w = Locale::Wolowitz->new(_path_directory_locale()) unless defined($w);
my $lang = $_[2] || _lang();
# return early if no args array-ref given
!$_[1] and return $w->loc($_[0], $lang); # was: !$args and return $w->loc($str, $lang);
return $w->loc($_[0], $lang, map($w->loc($_, $lang), @{$_[1]}));
}
sub _path_directory_locale {
my $path = plugin_setting()->{locale_path_directory}
// Dancer::FileUtils::path(setting('appdir'), 'i18n');
if ( ! -d $path ) {
raise DirectoryNotFound => $path;
}
return $path;
}
sub _lang {
my $lang;
# don't force the user to store lang in a session
if ( setting('session') ) {
my $lang_session = plugin_setting()->{lang_session} || 'lang';
my $session_language = session $lang_session;
return $session_language if $session_language;
$lang = _detect_lang_from_browser();
session $lang_session => $lang;
return $lang;
}
$lang = _detect_lang_from_browser();
return $lang;
}
sub _detect_lang_from_browser {
# a rude shortcut, for no-session contexts, so multiple loc() calls within the
# same request don't trigger regex matching/string munging over and over
return request->{__dancer_plugin_locale_wolowitz_detected_language} if request->{__dancer_plugin_locale_wolowitz_detected_language};
my $lang = request->accept_language;
return unless $lang;
$lang =~ s/-\w+//g;
$lang = (split(/,\s*/,$lang))[0] if index($lang,',');
request->{__dancer_plugin_locale_wolowitz_detected_language} = $lang; # this is a bit rude, but it saves us from detecting lang over and over (with regex and all) within the same request
return $lang;
}
register_plugin;
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Dancer::Plugin::Locale::Wolowitz - Internationalization for Dancer
=head1 VERSION
version 0.160190
=head1 SYNOPSIS
use Dancer ':syntax';
use Dancer::Plugin::Locale::Wolowitz;
get '/' => sub {
template index;
}
=head1 DESCRIPTION
Provides an easy way to translate your application. This module relies on L<Locale::Wolowitz>, please consult the documentation of Locale::Wolowitz.
=head1 METHODS
=head2 loc
loc('Welcome');
loc('View %1', ['Country'])
loc('View %1', ['Country'], $language)
or in templates
<% l('Welcome') %>
<% l('View %1', ['Country']) %>
<% l('View %1', ['Country'], 'fr') %>
Translated to the requested language, if such a translation exists, otherwise
no translation occurs. Just like in L<Locale::Wolowitz>, with the difference that
auto-detection is the default, hence an optional passed language is the third,
instead of the the second argument.
input: (Str): Key translate
(Arrayref): Arguments are injected to the placeholders in the string
(Str): Language code, to circumvent auto-detection from browser header
output: (Str): Translated to the requested language
=head1 CONFIGURATION
plugins:
Locale::Wolowitz:
lang_session: "lang"
locale_path_directory: "i18n"
=head1 CONTRIBUTING
This module is developed on Github at:
L<http://github.com/hobbestigrou/Dancer-Plugin-Locale-Wolowitz>
=head1 ACKNOWLEDGEMENTS
Thanks to Ido Perlmuter for Locale::Wolowitz
=head1 BUGS
Please report any bugs or feature requests via github issue tracker.
=head1 SUPPORT
You can find documentation for this module with the perldoc command.
perldoc Dancer::Plugin::Locale::Wolowitz
=head1 SEE ALSO
L<Dancer>
L<Locale::Wolowitz>
=head1 AUTHOR
Natal Ngétal
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2016 by Natal Ngétal.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut