如何更改整个 Django CMS 网站的语言?
How can I change the language of a whole Django CMS website?
我想将使用 Django CMS 编写的网站的语言从 en-us
更改为 de
,这样 en-us
中的所有现有内容都会显示 de
将来。
我试过了
Page.objects.all().update(languages='de')
但是后来到处都是404错误。
我还需要更改什么?
要更改 django CMS 站点上所有内容的语言代码,运行 这些命令(从 'en-us'
切换到 'de'
:
Page.objects.filter(language='en-us').update('de')
Title.objects.filter(language='en-us').update(language='de')
CMSPlugin.objects.filter(language='en-us').update(language='de')
添加到@ojii 的答案,django-cms 3.6.0 和 django 1.11.20 现在的程序是:
- 修改
settings.py
:
#LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'en'
- 更新页面、标题、CMSPlugin(注意页面的
languages
):
Page.objects.filter(languages='en-us').update(languages='en')
Title.objects.filter(language='en-us').update(language='en')
CMSPlugin.objects.filter(language='en-us').update(language='en')
接受的答案与较新版本的 Django CMS 不兼容。 language
属性已更改为 languages
(另请参阅 )。对于 draft mode
版本的页面,这包含可用语言的逗号分隔列表。简单地搜索确切的语言并将其更新到下一个版本是行不通的。
鉴于我们要将 'nl' 更改为 'nl-nl',以下应匹配:
nl,en,de
de,nl,en
en,de,nl
nl
我们不能只搜索 'nl',因为不能匹配以下内容:
nl-nl
nl-nl,en
我的解决方案:
from_lang = 'nl'
to_lang = 'nl-nl'
# Match our lang at start, middle or end of list
lang_regex = r'^(.*,)?{}(,.*)?$'.format(from_lang)
# Get all distinct combinations of languages that contain our language
language_combinations = Page.objects\
.filter(languages__regex=lang_regex)\
.values('languages')\
.distinct()
# Create a mapping for each combination, replacing the old for the new lang
language_mappings = [
(
page['languages'],
re.sub(lang_regex, '\1{}\2'.format(to_lang), page['languages'])
) for page in language_combinations
]
# Update all pages to new lang
for old_languages, new_languages in language_mappings:
Page.objects\
.filter(languages=old_languages)\
.update(languages=new_languages)
# Also update Title and CMSPlugins
Title.objects.filter(language=from_lang).update(language=to_lang)
CMSPlugin.objects.filter(language=from_lang).update(language=to_lang)
我想将使用 Django CMS 编写的网站的语言从 en-us
更改为 de
,这样 en-us
中的所有现有内容都会显示 de
将来。
我试过了
Page.objects.all().update(languages='de')
但是后来到处都是404错误。
我还需要更改什么?
要更改 django CMS 站点上所有内容的语言代码,运行 这些命令(从 'en-us'
切换到 'de'
:
Page.objects.filter(language='en-us').update('de')
Title.objects.filter(language='en-us').update(language='de')
CMSPlugin.objects.filter(language='en-us').update(language='de')
添加到@ojii 的答案,django-cms 3.6.0 和 django 1.11.20 现在的程序是:
- 修改
settings.py
:
#LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'en'
- 更新页面、标题、CMSPlugin(注意页面的
languages
):
Page.objects.filter(languages='en-us').update(languages='en')
Title.objects.filter(language='en-us').update(language='en')
CMSPlugin.objects.filter(language='en-us').update(language='en')
接受的答案与较新版本的 Django CMS 不兼容。 language
属性已更改为 languages
(另请参阅 draft mode
版本的页面,这包含可用语言的逗号分隔列表。简单地搜索确切的语言并将其更新到下一个版本是行不通的。
鉴于我们要将 'nl' 更改为 'nl-nl',以下应匹配:
nl,en,de
de,nl,en
en,de,nl
nl
我们不能只搜索 'nl',因为不能匹配以下内容:
nl-nl
nl-nl,en
我的解决方案:
from_lang = 'nl'
to_lang = 'nl-nl'
# Match our lang at start, middle or end of list
lang_regex = r'^(.*,)?{}(,.*)?$'.format(from_lang)
# Get all distinct combinations of languages that contain our language
language_combinations = Page.objects\
.filter(languages__regex=lang_regex)\
.values('languages')\
.distinct()
# Create a mapping for each combination, replacing the old for the new lang
language_mappings = [
(
page['languages'],
re.sub(lang_regex, '\1{}\2'.format(to_lang), page['languages'])
) for page in language_combinations
]
# Update all pages to new lang
for old_languages, new_languages in language_mappings:
Page.objects\
.filter(languages=old_languages)\
.update(languages=new_languages)
# Also update Title and CMSPlugins
Title.objects.filter(language=from_lang).update(language=to_lang)
CMSPlugin.objects.filter(language=from_lang).update(language=to_lang)