ಅನುವಾದ ವ್ಯವಸ್ಥೆ: ಮೂರು-ತಂತ್ರಜ್ಞಾನ ಹೈಬ್ರಿಡ್ ವಿಧಾನ

ಈ ಲೇಖನವು ಮೂರು ತಂತ್ರಜ್ಞಾನಗಳನ್ನು—ಟೆಂಪ್ಲೇಟ್ಗಳಿಗೆ Flask-Babel, ಪದಗುಚ್ಛ ಕೋಷ್ಟಕಗಳಿಗೆ TranslationManager, ಮತ್ತು ವಿಷಯ ಅನುವಾದಕ್ಕೆ DeepSeek AI—ಸಂಯೋಜಿಸುವ ನಮ್ಮ ಅನುವಾದ ವ್ಯವಸ್ಥೆಯನ್ನು ವಿವರಿಸುತ್ತದೆ, ಇದು ಸಮಗ್ರ ಬಹುಭಾಷಾ ಬೆಂಬಲವನ್ನು ಒದಗಿಸುತ್ತದೆ.

ಸಮಸ್ಯೆ: ಸಂಕೀರ್ಣ ವೆಬ್ಸೈಟ್ ಅನ್ನು ಅನುವಾದಿಸುವುದು

ನಮ್ಮ ವೆಬ್ಸೈಟ್ ಅನುವಾದ ಅಗತ್ಯವಿರುವ ಬಹು-ರೀತಿಯ ವಿಷಯಗಳನ್ನು ಹೊಂದಿದೆ:

  • ಸ್ಥಿರ ಟೆಂಪ್ಲೇಟ್ಗಳು: ನ್ಯಾವಿಗೇಷನ್, ಬಟನ್ಗಳು, ಲೇಬಲ್ಗಳು (500+ ಸ್ಟ್ರಿಂಗ್ಗಳು)

  • ಡೈನಾಮಿಕ್ ವಿಷಯ: ಉತ್ಪನ್ನ ಹೆಸರುಗಳು, ವಿವರಣೆಗಳು, ವೈಶಿಷ್ಟ್ಯಗಳು (10,000+ ಸ್ಟ್ರಿಂಗ್ಗಳು)

  • ಬಳಕೆದಾರ-ರಚಿತ ವಿಷಯ: ವಿಮರ್ಶೆಗಳು, ಕಾಮೆಂಟ್ಗಳು, ಬೆಂಬಲ ಟಿಕೆಟ್ಗಳು

  • ತಾಂತ್ರಿಕ ಪದಗಳು: ಬ್ರಾಂಡ್ ಹೆಸರುಗಳು, SKUಗಳು, URLಗಳು (ಅನುವಾದಿಸಬಾರದು)

ಒಂದೇ ಅನುವಾದ ವಿಧಾನವು ಕಾರ್ಯನಿರ್ವಹಿಸುವುದಿಲ್ಲ:

  • ಯಂತ್ರ ಅನುವಾದ: ವೇಗವಾಗಿದೆ ಆದರೆ ತಾಂತ್ರಿಕ ಪದಗಳಿಗೆ ನಿಖರವಾಗಿಲ್ಲ

  • ಕೈಯಾರೆ ಅನುವಾದ: ನಿಖರವಾಗಿದೆ ಆದರೆ ನಿಧಾನ ಮತ್ತು ದುಬಾರಿ

  • ಟೆಂಪ್ಲೇಟ್-ಮಾತ್ರ: ಡೈನಾಮಿಕ್ ವಿಷಯವನ್ನು ನಿಭಾಯಿಸುವುದಿಲ್ಲ

ನಮಗೆ ಎಲ್ಲಾ ಮೂರರ ಅತ್ಯುತ್ತಮವನ್ನು ಸಂಯೋಜಿಸುವ ಹೈಬ್ರಿಡ್ ವಿಧಾನದ ಅಗತ್ಯವಿದೆ.

ಅನುವಾದ ವಿನ್ಯಾಸ

