Getting translation packages installed automagically

Colin Watson cjwatson at ubuntu.com
Fri Sep 25 10:15:09 BST 2009


On Thu, Sep 24, 2009 at 02:31:26AM +0800, Arne Goetje wrote:
> as you might know, we have a number of translation related packages for
> a given language in addition to the regular language-packs. For example:
> language-pack-gnome-*, language-pack-kde-*, thunderbird-locale-*,
> openoffice.org-l10n-*, etc..
> These additional packages should only be installed when the user also
> has the main packages installed for which the translations make sense.
> The functionality to detect this and mark the additional packages for
> installation is currently in language-selector.
> That means, we currently have the situation that a user needs to run
> language-selector manually in order to get full language support installed.
> 
> A related bug report for this is here:
> https://bugs.launchpad.net/bugs/434173
> 
> I have created a command line tool as part of language-selector, which
> does the check for missing packages, so it's not necessary to run the
> full gnome-language-selector for this task.

This is great, thanks.

> The code is here: lp:~arnegoetje/language-selector/language-selector-karmic
> 
> The tool is called 'check-language-support' and can optionally take the
> argument -l, followed by a language-code (e.g. es_US, fi, zh-hant,
> ca_ES at valencia)
> It returns a list of missing packages, separated by space.
> If no language argument is given, the code will check for all already
> installed language-packs or those which are marked as to be installed
> and return the list of missing packages for all languages on the system.

Can we get this into the archive as soon as possible? Is somebody
already looking at sponsoring this, or do you need (e.g.) me to do it?

> The idea is, that the installer runs this tool if network connectivity
> is available before the packages are actually installed, parses the
> output of 'check-language-support -l TARGET_LANGUAGE_CODE' and mark
> those packages for installation. Then the user will get a fully
> localized system right from the start.

In fact, I think the installer should just run it unconditionally, as
some of the necessary packages may be available on the CD. (The fact
that we can now include only *some* of the necessary packages on CDs
relatively easily is a big advantage of this work, as I understand it.)
I think I can implement this in pkgsel and ubiquity fairly
straightforwardly.

There's one extra feature I'll need in check-language-support, though:
pkgsel has an option to install support for all languages, which is used
in all special cases. I have a branch for this but some problems with
the upgrade to bzr 2.0 mean that I apparently can't push this to
Launchpad at the moment; instead, I've attached a merge directive to
this mail which you can merge using 'bzr merge check-all.bundle'.

Thanks,

-- 
Colin Watson                                       [cjwatson at ubuntu.com]
-------------- next part --------------
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: cjwatson at canonical.com-20090925090704-y2poysa7k9ewog30
# target_branch: ../language-selector-karmic
# testament_sha1: 95a7ec6f1ee4aa91ba8e895f33a39f74f93e5c0b
# timestamp: 2009-09-25 10:12:20 +0100
# base_revision_id: arne at canonical.com-20090923174456-ehiurxarbx7z3w7z
# 
# Begin patch
=== modified file 'check-language-support'
--- check-language-support	2009-09-23 17:44:56 +0000
+++ check-language-support	2009-09-25 09:07:04 +0000
@@ -23,7 +23,7 @@
             if pkg in self and \
                 not self[pkg].isInstalled and \
                 not self[pkg].markedInstall:
-                self.missing.append(pkg)
+                self.missing.add(pkg)
         if pkgcode in self.pkg_translations:
             for (pkg, translation) in self.pkg_translations[pkgcode]:
                 if pkg in self and \
@@ -31,7 +31,7 @@
                     self[pkg].markedInstall) and \
                     not self[translation].isInstalled and \
                     not self[translation].markedInstall:
-                    self.missing.append(translation)
+                    self.missing.add(translation)
                     
         if pkgcode in self.pkg_writing and \
            (pkgcode == self.system_pkgcode or \
@@ -49,7 +49,7 @@
                             not self[pull_pkg].isInstalled and \
                             not self[pull_pkg].markedInstall and \
                             added == 0:
-                            self.missing.append(pull_pkg)
+                            self.missing.add(pull_pkg)
                             added = 1
                 else:
                     if pkg in self and \
@@ -58,7 +58,7 @@
                         pull_pkg in self and \
                         not self[pull_pkg].isInstalled and \
                         not self[pull_pkg].markedInstall:
-                        self.missing.append(pull_pkg)
+                        self.missing.add(pull_pkg)
 
     def __init__(self, options):
         self.BLACKLIST = os.path.join(options.datadir, 'data', 'blacklist')
@@ -81,7 +81,7 @@
         self.pkg_writing = {}
         filter_list = {}
         blacklist = []
-        self.missing = []
+        self.missing = set()
         self.system_pkgcode = ''
         
         for l in open(self.BLACKLIST):
@@ -180,7 +180,22 @@
 
             self.getMissingPackages(self.system_pkgcode)
             
-               
+        elif options.all:
+            # try all available languages
+            pkgcodes = []
+            for item in self.keys():
+                if item in blacklist:
+                    continue
+                if item.startswith('language-pack-') and \
+                   not item.startswith('language-pack-gnome') and \
+                   not item.startswith('language-pack-kde') and \
+                   not item.endswith('-base'):
+                    pkgcode = item.replace('language-pack-', '')
+                    pkgcodes.append(pkgcode)
+
+            for pkgcode in pkgcodes:
+                self.getMissingPackages(pkgcode)
+
         else:
             # get a list of language-packs we have already installed or are going to install
             # 1. system locale
@@ -209,7 +224,7 @@
             for pkgcode in pkgcodes:
                 self.getMissingPackages(pkgcode)
                     
-        print (' '.join(self.missing))
+        print (' '.join(sorted(self.missing)))
 
 if __name__ == "__main__":
 	parser = OptionParser()
@@ -218,6 +233,8 @@
 	parser.add_option("-d", "--datadir",
 			  default="/usr/share/language-selector/",
 			  help=_("alternative datadir"))
+	parser.add_option("-a", "--all", action='store_true', default=False,
+			  help=_("check all available languages"))
 	(options, args) = parser.parse_args()
 
 # sanity check for language code

=== modified file 'data/check-language-support.1'
--- data/check-language-support.1	2009-09-23 16:55:04 +0000
+++ data/check-language-support.1	2009-09-25 09:05:14 +0000
@@ -15,5 +15,8 @@
 \fB\-d\fR DATADIR, \fB\-\-datadir\fR=\fIDATADIR\f
 use an alternative data directory instead of the default
 .B /usr/share/language\-selector
+.TP
+\fB\-a\fR, \fB\-\-all\fR
+check all available languages
 .SH AUTHOR
 This manpage has been written by Arne Goetje <arne at ubuntu.com>

# Begin bundle
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
kU4UJCAWsiJA


More information about the ubuntu-devel mailing list