195640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org#!/usr/bin/env python 295640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org# Copyright (c) 2012 The Chromium Authors. All rights reserved. 301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org# Use of this source code is governed by a BSD-style license that can be 401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org# found in the LICENSE file. 501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org'''The 'grit menufromparts' tool.''' 701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgimport types 901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 1001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgfrom grit import grd_reader 1101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgfrom grit import tclib 1201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgfrom grit import util 1301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgfrom grit import xtb_reader 14b9161407f737461b5db16a29782f8a31d19e602dbenrg@chromium.orgfrom grit.tool import interface 15b9161407f737461b5db16a29782f8a31d19e602dbenrg@chromium.orgfrom grit.tool import transl2tc 1601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 1701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgimport grit.extern.tclib 1801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 1901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 2001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgclass MenuTranslationsFromParts(interface.Tool): 2101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org '''One-off tool to generate translated menu messages (where each menu is kept 2201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgin a single message) based on existing translations of the individual menu 2301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgitems. Was needed when changing menus from being one message per menu item 2401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgto being one message for the whole menu.''' 2501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 2601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org def ShortDescription(self): 2701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org return ('Create translations of whole menus from existing translations of ' 2801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 'menu items.') 2901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 3001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org def Run(self, globopt, args): 3101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org self.SetOptions(globopt) 3201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org assert len(args) == 2, "Need exactly two arguments, the XTB file and the output file" 3301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 3401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org xtb_file = args[0] 3501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org output_file = args[1] 3601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 3701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org grd = grd_reader.Parse(self.o.input, debug=self.o.extra_verbose) 3801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org grd.OnlyTheseTranslations([]) # don't load translations 39ccda47032903a6550dac2921f88c51b4da55aa36benrg@chromium.org grd.RunGatherers() 4001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 4101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org xtb = {} 4201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org def Callback(msg_id, parts): 4301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org msg = [] 4401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org for part in parts: 4501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org if part[0]: 4601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org msg = [] 4701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org break # it had a placeholder so ignore it 4801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org else: 4901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org msg.append(part[1]) 5001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org if len(msg): 5101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org xtb[msg_id] = ''.join(msg) 52b9161407f737461b5db16a29782f8a31d19e602dbenrg@chromium.org with open(xtb_file) as f: 53b9161407f737461b5db16a29782f8a31d19e602dbenrg@chromium.org xtb_reader.Parse(f, Callback) 5401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 5501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org translations = [] # list of translations as per transl2tc.WriteTranslations 5601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org for node in grd: 5701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org if node.name == 'structure' and node.attrs['type'] == 'menu': 5801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org assert len(node.GetCliques()) == 1 5901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org message = node.GetCliques()[0].GetMessage() 6001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org translation = [] 6101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 6201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org contents = message.GetContent() 6301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org for part in contents: 6401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org if isinstance(part, types.StringTypes): 6501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org id = grit.extern.tclib.GenerateMessageId(part) 6601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org if id not in xtb: 6701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org print "WARNING didn't find all translations for menu %s" % node.attrs['name'] 6801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org translation = [] 6901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org break 7001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org translation.append(xtb[id]) 7101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org else: 7201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org translation.append(part.GetPresentation()) 7301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 7401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org if len(translation): 7501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org translations.append([message.GetId(), ''.join(translation)]) 7601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 77b9161407f737461b5db16a29782f8a31d19e602dbenrg@chromium.org with util.WrapOutputStream(open(output_file, 'w')) as f: 78b9161407f737461b5db16a29782f8a31d19e602dbenrg@chromium.org transl2tc.TranslationToTc.WriteTranslations(f, translations) 7901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org 80