]> git.evergreen-ils.org Git - Evergreen.git/blob - build/i18n/scripts/update_pofiles
LP#1778972: make it possible to translate the Bootstrap OPAC
[Evergreen.git] / build / i18n / scripts / update_pofiles
1 #!/usr/bin/perl
2 # Copyright (C) 2011 Laurentian University
3 # Author: Dan Scott <dscott@laurentian.ca>
4 #
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License
7 # as published by the Free Software Foundation; either version 2
8 # of the License, or (at your option) any later version.
9
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 # ---------------------------------------------------------------
15
16 use strict;
17 use warnings;
18 use File::Spec;
19 use Getopt::Long;
20 use Pod::Usage qw/ pod2usage /;
21
22 my $lp_base_dir;
23 my $eg_base_dir;
24 my $help = 0;
25
26 GetOptions(
27     'launchpad-base-dir=s' => \$lp_base_dir,
28     'evergreen-base-dir=s' => \$eg_base_dir,
29     'help' => \$help,
30 );
31
32 if ($help) {
33     pod2usage(0);
34 }
35
36 check_options();
37
38 my %locs = (
39     ar => "ar-JO",
40     cs => "cs-CZ",
41     de => "de-DE",
42     en_CA => "en-CA",
43     en_GB => "en-GB",
44     es => "es-ES",
45     fi => "fi-FI",
46     fr => "fr-CA",
47     he => "he-IL",
48     hu => "hu-HU",
49     hy => "hy-AM",
50     oc => "oc-FR",
51     pt_BR => "pt-BR",
52     ru => "ru-RU",
53     sv => "sv-SE",
54     tr => "tr-TR",
55 );
56
57 my @pofiles = qw/
58     acq
59     acq.js
60     actor
61     admin.properties
62     authority.js
63     auth.properties
64     AutoFieldWidget.js
65     booking
66     capture.js
67     cat
68     cat.properties
69     circ
70     circ.properties
71     common.properties
72     conify
73     conify.dtd
74     conify.js
75     db.seed
76     FlattenerGrid.js
77     fm_IDL.dtd
78     ils_events.xml
79     kpac
80     lang.dtd
81     match_set.js
82     multiclass_search_help.html
83     offline.properties
84     opac.dtd
85     opac.js
86     patron.properties
87     PCrudFilterPane.js
88     pickup_and_return.js
89     pull_list.js
90     register.js
91     reports.dtd
92     reports.js
93     reservation.js
94     Searcher.js
95     selfcheck.js
96     serial
97     serial.js
98     serial.properties
99     tpac
100     bootstrap-opac
101     TranslatorPopup.js
102     URLVerify.js
103     User.js
104     urlverify
105     vandelay
106     vandelay.dtd
107     vandelay.js
108     webstaff
109     XULTermLoader.js
110 /;
111
112 foreach my $pofile (@pofiles) {
113     foreach my $lang (keys %locs) {
114         my $src_file = File::Spec->catfile(
115             ($lp_base_dir, 'build/i18n/po', $pofile), "$lang.po"
116         );
117         my $dest_file = File::Spec->catfile(
118             ($eg_base_dir, 'build/i18n/po', $pofile), "$locs{$lang}.po"
119         );
120
121         # If the source file doesn't exist, move on
122         next if ! -f $src_file;
123
124         # Check for actual changed strings
125         if (-f $dest_file) {
126             my $diff = `diff -u $dest_file $src_file`;
127
128             # Ignore changes to the PO header
129             $diff =~ s/^\+#.*?$//ms;
130             $diff =~ s/^\+"PO-Revision-Date:.*?$//ms;
131             $diff =~ s/^\+"Report-Msgid-Bugs-To:.*?$//ms;
132             $diff =~ s/^\+"X-Launchpad-Export-Date:.*?$//ms;
133             $diff =~ s/^\+"X-Generator:.*?$//ms;
134
135             if ($diff =~ /^\+/sm) {
136                 `cp $src_file $dest_file`;
137             }
138         } else {
139             # Copy brand new translations into place
140             `cp $src_file $dest_file`;
141         }
142     }
143 }
144
145 sub check_options {
146     if (!($lp_base_dir && $eg_base_dir)) {
147         pod2usage(1);
148     }
149
150     if (!-d $lp_base_dir) {
151         print STDERR "$lp_base_dir does not exist; exiting\n";
152         pod2usage(1);
153     }
154
155     if (!-d $eg_base_dir) {
156         print STDERR "$eg_base_dir does not exist; exiting\n";
157         pod2usage(1);
158     }
159
160     if (!-d File::Spec->catdir($lp_base_dir, '.bzr')) {
161         print STDERR "$lp_base_dir is not a bzr branch; exiting\n";
162         pod2usage(1);
163     }
164
165     if (!-f File::Spec->catfile(($eg_base_dir, '.git'), 'config')) {
166         print STDERR "$eg_base_dir is not a git clone; exiting\n";
167         pod2usage(1);
168     }
169 }
170
171 __END__
172
173 =head1 NAME
174
175 update_pofiles - Updates translations from Launchpad
176
177 =head1 SYNOPSIS
178
179 B<update_pofile> B<--launchpad-base-dir>=I<translation-export-directory>
180                 B<--evergreen-base-dir>=I<evergreen-git-clone-directory>
181
182 =head1 DESCRIPTION
183
184 Assuming that you have an updated bzr checkout of the translation-export
185 to satisfy the 'launchpad-base-dir' argument, and an updated git clone
186 of Evergreen master to satisfy the 'evergreen-base-dir' argument,
187 this script attempts to copy only the new or changed translations
188 from the Launchpad directory into the Evergreen directory. It
189 converts the Launchpad I<ll> and I<ll_LL> locale names into Evergreen's
190 I<ll-LL> locale names.
191
192 Note that the user is still required to build, test, and check in the
193 updated translations.
194
195 =head1 OPTIONS
196
197 =over
198
199 =item * B<-l> I<translation-export-directory>, B<--launchpad-base-dir>=I<translation-export-directory>
200
201 Specifies the directory holding the updated bzr checkout of
202 https://code.launchpad.net/~denials/evergreen/translation-export - which
203 you can create via "bzr lp:~denials/evergreen/translation-export".
204
205 =item * B<-e> I<evergreen-directory>, B<--evergreen-base-dir>=I<evergreen-directory>
206
207 Specifies the directory holding the updated git clone of Evergreen, which you
208 can create via "git clone git://git.evergreen-ils.org/Evergreen.git".
209
210 =back
211
212 =head1 AUTHOR
213
214 Dan Scott <dscott@laurentian.ca>
215
216 =head1 COPYRIGHT AND LICENSE
217
218 Copyright 2011 by Dan Scott
219
220 This program is free software; you can redistribute it and/or
221 modify it under the terms of the GNU General Public License
222 as published by the Free Software Foundation; either version 2
223 of the License, or (at your option) any later version.
224
225 This program is distributed in the hope that it will be useful,
226 but WITHOUT ANY WARRANTY; without even the implied warranty of
227 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
228 GNU General Public License for more details.
229
230 You should have received a copy of the GNU General Public License
231 along with this program; if not, write to the Free Software
232 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
233
234 =cut
235