Hi Leif,

> A variation on this idea would be to define a certain scope, 
> instead of main:: for the multilingual strings.
> $LANG::this = ...
> $LANG::that = ...

I hadn't thought of that, but your suggestion looks to be a good approach.  It 
looks like if I declare each language module, regardless of the language (or 
file name), to be "package Lang;" it will allow me to use the 
"$Lang::<variable>" syntax in the main program.

Like usual, you have provided useful and helpful advice.  Thank you.

-- Michael

# Michael Doran, Systems Librarian
# University of Texas at Arlington
# 817-272-5326 office
# 817-688-1926 mobile
# [EMAIL PROTECTED]
# http://rocky.uta.edu/doran/
 

> -----Original Message-----
> From: Leif Andersson [mailto:[EMAIL PROTECTED] 
> Sent: Sunday, April 27, 2008 3:20 PM
> To: Doran, Michael D; Perl4lib
> Subject: Re: Importing Perl package variables into a Perl 
> script with "require"
> 
> Michael,
> 
> Interesting question.
> 
> There are probably several approaches to implementing 
> multilingual support.
> I hope you get many responses to this question. I would 
> really like to see what others have to say.
> 
> From me - just a few simple comments:
> 
> I see two problems.
> 1) to load a particular file, unknown at compile time.
> 2) to "export" a variable into the main program
> 
> The first you have solved with require ("do" would also be fine).
> But you don't have to load a package, you can just load a file.
> 
> The second: define your variable(s) with "our".
> 
> #!/usr/bin/perl -wl
> use strict;
> 
> our %msg;
> my $lang = $ARGV[0] ||'en';
> 
> require "Mylang_$lang.pl";
> 
> print $msg{alert};
> print $msg{success};
> __END__
> 
> And Mylang_en.pl and friends looks like
> use strict;
> %main::msg = (
>     alert   => 'ALERT',
>     success => 'OK',
> );
> __END__
> 
> 
> A variation on this idea would be to define a certain scope, 
> instead of main:: for the multilingual strings.
> $LANG::this = ...
> $LANG::that = ...
> 
> But is it actually anything wrong with your original idea of 
> using no strict 'refs' for that part of the code building up 
> the loading of a module?
> 
> I don't know.
> 
> Doing a little google-ing a found this article quite interesting:
> http://www.drdobbsjournal.net/web-development/184416008
> 
> It is from The Perl Journal (May 2003), Autrijus Tang writing 
> about Web Localization and Perl. In that article he is 
> demonstrating the use of Locale::Maketext::Lexicon
> 
> Probably too demanding for smaller projects, but still interesting.
> 
> There is always a balance between how much work to spend on 
> solving a problem, how flexible and scalable it has to be, if 
> we like avoiding installing extra modules etc etc...
> 
> Leif
> 
> ======================================
> Leif Andersson, Systems Librarian
> Stockholm University Library
> SE-106 91 Stockholm
> SWEDEN
> Phone : +46 8 162769
> Mobile: +46 70 6904281
> 
> -----Ursprungligt meddelande-----
> Från: Doran, Michael D [mailto:[EMAIL PROTECTED]
> Skickat: den 26 april 2008 02:46
> Till: Perl4lib
> Ämne: Importing Perl package variables into a Perl script 
> with "require"
> 
> Back-story:
> 
> I have a Perl CGI program.  The CGI program needs to utilize 
> variables in one of several separate configuration files 
> (packages).  The different packages all contain the same 
> variables, but with different values for those variables.  
> Each package represents a different language for a 
> multilingual interface for the CGI program.  e.g. English.pm, 
> French.pm, Spanish.pm.
> 
> The CGI program can't determine which language package is 
> needed until it parses the form input and does a test based 
> on the value for a query string name/value pair.  Based on 
> the test, I assign a value to a package load command (i.e. 
> 'use English' or 'require English').  Because of that, I 
> can't load the package with "use Package" since "use" runs at 
> compile time, before I can assign a value to it.
> 
> So I am using the 'require' command, which executes at 
> runtime.  All's good so far.
> 
> Problem:
> 
> When loading a module with 'require' AND ALSO using 'use 
> strict' I can't figure out how to utilize those package 
> variables *without* also using an explicit package name (e.g. 
> $English::button_label).  Doing so is pretty straightforward 
> if I had been able to use 'use English', but it's not 
> straightforward (at least to me) on how to do it using 
> 'require English' [1].
> 
> At issue again, is not knowing what the appropriate package 
> name will be until runtime.  I can brute force within the CGI 
> program by doing it along these lines (which also requires 
> that I set "no strict 'refs'":
> 
> my ($var_1,$var_2,$var_3,$var_4);
> {   no strict 'refs';
>     $var_1 = ${$lang_package . "::" . "var_1"};
>     $var_2 = ${$lang_package . "::" . "var_2"};
>     $var_3 = ${$lang_package . "::" . "var_3"};
>     $var_4 = ${$lang_package . "::" . "var_4"}; }
> 
> Below is what I want to do, reduced to the minimum (i.e. I 
> want test.cgi to print out the variable without specifying 
> the package name):
> 
> test.cgi
> ========
> #!/usr/local/bin/perl
> use strict;
> my $lang_package_file = "English.pm";
> require $lang_package_file;
> print "My package variable \$language value is $language" . 
> "\n"; # This doesn't work [2] exit(0);
> 
> English.pm
> ==========
> package English;
> $language = "English";
> 1;
> 
> I know I can turn off "use strict" but I've tried to walk the 
> straight and narrow with recent programming efforts, and I 
> hate to start backsliding.  There's got to be a better, more 
> elegant way to do this and maintain 'use strict' in the main 
> CGI program, I'm just not getting it at the moment...
> 
> -- Michael
> 
> [1] I'm referring to using this stuff in the package, which 
> works great with 'use English' but not so great (for me 
> anyway) with 'require English'.
> 
> package English;
> require Exporter;
> @ISA    = qw(Exporter);
> @EXPORT = qw($language $etc);
> 
> [2] I get this when I run test.cgi: 
> 
> Global symbol "$language" requires explicit package name at 
> test.cgi line 5.
> Execution of test.cgi aborted due to compilation errors.
> 
> # Michael Doran, Systems Librarian
> # University of Texas at Arlington
> # 817-272-5326 office
> # 817-688-1926 mobile
> # [EMAIL PROTECTED]
> # http://rocky.uta.edu/doran/
> 

Reply via email to