|
Lines 191-247
sub getLanguages {
Link Here
|
| 191 |
my $lang = shift; |
191 |
my $lang = shift; |
| 192 |
my $isFiltered = shift; |
192 |
my $isFiltered = shift; |
| 193 |
|
193 |
|
| 194 |
my @languages_loop; |
194 |
my $dbh = C4::Context->dbh; |
| 195 |
my $dbh=C4::Context->dbh; |
195 |
|
| 196 |
my $default_language = 'en'; |
196 |
my $default_language = 'en'; |
| 197 |
my $current_language = $default_language; |
197 |
my $current_language = $default_language; |
| 198 |
my $language_list = $isFiltered ? C4::Context->preference("AdvancedSearchLanguages") : undef; |
|
|
| 199 |
if ($lang) { |
198 |
if ($lang) { |
| 200 |
$current_language = regex_lang_subtags($lang)->{'language'}; |
199 |
$current_language = regex_lang_subtags($lang)->{'language'}; |
| 201 |
} |
200 |
} |
| 202 |
my $sth = $dbh->prepare('SELECT * FROM language_subtag_registry WHERE type=\'language\' ORDER BY description'); |
|
|
| 203 |
$sth->execute(); |
| 204 |
while (my $language_subtag_registry = $sth->fetchrow_hashref) { |
| 205 |
my $desc; |
| 206 |
# check if language name is stored in current language |
| 207 |
my $sth4= $dbh->prepare("SELECT description FROM language_descriptions WHERE type='language' AND subtag =? AND lang = ?"); |
| 208 |
$sth4->execute($language_subtag_registry->{subtag},$current_language); |
| 209 |
while (my $language_desc = $sth4->fetchrow_hashref) { |
| 210 |
$desc=$language_desc->{description}; |
| 211 |
} |
| 212 |
my $sth2= $dbh->prepare("SELECT * FROM language_descriptions LEFT JOIN language_rfc4646_to_iso639 on language_rfc4646_to_iso639.rfc4646_subtag = language_descriptions.subtag WHERE type='language' AND subtag =? AND language_descriptions.lang = ?"); |
| 213 |
if ($desc) { |
| 214 |
$sth2->execute($language_subtag_registry->{subtag},$current_language); |
| 215 |
} |
| 216 |
else { |
| 217 |
$sth2->execute($language_subtag_registry->{subtag},$default_language); |
| 218 |
} |
| 219 |
my $sth3 = $dbh->prepare("SELECT description FROM language_descriptions WHERE type='language' AND subtag=? AND lang=?"); |
| 220 |
# add the correct description info |
| 221 |
while (my $language_descriptions = $sth2->fetchrow_hashref) { |
| 222 |
$sth3->execute($language_subtag_registry->{subtag},$language_subtag_registry->{subtag}); |
| 223 |
my $native_description; |
| 224 |
while (my $description = $sth3->fetchrow_hashref) { |
| 225 |
$native_description = $description->{description}; |
| 226 |
} |
| 227 |
|
201 |
|
| 228 |
# fill in the ISO6329 code |
202 |
my $language_list = $isFiltered ? C4::Context->preference("AdvancedSearchLanguages") : undef; |
| 229 |
$language_subtag_registry->{iso639_2_code} = $language_descriptions->{iso639_2_code}; |
203 |
my $language_list_cond = $language_list ? 'HAVING FIND_IN_SET(language_rfc4646_to_iso639.iso639_2_code, ?)' : ''; |
| 230 |
# fill in the current selected ui language's translation, as well as the native description of the language |
204 |
|
| 231 |
if ($native_description) { |
205 |
my $sth = $dbh->prepare(" |
| 232 |
$language_subtag_registry->{language_description} = $language_descriptions->{description} || q{}; |
206 |
SELECT |
| 233 |
$language_subtag_registry->{language_description} .= " ($native_description)"; |
207 |
language_subtag_registry.*, |
| 234 |
} |
208 |
language_rfc4646_to_iso639.iso639_2_code, |
| 235 |
else { |
209 |
CASE |
| 236 |
$language_subtag_registry->{language_description} = $language_descriptions->{description}; |
210 |
-- If user's localized name of given lang is available |
| 237 |
} |
211 |
WHEN current_language_descriptions.description IS NOT NULL |
| 238 |
} |
212 |
THEN |
| 239 |
# Do not push unless valid iso639-2 code |
213 |
CASE |
| 240 |
if ( $language_subtag_registry->{ iso639_2_code } and ( !$language_list || index ( $language_list, $language_subtag_registry->{ iso639_2_code } ) >= 0) ) { |
214 |
-- Append native translation of given language if possible |
| 241 |
push @languages_loop, $language_subtag_registry; |
215 |
WHEN native_language_descriptions.description IS NOT NULL |
| 242 |
} |
216 |
AND native_language_descriptions.description != current_language_descriptions.description |
|
|
217 |
THEN CONCAT(current_language_descriptions.description, ' (', native_language_descriptions.description, ')') |
| 218 |
ELSE current_language_descriptions.description |
| 219 |
END |
| 220 |
ELSE -- fall back to English description |
| 221 |
CASE |
| 222 |
-- Append native translation of given language if possible |
| 223 |
WHEN native_language_descriptions.description IS NOT NULL |
| 224 |
AND native_language_descriptions.description != language_subtag_registry.description |
| 225 |
THEN CONCAT(language_subtag_registry.description, ' (', native_language_descriptions.description, ')') |
| 226 |
ELSE language_subtag_registry.description |
| 227 |
END |
| 228 |
END AS language_description |
| 229 |
|
| 230 |
-- Useful if debugging the query: |
| 231 |
-- current_language_descriptions.description AS _current_language_descriptions_description, |
| 232 |
-- native_language_descriptions.description AS _native_language_descriptions_description |
| 233 |
|
| 234 |
FROM language_subtag_registry |
| 235 |
|
| 236 |
-- Grab ISO code for language |
| 237 |
INNER JOIN language_rfc4646_to_iso639 |
| 238 |
ON language_rfc4646_to_iso639.rfc4646_subtag = language_subtag_registry.subtag |
| 239 |
AND language_rfc4646_to_iso639.iso639_2_code IS NOT NULL |
| 240 |
|
| 241 |
-- Grab language name in user's current language |
| 242 |
LEFT JOIN language_descriptions current_language_descriptions |
| 243 |
ON current_language_descriptions.subtag = language_subtag_registry.subtag |
| 244 |
AND current_language_descriptions.lang = ? |
| 245 |
AND current_language_descriptions.type = 'language' |
| 246 |
|
| 247 |
-- Grab language name in the given language itself |
| 248 |
LEFT JOIN language_descriptions native_language_descriptions |
| 249 |
ON native_language_descriptions.subtag = language_subtag_registry.subtag |
| 250 |
AND native_language_descriptions.lang = language_subtag_registry.subtag |
| 251 |
AND native_language_descriptions.type = 'language' |
| 252 |
|
| 253 |
WHERE language_subtag_registry.type = 'language' |
| 254 |
${language_list_cond}"); |
| 255 |
|
| 256 |
if ($language_list) { |
| 257 |
$sth->execute($current_language, join ',' => split(/,|\|/, $language_list)); |
| 258 |
} else { |
| 259 |
$sth->execute($current_language); |
| 260 |
} |
| 261 |
|
| 262 |
my @languages_list; |
| 263 |
while (my $row = $sth->fetchrow_hashref) { |
| 264 |
push @languages_list, $row; |
| 243 |
} |
265 |
} |
| 244 |
return \@languages_loop; |
266 |
return \@languages_list; |
| 245 |
} |
267 |
} |
| 246 |
|
268 |
|
| 247 |
sub _get_opac_language_dirs { |
269 |
sub _get_opac_language_dirs { |
| 248 |
- |
|
|