graph TD
    Request[ಬಳಕೆದಾರ ವಿನಂತಿ
lang=hi] subgraph Templates Babel[Flask-Babel
.po ಫೈಲ್ಗಳು] Static[ಸ್ಥಿರ ಸ್ಟ್ರಿಂಗ್ಗಳು
ಬಟನ್ಗಳು, ಲೇಬಲ್ಗಳು] end subgraph Dynamic TM[TranslationManager
ಪದಗುಚ್ಛ ಕೋಷ್ಟಕಗಳು] Phrases[ಉತ್ಪನ್ನ ಹೆಸರುಗಳು
ವೈಶಿಷ್ಟ್ಯಗಳು, ಪದಗಳು] end subgraph AI DS[DeepSeek API
AI ಅನುವಾದ] Content[ವಿವರಣೆಗಳು
ಲೇಖನಗಳು, ಉದ್ದ ಪಠ್ಯ] end Request --> Babel Request --> TM Request --> DS Babel --> Static TM --> Phrases DS --> Content Static --> Response[ಅನುವಾದಿತ ಪುಟ] Phrases --> Response Content --> Response

ಮೂರು ತಂತ್ರಜ್ಞಾನಗಳು

1. Flask-Babel: ಟೆಂಪ್ಲೇಟ್ ಅನುವಾದಗಳು

Flask-Babel ಸ್ಥಿರ ಟೆಂಪ್ಲೇಟ್ ಸ್ಟ್ರಿಂಗ್ಗಳನ್ನು gettext .po ಫೈಲ್ಗಳನ್ನು ಬಳಸಿಕೊಂಡು ನಿಭಾಯಿಸುತ್ತದೆ.

  • ಬಳಕೆಯ ಪ್ರಕರಣ: ನ್ಯಾವಿಗೇಷನ್, ಬಟನ್ಗಳು, ಲೇಬಲ್ಗಳು, ದೋಷ ಸಂದೇಶಗಳು

  • ಉದಾಹರಣೆ:

# ಟೆಂಪ್ಲೇಟ್
{{ _('Add to Cart') }}

# .po ಫೈಲ್ (ಹಿಂದಿ)
msgid "Add to Cart"
msgstr "कार्ट में जोड़ें"

ಲಾಭಗಳು:

  • ✅ ಪ್ರಮಾಣಿತ i18n ವಿಧಾನ

  • ✅ ಅನುವಾದ ಸಾಧನಗಳ ಬೆಂಬಲ (Poedit, Weblate)

  • ✅ ಕಂಪೈಲ್-ಸಮಯದ ಮೌಲ್ಯೀಕರಣ

  • ✅ ವೇಗವಾದ ಲುಕಪ್ (ಸಂಕಲಿತ .mo ಫೈಲ್ಗಳು)

ಮಿತಿಗಳು:

  • ❌ ಸ್ಥಿರ ಸ್ಟ್ರಿಂಗ್ಗಳಿಗೆ ಮಾತ್ರ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ

  • ❌ ಹೊಸ ಸ್ಟ್ರಿಂಗ್ಗಳನ್ನು ಸೇರಿಸಲು ಕೋಡ್ ಬದಲಾವಣೆಗಳು ಬೇಕಾಗುತ್ತವೆ

  • ❌ ಡೈನಾಮಿಕ್ ವಿಷಯ ಬೆಂಬಲವಿಲ್ಲ

2. TranslationManager: ಪದಗುಚ್ಛ ಕೋಷ್ಟಕಗಳು

ನಮ್ಮ ಕಸ್ಟಮ್ TranslationManager ವರ್ಗವು JSON ಪದಗುಚ್ಛ ಕೋಷ್ಟಕಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಡೈನಾಮಿಕ್ ವಿಷಯವನ್ನು ನಿಭಾಯಿಸುತ್ತದೆ.

  • ಬಳಕೆಯ ಪ್ರಕರಣ: ಉತ್ಪನ್ನ ಹೆಸರುಗಳು, ವೈಶಿಷ್ಟ್ಯಗಳು, ವಿವರಣೆಗಳು, ವಿಶೇಷಣಗಳು

  • ಉದಾಹರಣೆ:

