Skip to main content
Glama

PowerPoint Translator

by daekeun-ml
config.py12.8 kB
""" Configuration constants and settings for PowerPoint Translator """ import os from pathlib import Path from typing import Dict, List from dotenv import load_dotenv # Load environment variables from .env file env_path = Path(__file__).parent.parent / '.env' load_dotenv(dotenv_path=env_path) class Config: """Configuration constants""" # AWS Configuration AWS_REGION = os.getenv('AWS_REGION', 'us-east-1') AWS_PROFILE = os.getenv('AWS_PROFILE', 'default') # Translation settings from environment DEFAULT_TARGET_LANGUAGE = os.getenv('DEFAULT_TARGET_LANGUAGE', 'ko') DEFAULT_MODEL_ID = os.getenv('BEDROCK_MODEL_ID', 'us.anthropic.claude-3-7-sonnet-20250219-v1:0') MAX_TOKENS = int(os.getenv('MAX_TOKENS', '4000')) TEMPERATURE = float(os.getenv('TEMPERATURE', '0.1')) ENABLE_POLISHING = os.getenv('ENABLE_POLISHING', 'true').lower() == 'true' BATCH_SIZE = int(os.getenv('BATCH_SIZE', '20')) CONTEXT_THRESHOLD = int(os.getenv('CONTEXT_THRESHOLD', '5')) # Debug settings DEBUG = os.getenv('DEBUG', 'false').lower() == 'true' # Post-processing settings ENABLE_TEXT_AUTOFIT = os.getenv('ENABLE_TEXT_AUTOFIT', 'true').lower() == 'true' TEXT_LENGTH_THRESHOLD = int(os.getenv('TEXT_LENGTH_THRESHOLD', '10')) # Font settings by language FONT_KOREAN = os.getenv('FONT_KOREAN', '맑은 고딕') FONT_JAPANESE = os.getenv('FONT_JAPANESE', 'Yu Gothic UI') FONT_ENGLISH = os.getenv('FONT_ENGLISH', 'Amazon Ember') FONT_CHINESE = os.getenv('FONT_CHINESE', 'Microsoft YaHei') FONT_DEFAULT = os.getenv('FONT_DEFAULT', 'Arial') # Font mapping by language code FONT_MAP = { 'ko': FONT_KOREAN, 'ja': FONT_JAPANESE, 'en': FONT_ENGLISH, 'en-US': FONT_ENGLISH, 'en-GB': FONT_ENGLISH, 'en-AU': FONT_ENGLISH, 'en-CA': FONT_ENGLISH, 'zh': FONT_CHINESE, 'zh-CN': FONT_CHINESE, 'zh-TW': FONT_CHINESE, 'zh-HK': FONT_CHINESE, 'zh-SG': FONT_CHINESE, 'zh-MY': FONT_CHINESE, } # Supported models SUPPORTED_MODELS = [ # Amazon Nova models "amazon.nova-micro-v1:0", "amazon.nova-lite-v1:0", "amazon.nova-pro-v1:0", "amazon.nova-premier-v1:0", # Anthropic Claude models "anthropic.claude-3-sonnet-20240229-v1:0", "anthropic.claude-3-haiku-20240307-v1:0", "anthropic.claude-3-5-sonnet-20240620-v1:0", "anthropic.claude-3-5-sonnet-20241022-v2:0", "anthropic.claude-3-5-haiku-20241022-v1:0", "us.anthropic.claude-3-5-sonnet-20240620-v1:0", "us.anthropic.claude-3-5-sonnet-20241022-v2:0", "us.anthropic.claude-3-5-haiku-20241022-v1:0", "us.anthropic.claude-3-7-sonnet-20250219-v1:0", "us.anthropic.claude-opus-4-20250514-v1:0", "us.anthropic.claude-sonnet-4-20250514-v1:0", "us.anthropic.claude-opus-4-1-20250805-v1:0", # Meta Llama models "meta.llama3-8b-instruct-v1:0", "meta.llama3-70b-instruct-v1:0", "us.meta.llama3-1-8b-instruct-v1:0", "us.meta.llama3-1-70b-instruct-v1:0", "us.meta.llama3-2-1b-instruct-v1:0", "us.meta.llama3-2-3b-instruct-v1:0", "us.meta.llama3-2-11b-instruct-v1:0", "us.meta.llama3-2-90b-instruct-v1:0", "us.meta.llama3-3-70b-instruct-v1:0", "us.meta.llama4-scout-17b-instruct-v1:0", "us.meta.llama4-maverick-17b-instruct-v1:0", # DeepSeek models "deepseek.r1-v1:0", "us.deepseek.r1-v1:0", # Mistral models "mistral.mistral-7b-instruct-v0:2", "mistral.mixtral-8x7b-instruct-v0:1", "mistral.mistral-large-2402-v1:0", "mistral.mistral-small-2402-v1:0", "mistral.pixtral-large-2502-v1:0", # Cohere models "cohere.command-r-v1:0", "cohere.command-r-plus-v1:0", # AI21 models "ai21.jamba-1-5-large-v1:0", "ai21.jamba-1-5-mini-v1:0", "ai21.jamba-instruct-v1:0", ] # Language mapping - Comprehensive list of supported languages LANGUAGE_MAP = { # Major languages 'en': 'English', 'ko': 'Korean', 'ja': 'Japanese', 'zh': 'Chinese (Simplified)', 'zh-CN': 'Chinese (Simplified)', 'zh-TW': 'Chinese (Traditional)', 'zh-HK': 'Chinese (Hong Kong)', # European languages 'fr': 'French', 'de': 'German', 'es': 'Spanish', 'it': 'Italian', 'pt': 'Portuguese', 'pt-BR': 'Portuguese (Brazil)', 'ru': 'Russian', 'nl': 'Dutch', 'sv': 'Swedish', 'no': 'Norwegian', 'da': 'Danish', 'fi': 'Finnish', 'pl': 'Polish', 'cs': 'Czech', 'sk': 'Slovak', 'hu': 'Hungarian', 'ro': 'Romanian', 'bg': 'Bulgarian', 'hr': 'Croatian', 'sr': 'Serbian', 'sl': 'Slovenian', 'et': 'Estonian', 'lv': 'Latvian', 'lt': 'Lithuanian', 'el': 'Greek', 'tr': 'Turkish', 'uk': 'Ukrainian', 'be': 'Belarusian', 'mk': 'Macedonian', 'mt': 'Maltese', 'is': 'Icelandic', 'ga': 'Irish', 'cy': 'Welsh', 'eu': 'Basque', 'ca': 'Catalan', 'gl': 'Galician', # Middle Eastern and African languages 'ar': 'Arabic', 'he': 'Hebrew', 'fa': 'Persian (Farsi)', 'ur': 'Urdu', 'sw': 'Swahili', 'am': 'Amharic', 'ha': 'Hausa', 'yo': 'Yoruba', 'ig': 'Igbo', 'zu': 'Zulu', 'af': 'Afrikaans', # South Asian languages 'hi': 'Hindi', 'bn': 'Bengali', 'te': 'Telugu', 'mr': 'Marathi', 'ta': 'Tamil', 'gu': 'Gujarati', 'kn': 'Kannada', 'ml': 'Malayalam', 'pa': 'Punjabi', 'or': 'Odia', 'as': 'Assamese', 'ne': 'Nepali', 'si': 'Sinhala', 'my': 'Burmese', # Southeast Asian languages 'th': 'Thai', 'vi': 'Vietnamese', 'id': 'Indonesian', 'ms': 'Malay', 'tl': 'Filipino (Tagalog)', 'km': 'Khmer', 'lo': 'Lao', # Other languages 'az': 'Azerbaijani', 'kk': 'Kazakh', 'ky': 'Kyrgyz', 'uz': 'Uzbek', 'tg': 'Tajik', 'mn': 'Mongolian', 'ka': 'Georgian', 'hy': 'Armenian', 'sq': 'Albanian', 'mk': 'Macedonian', 'lv': 'Latvian', 'lt': 'Lithuanian', 'et': 'Estonian', # Additional variants and regional codes 'en-US': 'English (US)', 'en-GB': 'English (UK)', 'en-AU': 'English (Australia)', 'en-CA': 'English (Canada)', 'fr-CA': 'French (Canada)', 'fr-CH': 'French (Switzerland)', 'de-AT': 'German (Austria)', 'de-CH': 'German (Switzerland)', 'es-MX': 'Spanish (Mexico)', 'es-AR': 'Spanish (Argentina)', 'es-CO': 'Spanish (Colombia)', 'es-CL': 'Spanish (Chile)', 'es-PE': 'Spanish (Peru)', 'es-VE': 'Spanish (Venezuela)', 'pt-PT': 'Portuguese (Portugal)', 'it-CH': 'Italian (Switzerland)', 'nl-BE': 'Dutch (Belgium)', 'sv-FI': 'Swedish (Finland)', 'ar-SA': 'Arabic (Saudi Arabia)', 'ar-EG': 'Arabic (Egypt)', 'ar-AE': 'Arabic (UAE)', 'ar-MA': 'Arabic (Morocco)', 'zh-SG': 'Chinese (Singapore)', 'zh-MY': 'Chinese (Malaysia)', 'ms-SG': 'Malay (Singapore)', 'ta-SG': 'Tamil (Singapore)', 'hi-IN': 'Hindi (India)', 'bn-BD': 'Bengali (Bangladesh)', 'ur-PK': 'Urdu (Pakistan)', 'fa-IR': 'Persian (Iran)', 'fa-AF': 'Persian (Afghanistan)', 'ps': 'Pashto', 'sd': 'Sindhi', 'ckb': 'Kurdish (Sorani)', 'ku': 'Kurdish (Kurmanji)', 'yi': 'Yiddish', 'la': 'Latin', 'eo': 'Esperanto', 'jv': 'Javanese', 'su': 'Sundanese', 'ceb': 'Cebuano', 'haw': 'Hawaiian', 'mi': 'Maori', 'sm': 'Samoan', 'to': 'Tongan', 'fj': 'Fijian', 'mg': 'Malagasy', 'ny': 'Chichewa', 'sn': 'Shona', 'st': 'Sesotho', 'tn': 'Setswana', 'ts': 'Tsonga', 've': 'Venda', 'xh': 'Xhosa', 'co': 'Corsican', 'fy': 'Frisian', 'gd': 'Scottish Gaelic', 'lb': 'Luxembourgish', 'rm': 'Romansh' } # Korean-specific terminology rules KOREAN_TERMINOLOGY = { "Observability": "Observability", "AgentCore Observability": "AgentCore Observability", "Key concepts": "핵심 개념", "Best Practices": "모범 사례", "Resources": "리소스", "Demos": "데모", "Pricing": "가격 책정" } # Text patterns to skip translation SKIP_PATTERNS = [ r'^\d+$', # Numbers only r'^https?://', # URLs r'\S+@\S+\.\S+', # Email addresses ] @classmethod def get_language_name(cls, language_code: str) -> str: """Get the full language name from language code""" return cls.LANGUAGE_MAP.get(language_code, language_code) @classmethod def validate_model_id(cls, model_id: str) -> bool: """Validate if the model ID is supported""" return model_id in cls.SUPPORTED_MODELS @classmethod def reload_env(cls): """Reload environment variables (useful for testing)""" load_dotenv(dotenv_path=env_path, override=True) @classmethod def get_font_for_language(cls, language_code: str) -> str: """Get the appropriate font for a given language code""" return cls.FONT_MAP.get(language_code, cls.FONT_DEFAULT) @classmethod def check_aws_credentials(cls): """Check if AWS credentials are properly configured""" import boto3 from botocore.exceptions import NoCredentialsError, PartialCredentialsError try: # Try to create a session with the specified profile if cls.AWS_PROFILE and cls.AWS_PROFILE != 'default': session = boto3.Session(profile_name=cls.AWS_PROFILE) else: session = boto3.Session() # Try to get credentials credentials = session.get_credentials() if credentials is None: return False, "No AWS credentials found. Please run 'aws configure' to set up your credentials." # Try to make a simple AWS call to verify credentials work sts = session.client('sts', region_name=cls.AWS_REGION) sts.get_caller_identity() return True, "AWS credentials are properly configured." except NoCredentialsError: return False, "No AWS credentials found. Please run 'aws configure' to set up your credentials." except PartialCredentialsError: return False, "Incomplete AWS credentials. Please run 'aws configure' to complete your credential setup." except Exception as e: return False, f"AWS credential verification failed: {str(e)}" def __init__(self): """Initialize configuration with environment variables""" self._env_vars = {} self._load_env_vars() def _load_env_vars(self): """Load all environment variables""" for key, value in os.environ.items(): self._env_vars[key] = value def get(self, key: str, default: str = None) -> str: """Get configuration value by key""" return self._env_vars.get(key, default) def get_bool(self, key: str, default: bool = False) -> bool: """Get boolean configuration value""" value = self.get(key, str(default).lower()) return value.lower() in ('true', '1', 'yes', 'on') def get_int(self, key: str, default: int = 0) -> int: """Get integer configuration value""" try: return int(self.get(key, str(default))) except (ValueError, TypeError): return default def get_float(self, key: str, default: float = 0.0) -> float: """Get float configuration value""" try: return float(self.get(key, str(default))) except (ValueError, TypeError): return default def set(self, key: str, value: str): """Set configuration value""" self._env_vars[key] = value os.environ[key] = value

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/daekeun-ml/ppt-translator'

If you have feedback or need assistance with the MCP directory API, please join our Discord server