]>
Commit | Line | Data |
---|---|---|
aff192e6 DM |
1 | package PVE::I18N; |
2 | ||
3 | use strict; | |
4 | require Exporter; | |
5 | use vars qw(@ISA @EXPORT); | |
6 | use Encode; | |
7 | use HTML::Entities; | |
8 | use Locale::Messages qw (:libintl_h dgettext); | |
9 | ||
10 | @ISA = qw(Exporter); | |
11 | @EXPORT = qw( __ ); | |
12 | ||
13 | my $nlsinited; | |
14 | my $language = 'C'; | |
15 | my $lang_is_utf8 = 0; | |
16 | ||
17 | my %textdomains = (); | |
18 | ||
19 | ||
20 | sub import | |
21 | { | |
22 | my ($self, $textdomain) = @_; | |
23 | ||
24 | # like Locale/TextDomain.pm | |
25 | # usage: use PVE::I18N qw(<textdomain>) | |
26 | ||
27 | $textdomain = 'pve-manager' if !$textdomain; | |
28 | ||
29 | # Check our caller. | |
30 | my $package = caller; | |
31 | return if exists $textdomains{$package}; | |
32 | ||
33 | # Remember the textdomain of that package. | |
34 | $textdomains{$package} = $textdomain; | |
35 | ||
36 | PVE::I18N->export_to_level (1, $package, @EXPORT); | |
37 | } | |
38 | ||
39 | sub get_lang { | |
40 | ||
41 | my $section = 'default'; | |
42 | my $lang = 'C'; | |
43 | ||
44 | open (SYSCFG, "</etc/pve/pve.cfg") || return $lang; | |
45 | while (my $line = <SYSCFG>) { | |
46 | chomp $line; | |
47 | if ($line =~ m/\s*language\s*:\s*(\S+)\s*$/) { | |
48 | $lang = $1; | |
49 | last; | |
50 | } | |
51 | } | |
52 | close (SYSCFG); | |
53 | ||
54 | return $lang; | |
55 | } | |
56 | ||
57 | sub set_lang { | |
58 | my $lang = shift; | |
59 | ||
60 | $language = $lang; | |
61 | ||
62 | $lang_is_utf8 = scalar (grep { $language eq $_ } qw (vi pl ja hu ro ru fr tr zh_CN sr cs sl)) | |
63 | } | |
64 | ||
65 | if (!$nlsinited) { | |
66 | ||
67 | set_lang (get_lang); | |
68 | ||
69 | $nlsinited = 1; | |
70 | } | |
71 | ||
72 | sub __ { | |
73 | my $msgid = shift; | |
74 | my $oldlang = $ENV{LANGUAGE}; | |
75 | my $oldlc_all = $ENV{LC_ALL}; | |
76 | $ENV{LANGUAGE} = $language; | |
77 | ||
78 | my $package = caller; | |
79 | my $textdomain = $textdomains{$package}; | |
80 | ||
81 | my $res = dgettext($textdomain, $msgid); | |
82 | ||
83 | if ($lang_is_utf8) { | |
84 | $res = decode('UTF-8', $res) ; | |
85 | } else { | |
86 | $res = decode('iso-8859-1', $res) ; | |
87 | } | |
88 | ||
89 | $ENV{LANGUAGE} = $oldlang || ''; | |
90 | $ENV{LC_ALL} = $oldlc_all || ''; | |
91 | return $res; | |
92 | } | |
93 | ||
94 | 1; |