i18n App¶
Internationalization and localization for multi-language content.
Overview¶
The i18n app provides:
- Localizable strings (base content in one language)
- Localized strings (translated content)
- Multi-language support
- Language detection
- Translation management
Quick Start¶
Create Translatable Strings¶
from htk.apps.i18n.models import AbstractLocalizableString
# Create base string
base_string = AbstractLocalizableString.objects.create(
key='greeting',
default_value='Hello'
)
# Add translation
base_string.add_translation(language='es', value='Hola')
base_string.add_translation(language='fr', value='Bonjour')
Look Up Translations¶
from htk.apps.i18n.utils.general import lookup_localization
# Get translated string
greeting = lookup_localization('greeting', language='es')
# Returns 'Hola' or default if not found
Retrieve All Strings¶
from htk.apps.i18n.utils.data import retrieve_all_strings
# Get all translations for all languages
all_strings = retrieve_all_strings()
# {
# 'greeting': {
# 'en': 'Hello',
# 'es': 'Hola',
# 'fr': 'Bonjour'
# }
# }
Models¶
AbstractLocalizableString- Base string in default languageAbstractLocalizedString- Translation in specific language
Common Patterns¶
Language Detection¶
from htk.apps.i18n.utils.general import detect_user_language
# Detect from request
language = detect_user_language(request)
# Set user language preference
user.profile.language = language
user.profile.save()
Bulk Translation Load¶
from htk.apps.i18n.utils.data import load_strings
data = {
'greeting': {
'en': 'Hello',
'es': 'Hola',
'fr': 'Bonjour'
},
'goodbye': {
'en': 'Goodbye',
'es': 'Adiós',
'fr': 'Au revoir'
}
}
load_strings(data)
Check Instrumentation¶
# Check if string is being used in code
if not base_string.is_instrumented():
# String is defined but not used
# Consider removing or archiving
pass
Supported Languages¶
from htk.apps.i18n.utils.data import look_up_supported_languages
languages = look_up_supported_languages()
# ['en', 'es', 'fr', 'de', 'ja', 'zh']
Configuration¶
# settings.py
LANGUAGE_CODE = 'en'
LANGUAGES = [
('en', 'English'),
('es', 'Spanish'),
('fr', 'French'),
('de', 'German'),
('ja', 'Japanese'),
('zh', 'Simplified Chinese'),
]
# Supported for i18n app
I18N_SUPPORTED_LANGUAGES = LANGUAGES
Best Practices¶
- Use descriptive keys -
app.feature.message, notmsg_1 - Keep context in values - Provide enough info for translators
- Use placeholders - For dynamic content in translations
- Avoid HTML in strings - Separate content from markup
- Test all languages - Verify strings render correctly
- Archive old strings - Clean up unused translations
- Use professional translators - Better quality than automated
Translation Workflow¶
1. Create key in default language
2. Mark translation needed
3. Send to translators
4. Add translations via admin or load_strings()
5. Deploy and test
6. Monitor for missing translations
Integration Example¶
def render_with_language(request):
language = request.user.profile.language or 'en'
context = {
'greeting': lookup_localization('greeting', language),
'welcome': lookup_localization('welcome_message', language),
}
return render(request, 'page.html', context)