{
  "Mini PC": "मिनी पीसी",
  "Intel N100": "Intel N100",
  "8GB RAM": "8GB RAM",
  "256GB SSD": "256GB SSD"
}

ಲಾಭಗಳು:

  • ✅ ಡೈನಾಮಿಕ್ ವಿಷಯ ಬೆಂಬಲ

  • ✅ ರನ್ಟೈಮ್ ನವೀಕರಣಗಳು (ರೀಸ್ಟಾರ್ಟ್ ಅಗತ್ಯವಿಲ್ಲ)

  • ✅ ಸಂರಕ್ಷಣೆ ನಿಯಮಗಳು (ಬ್ರಾಂಡ್ ಹೆಸರುಗಳು, SKUಗಳು)

  • ✅ ಪ್ರಾದೇಶಿಕ ಫಾರ್ಮ್ಯಾಟಿಂಗ್ (ದಶಮಾಂಶ ವಿಭಾಜಕಗಳು)

  • ✅ ಅನುವಾದ ಕ್ಯೂ (ಕಾಣೆಯಾದ ಸ್ಟ್ರಿಂಗ್ಗಳು)

ಮಿತಿಗಳು:

  • ❌ ಕೈಯಾರೆ ಪದಗುಚ್ಛ ನಿರ್ವಹಣೆ

  • ❌ ಅನುವಾದಕರಿಗೆ ಸಂದರ್ಭವಿಲ್ಲ

  • ❌ ಆರಂಭಿಕ ಅನುವಾದ ಅಗತ್ಯವಿದೆ

3. DeepSeek AI: ವಿಷಯ ಅನುವಾದ

DeepSeek AI ಮಾದರಿಯು ದೀರ್ಘ-ರೂಪದ ವಿಷಯ ಅನುವಾದವನ್ನು ನಿಭಾಯಿಸುತ್ತದೆ.

  • ಬಳಕೆಯ ಪ್ರಕರಣ: ಬ್ಲಾಗ್ ಲೇಖನಗಳು, ಉತ್ಪನ್ನ ವಿವರಣೆಗಳು, ಮಾರ್ಕೆಟಿಂಗ್ ಕಾಪಿ

  • ಉದಾಹರಣೆ:

prompt = f"Translate to {lang}: {text}"
response = deepseek.generate(prompt)

ಲಾಭಗಳು:

  • ✅ ಉದ್ದನೆಯ ವಿಷಯವನ್ನು ನಿಭಾಯಿಸುತ್ತದೆ (1000+ ಪದಗಳು)

  • ✅ ಸಂದರ್ಭ-ಸಾಕ್ಷಿಯ ಅನುವಾದ

  • ✅ ನೈಸರ್ಗಿಕ ಭಾಷಾ ಔಟ್ಪುಟ್

  • ✅ ಬ್ಯಾಚ್ ಪ್ರಕ್ರಿಯೆ

ಮಿತಿಗಳು:

  • ❌ ಅನುವಾದಕ್ಕೆ API ವೆಚ್ಚ

  • ❌ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕ ಅಗತ್ಯವಿದೆ

  • ❌ ತಾಂತ್ರಿಕ ಪದಗಳನ್ನು ತಪ್ಪಾಗಿ ಅನುವಾದಿಸಬಹುದು

TranslationManager ವಿನ್ಯಾಸ

ಪದಗುಚ್ಛ ಕೋಷ್ಟಕ ರಚನೆ

ಪದಗುಚ್ಛ ಕೋಷ್ಟಕಗಳು ಪ್ರತಿ ಭಾಷೆಗೆ JSON ಫೈಲ್ಗಳಾಗಿ ಸಂಗ್ರಹಿಸಲ್ಪಡುತ್ತವೆ:

