This was _really_ annoying me to the point of burning effigies of 
camels, so with a view to helping any other unwary souls -

Problem:
After rolling your own installation of perl , when you try to run a perl 
script you get a variation on the following:

perl: warning: Setting locale failed.
                perl: warning: Please check that your locale settings:
                        LC_ALL = "En_US",
                        LANG = (unset)
                    are supported and installed on your system.
                perl: warning: Falling back to the standard locale ("C").

Several places on the internet, including the ADC section of the apple 
web site, suggest creating a .tcshrc or .bash file containing the 
missing variables. This is only a partial solution however, working only 
if you run the script from a terminal window (aka CLI) - perl scripts 
run as standalones, cron jobs and so on, still throw up locale errors 
because the system environment doesn't have the necessary variable(s) set

The solution?

I got the answer thanks to this page by Bob Dalgleish
http://duke.usask.ca/~dalglb/macosx/Perl_5.6.html

where it gives an example of a shell script which makes an 
environment.plist containing the missing locale variable(s).

I've turned it into a perl script (written for clarity rather than 
compactness) with some extra features which I think might be useful 
(like the ability to change the language locale).


==SCRIPT STARTS BELOW THIS TEXT==
#!/usr/bin/perl -w

# Locale WTK(water torture killer).pl
# Author Robin McFarlane <[EMAIL PROTECTED]>
#
# based on the shell script written by by Bob Dalgleish
# viewable at http://duke.usask.ca/~dalglb/macosx/Perl_5.6.html
#
# This script will look for any missing folders and files in your user 
folder,
# needed to kill locale related errors, creating them as need be.
#
# It will also safely add missing locale info to an existing 
environment.plist,
# making a back-up of the original called "environment.plist.old" in the 
same folder.



#=========== declare includes =============

use strict;
use diagnostics-verbose;


#========== declare variables =============

my ($TempPath,$path,$flag,$dir,$Missing1,$Missing2);
my (@NewPlist,@OldPlist,@Template,$TempFile,$plist);
my (%DataCheck,$ChangeFlag);

$path=join ('/', '/Users',$ENV{USER});
$dir ='.MacOSX';
$plist='environment.plist';
@Template=<DATA>;

print "Checking your current environment set up\n";

$TempPath= join ('/',$path,$dir);
        if (-e $TempPath){
        print "\t",$TempPath," exists\n";
        }else{
        print "\t",$TempPath," is missing - creating it now\n";
        mkdir $TempPath || die "can't make $TempPath,\n OS says $!";
        }


$TempPath= join ('/',$TempPath,$plist);

if (-f $TempPath){
        
        print "\t",$TempPath," exists, checking the locale data\n";
        open(IN, $TempPath)|| die "can't open $TempPath,\n OS says $!";
        @OldPlist=<IN>;
        close (IN);
        @DataCheck{@OldPlist}=();
        
                for (@Template){
                        unless (exists $DataCheck{$_}){
                        print "\t$_ missing from $TempPath, adding\n";
                        $DataCheck{$_}=() ;
                        $ChangeFlag=1;
                        
                }
        @NewPlist=keys(%DataCheck);
                if ($ChangeFlag){
                $flag = rename $TempPath,$TempPath.'.old';
                die "can't seem to modify $TempFile, may be permissions 
related\n" if $flag;
                }
        }
        
        
} else {
        print "\t",$TempPath," is missing - creating it now\n";
        @NewPlist=@Template;
        $ChangeFlag=1;
}

if ($ChangeFlag){

        
        open (OUT,">$TempPath") || die "can't print to $TempPath,\n OS 
says $!";
        print OUT @NewPlist;
        close (OUT);
        print "your locale data has been updated - \nany changes will come 
into effect the next time you log into OSX. \n";
}else { print "No data was changed, any problems you might be 
experiencing \nare not connected with your environment.plist\n"; }

__DATA__
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist SYSTEM 
"file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="0.9">
<dict>
        <key>LANG</key>
        <string>us_ENG</string>
        <key>LC_ALL</key>
        <string>C</string>
</dict>
</plist>
==SCRIPT STARTS ABOVE THIS TEXT==

Reply via email to