Django i18n setlang not changing session data django_language
I don't know what I'm doing wrong, but my session data won't change even if I submit a new language to /i18n/setlang. I am to translate to Filipino language using the code 'tl' but somehow, it just doesn't seem to work. Please help. Here are some code:
# Django settings for ppdjango project.
import os
DEBUG = True
TEMPLATE_DEBUG = DEBUG
ADMINS = (
# ('Your Name', 'your_email@domain.com'),
)
MANAGERS = ADMINS
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'bookmarksdb',
'USER': '', # Not used with sqlite3.
'PASSWORD': '', # Not used with sqlite3.
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
}
}
# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# On Unix systems, a value of None will cause Django to use the same
# timezone as the operating system.
# If running in a Windows environment this must开发者_运维问答 be set to the same as your
# system time zone.
TIME_ZONE = 'America/Chicago'
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'en-us'
LANGUAGES = (
('tl', 'Filipino'),
('en', 'English'),
)
SITE_ID = 1
# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True
# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale
USE_L10N = True
# Absolute path to the directory that holds media.
# Example: "/home/media/media.lawrence.com/"
MEDIA_ROOT = ''
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash if there is a path component (optional in other cases).
# Examples: "http://media.lawrence.com", "http://example.com/media/"
MEDIA_URL = ''
# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
# trailing slash.
# Examples: "http://foo.com/media/", "/media/".
ADMIN_MEDIA_PREFIX = '/media/'
# Make this unique, and don't share it with anybody.
SECRET_KEY = '35qqpsggj&v0^!rdabnr7daj(#gu2252hj4&8qw1k6gb@5r)qa'
# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
# 'django.template.loaders.eggs.Loader',
)
MIDDLEWARE_CLASSES = (
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware'
)
ROOT_URLCONF = 'ppdjango.urls'
TEMPLATE_DIRS = (
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
os.path.join(os.path.dirname(__file__), 'templates')
)
TEMPLATE_CONTEXT_PROCESSORS = (
"django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
'django.core.context_processors.request',
)
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.comments',
'bookmarks',
# Uncomment the next line to enable the admin:
'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
)
LOGIN_URL = '/login/'
CACHE_BACKEND = 'db://cache_table'
CACHE_MIDDLEWARE_SECONDS = 60 * 5
#email
SITE_HOST = '127.0.0.1:8000'
DEFAULT_FROM_EMAIL = 'Django Bookmarks <django.bookmarks@example.com>'
EMAIL_HOST = 'mail.ygamretuta.com'
EMAIL_PORT = ''
EMAIL_HOST_USER = 'dev@ygamretuta.com'
EMAIL_HOST_PASSWORD = ''
My language settings form: {
{% load i18n %}
<!DOCTYPE html>
<html>
<head>
<title>
Django Bookmarks | {% block title %}{% endblock %}
</title>
<link rel="stylesheet" type="text/css" href="/site_media/style.css">
<script type="text/javascript" src="/site_media/jquery.js"></script>
{% block external %}
<script type="text/javascript" src="/site_media/search.js"></script>
{% endblock %}
</head>
<body>
{% block content %}{% endblock %}
<div id="footer">
<form action="/i18n/setlang/" method="post">
{% csrf_token %}
<input name="next" type="hidden" value="/friend/invite/" />
<select name="language">
{% for lang in LANGUAGES %}
<option value="{{ lang.0 }}">{{ lang.1 }}</option>
{% endfor %}
</select>
<input type="submit" value="Switch Language"/>
</form>
</div>
</body>
</html>
my url settings:
# the rest is above
(r'^i18n/', include('django.conf.urls.i18n')),
EDIT My languages are working well because if I make 'tl' the only language in settings, the page get translated to Tagalog
EDIT included the whole settings file
MIDDLEWARE_CLASSES = (
'django.middleware.cache.UpdateCacheMiddleware',
+ 'django.middleware.locale.LocaleMiddleware', # you need this to activate language (code)
'django.middleware.common.CommonMiddleware',
...
)
I've investigated this a bit and here's some things to check:
1- Add this line in your /friend/invite/ associated view to ensure the set_lang view is working correctly.
print request.LANGUAGE_CODE
If it does not output 'tl', it's probably because you're missing django locale files for your language since they are in your settings file. These files should be located under django/conf/locale/tl. There's more than one files in there and these won't be generated by the makemessages command.
2- If it does output 'tl', that must mean you have a tl folder in django code tree. Then I would try and make it work with a supported language first. When trying to make your example work, I wasn't able to get tagalog either. By switching to another supported language, french in my case, I've been able to troubleshoot my problems.
3- It would help to have the template to render /friend/invite/ view so we can see what you're translating. In my test I used a django string to avoid having to generate my own messages. I did what the documentation says and copied from english to use in tagalog. I then modified one of the strings in there. The problem is, django uses a binary file generated from the text one so only modifying the text version would still display django strings in english even if under tagalog. I discovered that when instead of using english as a basis, I used the french versions to put under tagalog.
Did you create the translation for Filipino and put it in the correct location in your project? If so, where did you put it?
Django looks for translations by following this algorithm:
- First, it looks for a locale directory in the application directory of the view that’s being called. If it finds a translation for the selected language, the translation will be installed.
- Next, it looks for a locale directory in the project directory. If it finds a translation, the translation will be installed.
- Finally, it checks the Django-provided base translation in django/conf/locale.
Filipino isn't one of the django supported languages so you will need to add it yourself. Here is something that I got from the djangobook.com
http://www.djangobook.com/en/2.0/chapter19/
The LocaleMiddleware can only select languages for which there is a Django-provided base translation. If you want to provide translations for your application that aren’t already in the set of translations in Django’s source tree, you’ll want to provide at least basic translations for that language. For example, Django uses technical message IDs to translate date formats and time formats — so you will need at least those translations for the system to work correctly.
A good starting point is to copy the English .po file and to translate at least the technical messages — maybe the validation messages, too.
Technical message IDs are easily recognized; they’re all upper case. You don’t translate the message ID as with other messages, you provide the correct local variant on the provided English value. For example, with DATETIME_FORMAT (or DATE_FORMAT or TIME_FORMAT), this would be the format string that you want to use in your language. The format is identical to the format strings used by the now template tag.
I'm not sure if that will solve your problem, but hopefully it will help you get there.
try adding LANGUAGE_CODE = 'en-us'
it is not a caching problem? Try to remove the cache to test..
I would check if there is use of django.utils.translation's deactivate or activate methods in you application since I've got in troubles once because of it!
I also suggest you to have a look with pdb on what happens in django.views.i18n set_language view when you try to change the language.
If I understand correctly, setting LANGUAGE_CODE to tl allows you to load your site in Filipino. If not, you probably have some configuration issue with the locale set-up.
To help pin point the problem, I suggest to do the following:
Have the language setting form point to itself when changing language. This way we have a non trivial compare between clicks. Here I am assuming that the language settings form resides the bookmarks url.
<input name="next" type="hidden" value="/bookmarks/" />
Next, change the title tag to a django default string that you have translated in your language. In this case "Delete"
<title>{% trans "Delete" %}</title>
You can also add another language, such as fr, to your LANGUAGES settings to see that a django provided language does work.
Loading the language setting page directly will allow you to change the language and then compare that the title changed (you could use another tag if you want). Using this method with your provided information, the language switch worked on my setup.
Maybe you are using ugettext when you should be using ugettext_lazy. See this answer.
精彩评论