• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python
2# Copyright (c) 2012 The Chromium Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6'''The 'grit menufromparts' tool.'''
7
8import types
9
10from grit import grd_reader
11from grit import tclib
12from grit import util
13from grit import xtb_reader
14from grit.tool import interface
15from grit.tool import transl2tc
16
17import grit.extern.tclib
18
19
20class MenuTranslationsFromParts(interface.Tool):
21  '''One-off tool to generate translated menu messages (where each menu is kept
22in a single message) based on existing translations of the individual menu
23items.  Was needed when changing menus from being one message per menu item
24to being one message for the whole menu.'''
25
26  def ShortDescription(self):
27    return ('Create translations of whole menus from existing translations of '
28            'menu items.')
29
30  def Run(self, globopt, args):
31    self.SetOptions(globopt)
32    assert len(args) == 2, "Need exactly two arguments, the XTB file and the output file"
33
34    xtb_file = args[0]
35    output_file = args[1]
36
37    grd = grd_reader.Parse(self.o.input, debug=self.o.extra_verbose)
38    grd.OnlyTheseTranslations([])  # don't load translations
39    grd.RunGatherers()
40
41    xtb = {}
42    def Callback(msg_id, parts):
43      msg = []
44      for part in parts:
45        if part[0]:
46          msg = []
47          break  # it had a placeholder so ignore it
48        else:
49          msg.append(part[1])
50      if len(msg):
51        xtb[msg_id] = ''.join(msg)
52    with open(xtb_file) as f:
53      xtb_reader.Parse(f, Callback)
54
55    translations = []  # list of translations as per transl2tc.WriteTranslations
56    for node in grd:
57      if node.name == 'structure' and node.attrs['type'] == 'menu':
58        assert len(node.GetCliques()) == 1
59        message = node.GetCliques()[0].GetMessage()
60        translation = []
61
62        contents = message.GetContent()
63        for part in contents:
64          if isinstance(part, types.StringTypes):
65            id = grit.extern.tclib.GenerateMessageId(part)
66            if id not in xtb:
67              print "WARNING didn't find all translations for menu %s" % node.attrs['name']
68              translation = []
69              break
70            translation.append(xtb[id])
71          else:
72            translation.append(part.GetPresentation())
73
74        if len(translation):
75          translations.append([message.GetId(), ''.join(translation)])
76
77    with util.WrapOutputStream(open(output_file, 'w')) as f:
78      transl2tc.TranslationToTc.WriteTranslations(f, translations)
79
80