app/shared/translation/phrase_tables/

ಪ್ರತಿ ಫೈಲ್ ಇಂಗ್ಲಿಷ್ ಪದಗುಚ್ಛಗಳನ್ನು ಅನುವಾದಗಳಿಗೆ ಮ್ಯಾಪ್ ಮಾಡುತ್ತದೆ:

{
  "Mini PC": "मिनी पीसी",
  "Thin Client": "थिन क्लाइंट",
  "Industrial PC": "औद्योगिक पीसी",
  "All-in-One": "ऑल-इन-वन"
}

ಅನುವಾದ ಲುಕಪ್

get() ವಿಧಾನವು ಬಹು-ಹಂತದ ಲುಕಪ್ ಅನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ:

1. ಸಂರಕ್ಷಣೆ ಪರಿಶೀಲನೆ:

if self._should_skip_translation(text, lang):
    return text  # ಬ್ರಾಂಡ್ ಹೆಸರುಗಳು, SKUಗಳು, URLಗಳನ್ನು ಅನುವಾದಿಸಬೇಡಿ

2. ಅಲ್ಪವಿರಾಮ ವಿಭಜನೆ (ಉದ್ದನೆಯ ಸ್ಟ್ರಿಂಗ್ಗಳಿಗೆ):

if len(text) > 150 and "," in text:
    parts = text.split(",")
    return ", ".join(self.get(p, lang) for p in parts)

3. ಪದಗುಚ್ಛ ಕೋಷ್ಟಕ ಲುಕಪ್:

if text in self.phrase_tables[lang]:
    return self.phrase_tables[lang][text]

4. ಲೆಗಸಿ ಕ್ಯಾಶೆ ಪ್ರಚಾರ:

if text_hash in self.legacy_caches[lang]:
    translation = self.legacy_caches[lang][text_hash]
    self.set(text, lang, translation)  # ಪದಗುಚ್ಛ ಕೋಷ್ಟಕಕ್ಕೆ ಪ್ರಚಾರ ಮಾಡಿ
    return translation

5. ಕಾಣೆಯಾದರೆ ಕ್ಯೂ ಮಾಡಿ:

if queue_if_missing:
    self.add_to_queue(text, lang)
return None  # ಅನುವಾದ ಕಂಡುಬಂದಿಲ್ಲ

ಸಂರಕ್ಷಣೆ ನಿಯಮಗಳು

ನಾವು ನಿರ್ದಿಷ್ಟ ವಿಷಯ ಪ್ರಕಾರಗಳನ್ನು ಸಂರಕ್ಷಿಸುತ್ತೇವೆ:

ಬ್ರಾಂಡ್ ಹೆಸರುಗಳು:

BRAND_NAMES_PRESERVE = [
    "Thinvent", "Intel", "AMD", "Microsoft", "Ubuntu",
    "Windows", "Linux", "WiFi", "Bluetooth"
]

ತಾಂತ್ರಿಕ ಪದಗಳು:

TECHNICAL_TERMS_PRESERVE = [
    "HDMI", "DisplayPort", "VGA", "USB", "Ethernet",
    "DDR4", "SSD", "NVMe", "PCIe", "SATA"
]

SKUಗಳು (ಮಾದರಿ-ಆಧಾರಿತ):

if not " " in text and text.count("-") >= 2:
    return True  # "Treo-N100-8-256-2H-W6-11P" ಅನ್ನು ಸಂರಕ್ಷಿಸಿ

URLಗಳು:

if text.startswith(("/", "http://", "https://")):
    return True

ಪ್ರಾದೇಶಿಕ ಫಾರ್ಮ್ಯಾಟಿಂಗ್

ಯುರೋಪಿಯನ್ ಸ್ಥಳೀಯತೆಗಳಿಗೆ (ಜರ್ಮನ್, ಫ್ರೆಂಚ್, ಸ್ಪ್ಯಾನಿಷ್), ನಾವು ಪ್ರಾದೇಶಿಕ ಫಾರ್ಮ್ಯಾಟಿಂಗ್ ಅನ್ನು ಅನ್ವಯಿಸುತ್ತೇವೆ:

