139 lines
4.1 KiB
Python
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
|
|
} |