Search code examples
perlinternationalizationcatalyst

Perl and Catalyst: accessing maketext from a model


Edited to clarify / reflect what I've been trying:

I'm using CatalystX::I18N::* in order to be able to internationalise my site. I have that working nicely, and my site text is coming from $c->maketext().

However, I've been trying to access these codes from my database model (in order to generate, e.g., success or failure messages when checking input before creating / updating) and am struggling.

According to the CatalystX::I18N docs, CatalystX::I18N::Maketext is a 'Helpful wrapper around Locale::Maketext. Can also be used outside of Catalyst'.

I have MyApp::Maketext setup as directed:

package MyApp::Maketext;

use strict;
use warnings;
use parent qw(CatalystX::I18N::Maketext);

1;

I have a little test script running, the setup for which is this:

#!/usr/bin/perl

use strict;
use warnings;
use FindBin qw( $Bin );
use lib "$Bin/../lib";
use TopTable::Maketext;
use Path::Class::Dir;

my $dir = Path::Class::Dir->new( "$Bin/..", "root", "locale" );
TopTable::Maketext->load_lexicon(
  locales => ["en_GB"], # Required
  directories => [$dir], # Required
  gettext_style => 0, # Optional, Default 1
);

I am then trying two different ways to get a handle to the maketext() method:

my $lang = TopTable::Maketext->get_handle;
printf "%s\n", $lang->maketext( "menu.title.news" );

Gives the following result:

Can't call method "maketext" on an undefined value at bin\maketext-demo.pl line 23.

If I swap ->get_handle to ->new:

my $lang = TopTable::Maketext->new;
printf "%s\n", $lang->maketext( "menu.title.news" );

I get the following:

maketext doesn't know how to say:
menu.title.news
as needed at bin\maketext-demo.pl line 23.

I'm at a bit of a loss as to what to try next! Thank you so much in advance for any pointers anyone can give.

Chris


Solution

  • I have finally got my head around this - this is the code that eventually worked:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use FindBin qw( $Bin );
    use lib "$Bin/../lib";
    use Data::Dumper::Concise;
    use TopTable::Maketext;
    use Config::ZOMG;
    use Path::Class::Dir;
    
    my $tt_config = Config::ZOMG->new( name => 'TopTable' );
    my $config_hash = $tt_config->load;
    
    my (@locales, %inhertiance, $config);
    $config = $config_hash->{I18N}{locales};
    foreach my $locale (keys %$config) {
      push(@locales, $locale);
      $inhertiance{$locale} = $config->{$locale}{inherits} if defined $con
    +fig->{$locale}{inherits};
    }
    
    my $dir = Path::Class::Dir->new( "$Bin/..", "root", "locale" );
    TopTable::Maketext->load_lexicon(
      locales => \@locales,
      directories => [$dir],
      gettext_style => 1,
      inheritance => \%inhertiance,
    );
    
    my $lang = TopTable::Maketext->get_handle( "en_GB" );
    printf "%s\n", $lang->maketext( "menu.title.league-tables", "Division Three" );
    
    1;
    

    This gives the correct value of:

    League Tables for Division Three
    

    Thanks for putting up with my spam!