ದಶಮಾಂಶ ವಿಭಾಜಕ:

# ಇಂಗ್ಲಿಷ್: 34.00
# ಜರ್ಮನ್:  34,00
text = text.replace(".", ",")

ವೋಲ್ಟೇಜ್/ಆಂಪಿಯರೇಜ್:

# ಇಂಗ್ಲಿಷ್: 12.5V
# ಜರ್ಮನ್:  12,5V
text = re.sub(r"(\d+)\.(\d+)V", r"\1,\2V", text)

ಇದು ಪ್ರತಿ ಸ್ಥಳೀಯತೆಗೆ ಸಂಖ್ಯೆಗಳು ಸರಿಯಾಗಿ ಪ್ರದರ್ಶಿತವಾಗುವುದನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ.

ಅನುವಾದ ಕ್ಯೂ

ಕಾಣೆಯಾದ ಅನುವಾದಗಳನ್ನು ಬ್ಯಾಚ್ ಪ್ರಕ್ರಿಯೆಗಾಗಿ ಕ್ಯೂ ಮಾಡಲಾಗುತ್ತದೆ:

[
  {
    "text": "Compact Desktop",
    "lang": "hi",
    "hash": "a1b2c3d4e5f6"
  },
  {
    "text": "Fanless Design",
    "lang": "hi",
    "hash": "f6e5d4c3b2a1"
  }
]

ಹಿನ್ನೆಲೆ ಸ್ಕ್ರಿಪ್ಟ್ DeepSeek AI ಬಳಸಿ ಕ್ಯೂವನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುತ್ತದೆ:

for item in queue:
    translation = deepseek.translate(item["text"], item["lang"])
    translation_manager.set(item["text"], item["lang"], translation)

ಫೈಲ್ ಲಾಕಿಂಗ್

ಸಮಕಾಲೀನ ಬರಹಗಳನ್ನು ತಡೆಯಲು ನಾವು fcntl ಫೈಲ್ ಲಾಕಿಂಗ್ ಅನ್ನು ಬಳಸುತ್ತೇವೆ:

with open(lock_path, "w") as lock_file:
    fcntl.flock(lock_file, fcntl.LOCK_EX)
    try:
        # ಪದಗುಚ್ಛ ಕೋಷ್ಟಕವನ್ನು ಓದಿ, ಮಾರ್ಪಡಿಸಿ, ಬರೆಯಿರಿ
        with open(table_path, "r+") as f:
            data = json.load(f)
            data.update(new_translations)
            f.seek(0)
            json.dump(data, f)
            f.truncate()
    finally:
        fcntl.flock(lock_file, fcntl.LOCK_UN)

ಇದು ಬಹು ಪ್ರಕ್ರಿಯೆಗಳು ಪದಗುಚ್ಛ ಕೋಷ್ಟಕಗಳನ್ನು ಹಾಳುಮಾಡದಂತೆ ಖಚಿತಪಡಿಸುತ್ತದೆ.

ಭಾಷಾ ಪತ್ತೆ

ನಾವು ಯೂನಿಕೋಡ್ ಶ್ರೇಣಿಗಳು ಮತ್ತು ಸ್ಟಾಪ್ವರ್ಡ್ಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಪ್ರಶ್ನೆಯ ಭಾಷೆಯನ್ನು ಪತ್ತೆ ಮಾಡುತ್ತೇವೆ:

ಯೂನಿಕೋಡ್ ಶ್ರೇಣಿ ಪತ್ತೆ

ದೇವನಾಗರಿ (ಹಿಂದಿ, ಮರಾಠಿ):

if 0x0900 <= ord(char) <= 0x097F:
    return "hi"

ಬಂಗಾಳಿ: ```python if 0x0980 <= ord(char) <= 0x09FF: