]>
Commit | Line | Data |
---|---|---|
cd1a2927 MT |
1 | # SmoothWall CGIs\r |
2 | #\r | |
3 | # This code is distributed under the terms of the GPL\r | |
4 | #\r | |
5 | # (c) The SmoothWall Team\r | |
6 | # Copyright (c) 2002/08/23 Mark Wormgoor <mark@wormgoor.com> Split from header.pl\r | |
7 | #\r | |
8 | # $Id: lang.pl,v 1.1.2.11 2005/09/10 16:22:50 eoberlander Exp $\r | |
9 | #\r | |
10 | \r | |
11 | package Lang;\r | |
12 | require 'CONFIG_ROOT/general-functions.pl';\r | |
13 | use strict;\r | |
14 | \r | |
15 | ### A cache file to avoid long recalculation\r | |
16 | $Lang::CacheLang = '/var/run/cache-lang.pl';\r | |
17 | \r | |
18 | # When you want to add your own language strings/entries to the ipcop language file,\r | |
19 | # you should create a file with <PREFIX>.<LANG>.pl into CONFIG_ROOT/addon-lang dir\r | |
20 | # <PREFIX> is free choosable but should be significant. An Example might be "myAddnName"\r | |
21 | # <LANG> is a mnemonic of the used language like en, de, it, nl etc.\r | |
22 | # You can find a detailed list of possible mnemonic's in the file CONFIG_ROOT/langs/list\r | |
23 | # A file could be named "VirtualHttpd.en.pl" for example.\r | |
24 | #\r | |
25 | # The file content has to start with (of course without the leading #):\r | |
26 | # --------- CODE ---------\r | |
27 | #%tr = (%tr,\r | |
28 | # 'key1' => 'value', # add all your entries key/values here \r | |
29 | # 'key2' => 'value' # and end with (of course without the leading #):\r | |
30 | #);\r | |
31 | # --------- CODE END---------\r | |
32 | #\r | |
33 | # After you have copied all your files to CONFIG_ROOT/add-lang you have to run the\r | |
34 | # script compilation:\r | |
35 | # perl -e "require '/CONFIG_ROOT/lang.pl'; &Lang::BuildCacheLang"\r | |
36 | \r | |
37 | \r | |
38 | ### Initialize language\r | |
39 | %Lang::tr = ();\r | |
40 | my %settings = ();\r | |
41 | &General::readhash("${General::swroot}/main/settings", \%settings);\r | |
42 | reload($settings{'LANGUAGE'});\r | |
43 | \r | |
44 | # language variable used by makegraphs script\r | |
45 | our $language;\r | |
46 | $language = $settings{'LANGUAGE'};\r | |
47 | \r | |
48 | #\r | |
49 | # Load requested language file from cachefile. If cachefile doesn't exist, build on the fly.\r | |
50 | # (it is a developper options)\r | |
51 | #\r | |
52 | sub reload {\r | |
53 | \r | |
54 | my ($LG) = @_;\r | |
55 | %Lang::tr = (); # start with a clean array\r | |
56 | \r | |
57 | # Use CacheLang if present & not empty.\r | |
58 | if (-s "$Lang::CacheLang.$LG" ) {\r | |
59 | ##fix: need to put a lock_shared on it in case rebuild is active ?\r | |
60 | do "$Lang::CacheLang.$LG";\r | |
61 | #&General::log ("cachelang file used [$LG]"); \r | |
62 | return;\r | |
63 | }\r | |
64 | \r | |
65 | #&General::log("Building on the fly cachelang file for [$LG]");\r | |
66 | do "${General::swroot}/langs/en.pl";\r | |
67 | do "${General::swroot}/langs/$LG.pl" if ($LG ne 'en');\r | |
68 | \r | |
69 | my $AddonDir = ${General::swroot}.'/addon-lang';\r | |
70 | \r | |
71 | opendir (DIR, $AddonDir);\r | |
72 | my @files = readdir (DIR);\r | |
73 | closedir (DIR);\r | |
74 | \r | |
75 | # default is to load english first\r | |
76 | foreach my $file ( grep (/.*\.en.pl$/,@files)) {\r | |
77 | do "$AddonDir/$file";\r | |
78 | }\r | |
79 | \r | |
80 | # read again, overwriting 'en' with choosed lang\r | |
81 | if ($LG ne 'en') {\r | |
82 | foreach my $file (grep (/.*\.$LG\.pl$/,@files) ) {\r | |
83 | do "$AddonDir/$file";\r | |
84 | }\r | |
85 | }\r | |
86 | }\r | |
87 | \r | |
88 | #\r | |
89 | # Assume this procedure is called with enough privileges.\r | |
90 | # Merge ipcop langage file + all other extension found in addon-lang\r | |
91 | # to build a 'cachefile' for selected language\r | |
92 | #\r | |
93 | sub BuildUniqueCacheLang {\r | |
94 | \r | |
95 | my ($LG) = @_;\r | |
96 | \r | |
97 | # Make CacheLang empty so that it won't be used by Lang::reload\r | |
98 | open (FILE, ">$Lang::CacheLang.$LG") or return 1;\r | |
99 | flock (FILE, 2) or return 1;\r | |
100 | close (FILE);\r | |
101 | \r | |
102 | # Load languages files\r | |
103 | &Lang::reload ($LG);\r | |
104 | \r | |
105 | # Write the unique %tr=('key'=>'value') array\r | |
106 | open (FILE, ">$Lang::CacheLang.$LG") or return 1;\r | |
107 | flock (FILE, 2) or return 1;\r | |
108 | print FILE '%tr=(';\r | |
109 | foreach my $k ( keys %Lang::tr ){\r | |
110 | $Lang::tr{$k} =~ s/\'/\\\'/g; # quote ' => \'\r | |
111 | print FILE "'$k' => '$Lang::tr{$k}',"; # key => value,\r | |
112 | }\r | |
113 | print FILE ');';\r | |
114 | close (FILE);\r | |
115 | \r | |
116 | # Make nobody:nobody file's owner\r | |
117 | # Will work when called by root/rc.sysinit\r | |
118 | chown (0,0,"$Lang::CacheLang.$LG");\r | |
119 | chmod (0004,"$Lang::CacheLang.$LG");\r | |
120 | return 0;\r | |
121 | }\r | |
122 | \r | |
123 | #\r | |
124 | # Switch Ipcop Language for each lang then call build cachelang\r | |
125 | #\r | |
126 | sub BuildCacheLang {\r | |
127 | \r | |
128 | my $AddonDir = ${General::swroot}.'/addon-lang';\r | |
129 | \r | |
130 | # Correct permission in case addon-installer did not do it\r | |
131 | opendir (DIR, $AddonDir);\r | |
132 | my @files = readdir (DIR);\r | |
133 | foreach my $file (@files) {\r | |
134 | next if (($file eq '..') || ($file eq '.'));\r | |
135 | chown (0,0,"$AddonDir/$file");\r | |
136 | chmod (0004,"$AddonDir/$file");\r | |
137 | }\r | |
138 | closedir (DIR);\r | |
139 | \r | |
140 | my $selected = '';;\r | |
141 | my $missed = '';\r | |
142 | my $error = 0;\r | |
143 | \r | |
144 | open (LANGS, "${General::swroot}/langs/list");\r | |
145 | while (<LANGS>) {\r | |
146 | ($selected) = split (':');\r | |
147 | if (BuildUniqueCacheLang ($selected) == 1) {\r | |
148 | $missed = $selected; # will try latter. Can only be the current cachelang file locked\r | |
149 | };\r | |
150 | }\r | |
151 | close (LANGS);\r | |
152 | \r | |
153 | if ($missed) { # collision with current cache lang being used ?\r | |
154 | $error = &BuildUniqueCacheLang ($missed);\r | |
155 | }\r | |
156 | \r | |
157 | &General::log ("WARNING: cannot build cachelang file for [$missed].") if ($error);\r | |
158 | return $error;\r | |
159 | }\r | |
160 | 1;\r |