2011-01-28 26 views
9

Tôi không biết mình đang làm gì sai, nhưng dữ liệu phiên của tôi sẽ không thay đổi ngay cả khi tôi gửi một ngôn ngữ mới đến/i18n/setlang. Tôi dịch sang ngôn ngữ Philippines bằng cách sử dụng mã 'tl' nhưng bằng cách nào đó, nó dường như không hoạt động. Hãy giúp tôi. Dưới đây là một số mã:Django i18n setlang không thay đổi dữ liệu phiên django_language

# Django settings for ppdjango project. 
import os 

DEBUG = True 
TEMPLATE_DEBUG = DEBUG 

ADMINS = (
    # ('Your Name', '[email protected]'), 
) 

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&[email protected])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 <[email protected]>' 
EMAIL_HOST = 'mail.ygamretuta.com' 
EMAIL_PORT = '' 
EMAIL_HOST_USER = '[email protected]' 
EMAIL_HOST_PASSWORD = '' 

My hình thức cài đặt ngôn ngữ: {

{% 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> 

thiết lập url của tôi:

# the rest is above 
(r'^i18n/', include('django.conf.urls.i18n')), 

EDIT ngôn ngữ của tôi đang làm việc tốt vì nếu tôi làm ' tl 'ngôn ngữ duy nhất trong cài đặt, trang được dịch sang tiếng Tagalog

EDIT bao gồm toàn bộ các thiết lập nộp

Trả lời

5

Tôi đã điều tra này một chút và đây là một số điều cần kiểm tra:

1- Thêm dòng này vào/bạn bè/người mời/xem liên kết của bạn để đảm bảo quan điểm set_lang đang làm việc một cách chính xác.

print request.LANGUAGE_CODE 

Nếu nó không xuất ra 'tl', có thể do bạn thiếu tệp ngôn ngữ django cho ngôn ngữ của bạn vì chúng nằm trong tệp cài đặt của bạn. Những tập tin này nên được đặt dưới django/conf/locale/tl. Có nhiều hơn một tệp trong đó và các tệp này sẽ không được tạo bởi lệnh makemessages.

2- Nếu nó xuất 'tl', điều đó phải có nghĩa là bạn có thư mục tl trong cây mã django. Sau đó, tôi sẽ cố gắng và làm cho nó hoạt động với một ngôn ngữ được hỗ trợ đầu tiên. Khi cố gắng làm ví dụ của bạn, tôi cũng không thể nhận được tagalog. Bằng cách chuyển sang ngôn ngữ được hỗ trợ khác, tiếng Pháp trong trường hợp của tôi, tôi đã có thể khắc phục sự cố của mình.

3- Sẽ giúp mẫu hiển thị/bạn bè/mời/xem để chúng tôi có thể xem những gì bạn đang dịch. Trong thử nghiệm của tôi, tôi sử dụng một chuỗi django để tránh phải tạo ra các tin nhắn của riêng tôi. Tôi đã làm những gì tài liệu nói và sao chép từ tiếng Anh để sử dụng trong Tagalog. Sau đó tôi sửa đổi một trong những chuỗi trong đó. Vấn đề là, django sử dụng một tập tin nhị phân được tạo ra từ văn bản một để chỉ sửa đổi phiên bản văn bản sẽ vẫn hiển thị chuỗi django trong tiếng Anh ngay cả khi theo Tagalog. Tôi phát hiện ra rằng khi thay vì sử dụng tiếng Anh làm cơ sở, tôi đã sử dụng các phiên bản tiếng Pháp để đặt dưới tagalog.

0

thử thêm LANGUAGE_CODE = 'en-us'

+0

cố gắng, không làm việc mặc dù :( – yretuta

+0

TEMPLATE_CONTEXT_PROCESSORS = ( "django.core.context_processors.i18n", ) Các bạn đã thêm vào này trong settings.py – sush

+0

vâng. Tôi nghĩ mình phải cập nhật nó để bao gồm toàn bộ tập tin cài đặt của tôi – yretuta

0

nó không phải là một vấn đề bộ nhớ đệm? Hãy thử xóa bộ nhớ cache để kiểm tra ..

+0

sự cố xảy ra ngay cả trước khi tôi thêm phần đệm trung gian bộ nhớ cache :) – yretuta

1

Bạn đã tạo bản dịch cho tiếng Philipin và đặt nó vào vị trí chính xác trong dự án của bạn chưa? Nếu vậy, bạn đã đặt nó ở đâu?

Django tìm kiếm bản dịch của sau thuật toán này:

  • Đầu tiên, nó sẽ tìm kiếm một thư mục locale trong thư mục ứng dụng của quan điểm cho rằng đang được gọi. Nếu nó tìm bản dịch cho ngôn ngữ được chọn, bản dịch sẽ được cài đặt.
  • Tiếp theo, nó sẽ tìm thư mục ngôn ngữ trong thư mục dự án. Nếu tìm thấy bản dịch, bản dịch sẽ được cài đặt.
  • Cuối cùng, nó kiểm tra bản dịch cơ sở do Django cung cấp trong django/conf/locale.

Philipin không phải là một trong những ngôn ngữ được hỗ trợ django, do đó bạn sẽ cần thêm ngôn ngữ đó. Dưới đây là một cái gì đó mà tôi nhận được từ các djangobook.com

http://www.djangobook.com/en/2.0/chapter19/

Các LocaleMiddleware chỉ có thể chọn ngôn ngữ mà có một bản dịch cơ sở Django cung cấp. Nếu bạn muốn cung cấp bản dịch cho ứng dụng của bạn chưa phải là trong tập hợp các bản dịch trong cây mã nguồn của Django, bạn sẽ muốn cung cấp tại bản dịch cơ bản nhất cho ngôn ngữ đó. Ví dụ: Django sử dụng ID thông báo kỹ thuật để dịch định dạng ngày và định dạng thời gian - vì vậy, bạn sẽ cần ít nhất những bản dịch đó để hệ thống hoạt động chính xác.

Điểm khởi đầu tốt là sao chép tệp tiếng Anh .po và để dịch ở số ít nhất là thông báo kỹ thuật - có thể cả thông báo xác thực.

ID thông báo kỹ thuật dễ dàng được hiển thị ; tất cả chúng đều là chữ hoa. Bạn không dịch ID thư là với các thư khác, bạn cung cấp biến thể địa phương chính xác trên giá trị tiếng Anh được cung cấp. Ví dụ: với DATETIME_FORMAT (hoặc DATE_FORMAT hoặc TIME_FORMAT), đây sẽ là định dạng chuỗi mà bạn muốn sử dụng bằng ngôn ngữ của mình. Định dạng giống hệt với các chuỗi định dạng được sử dụng bởi thẻ mẫu hiện tại.

Tôi không chắc liệu điều đó có giải quyết được vấn đề của bạn hay không, nhưng hy vọng nó sẽ giúp bạn đạt được điều đó.

+0

cảm ơn, nhưng tôi đã có bản dịch tiếng Philipin cho các chuỗi có thể dịch mà tôi tạo bằng python manage.py makemessages. nó nằm trong một thư mục được gọi là miền địa phương với mã 'tl' – yretuta

0

Tôi sẽ kiểm tra xem có sử dụng django.utils.translation tắt hoặc kích hoạt các phương pháp trong ứng dụng của bạn vì tôi đã gặp rắc rối một lần vì nó!

Tôi cũng đề nghị bạn có một cái nhìn với pdb về những gì xảy ra trong view django.views.i18n set_language khi bạn cố gắng thay đổi ngôn ngữ.

0

Nếu tôi hiểu chính xác, hãy đặt LANGUAGE_CODE thành tl cho phép bạn tải trang web của mình bằng tiếng Philipin. Nếu không, bạn có thể có một số vấn đề cấu hình với thiết lập miền địa phương.

Để giúp pin điểm vấn đề, tôi đề nghị phải làm như sau:

Có điểm hình thức cài đặt ngôn ngữ cho chính nó khi thay đổi ngôn ngữ. Bằng cách này, chúng tôi có sự so sánh không nhỏ giữa các lần nhấp. Ở đây tôi giả định rằng biểu mẫu cài đặt ngôn ngữ nằm trong url dấu trang.

<input name="next" type="hidden" value="/bookmarks/" /> 

Tiếp theo, thay đổi thẻ tiêu đề thành chuỗi mặc định django mà bạn đã dịch bằng ngôn ngữ của mình. Trong trường hợp này "Delete"

<title>{% trans "Delete" %}</title> 

Bạn cũng có thể thêm một ngôn ngữ khác, chẳng hạn như fr, để thiết lập NGÔN NGỮ của bạn để thấy rằng một ngôn ngữ django cung cấp làm việc.

Tải trang cài đặt ngôn ngữ trực tiếp sẽ cho phép bạn thay đổi ngôn ngữ và sau đó so sánh tiêu đề đã thay đổi (bạn có thể sử dụng thẻ khác nếu bạn muốn). Sử dụng phương pháp này với thông tin được cung cấp của bạn, công tắc ngôn ngữ hoạt động trên thiết lập của tôi.

0

Có thể bạn đang sử dụng ugettext khi bạn nên sử dụng ugettext_lazy. Xem this answer.

15
MIDDLEWARE_CLASSES = (
    'django.middleware.cache.UpdateCacheMiddleware', 
+ 'django.middleware.locale.LocaleMiddleware', # you need this to activate language (code) 
    'django.middleware.common.CommonMiddleware', 
    ... 
) 
+0

Tôi muốn gợi ý, rằng thứ tự Middleware có thể là quan trọng. Tôi cần thiết để đưa SessionMiddle trước LocaleMiddleWare, mà âm thanh có ý nghĩa: ' 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', ' – contmp

+0

@contmp, hmm .. ., nó tùy thuộc vào bạn. Nhưng tôi không tìm thấy sự phụ thuộc giữa SessionMiddleware và LocaleMiddleware. – gzerone

Các vấn đề liên quan