Seera-Unified-Asset/asset_lite/api/translation_api.py
2026-03-23 17:34:51 +05:30

139 lines
4.1 KiB
Python

import frappe
from frappe import _
@frappe.whitelist(allow_guest = True)
def get_translations(language='en'):
"""
Get all translations for a specific language from Frappe's Translation doctype
This returns a dictionary of source text -> translated text
Usage: /api/method/asset_lite.api.translation_api.get_translations?language=ar
Args:
language: Language code (e.g., 'en', 'ar')
Returns:
Dictionary mapping source text to translated text
"""
try:
# Validate language parameter
if not language:
language = 'en'
# Get all translations for the specified language
translations = frappe.get_all(
'Translation',
filters={
'language': language
},
fields=['source_text', 'translated_text'],
limit_page_length=0 # 0 means no limit (get all)
)
# Convert to dictionary format: {source_text: translated_text}
translation_dict = {}
for trans in translations:
source = trans.get('source_text')
translated = trans.get('translated_text')
if source and translated:
translation_dict[source] = translated
return {
"success": True,
"language": language,
"count": len(translation_dict),
"translations": translation_dict
}
except Exception as e:
frappe.log_error(f"Error in get_translations: {str(e)}", "Translation API Error")
return {
"success": False,
"error": str(e),
"translations": {}
}
@frappe.whitelist(allow_guest=False)
def get_available_languages():
"""
Get list of all available languages that have translations
Usage: /api/method/asset_lite.api.translation_api.get_available_languages
Returns:
List of language codes (e.g., ['en', 'ar'])
"""
try:
# Get distinct languages from Translation doctype
languages = frappe.db.sql("""
SELECT DISTINCT language
FROM `tabTranslation`
WHERE language IS NOT NULL AND language != ''
ORDER BY language
""", as_dict=True)
language_list = [lang['language'] for lang in languages if lang.get('language')]
# Always include English as default
if 'en' not in language_list:
language_list.insert(0, 'en')
return {
"success": True,
"languages": language_list
}
except Exception as e:
frappe.log_error(f"Error in get_available_languages: {str(e)}", "Translation API Error")
return {
"success": False,
"error": str(e),
"languages": ['en']
}
@frappe.whitelist(allow_guest=False)
def get_translation(source_text, language='ar'):
"""
Get a single translation for a specific text
Usage: /api/method/asset_lite.api.translation_api.get_translation?source_text=Comprehensive&language=ar
Args:
source_text: The text to translate
language: Target language code (default: 'ar')
Returns:
Translated text or original if not found
"""
try:
if not source_text:
return {
"success": False,
"error": "source_text is required"
}
translation = frappe.db.get_value(
'Translation',
filters={
'language': language,
'source_text': source_text
},
fieldname='translated_text'
)
return {
"success": True,
"source_text": source_text,
"translated_text": translation or source_text, # Return original if not found
"found": bool(translation)
}
except Exception as e:
frappe.log_error(f"Error in get_translation: {str(e)}", "Translation API Error")
return {
"success": False,
"error": str(e),
"translated_text": source_text
}