#!/usr/bin/perl use strict; use warnings; my $langtoolsdir = '/usr/share/language-tools'; # get the locales available on the system my @avail_locales = map { chomp; s/\.utf8//; $_ } qx( locale -a | grep -F .utf8 ); # add items without country code to facilitate lookups my %extended_localelist; for my $loc (@avail_locales) { ( my $lang = $loc ) =~ s/_[A-Z]+//; @extended_localelist{$loc, $lang} = (1, 1); } # get the directory names in /usr/share/locale-langpack plus possible other # translation directory names in /usr/share/locale and /usr/local/share/locale my %translation_dirs; if ( opendir my ($dh), '/usr/share/locale-langpack' ) { $translation_dirs{$_} = 1 for readdir $dh; } my %langpack_langcodes = map { s/[^a-z].+//; $_, 1 } grep !/^\./, keys %translation_dirs; for my $t_dir ('/usr/share/locale', '/usr/local/share/locale') { if ( opendir my ($dh), $t_dir ) { for ( readdir $dh ) { for my $lang ( keys %langpack_langcodes ) { if ( /^$lang[_@]/ ) { $translation_dirs{$_} = 1; last; } } } } } # get the intersection of available translation_dirs and the extended locale list my %intersection; for ( keys %extended_localelist ) { $intersection{$_} = 1 if $translation_dirs{$_}; } # adjustments if ( open my $fh, '<', "$langtoolsdir/main-countries" ) { # If country code items in a language exist: # - Remove the item without country code, since gettext won't find a # translation under e.g. 'de_DE' if the first item in LANGUAGE is 'de' # (see https://launchpad.net/bugs/700213). 'en' is kept, though, since # it's always the last item in LANGUAGE per design. # - Make sure that the main dialect of the language is represented among # the country code items (see https://launchpad.net/bugs/710148). my %main; while ( <$fh> ) { next if /^\s*(?:#|$)/; my ($k, $v) = split; $main{$k} = $v; } my %count; for ( keys %intersection ) { next if /^en[^a-z]/; ( my $not_country = $_ ) =~ s/_[A-Z]+//; $count{$not_country} ++; } for my $langcode ( keys %count ) { if ( $count{$langcode} > 1 ) { delete $intersection{$langcode}; $intersection{ $main{$langcode} } = 1 if $main{$langcode}; } } } else { # not access to the language-to-main-dialect map # => stick with a minimum of list manipulation delete $intersection{'zh'}; } # print the resulting list of language options print join("\n", sort keys %intersection) || 'en';