पर्यवेक्षित मशीन अनुवाद
यह सामग्री मानव-निर्मित शब्दावलियों और शैली गाइडों के मार्गदर्शन में मशीन जनरेशन द्वारा अनुवादित की गई है। चूँकि इस पाठ की समीक्षा लाइन-दर-लाइन मैन्युअल रूप से नहीं की गई है, इसलिए कभी-कभी त्रुटियाँ या अनाड़ी वाक्य-रचना हो सकती है।
किसी भी विसंगति की स्थिति में, मूल अंग्रेज़ी संस्करण ही प्रामाणिक स्रोत है।
अंतर्राष्ट्रीयकरण और समय क्षेत्र
starlette-admin के साथ, आप UI स्ट्रिंग्स को प्रति-उपयोगकर्ता लोकलाइज़ कर सकते हैं और प्रदर्शित datetimes को दर्शक के लोकल टाइमज़ोन में बदल सकते हैं — इस बात से स्वतंत्र कि आपका डेटाबेस उन्हें कैसे स्टोर करता है।
पूर्ण उदाहरण: अंतर्राष्ट्रीयकरण और टाइमज़ोन प्रदर्शित करने वाले पूर्ण कार्यशील एप्लिकेशन के लिए GitHub रिपॉज़िटरी में examples/10-i18n-timezone देखें।
i18n extra इंस्टॉल करें
अनुवाद सपोर्ट के लिए Babel चाहिए। इसके बिना एडमिन फिर भी काम करता है, लेकिन वह English पर फ़ॉलबैक करता है और locale-aware दिनांक व संख्या फ़ॉर्मेटिंग छोड़ देता है।
Locale सेट करें
from sqlalchemy import create_engine
from starlette_admin import I18nConfig
from starlette_admin.contrib.sqla import Admin
from starlette_admin.i18n import SUPPORTED_LOCALES
engine = create_engine("sqlite:///admin.sqlite")
admin = Admin(
engine,
title="My Admin",
i18n_config=I18nConfig(
default_locale="en",
language_switcher=SUPPORTED_LOCALES,
),
secret_key="a-long-random-string",
)
i18n_config का डिफ़ॉल्ट None है, जो एडमिन को English में चलाता है। जब आप एक I18nConfig पास करते हैं, तो एडमिन LocaleMiddleware इंस्टॉल करता है। यह middleware हर रिक्वेस्ट पर एक locale resolve करता है और उसे टेम्पलेट्स तथा आपके फ़ील्ड/व्यू कोड भर में अनुवाद फ़ंक्शनों (gettext और lazy_gettext) को expose करता है।
language_switcher पैरामीटर एडमिन नेविगेशन बार में एक ड्रॉपडाउन जोड़ता है ताकि उपयोगकर्ता अपना locale चुन सकें। इसे डिफ़ॉल्ट None पर छोड़ें तब switcher छिप जाता है और default_locale तथा per-request डिटेक्शन पर भरोसा किया जाता है।
I18nConfig संदर्भ
| Attribute | Type | Default | Description |
|---|---|---|---|
default_locale |
str |
"en" |
Locale used when no cookie or header matches a supported locale. |
language_cookie_name |
str \| None |
"language" |
Cookie read to detect the user's locale. Set to None to disable. |
language_header_name |
str \| None |
"Accept-Language" |
Header read when the cookie is absent. Set to None to disable. |
language_switcher |
list[str] \| None |
None |
Locales offered in the navbar switcher. None hides the switcher. |
Locale कैसे पहचाना जाता है
LocaleMiddleware हर रिक्वेस्ट में एक बार locale resolve करता है, इस क्रम में:
- Cookie:
language_cookie_nameका मान, यदि वह किसी बिल्ट-इन समर्थित locale से मेल खाता है। - Header:
Accept-Languageहेडर, या वह हेडर जिसे आपनेlanguage_header_nameमें सेट किया है — उसी वैधता जाँच (validity check) के अधीन। - Default:
default_locale, जब न cookie मेल खाती है और न header।
बिल्ट-इन समर्थित locales (starlette_admin.i18n.SUPPORTED_LOCALES) हैं: German, English, French, Portuguese, Russian, Turkish, और Simplified व Traditional Chinese। जब कोई उपयोगकर्ता नेविगेशन बार में भाषा चुनता है, तब switcher भाषा cookie लिखता है, इसलिए चयन server-side session storage के बिना भी रिक्वेस्ट के दौरान बना रहता है।
समय क्षेत्र
from sqlalchemy import create_engine
from starlette_admin import TimezoneConfig
from starlette_admin.contrib.sqla import Admin
engine = create_engine("sqlite:///admin.sqlite")
admin = Admin(
engine,
title="My Admin",
timezone_config=TimezoneConfig(
default_timezone="UTC",
database_timezone="UTC",
timezone_switcher=["UTC", "Europe/Paris", "America/New_York", "Asia/Tokyo"],
),
secret_key="a-long-random-string",
)
Note
i18n_config के विपरीत, timezone_config का डिफ़ॉल्ट None नहीं है। यदि आप इसे छोड़ दें, तो Admin क्लास आपके लिए स्वयं एक TimezoneConfig() बना लेती है, इसलिए टाइमज़ोन रूपांतरण out of the box सक्रिय रहता है। एडमिन naive datetimes को database_timezone (डिफ़ॉल्ट "UTC") का मान मानता है और प्रत्येक उपयोगकर्ता को "UTC" — डिफ़ॉल्ट default_timezone — में दिखाता है, जब तक कि उपयोगकर्ता कोई और न चुने।
टाइमज़ोन कैसे पहचाना जाता है
TimezoneMiddleware हर रिक्वेस्ट में एक बार टाइमज़ोन resolve करता है:
- Cookie:
timezone_cookie_nameका मान — जो डिफ़ॉल्ट रूप से"timezone"है — यदि वह मौजूद हो। - Default: अन्यथा
default_timezone।
Navbar का टाइमज़ोन switcher ठीक भाषा switcher की तरह ही यह cookie लिखता है। टाइमज़ोन का Accept-Language हेडर जैसा कोई समकक्ष नहीं है क्योंकि ब्राउज़र ऐसा कोई हेडर नहीं भेजते, इसलिए डिटेक्शन पूरी तरह cookies पर निर्भर है। Client-side JavaScript जो Intl.DateTimeFormat().resolvedOptions().timeZone पढ़ता है, वह आमतौर पर cookie सेट करता है — switcher खुद भी ऐसा ही करता है।
फ़ील्ड मान कैसे बदले जाते हैं
DateTimeField और ArrowField मानों को database_timezone और दर्शक के resolved टाइमज़ोन के बीच बदलते हैं।
- Reading (list, detail, export): एडमिन डेटाबेस से मिला naive मान
database_timezoneका मान मानता है और फ़ॉर्मेट करने से पहले उसे दर्शक के टाइमज़ोन में बदल देता है। - Writing (create और edit फ़ॉर्म): एडमिन सबमिट किए गए मान को दर्शक के टाइमज़ोन का मान मानता है और उसे आपके मॉडल तक पहुँचने से पहले
database_timezoneमें बदल देता है।
परिणामस्वरूप, अलग-अलग टाइमज़ोन में बैठे दो एडमिन एक ही पंक्ति को एडिट कर सकते हैं और प्रत्येक समय को अपने लोकल समय में देखता है, जबकि डेटाबेस एक single, consistent टाइमज़ोन बनाए रखता है।
TimezoneConfig संदर्भ
| Attribute | Type | Default | Description |
|---|---|---|---|
default_timezone |
str |
"UTC" |
Timezone used when no cookie is set. Accepts any IANA timezone name. |
timezone_cookie_name |
str \| None |
"timezone" |
Cookie read to detect the viewer's timezone. Set to None to disable. |
database_timezone |
str |
"UTC" |
Timezone your stored datetimes are assumed to be in. |
timezone_switcher |
list[str] \| None |
None |
Timezones offered in the navbar switcher. None hides the switcher. |
use_user_locale_timezone |
bool |
True |
Prefer a timezone inferred from the user's locale over default_timezone. |
उपयोगकर्ता क्या चुन सकते हैं, इसे सीमित करने के लिए एक छोटी timezone_switcher लिस्ट पास करें। हर दर्शक के लिए एक ही टाइमज़ोन लागू करने के लिए timezone_switcher को None सेट करें और default_timezone सीधे सेट करें — उदाहरण के लिए company-wide "Europe/Paris"।
Navbar switcher प्रत्येक टाइमज़ोन का display नाम और UTC offset get_timezone और get_timezone_display_name टेम्पलेट globals के साथ रेंडर करता है। Templates गाइड इन globals और बाकी सभी को डॉक्यूमेंट करता है।
आगे क्या: