import 'dart:convert'; import 'package:flutter/services.dart'; import 'package:http/http.dart' as http; import 'package:intl/intl.dart'; extension FikoYTTranslationExtension on String { static late FikoYTTranslationManager _translationManager; /// Dil ayarlarını önceden belirleyin static Map supportedLanguages = { 'tr': 'tr_TR', 'en': 'en_US', // 'de': 'de_DE', // 'fr': 'fr_FR', // 'es': 'es_ES', // Diğer diller burada belirtilebilir }; /// Ayarları dosya yollarından yükle static Future loadSettingsFromFile({ required List translationFilePaths, }) async { _translationManager = await FikoYTTranslationManager.loadFromFiles(translationFilePaths); } /// Ayarları URL'lerden yükle static Future loadSettingsFromUrl({ required List translationUrls, }) async { _translationManager = await FikoYTTranslationManager.loadFromUrls(translationUrls); } /// `.tr` özelliği ile çeviri yapılır String tr({Map? variables, int? count, String? language}) { return _translationManager.translate(this, variables: variables, count: count, language: language); } // Sayı formatlama String formatNumber({required double number, required String formatKey, String? language}) { return _translationManager.formatNumber(number: number, formatKey: formatKey, language: language); } // Para birimi formatlama String formatCurrency({required double amount, required String currencyCode, String? language}) { return _translationManager.formatCurrency(amount: amount, currencyCode: currencyCode, language: language); } // Tarih formatlama String formatDate({required DateTime date, required String formatKey, String? language}) { return _translationManager.formatDate(date: date, formatKey: formatKey, language: language); } } class FikoYTTranslationManager { Map _translations = {}; Map _currencySettings = {}; Map _formattingSettings = {}; Map _localeSettings = {}; String _currentLanguage = 'tr'; String _currentLocale = 'tr_TR'; FikoYTTranslationManager._(); /// Birden fazla dosya yolundan yükleme static Future loadFromFiles(List filePaths) async { final manager = FikoYTTranslationManager._(); for (var filePath in filePaths) { final translationString = await rootBundle.loadString(filePath); final data = json.decode(translationString); manager._mergeSettings(data); } return manager; } /// Birden fazla URL'den yükleme static Future loadFromUrls(List urls) async { final manager = FikoYTTranslationManager._(); for (var url in urls) { final response = await http.get(Uri.parse(url)); if (response.statusCode == 200) { final data = json.decode(response.body); manager._mergeSettings(data); } else { throw Exception('Failed to load translation from $url'); } } return manager; } /// JSON verisini birleştirme void _mergeSettings(Map data) { print(data); // Çeviriler if (data['translations'] != null) { _translations = _translations.isEmpty ? data['translations'] : _mergeMaps(_translations, data['translations']); } // Para birimi ayarları if (data['currency_settings'] != null) { _currencySettings = _currencySettings.isEmpty ? data['currency_settings'] : _mergeMaps(_currencySettings, data['currency_settings']); } // Formatlama ayarları if (data['formatting'] != null) { _formattingSettings = _formattingSettings.isEmpty ? data['formatting'] : _mergeMaps(_formattingSettings, data['formatting']); } // Yerel ayarlar if (data['locale'] != null) { _localeSettings = _localeSettings.isEmpty ? data['locale'] : _mergeMaps(_localeSettings, data['locale']); } // Dil ve yerel ayarlarını güncelleme _currentLanguage = data['language'] ?? _currentLanguage; _currentLocale = data['locale'] ?? _currentLocale; } // Haritaları birleştirme Map _mergeMaps(Map map1, Map map2) { map1.addAll(map2); return map1; } /// Çeviri String translate(String key, {Map? variables, int? count, String? language}) { final targetLanguage = language ?? _currentLanguage; final translationData = _translations[targetLanguage]?[key]; if (translationData == null) return key; String translation = translationData['value'] ?? key; // Plural kontrolü if (count != null && translationData['plural'] != null) { translation = _handlePlural(translationData['plural'], count); } // Değişkenleri yerleştirme final variablesInText = translationData['variables'] as List? ?? []; for (var variable in variablesInText) { if (variables != null && variables.containsKey(variable)) { translation = translation.replaceAll('{$variable}', variables[variable]?.toString() ?? ''); } else { translation = translation.replaceAll('{$variable}', translationData['default'] ?? ''); } } // String formatlama final format = translationData['format']; if (format != null) { translation = _applyStringFormat(translation, format, targetLanguage); } return translation; } /// Plural işleme String _handlePlural(Map pluralData, int count) { final singular = pluralData['singular'] ?? ''; final plural = pluralData['plural'] ?? ''; final zero = pluralData['zero'] ?? ''; if (count == 0 && zero.isNotEmpty) { return zero; } else if (count == 1) { return singular; } else { return plural; } } /// String formatlamayı uygula String _applyStringFormat(String text, String formatKey, String language) { final formatMethod = _formattingSettings['string_formats']?[formatKey]; switch (formatMethod) { case 'toUpperCase': return text.toUpperCase(); case 'toLowerCase': return text.toLowerCase(); case 'capitalize': return text.capitalize(language); case 'snake_case': return text.replaceAll(' ', '_').toLowerCase(); case 'kebab-case': return text.replaceAll(' ', '-').toLowerCase(); case 'titleCase': return text.split(' ').map((e) => e.capitalize(language)).join(' '); case 'camelCase': return text.split(' ').map((e) => e.capitalize(language)).join(''); default: return text; } } // Sayı formatlama String formatNumber({required double number, required String formatKey, String? language}) { final targetLanguage = language ?? _currentLanguage; final formatData = _formattingSettings['number_formats']?[formatKey]; final decimalPlaces = formatData?['decimal_places'] ?? 2; final useGrouping = formatData?['use_grouping'] ?? true; final numberFormat = _buildNumberFormat(decimalPlaces, useGrouping, targetLanguage); return numberFormat.format(number); } // Sayı için özel format oluşturma (grup ayırıcı ile) NumberFormat _buildNumberFormat(int decimalPlaces, bool useGrouping, String language) { String pattern = '###0.${'0' * decimalPlaces}'; final numberFormat = NumberFormat(pattern, _getLocaleForLanguage(language)); return useGrouping ? _addGroupingSeparator(numberFormat) : numberFormat; } // Gruplama ayarlarını ekle NumberFormat _addGroupingSeparator(NumberFormat numberFormat) { numberFormat.maximumFractionDigits = 2; numberFormat.minimumFractionDigits = 2; return numberFormat; } // Dil parametresine göre yerel ayar almak String _getLocaleForLanguage(String language) { final locale = FikoYTTranslationExtension.supportedLanguages[language]; return locale ?? _currentLocale; // Eğer dil destekleniyorsa, o dilin locale'u, yoksa varsayılan locale } // Para birimi formatlama String formatCurrency({required double amount, required String currencyCode, String? language}) { final targetLanguage = language ?? _currentLanguage; final currencyData = _currencySettings['currencies']?[currencyCode]; final symbol = currencyData?['symbol'] ?? ''; final formattedAmount = formatNumber(number: amount, formatKey: 'currency', language: targetLanguage); return '$symbol$formattedAmount'; } // Tarih formatlama String formatDate({required DateTime date, required String formatKey, String? language}) { final targetLanguage = language ?? _currentLanguage; final formatData = _formattingSettings['date_formats']?[formatKey]; final formatPattern = formatData?['pattern'] ?? 'yyyy-MM-dd'; final dateFormat = DateFormat(formatPattern, _getLocaleForLanguage(targetLanguage)); return dateFormat.format(date); } } extension CapitalizeExtension on String { String capitalize(String language) { return this[0].toUpperCase() + substring(1).toLowerCase(); } }