Changeset 18981

Show
Ignore:
Timestamp:
15.04.2009 16:32:53 (10 years ago)
Author:
davidb
Message:

Code now looks for resource bundles in extension folders as well

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • gsdl/trunk/perllib/gsprintf.pm

    r17533 r18981  
    5858    # Return unless the required arguments were supplied 
    5959    return unless (defined($handle) && defined($text_string)); 
    60  
     60     
    6161    # Look up all the strings in the dictionary 
    6262    $text_string =~ s/(\{[^\}]+\})/&lookup_string($1)/eg; 
     
    7777    # Try the default resource bundle next 
    7878    if (!defined($utf8string)) { 
    79     # Load the default resource bundle if it is not already loaded 
    80     &load_default_resource_bundle() if (!%defaultresourcebundle); 
    81  
    82     $utf8string = $defaultresourcebundle{$stringkey}; 
    83     $outputencoding = $defaultoutputencoding; 
    84     } 
    85  
     79    # Load the default resource bundle if it is not already loaded 
     80    &load_default_resource_bundle() if (!%defaultresourcebundle); 
     81     
     82    $utf8string = $defaultresourcebundle{$stringkey}; 
     83    $outputencoding = $defaultoutputencoding; 
     84    } 
     85     
    8686    # Try the English resource bundle last 
    8787    if (!defined($utf8string)) { 
    88     # Load the English resource bundle if it is not already loaded 
    89     &load_english_resource_bundle() if (!%englishresourcebundle); 
    90  
    91     $utf8string = $englishresourcebundle{$stringkey}; 
    92     $outputencoding = $englishoutputencoding; 
    93     } 
    94  
     88    # Load the English resource bundle if it is not already loaded 
     89    &load_english_resource_bundle() if (!%englishresourcebundle); 
     90     
     91    $utf8string = $englishresourcebundle{$stringkey}; 
     92    $outputencoding = $englishoutputencoding; 
     93    } 
     94     
    9595    # No matching string was found, so just return the key 
    9696    if (!defined($utf8string)) { 
    97     return $stringkey; 
    98     } 
    99  
     97    return $stringkey; 
     98    } 
     99     
    100100    # Return the string matching the key 
    101101    return $utf8string if (!defined($outputencoding) || $outputstringsinUTF8 
    102                || $outputencoding eq "utf8"); 
    103  
     102               || $outputencoding eq "utf8"); 
     103     
    104104    # If an 8-bit output encoding has been defined, encode the string appropriately 
    105105    my $encoded=unicode::unicode2singlebyte(&unicode::utf82unicode($utf8string), $outputencoding); 
     
    107107    # If we successfully encoded it, return it 
    108108    if ($encoded) { return $encoded } 
    109  
     109     
    110110    # Otherwise, we can't convert to the requested encoding. return the utf8? 
    111111    $specialoutputencoding='utf8'; 
     
    117117{ 
    118118    my $language = shift(@_); 
    119  
     119     
    120120    # Read the specified resource bundle 
    121     my $resourcebundlehome = &util::filename_cat("$ENV{'GSDLHOME'}", "perllib"); 
    122121    my $resourcebundlename = "strings_" . $language . ".properties"; 
    123     my $resourcebundlefile = &util::filename_cat($resourcebundlehome, $resourcebundlename); 
    124  
    125     %specialresourcebundle = &read_resource_bundle($resourcebundlefile); 
     122     
     123    %specialresourcebundle  
     124    = &read_resource_bundle_and_extensions($ENV{'GSDLHOME'},"perllib",$resourcebundlename); 
    126125    return if (!%specialresourcebundle); 
    127  
     126     
    128127    # Read the output encoding to use from the resource bundle 
    129128    if ($ENV{'GSDLOS'} =~ /windows/) { 
    130     $specialoutputencoding = $specialresourcebundle{"{OutputEncoding.windows}"}; 
     129    $specialoutputencoding = $specialresourcebundle{"{OutputEncoding.windows}"}; 
    131130    } 
    132131    else { 
    133     # see if there is an encoding set in the appropriate locale env var 
    134  
    135     foreach my $envvar ('LC_ALL', 'LANG') { 
    136         if (!exists $ENV{$envvar}) { next } 
    137         my $locale=$ENV{$envvar}; 
    138         if ($locale !~ /^\w+\.(.+)$/) { next } 
    139         my $enc=lc($1); 
    140         $enc =~ s/-/_/g; 
    141         if ($enc eq 'utf_8') { $enc='utf8' } # normalise to this name 
    142         $specialoutputencoding = $enc; 
    143         return; 
    144     } 
    145     $specialoutputencoding = $specialresourcebundle{"{OutputEncoding.unix}"}; 
     132    # see if there is an encoding set in the appropriate locale env var 
     133     
     134    foreach my $envvar ('LC_ALL', 'LANG') { 
     135        if (!exists $ENV{$envvar}) { next } 
     136        my $locale=$ENV{$envvar}; 
     137        if ($locale !~ /^\w+\.(.+)$/) { next } 
     138        my $enc=lc($1); 
     139        $enc =~ s/-/_/g; 
     140        if ($enc eq 'utf_8') { $enc='utf8' } # normalise to this name 
     141        $specialoutputencoding = $enc; 
     142        return; 
     143    } 
     144    $specialoutputencoding = $specialresourcebundle{"{OutputEncoding.unix}"}; 
    146145    } 
    147146} 
     
    151150{ 
    152151    # Read the default resource bundle 
    153     my $resourcebundlehome = &util::filename_cat("$ENV{'GSDLHOME'}", "perllib"); 
    154152    my $resourcebundlename = "strings.properties"; 
    155     my $resourcebundlefile = &util::filename_cat($resourcebundlehome, $resourcebundlename); 
    156  
    157     %defaultresourcebundle = &read_resource_bundle($resourcebundlefile); 
     153 
     154    %defaultresourcebundle  
     155    = &read_resource_bundle_and_extensions($ENV{'GSDLHOME'},"perllib",$resourcebundlename); 
    158156    if (!%defaultresourcebundle) { 
    159157        # $! will still have the error value for the last failed syscall 
    160         print STDERR "$! $resourcebundlefile\n"; 
    161     # set something so we don't bother trying to load it again 
    162     $defaultresourcebundle{0}=undef;  
     158        print STDERR "$! $resourcebundlename\n"; 
     159    # set something so we don't bother trying to load it again 
     160    $defaultresourcebundle{0}=undef;  
    163161        return; 
    164162    } 
    165  
     163     
    166164    # Read the output encoding to use from the resource bundle 
    167165    if ($ENV{'GSDLOS'} =~ /windows/) { 
    168     $defaultoutputencoding = $defaultresourcebundle{"{OutputEncoding.windows}"}; 
     166    $defaultoutputencoding = $defaultresourcebundle{"{OutputEncoding.windows}"}; 
    169167    } 
    170168    else { 
    171     $defaultoutputencoding = $defaultresourcebundle{"{OutputEncoding.unix}"}; 
     169    $defaultoutputencoding = $defaultresourcebundle{"{OutputEncoding.unix}"}; 
    172170    } 
    173171} 
     
    178176    # Ensure the English resource bundle hasn't already been loaded 
    179177    if (%specialresourcebundle && $specialresourcebundle{"{Language.code}"} eq "en") { 
    180     %englishresourcebundle = %specialresourcebundle; 
    181     $englishoutputencoding = $specialoutputencoding; 
     178    %englishresourcebundle = %specialresourcebundle; 
     179    $englishoutputencoding = $specialoutputencoding; 
    182180    } 
    183181     
    184182    if ($defaultresourcebundle{"{Language.code}"} && 
    185183        $defaultresourcebundle{"{Language.code}"} eq "en") { 
    186     %englishresourcebundle = %defaultresourcebundle; 
    187     $englishoutputencoding = $defaultoutputencoding; 
    188     } 
    189  
     184    %englishresourcebundle = %defaultresourcebundle; 
     185    $englishoutputencoding = $defaultoutputencoding; 
     186    } 
     187     
    190188    # Read the English resource bundle 
    191     my $resourcebundlehome = &util::filename_cat("$ENV{'GSDLHOME'}", "perllib"); 
    192189    my $resourcebundlename = "strings_en.properties"; 
    193     my $resourcebundlefile = &util::filename_cat($resourcebundlehome, $resourcebundlename); 
    194  
    195     %englishresourcebundle = &read_resource_bundle($resourcebundlefile); 
     190 
     191    %englishresourcebundle  
     192    = &read_resource_bundle_and_extensions($ENV{'GSDLHOME'},"perllib",$resourcebundlename); 
    196193    return if (!%englishresourcebundle); 
    197  
     194     
    198195    # Read the output encoding to use from the resource bundle 
    199196    if ($ENV{'GSDLOS'} =~ /windows/) { 
    200     $englishoutputencoding = $englishresourcebundle{"{OutputEncoding.windows}"}; 
     197    $englishoutputencoding = $englishresourcebundle{"{OutputEncoding.windows}"}; 
    201198    } 
    202199    else { 
    203     $englishoutputencoding = $englishresourcebundle{"{OutputEncoding.unix}"}; 
    204     } 
     200    $englishoutputencoding = $englishresourcebundle{"{OutputEncoding.unix}"}; 
     201    } 
     202} 
     203 
     204 
     205sub read_resource_bundle_and_extensions 
     206{ 
     207    my ($bundle_base,$primary_dir,$resourcename) = @_; 
     208 
     209    my $primary_resourcebundlefile  
     210    = &util::filename_cat($bundle_base,$primary_dir,$resourcename); 
     211 
     212    my $resourcebundle = read_resource_bundle($primary_resourcebundlefile); 
     213    return if (!defined $resourcebundle); 
     214 
     215    my @extensions = split(/:/,$ENV{'GSDLEXTS'}); 
     216    foreach my $e (@extensions) {    
     217    my $ext_base 
     218        = &util::filename_cat($bundle_base,"ext",$e); 
     219 
     220    my $ext_resourcebundlefile  
     221        = &util::filename_cat($ext_base,$primary_dir,$resourcename); 
     222 
     223    # can ignore return value (will be same reference to $resourcebundle) 
     224    read_resource_bundle($ext_resourcebundlefile,$resourcebundle); 
     225    } 
     226     
     227    return %$resourcebundle; 
    205228} 
    206229 
     
    208231sub read_resource_bundle 
    209232{ 
    210     my ($resourcebundlefilepath) = shift(@_); 
    211  
    212     # Return an empty hash if the specified resource bundle could not be read 
    213     return () if (!open(RESOURCE_BUNDLE, "<$resourcebundlefilepath")); 
    214  
     233    my ($resourcebundlefilepath,$resourcebundle) = @_; 
     234 
     235    if (!open(RESOURCE_BUNDLE, "<$resourcebundlefilepath")) { 
     236    # When called for the first time (primary resource), $resourcebundle 
     237    # is not defined (=undef). If the file does not exist, then we return 
     238    # this 'undef' to signal it was not found 
     239    # For an extension resource bundle, if it does not exist this 
     240    # is not so serious (in fact quite likely) => return what we  
     241    # have built up so far 
     242     
     243    return $resourcebundle; 
     244    } 
     245 
     246    if (!defined $resourcebundle) {  
     247    # resource files exists, so exect some content to be stored 
     248    $resourcebundle = {}; 
     249    } 
     250     
    215251    # Load this resource bundle 
    216252    my @resourcebundlelines = <RESOURCE_BUNDLE>; 
     
    218254 
    219255    # Parse the resource bundle 
    220     my %resourcebundle = (); 
     256 
    221257    foreach my $line (@resourcebundlelines) { 
    222258        # Remove any trailing whitespace 
     
    232268 
    233269                # Map key to text 
    234                 $resourcebundle{$linekey} = $linetext; 
     270                $resourcebundle->{$linekey} = $linetext; 
    235271            } 
    236272        } 
    237273    } 
    238274 
    239     return %resourcebundle; 
     275    return $resourcebundle; 
    240276} 
    241277