django1.8.6 i18n 国际化 遇到的问题
python manage.py makemessages -l zh_CNpython manage.py makemessages -l zh_TW编译python manage.py compilemessages settings里面的LANGUAGE_CODE确要小写比如 zh_CN要写成zh_cn,其他同理 settings里面的LANGUAGES也是小写在urls.py里面配置一个i18n的辅助应用
(r'^i18n/', include('django.conf.urls.i18n')),
有了这个就可以自由的切换语言了,使用/i18n/setlang/?language=en这样的形式,不过django1.8只支持post。
po文件的格式翻译不到的情况,已经存在子翻译:
有的会多出几行注释
##########################################
#: dsgame/game/component/base.py:128
#, fuzzy
#| msgid "翻译"
msgid "测试翻译"
msgstr "烦烦烦"
#####################################
去掉多余注释才能获取到翻译
去掉后如下:
##########################################
#: dsgame/game/component/base.py:128
msgid "测试翻译"
msgstr "烦烦烦"
#####################################
下面是一个可用的配置,用上面的命令编译i18n国际化文件
#coding=utf-8
"""
Django settings for udserver project.
Generated by 'django-admin startproject' using Django 1.8.3.
For more information on this file, see
https://docs.djangoproject.com/en/1.8/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.8/ref/settings/
"""
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os, sys
sys.path.insert(0, "../..")
from lzserver.gconfigs import dbconfig_game, caches_game
#modify by yx
if 0:#如果要使用pypy的话,就要加这里
import pymysql
pymysql.install_as_MySQLdb()
#end--modify by yx
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '14%4&t&aq83i34lw(789451fds)_6z#y-2qeio4ds1+&v8q2y_7j'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = ["*"]
# Application definition
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#'common',
'gm',
'player',
'mgr'
)
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware', #i18n需要的
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
#'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)
ROOT_URLCONF = 'game.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, "templates")], #],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.core.context_processors.i18n', #i18n需要的
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'game.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases
DATABASES = dbconfig_game
#DATABASE_ROUTERS = ['common.config.AdminRouter','common.config.UdRouter']
CACHES = caches_game
# Internationalization
# https://docs.djangoproject.com/en/1.8/topics/i18n/
#i18n需要的
LANGUAGES = (
('zh_cn', (u'中文简体')),
('zh_tw', (u'中文繁體')),
)
#i18n需要的
#翻译文件所在目录,需要手工创建
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale'),
)
#i18n需要的
LANGUAGE_CODE = 'zh_cn'
#i18n需要的
TIME_ZONE = 'Asia/Shanghai'
#i18n需要的
USE_I18N = True
#i18n需要的
USE_L10N = True
USE_TZ = False
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.8/howto/static-files/
# add by yx
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static_root')
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
SESSION_COOKIE_NAME = "gameserversessionlzid"
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
SESSION_ENGINE = "django.contrib.sessions.backends.cache" #如果在twisted里用,就必须在安装选项里面写出来
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
#'business.auth.BusinessBackend',
)
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
}
}
DATETIME_FORMAT = 'Y-m-d H:i:sO'
DATE_FORMAT = 'Y-m-d'
DATABASE_ROUTERS = ['common.databasesrouters.DatabaseAppsRouter']
#coding:utf8
#这一段是因为部署到supervisord的时候会重置编码,不能print中文
import sys
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)
#end--这一段是因为部署到supervisord的时候会重置编码,不能print中文
#日志设置
# from twisted.python import context
# from twisted.python.log import ILogContext
# context.setDefault(ILogContext,
# {"isError": 1,
# "system": "-"})
#end--日志设置
# django>=1.6
from gevent import monkey; monkey.patch_os()
import json,sys,logging
from twisted.python import log
from gfirefly.server.server import FFServer
from twisted.logger import globalLogBeginner
class LevelFileLogObserver(log.FileLogObserver):
def __init__(self, f, level=logging.INFO):
log.FileLogObserver.__init__(self, f)
self.logLevel = level
def emit(self, eventDict):
if eventDict['isError']:
level = logging.ERROR
elif 'level' in eventDict:
level = eventDict['level']
else:
level = logging.INFO
if level >= self.logLevel:
log.FileLogObserver.emit(self, eventDict)
#!!!!!上线把日志级别改成error--以后检测是否有内存泄露
logger = LevelFileLogObserver(sys.stderr, logging.NOTSET) #logging.NOTSET, logging.ERROR
globalLogBeginner.beginLoggingTo([logger.emit])
#log.addObserver(logger.emit)
#日志系统支持日志级别---start#日志系统支持日志级别---end
try:
from django.conf import settings
import sys, os
sys.stdout = sys.stderr # 调试supervisor的时候需要显示print的日志就加这一句
sys.path.append('../game')
from game import settings as project_settings
except Exception,e:
log.err("=============")
log.err(e)
# 用pymysql代替mysqldb--支持pypy
# import pymysql
# pymysql.install_as_MySQLdb()
# end--用pymysql代替mysqldb--支持pypy
settings.configure(DEBUG=False, # 要想在supervisor中显示出djanog的print信息,这里要设置为True,还没实践
DATABASES=project_settings.DATABASES,
INSTALLED_APPS=project_settings.INSTALLED_APPS,
CACHES=project_settings.CACHES,
DATABASE_ROUTERS=project_settings.DATABASE_ROUTERS,
#
MIDDLEWARE_CLASSES = project_settings.MIDDLEWARE_CLASSES,
LANGUAGES = project_settings.LANGUAGES,
LANGUAGE_CODE = project_settings.LANGUAGE_CODE,
LOCALE_PATHS = project_settings.LOCALE_PATHS,
TIME_ZONE = project_settings.TIME_ZONE,
USE_I18N = project_settings.USE_I18N,
USE_L10N = project_settings.USE_L10N,
USE_TZ = project_settings.USE_TZ,
TEMPLATES = project_settings.TEMPLATES
)
#解决apps.get_model的问题
try:
import django
django.setup()
except Exception,e:
pass
#django启动要做的事情
# # 使用sqlalchemy的连接池
# from useSqlalchemyPool import init_pool
# init_pool()
# # end--使用sqlalchemy的连接池
try:
from common.defines import BMOBJ
BMOBJ.initConfigG()
except Exception,e:
pass
#end--django启动要做的事
if __name__=="__main__":
from django.utils.translation import ugettext as _
from django.utils.translation import activate
from django.utils import translation
log.err( translation.get_language())
#activate('zh_tw')
log.err(_(u"测试翻译"))
>>> from django.utils.translation import activate
>>> activate("zh_tw")
>>> from django.utils.translation import ugettext as _
>>> print _(u"测试i18n")
測試 i18n
>>>