'Open a view for translating the field(s) of the record (model, id).'

@api.model
def translate_fields(self, model, id, field=None):

    main_lang = 'en_US'
    if (not self.env['res.lang'].search_count([('code', '!=', main_lang)])):
        raise UserError(_('Translation    features    are    unavailable    until    you    install    an    extra    translation.'))
    record = self.env[model].with_context(lang=main_lang).browse(id)
    domain = ['&', ('res_id', '=', id), ('name', '=like', (model + ',%'))]
    def make_domain(fld, rec):
        name = ('%s,%s' % (fld.model_name, fld.name))
        return ['&', ('res_id', '=', rec.id), ('name', '=', name)]
    for (name, fld) in record._fields.items():
        if (not fld.translate):
            continue
        rec = record
        if fld.related:
            try:
                while fld.related:
                    (rec, fld) = fld.traverse_related(rec)
                if rec:
                    domain = ((['|'] + domain) + make_domain(fld, rec))
            except AccessError:
                continue
        assert (fld.translate and (rec._name == fld.model_name))
        self.insert_missing(fld, rec)
    action = {'name': 'Translate', 'res_model': 'ir.translation', 'type': 'ir.actions.act_window', 'view_mode': 'tree', 'view_id': self.env.ref('base.view_translation_dialog_tree').id, 'target': 'current', 'flags': {'search_view': True, 'action_buttons': True}, 'domain': domain}
    if field:
        fld = record._fields[field]
        if (not fld.related):
            action['context'] = {'search_default_name': ('%s,%s' % (fld.model_name, fld.name))}
    return action
