Odoo中文社区可以通过以下三个域名访问:shine-it.net , odoocn.org,odoo.net.cn

原论坛用户的基本信息和发帖这里都予以保留,请注意:原论坛用户无需重新注册新用户,但是您的密码需要重置

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

Openerp Web Client 中文日期时间 unicode strformat 问题解决方法



  •     默认情况下,Openerp Web Client 使用中文日期时间会报以下错误:
    [code]
    return format.format_datetime(self.value, kind=self.attrs.get('type', 'datetime'))
    ...
    <type 'exceptions.UnicodeEncodeError'>: 'ascii' codec can't encode character u'\u5e74' in position 2: ordinal not in range(128)
          args = ('ascii', u'%Y\u5e74%m\u6708%d\u65e5', 2, 3, 'ordinal not in range(128)')
          encoding = 'ascii'
          end = 3
          message = ''
          object = u'%Y\u5e74%m\u6708%d\u65e5'
          reason = 'ordinal not in range(128)'
          start = 2
    [/code]

        翻了下论坛的帖子,解决方法大多均为在系统管理->翻译->语言->中文,把时间日期格式中的中文去掉。此方法并没有真正解决中文时间日期格式问题,只能算权宜之计吧。

    看了报错信息,根据经验大多就是str 和 unicode 的问题。跟踪代码后,问题定位在 openerp-web-6.0.3/openobject/i18n/format.py 上。主要原因是 strftime 和 strptime 函数参数的编码不一致,form 提交上来的 value 是str 类型,而timeformat 是unicode 类型。因此就抛出异常,报错。

    解决方法:
    1、修改 DT_SERVER_FORMATS 常量 (openerp-web-6.0.3/openobject/i18n/format.py ):
    [code]
    DT_SERVER_FORMATS = {
      'datetime' : '%Y-%m-%d %H:%M:%S'.encode('utf-8'),
      'date' : '%Y-%m-%d'.encode('utf-8'),
      'time' : '%H:%M:%S'.encode('utf-8')
    }
    [/code]

    2、修改get_datetime_format 函数 (openerp-web-6.0.3/openobject/i18n/format.py ):
    [code]
    def get_datetime_format(kind="datetime"):
        """Get local datetime format.

        @param kind: type (date, time or datetime)
        @return: string

        @todo: cache formats to improve performance.
        """
        if 'lang' in cherrypy.session:
            # server-defined formatting
            if kind == 'time':
                return cherrypy.session['lang']['time_format'].encode('utf-8')
            elif kind == 'date':
                return cherrypy.session['lang']['date_format'].encode('utf-8')
            else:
                return ("%(date_format)s %(time_format)s"% cherrypy.session['lang']).encode('utf-8')

        # TODO: correctly convert from LDML to POSIX datetime formatting
        # current converter is trivial and lame and probably very easy to break
        date_format = _to_posix_format(dates.get_date_format(
                format='short', locale=get_locale())).format
        if kind == 'time':
            # Should use dates.get_time_format(locale=get_locale())
            return '%H:%M:%S'.encode('utf-8')
        elif kind == 'date':
            return date_format.encode('utf-8')
        else:
            # Should use dates.get_datetime_format, but that one returns
            # a 2.6-style formats
            return ("%s %s" % (date_format, '%H:%M:%S')).encode('utf-8')
    [/code]

    修改完成后,重启oe server 和 oe web client ,即可正常使用中文日期时间。如果你懒的修改上面文件,也可以下载附件,覆盖openerp-web-6.0.3/openobject/i18n/format.py 皆可。

    以上在 openerp server 6.03 和 openerp web client 6.0.3 , on debian 6.1 测试通过。



  •     默认情况下,Openerp Web Client 使用中文日期时间会报以下错误:
    [code]
    return format.format_datetime(self.value, kind=self.attrs.get('type', 'datetime'))
    ...
    <type 'exceptions.UnicodeEncodeError'>: 'ascii' codec can't encode character u'\u5e74' in position 2: ordinal not in range(128)
          args = ('ascii', u'%Y\u5e74%m\u6708%d\u65e5', 2, 3, 'ordinal not in range(128)')
          encoding = 'ascii'
          end = 3
          message = ''
          object = u'%Y\u5e74%m\u6708%d\u65e5'
          reason = 'ordinal not in range(128)'
          start = 2
    [/code]

        翻了下论坛的帖子,解决方法大多均为在系统管理->翻译->语言->中文,把时间日期格式中的中文去掉。此方法并没有真正解决中文时间日期格式问题,只能算权宜之计吧。

    看了报错信息,根据经验大多就是str 和 unicode 的问题。跟踪代码后,问题定位在 openerp-web-6.0.3/openobject/i18n/format.py 上。主要原因是 strftime 和 strptime 函数参数的编码不一致,form 提交上来的 value 是str 类型,而timeformat 是unicode 类型。因此就抛出异常,报错。

    解决方法:
    1、修改 DT_SERVER_FORMATS 常量 (openerp-web-6.0.3/openobject/i18n/format.py ):
    [code]
    DT_SERVER_FORMATS = {
      'datetime' : '%Y-%m-%d %H:%M:%S'.encode('utf-8'),
      'date' : '%Y-%m-%d'.encode('utf-8'),
      'time' : '%H:%M:%S'.encode('utf-8')
    }
    [/code]

    2、修改get_datetime_format 函数 (openerp-web-6.0.3/openobject/i18n/format.py ):
    [code]
    def get_datetime_format(kind="datetime"):
        """Get local datetime format.

        @param kind: type (date, time or datetime)
        @return: string

        @todo: cache formats to improve performance.
        """
        if 'lang' in cherrypy.session:
            # server-defined formatting
            if kind == 'time':
                return cherrypy.session['lang']['time_format'].encode('utf-8')
            elif kind == 'date':
                return cherrypy.session['lang']['date_format'].encode('utf-8')
            else:
                return ("%(date_format)s %(time_format)s"% cherrypy.session['lang']).encode('utf-8')

        # TODO: correctly convert from LDML to POSIX datetime formatting
        # current converter is trivial and lame and probably very easy to break
        date_format = _to_posix_format(dates.get_date_format(
                format='short', locale=get_locale())).format
        if kind == 'time':
            # Should use dates.get_time_format(locale=get_locale())
            return '%H:%M:%S'.encode('utf-8')
        elif kind == 'date':
            return date_format.encode('utf-8')
        else:
            # Should use dates.get_datetime_format, but that one returns
            # a 2.6-style formats
            return ("%s %s" % (date_format, '%H:%M:%S')).encode('utf-8')
    [/code]

    修改完成后,重启oe server 和 oe web client ,即可正常使用中文日期时间。如果你懒的修改上面文件,也可以下载附件,覆盖openerp-web-6.0.3/openobject/i18n/format.py 皆可。

    以上在 openerp server 6.03 和 openerp web client 6.0.3 , on debian 6.1 测试通过。



  • 我记得GTK上也遇到过这个问题。



  • [quote author=Jeff link=topic=2634.msg8779#msg8779 date=1318767366]
    我记得GTK上也遇到过这个问题。
    [/quote]

    刚才测试了下 openerp-client-6.0.3 on debian 6.1 ,保存和显示都没有问题啊。



  • 终于有个正解了,呵呵!


登录后回复
 

与 Odoo 中文社区 的连接断开,我们正在尝试重连,请耐心等待