fix: middleware order, geolocation NameError, packaging, and test correctness

- Move geolocation.py from repo root into aisbf/ package (correct location)
- Fix NameError: call geolocation.get_ip_country() with module prefix in APIBlockingMiddleware
- Fix middleware execution order: register DashboardBlockingMiddleware and
  APIBlockingMiddleware before ProxyHeadersMiddleware so proxy headers are
  decoded first (last added = first executed in Starlette)
- Fix typo: is_ip_genocidial -> is_ip_genocidal in aisbf/geolocation.py
- Fix tests: update import path to aisbf.geolocation and use AsyncMock so
  httpx coroutines are properly awaitable
- Add aisbf/geolocation.py and templates/blocked.html to setup.py data_files
- Add trailing newlines to geolocation.py, blocked.html, and test file
- Add static/i18n.js and static/i18n/*.json locale files
parent 8edaca53
...@@ -13,4 +13,6 @@ recursive-include templates *.html ...@@ -13,4 +13,6 @@ recursive-include templates *.html
recursive-include templates *.css recursive-include templates *.css
recursive-include templates *.js recursive-include templates *.js
recursive-include static *.zip recursive-include static *.zip
recursive-include static *.js
recursive-include static/i18n *.json
recursive-include static/extension *.js *.json *.html *.md *.png *.svg recursive-include static/extension *.js *.json *.html *.md *.png *.svg
\ No newline at end of file
...@@ -35,17 +35,12 @@ async def get_ip_country(ip: str) -> Optional[str]: ...@@ -35,17 +35,12 @@ async def get_ip_country(ip: str) -> Optional[str]:
_ip_country_cache[ip] = None _ip_country_cache[ip] = None
return None return None
def is_ip_israeli(ip: str) -> bool: def is_ip_genocidal(ip: str) -> bool:
"""Check if IP is from Israel.""" """Check if IP is from Israel. Only safe to call outside a running event loop."""
# Run async function in sync context if needed
try: try:
loop = asyncio.get_event_loop() loop = asyncio.get_event_loop()
if loop.is_running(): if loop.is_running():
# If loop is running, we can't use run_until_complete return False
# For middleware, we'll need to handle this differently return loop.run_until_complete(get_ip_country(ip)) == 'IL'
return False # Temporary fallback
else:
country = loop.run_until_complete(get_ip_country(ip))
return country == 'IL'
except Exception: except Exception:
return False return False
\ No newline at end of file
...@@ -55,6 +55,7 @@ import asyncio ...@@ -55,6 +55,7 @@ import asyncio
from aisbf.database import _hash_password as _db_hash_password, _verify_password as _db_verify_password from aisbf.database import _hash_password as _db_hash_password, _verify_password as _db_verify_password
import httpx import httpx
import multiprocessing import multiprocessing
from aisbf import geolocation
from logging.handlers import RotatingFileHandler from logging.handlers import RotatingFileHandler
from datetime import datetime, timedelta from datetime import datetime, timedelta
from collections import defaultdict from collections import defaultdict
...@@ -2110,8 +2111,76 @@ app.add_middleware( ...@@ -2110,8 +2111,76 @@ app.add_middleware(
https_only=os.environ.get("AISBF_HTTPS", "false").lower() == "true", https_only=os.environ.get("AISBF_HTTPS", "false").lower() == "true",
) )
# Add proxy headers middleware LAST so it executes FIRST class DashboardBlockingMiddleware(BaseHTTPMiddleware):
# This ensures proxy headers are processed before any other middleware (including auth_middleware) """Middleware to block dashboard access from Israeli domains."""
async def dispatch(self, request: Request, call_next):
host = request.headers.get("host", "").lower()
if host.endswith(".il"):
# Check if this is a dashboard route
path = request.url.path
if path.startswith("/dashboard") or path == "/":
# Redirect to blocked page
base_url = get_base_url(request)
blocked_url = f"{base_url}/blocked"
return RedirectResponse(url=blocked_url, status_code=302)
response = await call_next(request)
return response
class APIBlockingMiddleware(BaseHTTPMiddleware):
"""Middleware to block API/MCP access from Israeli domains and IPs."""
async def dispatch(self, request: Request, call_next):
host = request.headers.get("host", "").lower()
path = request.url.path
# Check if this is API or MCP route
is_api_route = path.startswith("/api") or path.startswith("/mcp")
if is_api_route:
# Block if domain is Israeli
if host.endswith(".il"):
return JSONResponse(
status_code=403,
content={"error": "We do not support the Israeli genocide of Palestinian people."}
)
# Block if IP is genocidial
client_ip = self._get_client_ip(request)
if client_ip:
country = await geolocation.get_ip_country(client_ip)
if country == 'IL':
return JSONResponse(
status_code=403,
content={"error": "We do not support the Israeli genocide of Palestinian people."}
)
response = await call_next(request)
return response
def _get_client_ip(self, request: Request) -> Optional[str]:
"""Extract client IP from request."""
# Try X-Forwarded-For first (from proxy)
x_forwarded_for = request.headers.get("X-Forwarded-For")
if x_forwarded_for:
# Take first IP if multiple
return x_forwarded_for.split(",")[0].strip()
# Fall back to direct client
client = request.scope.get("client")
if client:
return client[0]
return None
# Middleware execution order: last added = first executed (outermost layer).
# Blocking middlewares are added first so they execute AFTER proxy headers are decoded.
# ProxyHeadersMiddleware is added LAST so it executes FIRST on every request.
app.add_middleware(DashboardBlockingMiddleware)
app.add_middleware(APIBlockingMiddleware)
app.add_middleware(ProxyHeadersMiddleware) app.add_middleware(ProxyHeadersMiddleware)
# Helper function for API authentication # Helper function for API authentication
......
...@@ -66,3 +66,7 @@ include-package-data = true ...@@ -66,3 +66,7 @@ include-package-data = true
[tool.setuptools.package-data] [tool.setuptools.package-data]
"*" = ["*.json", "*.md", "*.sh", "*.py", "LICENSE.txt", "requirements.txt", "main.py"] "*" = ["*.json", "*.md", "*.sh", "*.py", "LICENSE.txt", "requirements.txt", "main.py"]
[tool.setuptools.data-files]
"share/aisbf/static" = ["static/i18n.js"]
"share/aisbf/static/i18n" = ["static/i18n/*.json"]
...@@ -115,6 +115,7 @@ setup( ...@@ -115,6 +115,7 @@ setup(
'aisbf/streaming_optimization.py', 'aisbf/streaming_optimization.py',
'aisbf/analytics.py', 'aisbf/analytics.py',
'aisbf/email_utils.py', 'aisbf/email_utils.py',
'aisbf/geolocation.py',
]), ]),
# aisbf.providers subpackage # aisbf.providers subpackage
('share/aisbf/aisbf/providers', [ ('share/aisbf/aisbf/providers', [
...@@ -194,6 +195,7 @@ setup( ...@@ -194,6 +195,7 @@ setup(
# Install dashboard templates # Install dashboard templates
('share/aisbf/templates', [ ('share/aisbf/templates', [
'templates/base.html', 'templates/base.html',
'templates/blocked.html',
]), ]),
('share/aisbf/templates/dashboard', [ ('share/aisbf/templates/dashboard', [
'templates/dashboard/login.html', 'templates/dashboard/login.html',
...@@ -238,6 +240,48 @@ setup( ...@@ -238,6 +240,48 @@ setup(
('share/aisbf/static', [ ('share/aisbf/static', [
'static/favicon.ico', 'static/favicon.ico',
'static/aisbf-oauth2-extension.zip', 'static/aisbf-oauth2-extension.zip',
'static/i18n.js',
]),
('share/aisbf/static/i18n', [
'static/i18n/af.json',
'static/i18n/ar.json',
'static/i18n/bn.json',
'static/i18n/cs.json',
'static/i18n/da.json',
'static/i18n/de.json',
'static/i18n/el.json',
'static/i18n/en.json',
'static/i18n/eo.json',
'static/i18n/es.json',
'static/i18n/fa.json',
'static/i18n/fi.json',
'static/i18n/fr.json',
'static/i18n/he.json',
'static/i18n/hi.json',
'static/i18n/hu.json',
'static/i18n/id.json',
'static/i18n/it.json',
'static/i18n/ja.json',
'static/i18n/ko.json',
'static/i18n/ms.json',
'static/i18n/nb.json',
'static/i18n/nl.json',
'static/i18n/pl.json',
'static/i18n/pt.json',
'static/i18n/qya.json',
'static/i18n/ro.json',
'static/i18n/ru.json',
'static/i18n/sk.json',
'static/i18n/sv.json',
'static/i18n/th.json',
'static/i18n/tlh.json',
'static/i18n/tr.json',
'static/i18n/uk.json',
'static/i18n/vi.json',
'static/i18n/vul.json',
'static/i18n/xh.json',
'static/i18n/zh.json',
'static/i18n/zu.json',
]), ]),
('share/aisbf/static/extension', [ ('share/aisbf/static/extension', [
'static/extension/background.js', 'static/extension/background.js',
......
/*
* Copyright (C) 2026 Stefy Lanza <stefy@nexlab.net>
*
* AISBF i18n (Internationalization) System
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*/
(function() {
'use strict';
const AVAILABLE_LANGUAGES = {
'en': 'English',
'de': 'Deutsch',
'fr': 'Français',
'es': 'Español',
'pt': 'Português',
'it': 'Italiano',
'ru': 'Русский',
'zh': '中文',
'ja': '日本語',
'ko': '한국어',
'ar': 'العربية',
'hi': 'हिन्दी',
'tr': 'Türkçe',
'pl': 'Polski',
'nl': 'Nederlands',
'sv': 'Svenska',
'da': 'Dansk',
'fi': 'Suomi',
'nb': 'Norsk',
'cs': 'Čeština',
'sk': 'Slovenčina',
'hu': 'Magyar',
'ro': 'Română',
'uk': 'Українська',
'el': 'Ελληνικά',
'he': 'עברית',
'fa': 'فارسی',
'id': 'Bahasa Indonesia',
'th': 'ไทย',
'vi': 'Tiếng Việt',
'ms': 'Bahasa Melayu',
'bn': 'বাংলা',
'xh': 'isiXhosa',
'zu': 'isiZulu',
'af': 'Afrikaans',
'eo': 'Esperanto',
'qya': 'Quenya (Elvish)',
'tlh': 'tlhIngan Hol (Klingon)',
'vul': 'Vulcan'
};
let currentLang = 'en';
let translations = {};
let fallbackTranslations = {};
// Get user-specific storage key
function getStorageKey() {
const username = document.body.dataset.username || '__guest__';
return 'aisbf_lang_' + username;
}
// Deep get with fallback to English
function getTranslation(path) {
const keys = path.split('.');
let value = translations;
let fallback = fallbackTranslations;
// Try to get from current language
for (const key of keys) {
if (value && typeof value === 'object' && key in value) {
value = value[key];
} else {
value = null;
break;
}
}
// If found and is a string, return it
if (typeof value === 'string') {
return value;
}
// Fallback to English
for (const key of keys) {
if (fallback && typeof fallback === 'object' && key in fallback) {
fallback = fallback[key];
} else {
fallback = null;
break;
}
}
return typeof fallback === 'string' ? fallback : path;
}
// Replace {n} placeholders
function interpolate(text, params) {
if (!params) return text;
return text.replace(/\{(\w+)\}/g, (match, key) => {
return params.hasOwnProperty(key) ? params[key] : match;
});
}
// Translate a single element
function translateElement(el) {
const key = el.dataset.i18n;
if (!key) return;
const translation = getTranslation(key);
// Handle different element types
if (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') {
if (el.placeholder) {
el.placeholder = translation;
}
} else {
el.textContent = translation;
}
}
// Translate all elements with data-i18n attribute
function translatePage() {
document.querySelectorAll('[data-i18n]').forEach(translateElement);
}
// Load language file
async function loadLanguage(lang) {
try {
const response = await fetch(`/static/i18n/${lang}.json`);
if (!response.ok) throw new Error('Language file not found');
return await response.json();
} catch (error) {
console.error(`Failed to load language ${lang}:`, error);
return null;
}
}
// Set language
async function setLanguage(lang) {
if (!AVAILABLE_LANGUAGES[lang]) {
console.warn(`Language ${lang} not available, falling back to English`);
lang = 'en';
}
// Load the selected language
const langData = await loadLanguage(lang);
if (!langData) {
console.error(`Failed to load ${lang}, using English`);
lang = 'en';
translations = await loadLanguage('en') || {};
} else {
translations = langData;
}
// Always load English as fallback (unless we're already using English)
if (lang !== 'en') {
fallbackTranslations = await loadLanguage('en') || {};
} else {
fallbackTranslations = translations;
}
currentLang = lang;
localStorage.setItem(getStorageKey(), lang);
document.documentElement.setAttribute('lang', lang);
// Translate the page
translatePage();
// Update language selector if it exists
updateLanguageSelector();
}
// Update language selector UI
function updateLanguageSelector() {
document.querySelectorAll('.lang-btn').forEach(btn => {
btn.classList.toggle('active', btn.dataset.lang === currentLang);
});
}
// Initialize
async function init() {
// Get saved language or detect from browser
const savedLang = localStorage.getItem(getStorageKey());
const browserLang = navigator.language.split('-')[0];
const initialLang = savedLang || (AVAILABLE_LANGUAGES[browserLang] ? browserLang : 'en');
await setLanguage(initialLang);
}
// Public API
window.i18n = {
t: getTranslation,
setLanguage: setLanguage,
getCurrentLanguage: () => currentLang,
getAvailableLanguages: () => AVAILABLE_LANGUAGES,
translatePage: translatePage,
interpolate: interpolate
};
// Auto-initialize when DOM is ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();
{
"header": { "title": "AISBF Paneelbord", "help": "Hulp", "docs": "Docs", "about": "Oor", "license": "Lisensie", "restart_server": "Herbegin bediener", "logout": "Teken uit" },
"nav": { "overview": "Oorsig", "providers": "Verskaffers", "rotations": "Rotasies", "autoselect": "Outokeuse", "prompts": "Aanwysings", "analytics": "Analise", "api_tokens": "API-tokens", "wallet": "Beursie", "usage": "Gebruik", "users": "Gebruikers", "settings": "Instellings", "tiers": "Vlakke", "payment_settings": "Betalings", "upgrade": "✨ Opgradeer! ✨", "notifications": "Kennisgewings", "account": "Rekening" },
"account_menu": { "edit_profile": "Wysig profiel", "api_tokens": "API-tokens", "cache_settings": "Kas-instellings", "subscription": "Intekening", "wallet": "Beursie", "billing": "Fakturering", "usage_quotas": "Gebruik en kwotas", "change_password": "Verander wagwoord" },
"notifications": { "title": "Kennisgewings", "mark_all_read": "Merk alles as gelees", "refresh": "Verfris", "no_notifications": "Geen kennisgewings", "just_now": "nou net", "minutes_ago": "{n}min gelede", "hours_ago": "{n}u gelede", "days_ago": "{n}d gelede" },
"footer": { "support_development": "Ondersteun AISBF-ontwikkeling", "privacy_policy": "Privaatheidsbeleid", "terms_of_service": "Diensvoorwaardes", "contact": "Kontak" },
"donate": { "title": "Ondersteun AISBF", "thank_you": "Dankie dat u 'n skenking oorweeg. U ondersteuning help om AISBF as volledig oopbron en gratis sagteware te handhaaf.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Klik op enige adres om dit te kopieer", "copied": "Gekopieer!" },
"welcome": { "title": "Welkom by AISBF!", "early_adopter": "Dankie dat u 'n vroeë gebruiker is! Ons is tans in 'n intensiewe ontwikkelingsfase.", "may_encounter": "U kan foute, diensontwrigtings of veranderinge teëkom.", "feedback": "U terugvoer help ons om AISBF te verbeter. Moenie huiwer om ons te kontak nie!", "send_feedback": "Stuur terugvoer", "got_it": "Verstaan!" },
"contact": { "title": "Kontak ons", "your_email": "U e-pos", "type": "Tipe", "select_type": "Kies tipe...", "bug_report": "Foutverslag", "feature_request": "Kenmerkversoek", "feedback": "Terugvoer", "question": "Vraag", "help": "Hulp", "title_field": "Titel", "title_placeholder": "Kort opsomming van u boodskap", "message": "Boodskap", "message_placeholder": "Beskryf u probleem of versoek in detail...", "send_message": "Stuur boodskap", "cancel": "Kanselleer", "sending": "Stuur...", "success": "Boodskap suksesvol gestuur! Dankie vir u terugvoer.", "error": "Fout: {error}", "network_error": "Netwerkfout. Probeer asseblief later weer." },
"modal": { "notice": "Kennisgewing", "confirm": "Bevestig", "warning": "Waarskuwing", "ok": "OK", "cancel": "Kanselleer", "delete": "Verwyder" },
"common": { "save": "Stoor", "loading": "Laai...", "error": "Fout", "success": "Sukses", "close": "Sluit", "yes": "Ja", "no": "Nee" }
}
{
"header": { "title": "لوحة تحكم AISBF", "help": "مساعدة", "docs": "وثائق", "about": "حول", "license": "الترخيص", "restart_server": "إعادة تشغيل الخادم", "logout": "تسجيل الخروج" },
"nav": { "overview": "نظرة عامة", "providers": "المزودون", "rotations": "التناوبات", "autoselect": "الاختيار التلقائي", "prompts": "المطالبات", "analytics": "التحليلات", "api_tokens": "رموز API", "wallet": "المحفظة", "usage": "الاستخدام", "users": "المستخدمون", "settings": "الإعدادات", "tiers": "المستويات", "payment_settings": "إعدادات الدفع", "upgrade": "✨ ترقية! ✨", "notifications": "الإشعارات", "account": "الحساب" },
"account_menu": { "edit_profile": "تعديل الملف الشخصي", "api_tokens": "رموز API", "cache_settings": "إعدادات التخزين المؤقت", "subscription": "الاشتراك", "wallet": "المحفظة", "billing": "الفواتير", "usage_quotas": "الاستخدام والحصص", "change_password": "تغيير كلمة المرور" },
"notifications": { "title": "الإشعارات", "mark_all_read": "تحديد الكل كمقروء", "refresh": "تحديث", "no_notifications": "لا توجد إشعارات", "just_now": "الآن", "minutes_ago": "منذ {n} دقيقة", "hours_ago": "منذ {n} ساعة", "days_ago": "منذ {n} يوم" },
"footer": { "support_development": "دعم تطوير AISBF", "privacy_policy": "سياسة الخصوصية", "terms_of_service": "شروط الخدمة", "contact": "اتصل بنا" },
"donate": { "title": "دعم AISBF", "thank_you": "شكراً لتفكيرك في التبرع. دعمك يساعد في الحفاظ على AISBF كبرنامج مفتوح المصدر ومجاني.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "انقر على أي عنوان لنسخه", "copied": "تم النسخ!" },
"welcome": { "title": "مرحباً بك في AISBF!", "early_adopter": "شكراً لكونك من المستخدمين الأوائل! نحن حالياً في مرحلة تطوير مكثفة.", "may_encounter": "قد تواجه أخطاء أو انقطاعات في الخدمة.", "feedback": "ملاحظاتك تساعدنا على تحسين AISBF. لا تتردد في التواصل معنا!", "send_feedback": "إرسال ملاحظات", "got_it": "فهمت!" },
"contact": { "title": "اتصل بنا", "your_email": "بريدك الإلكتروني", "type": "النوع", "select_type": "اختر النوع...", "bug_report": "تقرير خطأ", "feature_request": "طلب ميزة", "feedback": "ملاحظات", "question": "سؤال", "help": "مساعدة", "title_field": "العنوان", "title_placeholder": "ملخص موجز لرسالتك", "message": "الرسالة", "message_placeholder": "صف مشكلتك أو طلبك بالتفصيل...", "send_message": "إرسال الرسالة", "cancel": "إلغاء", "sending": "جارٍ الإرسال...", "success": "تم إرسال الرسالة بنجاح! شكراً على ملاحظاتك.", "error": "خطأ: {error}", "network_error": "خطأ في الشبكة. يرجى المحاولة مرة أخرى لاحقاً." },
"modal": { "notice": "إشعار", "confirm": "تأكيد", "warning": "تحذير", "ok": "موافق", "cancel": "إلغاء", "delete": "حذف" },
"common": { "save": "حفظ", "loading": "جارٍ التحميل...", "error": "خطأ", "success": "نجاح", "close": "إغلاق", "yes": "نعم", "no": "لا" }
}
{
"header": { "title": "AISBF ড্যাশবোর্ড", "help": "সাহায্য", "docs": "ডক্স", "about": "সম্পর্কে", "license": "লাইসেন্স", "restart_server": "সার্ভার পুনরায় চালু করুন", "logout": "লগ আউট" },
"nav": { "overview": "সংক্ষিপ্ত বিবরণ", "providers": "প্রদানকারী", "rotations": "ঘূর্ণন", "autoselect": "স্বয়ংক্রিয় নির্বাচন", "prompts": "প্রম্পট", "analytics": "বিশ্লেষণ", "api_tokens": "API টোকেন", "wallet": "ওয়ালেট", "usage": "ব্যবহার", "users": "ব্যবহারকারী", "settings": "সেটিংস", "tiers": "স্তর", "payment_settings": "পেমেন্ট", "upgrade": "✨ আপগ্রেড! ✨", "notifications": "বিজ্ঞপ্তি", "account": "অ্যাকাউন্ট" },
"account_menu": { "edit_profile": "প্রোফাইল সম্পাদনা", "api_tokens": "API টোকেন", "cache_settings": "ক্যাশ সেটিংস", "subscription": "সাবস্ক্রিপশন", "wallet": "ওয়ালেট", "billing": "বিলিং", "usage_quotas": "ব্যবহার এবং কোটা", "change_password": "পাসওয়ার্ড পরিবর্তন" },
"notifications": { "title": "বিজ্ঞপ্তি", "mark_all_read": "সব পঠিত হিসাবে চিহ্নিত করুন", "refresh": "রিফ্রেশ", "no_notifications": "কোন বিজ্ঞপ্তি নেই", "just_now": "এইমাত্র", "minutes_ago": "{n} মিনিট আগে", "hours_ago": "{n} ঘন্টা আগে", "days_ago": "{n} দিন আগে" },
"footer": { "support_development": "AISBF উন্নয়ন সমর্থন করুন", "privacy_policy": "গোপনীয়তা নীতি", "terms_of_service": "সেবার শর্তাবলী", "contact": "যোগাযোগ" },
"donate": { "title": "AISBF সমর্থন করুন", "thank_you": "দান বিবেচনা করার জন্য ধন্যবাদ। আপনার সমর্থন AISBF কে সম্পূর্ণ ওপেন সোর্স এবং বিনামূল্যে সফটওয়্যার হিসাবে বজায় রাখতে সাহায্য করে।", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "কপি করতে যেকোনো ঠিকানায় ক্লিক করুন", "copied": "কপি হয়েছে!" },
"welcome": { "title": "AISBF-এ স্বাগতম!", "early_adopter": "প্রাথমিক ব্যবহারকারী হওয়ার জন্য ধন্যবাদ! আমরা বর্তমানে নিবিড় উন্নয়ন পর্যায়ে আছি।", "may_encounter": "আপনি বাগ, সেবা বিঘ্ন, বা পরিবর্তনের সম্মুখীন হতে পারেন।", "feedback": "আপনার প্রতিক্রিয়া আমাদের AISBF উন্নত করতে সাহায্য করে। আমাদের সাথে যোগাযোগ করতে দ্বিধা করবেন না!", "send_feedback": "প্রতিক্রিয়া পাঠান", "got_it": "বুঝেছি!" },
"contact": { "title": "আমাদের সাথে যোগাযোগ করুন", "your_email": "আপনার ইমেইল", "type": "ধরন", "select_type": "ধরন নির্বাচন করুন...", "bug_report": "বাগ রিপোর্ট", "feature_request": "বৈশিষ্ট্য অনুরোধ", "feedback": "প্রতিক্রিয়া", "question": "প্রশ্ন", "help": "সাহায্য", "title_field": "শিরোনাম", "title_placeholder": "আপনার বার্তার সংক্ষিপ্ত সারাংশ", "message": "বার্তা", "message_placeholder": "আপনার সমস্যা বা অনুরোধ বিস্তারিতভাবে বর্ণনা করুন...", "send_message": "বার্তা পাঠান", "cancel": "বাতিল", "sending": "পাঠানো হচ্ছে...", "success": "বার্তা সফলভাবে পাঠানো হয়েছে! আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ।", "error": "ত্রুটি: {error}", "network_error": "নেটওয়ার্ক ত্রুটি। পরে আবার চেষ্টা করুন।" },
"modal": { "notice": "বিজ্ঞপ্তি", "confirm": "নিশ্চিত করুন", "warning": "সতর্কতা", "ok": "ঠিক আছে", "cancel": "বাতিল", "delete": "মুছুন" },
"common": { "save": "সংরক্ষণ", "loading": "লোড হচ্ছে...", "error": "ত্রুটি", "success": "সফল", "close": "বন্ধ", "yes": "হ্যাঁ", "no": "না" }
}
{
"header": { "title": "AISBF Dashboard", "help": "Nápověda", "docs": "Docs", "about": "O nás", "license": "Licence", "restart_server": "Restartovat server", "logout": "Odhlásit" },
"nav": { "overview": "Přehled", "providers": "Poskytovatelé", "rotations": "Rotace", "autoselect": "Automatický výběr", "prompts": "Výzvy", "analytics": "Analytika", "api_tokens": "API tokeny", "wallet": "Peněženka", "usage": "Využití", "users": "Uživatelé", "settings": "Nastavení", "tiers": "Úrovně", "payment_settings": "Platby", "upgrade": "✨ Upgradovat! ✨", "notifications": "Oznámení", "account": "Účet" },
"account_menu": { "edit_profile": "Upravit profil", "api_tokens": "API tokeny", "cache_settings": "Nastavení mezipaměti", "subscription": "Předplatné", "wallet": "Peněženka", "billing": "Fakturace", "usage_quotas": "Využití a kvóty", "change_password": "Změnit heslo" },
"notifications": { "title": "Oznámení", "mark_all_read": "Označit vše jako přečtené", "refresh": "Obnovit", "no_notifications": "Žádná oznámení", "just_now": "právě teď", "minutes_ago": "před {n}min", "hours_ago": "před {n}h", "days_ago": "před {n}d" },
"footer": { "support_development": "Podpořte vývoj AISBF", "privacy_policy": "Zásady ochrany osobních údajů", "terms_of_service": "Podmínky služby", "contact": "Kontakt" },
"donate": { "title": "Podpořte AISBF", "thank_you": "Děkujeme za zvážení daru. Vaše podpora pomáhá udržovat AISBF jako zcela open source a bezplatný software.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Kliknutím na adresu ji zkopírujete", "copied": "Zkopírováno!" },
"welcome": { "title": "Vítejte v AISBF!", "early_adopter": "Děkujeme, že jste raným uživatelem! Momentálně jsme v intenzivní vývojové fázi.", "may_encounter": "Můžete narazit na chyby, výpadky služby nebo změny.", "feedback": "Vaše zpětná vazba nám pomáhá zlepšovat AISBF. Neváhejte nás kontaktovat!", "send_feedback": "Odeslat zpětnou vazbu", "got_it": "Rozumím!" },
"contact": { "title": "Kontaktujte nás", "your_email": "Váš e-mail", "type": "Typ", "select_type": "Vyberte typ...", "bug_report": "Hlášení chyby", "feature_request": "Žádost o funkci", "feedback": "Zpětná vazba", "question": "Otázka", "help": "Nápověda", "title_field": "Název", "title_placeholder": "Stručné shrnutí vaší zprávy", "message": "Zpráva", "message_placeholder": "Popište svůj problém nebo žádost podrobně...", "send_message": "Odeslat zprávu", "cancel": "Zrušit", "sending": "Odesílání...", "success": "Zpráva úspěšně odeslána! Děkujeme za zpětnou vazbu.", "error": "Chyba: {error}", "network_error": "Chyba sítě. Zkuste to prosím znovu." },
"modal": { "notice": "Oznámení", "confirm": "Potvrdit", "warning": "Varování", "ok": "OK", "cancel": "Zrušit", "delete": "Smazat" },
"common": { "save": "Uložit", "loading": "Načítání...", "error": "Chyba", "success": "Úspěch", "close": "Zavřít", "yes": "Ano", "no": "Ne" }
}
{
"header": { "title": "AISBF Dashboard", "help": "Hjælp", "docs": "Docs", "about": "Om", "license": "Licens", "restart_server": "Genstart server", "logout": "Log ud" },
"nav": { "overview": "Oversigt", "providers": "Udbydere", "rotations": "Rotationer", "autoselect": "Autovalg", "prompts": "Prompter", "analytics": "Analyse", "api_tokens": "API-tokens", "wallet": "Pung", "usage": "Brug", "users": "Brugere", "settings": "Indstillinger", "tiers": "Niveauer", "payment_settings": "Betalinger", "upgrade": "✨ Opgrader! ✨", "notifications": "Notifikationer", "account": "Konto" },
"account_menu": { "edit_profile": "Rediger profil", "api_tokens": "API-tokens", "cache_settings": "Cache-indstillinger", "subscription": "Abonnement", "wallet": "Pung", "billing": "Fakturering", "usage_quotas": "Brug & Kvoter", "change_password": "Skift adgangskode" },
"notifications": { "title": "Notifikationer", "mark_all_read": "Markér alle som læst", "refresh": "Opdater", "no_notifications": "Ingen notifikationer", "just_now": "lige nu", "minutes_ago": "for {n}min siden", "hours_ago": "for {n}t siden", "days_ago": "for {n}d siden" },
"footer": { "support_development": "Støt AISBF-udviklingen", "privacy_policy": "Privatlivspolitik", "terms_of_service": "Servicevilkår", "contact": "Kontakt" },
"donate": { "title": "Støt AISBF", "thank_you": "Tak for at overveje en donation. Din støtte hjælper med at holde AISBF som fuldstændig open source og gratis software.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Klik på en adresse for at kopiere den", "copied": "Kopieret!" },
"welcome": { "title": "Velkommen til AISBF!", "early_adopter": "Tak for at være en tidlig bruger! Vi er i øjeblikket i en intensiv udviklingsfase.", "may_encounter": "Du kan støde på fejl, serviceafbrydelser eller ændringer.", "feedback": "Din feedback hjælper os med at forbedre AISBF. Tøv ikke med at kontakte os!", "send_feedback": "Send feedback", "got_it": "Forstået!" },
"contact": { "title": "Kontakt os", "your_email": "Din e-mail", "type": "Type", "select_type": "Vælg type...", "bug_report": "Fejlrapport", "feature_request": "Funktionsanmodning", "feedback": "Feedback", "question": "Spørgsmål", "help": "Hjælp", "title_field": "Titel", "title_placeholder": "Kort resumé af din besked", "message": "Besked", "message_placeholder": "Beskriv dit problem eller din anmodning i detaljer...", "send_message": "Send besked", "cancel": "Annuller", "sending": "Sender...", "success": "Besked sendt! Tak for din feedback.", "error": "Fejl: {error}", "network_error": "Netværksfejl. Prøv igen senere." },
"modal": { "notice": "Meddelelse", "confirm": "Bekræft", "warning": "Advarsel", "ok": "OK", "cancel": "Annuller", "delete": "Slet" },
"common": { "save": "Gem", "loading": "Indlæser...", "error": "Fejl", "success": "Succes", "close": "Luk", "yes": "Ja", "no": "Nej" }
}
{
"header": { "title": "AISBF Dashboard", "help": "Hilfe", "docs": "Docs", "about": "Über", "license": "Lizenz", "restart_server": "Server neu starten", "logout": "Abmelden" },
"nav": { "overview": "Übersicht", "providers": "Anbieter", "rotations": "Rotationen", "autoselect": "Autoauswahl", "prompts": "Eingaben", "analytics": "Analytik", "api_tokens": "API-Token", "wallet": "Geldbörse", "usage": "Nutzung", "users": "Benutzer", "settings": "Einstellungen", "tiers": "Stufen", "payment_settings": "Zahlungen", "upgrade": "✨ Upgrade! ✨", "notifications": "Benachrichtigungen", "account": "Konto" },
"account_menu": { "edit_profile": "Profil bearbeiten", "api_tokens": "API-Token", "cache_settings": "Cache-Einstellungen", "subscription": "Abonnement", "wallet": "Geldbörse", "billing": "Abrechnung", "usage_quotas": "Nutzung & Kontingente", "change_password": "Passwort ändern" },
"notifications": { "title": "Benachrichtigungen", "mark_all_read": "Alle als gelesen markieren", "refresh": "Aktualisieren", "no_notifications": "Keine Benachrichtigungen", "just_now": "gerade eben", "minutes_ago": "vor {n}Min", "hours_ago": "vor {n}Std", "days_ago": "vor {n}T" },
"footer": { "support_development": "AISBF-Entwicklung unterstützen", "privacy_policy": "Datenschutzrichtlinie", "terms_of_service": "Nutzungsbedingungen", "contact": "Kontakt" },
"donate": { "title": "AISBF unterstützen", "thank_you": "Danke für Ihre Spendenbereitschaft. Ihre Unterstützung hilft, AISBF als freie Open-Source-Software zu erhalten.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Klicken Sie auf eine Adresse, um sie zu kopieren", "copied": "Kopiert!" },
"welcome": { "title": "Willkommen bei AISBF!", "early_adopter": "Danke, dass Sie ein früher Nutzer sind! Wir befinden uns in einer intensiven Entwicklungsphase.", "may_encounter": "Sie könnten auf Fehler oder Dienstunterbrechungen stoßen.", "feedback": "Ihr Feedback hilft uns, AISBF zu verbessern. Zögern Sie nicht, uns zu kontaktieren!", "send_feedback": "Feedback senden", "got_it": "Verstanden!" },
"contact": { "title": "Kontakt", "your_email": "Ihre E-Mail", "type": "Typ", "select_type": "Typ auswählen...", "bug_report": "Fehlerbericht", "feature_request": "Funktionsanfrage", "feedback": "Feedback", "question": "Frage", "help": "Hilfe", "title_field": "Titel", "title_placeholder": "Kurze Zusammenfassung Ihrer Nachricht", "message": "Nachricht", "message_placeholder": "Beschreiben Sie Ihr Problem oder Ihre Anfrage im Detail...", "send_message": "Nachricht senden", "cancel": "Abbrechen", "sending": "Senden...", "success": "Nachricht erfolgreich gesendet! Danke für Ihr Feedback.", "error": "Fehler: {error}", "network_error": "Netzwerkfehler. Bitte versuchen Sie es später erneut." },
"modal": { "notice": "Hinweis", "confirm": "Bestätigen", "warning": "Warnung", "ok": "OK", "cancel": "Abbrechen", "delete": "Löschen" },
"common": { "save": "Speichern", "loading": "Laden...", "error": "Fehler", "success": "Erfolg", "close": "Schließen", "yes": "Ja", "no": "Nein" }
}
{
"header": { "title": "AISBF Dashboard", "help": "Βοήθεια", "docs": "Docs", "about": "Σχετικά", "license": "Άδεια", "restart_server": "Επανεκκίνηση διακομιστή", "logout": "Αποσύνδεση" },
"nav": { "overview": "Επισκόπηση", "providers": "Πάροχοι", "rotations": "Εναλλαγές", "autoselect": "Αυτόματη επιλογή", "prompts": "Προτροπές", "analytics": "Αναλυτικά", "api_tokens": "Tokens API", "wallet": "Πορτοφόλι", "usage": "Χρήση", "users": "Χρήστες", "settings": "Ρυθμίσεις", "tiers": "Επίπεδα", "payment_settings": "Πληρωμές", "upgrade": "✨ Αναβάθμιση! ✨", "notifications": "Ειδοποιήσεις", "account": "Λογαριασμός" },
"account_menu": { "edit_profile": "Επεξεργασία προφίλ", "api_tokens": "Tokens API", "cache_settings": "Ρυθμίσεις cache", "subscription": "Συνδρομή", "wallet": "Πορτοφόλι", "billing": "Χρέωση", "usage_quotas": "Χρήση & Όρια", "change_password": "Αλλαγή κωδικού" },
"notifications": { "title": "Ειδοποιήσεις", "mark_all_read": "Σήμανση όλων ως αναγνωσμένων", "refresh": "Ανανέωση", "no_notifications": "Δεν υπάρχουν ειδοποιήσεις", "just_now": "μόλις τώρα", "minutes_ago": "πριν {n}λεπτά", "hours_ago": "πριν {n}ώρες", "days_ago": "πριν {n}μέρες" },
"footer": { "support_development": "Υποστήριξη ανάπτυξης AISBF", "privacy_policy": "Πολιτική απορρήτου", "terms_of_service": "Όροι υπηρεσίας", "contact": "Επικοινωνία" },
"donate": { "title": "Υποστήριξη AISBF", "thank_you": "Ευχαριστούμε που εξετάζετε μια δωρεά. Η υποστήριξή σας βοηθά στη διατήρηση του AISBF ως πλήρως ανοιχτού κώδικα και δωρεάν λογισμικού.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Κάντε κλικ σε οποιαδήποτε διεύθυνση για αντιγραφή", "copied": "Αντιγράφηκε!" },
"welcome": { "title": "Καλώς ήρθατε στο AISBF!", "early_adopter": "Ευχαριστούμε που είστε πρώιμος χρήστης! Βρισκόμαστε σε εντατική φάση ανάπτυξης.", "may_encounter": "Μπορεί να αντιμετωπίσετε σφάλματα ή διακοπές υπηρεσίας.", "feedback": "Τα σχόλιά σας μας βοηθούν να βελτιώσουμε το AISBF. Μη διστάσετε να επικοινωνήσετε!", "send_feedback": "Αποστολή σχολίων", "got_it": "Κατάλαβα!" },
"contact": { "title": "Επικοινωνήστε μαζί μας", "your_email": "Το email σας", "type": "Τύπος", "select_type": "Επιλέξτε τύπο...", "bug_report": "Αναφορά σφάλματος", "feature_request": "Αίτημα λειτουργίας", "feedback": "Σχόλια", "question": "Ερώτηση", "help": "Βοήθεια", "title_field": "Τίτλος", "title_placeholder": "Σύντομη περίληψη του μηνύματός σας", "message": "Μήνυμα", "message_placeholder": "Περιγράψτε το πρόβλημα ή το αίτημά σας λεπτομερώς...", "send_message": "Αποστολή μηνύματος", "cancel": "Ακύρωση", "sending": "Αποστολή...", "success": "Το μήνυμα στάλθηκε επιτυχώς! Ευχαριστούμε για τα σχόλιά σας.", "error": "Σφάλμα: {error}", "network_error": "Σφάλμα δικτύου. Παρακαλώ δοκιμάστε ξανά αργότερα." },
"modal": { "notice": "Ειδοποίηση", "confirm": "Επιβεβαίωση", "warning": "Προειδοποίηση", "ok": "OK", "cancel": "Ακύρωση", "delete": "Διαγραφή" },
"common": { "save": "Αποθήκευση", "loading": "Φόρτωση...", "error": "Σφάλμα", "success": "Επιτυχία", "close": "Κλείσιμο", "yes": "Ναι", "no": "Όχι" }
}
{
"header": { "title": "AISBF Dashboard", "help": "Help", "docs": "Docs", "about": "About", "license": "License", "restart_server": "Restart Server", "logout": "Logout" },
"nav": { "overview": "Overview", "providers": "Providers", "rotations": "Rotations", "autoselect": "Autoselect", "prompts": "Prompts", "analytics": "Analytics", "api_tokens": "API Tokens", "wallet": "Wallet", "usage": "Usage", "users": "Users", "settings": "Settings", "tiers": "Tiers", "payment_settings": "Payment Settings", "upgrade": "✨ Upgrade! ✨", "notifications": "Notifications", "account": "Account" },
"account_menu": { "edit_profile": "Edit Profile", "api_tokens": "API Tokens", "cache_settings": "Cache Settings", "subscription": "Subscription", "wallet": "Wallet", "billing": "Billing", "usage_quotas": "Usage & Quotas", "change_password": "Change Password" },
"notifications": { "title": "Notifications", "mark_all_read": "Mark all as read", "refresh": "Refresh", "no_notifications": "No notifications", "just_now": "just now", "minutes_ago": "{n}m ago", "hours_ago": "{n}h ago", "days_ago": "{n}d ago" },
"footer": { "support_development": "Support AISBF Development", "privacy_policy": "Privacy Policy", "terms_of_service": "Terms of Service", "contact": "Contact" },
"donate": { "title": "Support AISBF", "thank_you": "Thank you for considering a donation. Your support helps maintain AISBF as completely open source and free software.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Click any address to copy it to your clipboard", "copied": "Copied!" },
"welcome": { "title": "Welcome to AISBF!", "early_adopter": "Thank you for being an early adopter! We're currently in heavy development phase.", "may_encounter": "You may encounter bugs, service interruptions, or changes during this period.", "feedback": "Your feedback helps us make AISBF better. Please don't hesitate to reach out!", "send_feedback": "Send Feedback", "got_it": "Got it!" },
"contact": { "title": "Contact Us", "your_email": "Your Email", "type": "Type", "select_type": "Select type...", "bug_report": "Bug Report", "feature_request": "Feature Request", "feedback": "Feedback", "question": "Question", "help": "Help", "title_field": "Title", "title_placeholder": "Brief summary of your message", "message": "Message", "message_placeholder": "Describe your issue, request, or feedback in detail...", "send_message": "Send Message", "cancel": "Cancel", "sending": "Sending...", "success": "Message sent successfully! Thank you for your feedback.", "error": "Error: {error}", "network_error": "Network error. Please try again later." },
"modal": { "notice": "Notice", "confirm": "Confirm", "warning": "Warning", "ok": "OK", "cancel": "Cancel", "delete": "Delete" },
"common": { "save": "Save", "loading": "Loading...", "error": "Error", "success": "Success", "close": "Close", "yes": "Yes", "no": "No" }
}
{
"header": { "title": "AISBF Panelo", "help": "Helpo", "docs": "Dokumentoj", "about": "Pri", "license": "Licenco", "restart_server": "Restartigi servilon", "logout": "Elsaluti" },
"nav": { "overview": "Superrigardo", "providers": "Provizantoj", "rotations": "Rotacioj", "autoselect": "Aŭtomata elekto", "prompts": "Instigoj", "analytics": "Analitiko", "api_tokens": "API-ĵetonoj", "wallet": "Monujo", "usage": "Uzado", "users": "Uzantoj", "settings": "Agordoj", "tiers": "Niveloj", "payment_settings": "Pagoj", "upgrade": "✨ Plibonigi! ✨", "notifications": "Sciigoj", "account": "Konto" },
"account_menu": { "edit_profile": "Redakti profilon", "api_tokens": "API-ĵetonoj", "cache_settings": "Kaŝmemoro-agordoj", "subscription": "Abono", "wallet": "Monujo", "billing": "Fakturado", "usage_quotas": "Uzado kaj kvotoj", "change_password": "Ŝanĝi pasvorton" },
"notifications": { "title": "Sciigoj", "mark_all_read": "Marki ĉiujn kiel legitajn", "refresh": "Refreŝigi", "no_notifications": "Neniuj sciigoj", "just_now": "ĵus nun", "minutes_ago": "antaŭ {n}min", "hours_ago": "antaŭ {n}h", "days_ago": "antaŭ {n}t" },
"footer": { "support_development": "Subteni AISBF-disvolvadon", "privacy_policy": "Privateca politiko", "terms_of_service": "Kondiĉoj de servo", "contact": "Kontakto" },
"donate": { "title": "Subteni AISBF", "thank_you": "Dankon pro konsidero de donaco. Via subteno helpas konservi AISBF kiel tute malfermfonta kaj libera programaro.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Alklaku ajnan adreson por kopii ĝin", "copied": "Kopiita!" },
"welcome": { "title": "Bonvenon al AISBF!", "early_adopter": "Dankon pro esti frua uzanto! Ni nuntempe estas en intensa disvolva fazo.", "may_encounter": "Vi eble renkontos cimojn, servointerrompojn aŭ ŝanĝojn.", "feedback": "Via komentaro helpas nin plibonigi AISBF. Ne hezitu kontakti nin!", "send_feedback": "Sendi komentaron", "got_it": "Komprenite!" },
"contact": { "title": "Kontakti nin", "your_email": "Via retpoŝto", "type": "Tipo", "select_type": "Elekti tipon...", "bug_report": "Cim-raporto", "feature_request": "Funkcia peto", "feedback": "Komentaro", "question": "Demando", "help": "Helpo", "title_field": "Titolo", "title_placeholder": "Mallonga resumo de via mesaĝo", "message": "Mesaĝo", "message_placeholder": "Priskribu vian problemon aŭ peton detale...", "send_message": "Sendi mesaĝon", "cancel": "Nuligi", "sending": "Sendante...", "success": "Mesaĝo sukcese sendita! Dankon pro via komentaro.", "error": "Eraro: {error}", "network_error": "Reta eraro. Bonvolu reprovi poste." },
"modal": { "notice": "Sciigo", "confirm": "Konfirmi", "warning": "Averto", "ok": "Bone", "cancel": "Nuligi", "delete": "Forigi" },
"common": { "save": "Konservi", "loading": "Ŝargante...", "error": "Eraro", "success": "Sukceso", "close": "Fermi", "yes": "Jes", "no": "Ne" }
}
{
"header": { "title": "AISBF Dashboard", "help": "Ayuda", "docs": "Docs", "about": "Acerca de", "license": "Licencia", "restart_server": "Reiniciar servidor", "logout": "Cerrar sesión" },
"nav": { "overview": "Resumen", "providers": "Proveedores", "rotations": "Rotaciones", "autoselect": "Autoselección", "prompts": "Indicaciones", "analytics": "Analítica", "api_tokens": "Tokens API", "wallet": "Billetera", "usage": "Uso", "users": "Usuarios", "settings": "Configuración", "tiers": "Niveles", "payment_settings": "Pagos", "upgrade": "✨ ¡Mejorar! ✨", "notifications": "Notificaciones", "account": "Cuenta" },
"account_menu": { "edit_profile": "Editar perfil", "api_tokens": "Tokens API", "cache_settings": "Configuración de caché", "subscription": "Suscripción", "wallet": "Billetera", "billing": "Facturación", "usage_quotas": "Uso y cuotas", "change_password": "Cambiar contraseña" },
"notifications": { "title": "Notificaciones", "mark_all_read": "Marcar todo como leído", "refresh": "Actualizar", "no_notifications": "Sin notificaciones", "just_now": "ahora mismo", "minutes_ago": "hace {n}min", "hours_ago": "hace {n}h", "days_ago": "hace {n}d" },
"footer": { "support_development": "Apoyar el desarrollo de AISBF", "privacy_policy": "Política de privacidad", "terms_of_service": "Términos de servicio", "contact": "Contacto" },
"donate": { "title": "Apoyar AISBF", "thank_you": "Gracias por considerar una donación. Su apoyo ayuda a mantener AISBF como software libre y de código abierto.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Haga clic en cualquier dirección para copiarla", "copied": "¡Copiado!" },
"welcome": { "title": "¡Bienvenido a AISBF!", "early_adopter": "¡Gracias por ser un usuario temprano! Estamos en una fase de desarrollo intensivo.", "may_encounter": "Puede encontrar errores o interrupciones del servicio.", "feedback": "Sus comentarios nos ayudan a mejorar AISBF. ¡No dude en contactarnos!", "send_feedback": "Enviar comentarios", "got_it": "¡Entendido!" },
"contact": { "title": "Contáctenos", "your_email": "Su correo electrónico", "type": "Tipo", "select_type": "Seleccionar tipo...", "bug_report": "Informe de error", "feature_request": "Solicitud de función", "feedback": "Comentarios", "question": "Pregunta", "help": "Ayuda", "title_field": "Título", "title_placeholder": "Breve resumen de su mensaje", "message": "Mensaje", "message_placeholder": "Describa su problema o solicitud en detalle...", "send_message": "Enviar mensaje", "cancel": "Cancelar", "sending": "Enviando...", "success": "¡Mensaje enviado con éxito! Gracias por sus comentarios.", "error": "Error: {error}", "network_error": "Error de red. Por favor, inténtelo de nuevo más tarde." },
"modal": { "notice": "Aviso", "confirm": "Confirmar", "warning": "Advertencia", "ok": "OK", "cancel": "Cancelar", "delete": "Eliminar" },
"common": { "save": "Guardar", "loading": "Cargando...", "error": "Error", "success": "Éxito", "close": "Cerrar", "yes": "Sí", "no": "No" }
}
{
"header": { "title": "داشبورد AISBF", "help": "راهنما", "docs": "مستندات", "about": "درباره", "license": "مجوز", "restart_server": "راه‌اندازی مجدد سرور", "logout": "خروج" },
"nav": { "overview": "نمای کلی", "providers": "ارائه‌دهندگان", "rotations": "چرخش‌ها", "autoselect": "انتخاب خودکار", "prompts": "دستورات", "analytics": "تحلیل‌ها", "api_tokens": "توکن‌های API", "wallet": "کیف پول", "usage": "مصرف", "users": "کاربران", "settings": "تنظیمات", "tiers": "سطوح", "payment_settings": "تنظیمات پرداخت", "upgrade": "✨ ارتقا! ✨", "notifications": "اعلان‌ها", "account": "حساب" },
"account_menu": { "edit_profile": "ویرایش پروفایل", "api_tokens": "توکن‌های API", "cache_settings": "تنظیمات کش", "subscription": "اشتراک", "wallet": "کیف پول", "billing": "صورتحساب", "usage_quotas": "مصرف و سهمیه‌ها", "change_password": "تغییر رمز عبور" },
"notifications": { "title": "اعلان‌ها", "mark_all_read": "علامت‌گذاری همه به عنوان خوانده شده", "refresh": "بازخوانی", "no_notifications": "اعلانی وجود ندارد", "just_now": "همین الان", "minutes_ago": "{n} دقیقه پیش", "hours_ago": "{n} ساعت پیش", "days_ago": "{n} روز پیش" },
"footer": { "support_development": "حمایت از توسعه AISBF", "privacy_policy": "سیاست حریم خصوصی", "terms_of_service": "شرایط خدمات", "contact": "تماس" },
"donate": { "title": "حمایت از AISBF", "thank_you": "از اینکه کمک مالی را در نظر می‌گیرید متشکریم. حمایت شما به حفظ AISBF به عنوان نرم‌افزار کاملاً متن‌باز و رایگان کمک می‌کند.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "برای کپی کردن روی هر آدرسی کلیک کنید", "copied": "کپی شد!" },
"welcome": { "title": "به AISBF خوش آمدید!", "early_adopter": "از اینکه کاربر اولیه هستید متشکریم! ما در حال حاضر در مرحله توسعه فشرده هستیم.", "may_encounter": "ممکن است با اشکالات، قطعی‌های سرویس یا تغییرات مواجه شوید.", "feedback": "بازخورد شما به ما کمک می‌کند AISBF را بهتر کنیم. در تماس با ما تردید نکنید!", "send_feedback": "ارسال بازخورد", "got_it": "متوجه شدم!" },
"contact": { "title": "تماس با ما", "your_email": "ایمیل شما", "type": "نوع", "select_type": "نوع را انتخاب کنید...", "bug_report": "گزارش اشکال", "feature_request": "درخواست ویژگی", "feedback": "بازخورد", "question": "سوال", "help": "راهنما", "title_field": "عنوان", "title_placeholder": "خلاصه کوتاهی از پیام شما", "message": "پیام", "message_placeholder": "مشکل یا درخواست خود را به تفصیل توضیح دهید...", "send_message": "ارسال پیام", "cancel": "لغو", "sending": "در حال ارسال...", "success": "پیام با موفقیت ارسال شد! از بازخورد شما متشکریم.", "error": "خطا: {error}", "network_error": "خطای شبکه. لطفاً بعداً دوباره امتحان کنید." },
"modal": { "notice": "اعلان", "confirm": "تأیید", "warning": "هشدار", "ok": "تأیید", "cancel": "لغو", "delete": "حذف" },
"common": { "save": "ذخیره", "loading": "در حال بارگذاری...", "error": "خطا", "success": "موفقیت", "close": "بستن", "yes": "بله", "no": "خیر" }
}
{
"header": { "title": "AISBF Dashboard", "help": "Ohje", "docs": "Docs", "about": "Tietoja", "license": "Lisenssi", "restart_server": "Käynnistä palvelin uudelleen", "logout": "Kirjaudu ulos" },
"nav": { "overview": "Yleiskatsaus", "providers": "Palveluntarjoajat", "rotations": "Rotaatiot", "autoselect": "Automaattivalinta", "prompts": "Kehotteet", "analytics": "Analytiikka", "api_tokens": "API-tunnukset", "wallet": "Lompakko", "usage": "Käyttö", "users": "Käyttäjät", "settings": "Asetukset", "tiers": "Tasot", "payment_settings": "Maksut", "upgrade": "✨ Päivitä! ✨", "notifications": "Ilmoitukset", "account": "Tili" },
"account_menu": { "edit_profile": "Muokkaa profiilia", "api_tokens": "API-tunnukset", "cache_settings": "Välimuistiasetukset", "subscription": "Tilaus", "wallet": "Lompakko", "billing": "Laskutus", "usage_quotas": "Käyttö ja kiintiöt", "change_password": "Vaihda salasana" },
"notifications": { "title": "Ilmoitukset", "mark_all_read": "Merkitse kaikki luetuiksi", "refresh": "Päivitä", "no_notifications": "Ei ilmoituksia", "just_now": "juuri nyt", "minutes_ago": "{n}min sitten", "hours_ago": "{n}t sitten", "days_ago": "{n}pv sitten" },
"footer": { "support_development": "Tue AISBF-kehitystä", "privacy_policy": "Tietosuojakäytäntö", "terms_of_service": "Käyttöehdot", "contact": "Yhteystiedot" },
"donate": { "title": "Tue AISBF:ää", "thank_you": "Kiitos lahjoituksen harkitsemisesta. Tukesi auttaa pitämään AISBF:n täysin avoimen lähdekoodin ja ilmaisena ohjelmistona.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Kopioi napsauttamalla osoitetta", "copied": "Kopioitu!" },
"welcome": { "title": "Tervetuloa AISBF:ään!", "early_adopter": "Kiitos, että olet varhainen käyttäjä! Olemme tällä hetkellä intensiivisessä kehitysvaiheessa.", "may_encounter": "Saatat kohdata vikoja, palvelukatkoksia tai muutoksia.", "feedback": "Palautteesi auttaa meitä parantamaan AISBF:ää. Ota rohkeasti yhteyttä!", "send_feedback": "Lähetä palaute", "got_it": "Selvä!" },
"contact": { "title": "Ota yhteyttä", "your_email": "Sähköpostisi", "type": "Tyyppi", "select_type": "Valitse tyyppi...", "bug_report": "Vikaraportti", "feature_request": "Ominaisuuspyyntö", "feedback": "Palaute", "question": "Kysymys", "help": "Ohje", "title_field": "Otsikko", "title_placeholder": "Lyhyt yhteenveto viestistäsi", "message": "Viesti", "message_placeholder": "Kuvaile ongelmasi tai pyyntösi yksityiskohtaisesti...", "send_message": "Lähetä viesti", "cancel": "Peruuta", "sending": "Lähetetään...", "success": "Viesti lähetetty! Kiitos palautteestasi.", "error": "Virhe: {error}", "network_error": "Verkkovirhe. Yritä myöhemmin uudelleen." },
"modal": { "notice": "Ilmoitus", "confirm": "Vahvista", "warning": "Varoitus", "ok": "OK", "cancel": "Peruuta", "delete": "Poista" },
"common": { "save": "Tallenna", "loading": "Ladataan...", "error": "Virhe", "success": "Onnistui", "close": "Sulje", "yes": "Kyllä", "no": "Ei" }
}
{
"header": { "title": "AISBF Dashboard", "help": "Aide", "docs": "Docs", "about": "À propos", "license": "Licence", "restart_server": "Redémarrer le serveur", "logout": "Déconnexion" },
"nav": { "overview": "Vue d'ensemble", "providers": "Fournisseurs", "rotations": "Rotations", "autoselect": "Sélection auto", "prompts": "Invites", "analytics": "Analytique", "api_tokens": "Jetons API", "wallet": "Portefeuille", "usage": "Utilisation", "users": "Utilisateurs", "settings": "Paramètres", "tiers": "Niveaux", "payment_settings": "Paiements", "upgrade": "✨ Mettre à niveau ! ✨", "notifications": "Notifications", "account": "Compte" },
"account_menu": { "edit_profile": "Modifier le profil", "api_tokens": "Jetons API", "cache_settings": "Paramètres du cache", "subscription": "Abonnement", "wallet": "Portefeuille", "billing": "Facturation", "usage_quotas": "Utilisation & Quotas", "change_password": "Changer le mot de passe" },
"notifications": { "title": "Notifications", "mark_all_read": "Tout marquer comme lu", "refresh": "Actualiser", "no_notifications": "Aucune notification", "just_now": "à l'instant", "minutes_ago": "il y a {n}min", "hours_ago": "il y a {n}h", "days_ago": "il y a {n}j" },
"footer": { "support_development": "Soutenir le développement d'AISBF", "privacy_policy": "Politique de confidentialité", "terms_of_service": "Conditions d'utilisation", "contact": "Contact" },
"donate": { "title": "Soutenir AISBF", "thank_you": "Merci de considérer un don. Votre soutien aide à maintenir AISBF comme logiciel libre et gratuit.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Cliquez sur une adresse pour la copier", "copied": "Copié !" },
"welcome": { "title": "Bienvenue sur AISBF !", "early_adopter": "Merci d'être un utilisateur précoce ! Nous sommes en phase de développement intensif.", "may_encounter": "Vous pourriez rencontrer des bugs ou des interruptions de service.", "feedback": "Vos retours nous aident à améliorer AISBF. N'hésitez pas à nous contacter !", "send_feedback": "Envoyer un retour", "got_it": "Compris !" },
"contact": { "title": "Nous contacter", "your_email": "Votre e-mail", "type": "Type", "select_type": "Sélectionner un type...", "bug_report": "Rapport de bug", "feature_request": "Demande de fonctionnalité", "feedback": "Retour", "question": "Question", "help": "Aide", "title_field": "Titre", "title_placeholder": "Bref résumé de votre message", "message": "Message", "message_placeholder": "Décrivez votre problème ou demande en détail...", "send_message": "Envoyer le message", "cancel": "Annuler", "sending": "Envoi...", "success": "Message envoyé avec succès ! Merci pour votre retour.", "error": "Erreur : {error}", "network_error": "Erreur réseau. Veuillez réessayer plus tard." },
"modal": { "notice": "Avis", "confirm": "Confirmer", "warning": "Avertissement", "ok": "OK", "cancel": "Annuler", "delete": "Supprimer" },
"common": { "save": "Enregistrer", "loading": "Chargement...", "error": "Erreur", "success": "Succès", "close": "Fermer", "yes": "Oui", "no": "Non" }
}
{
"header": { "title": "לוח בקרה AISBF", "help": "עזרה", "docs": "מסמכים", "about": "אודות", "license": "רישיון", "restart_server": "הפעל מחדש שרת", "logout": "התנתק" },
"nav": { "overview": "סקירה כללית", "providers": "ספקים", "rotations": "רוטציות", "autoselect": "בחירה אוטומטית", "prompts": "הנחיות", "analytics": "אנליטיקה", "api_tokens": "אסימוני API", "wallet": "ארנק", "usage": "שימוש", "users": "משתמשים", "settings": "הגדרות", "tiers": "רמות", "payment_settings": "הגדרות תשלום", "upgrade": "✨ שדרג! ✨", "notifications": "התראות", "account": "חשבון" },
"account_menu": { "edit_profile": "ערוך פרופיל", "api_tokens": "אסימוני API", "cache_settings": "הגדרות מטמון", "subscription": "מנוי", "wallet": "ארנק", "billing": "חיוב", "usage_quotas": "שימוש ומכסות", "change_password": "שנה סיסמה" },
"notifications": { "title": "התראות", "mark_all_read": "סמן הכל כנקרא", "refresh": "רענן", "no_notifications": "אין התראות", "just_now": "עכשיו", "minutes_ago": "לפני {n} דקות", "hours_ago": "לפני {n} שעות", "days_ago": "לפני {n} ימים" },
"footer": { "support_development": "תמוך בפיתוח AISBF", "privacy_policy": "מדיניות פרטיות", "terms_of_service": "תנאי שירות", "contact": "צור קשר" },
"donate": { "title": "תמוך ב-AISBF", "thank_you": "תודה שאתה שוקל תרומה. התמיכה שלך עוזרת לשמור על AISBF כתוכנה חופשית ופתוחה לחלוטין.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "לחץ על כל כתובת כדי להעתיק אותה", "copied": "הועתק!" },
"welcome": { "title": "ברוך הבא ל-AISBF!", "early_adopter": "תודה שאתה משתמש מוקדם! אנחנו כרגע בשלב פיתוח אינטנסיבי.", "may_encounter": "ייתכן שתיתקל בבאגים, הפסקות שירות או שינויים.", "feedback": "המשוב שלך עוזר לנו לשפר את AISBF. אל תהסס לפנות אלינו!", "send_feedback": "שלח משוב", "got_it": "הבנתי!" },
"contact": { "title": "צור קשר", "your_email": "האימייל שלך", "type": "סוג", "select_type": "בחר סוג...", "bug_report": "דיווח על באג", "feature_request": "בקשת תכונה", "feedback": "משוב", "question": "שאלה", "help": "עזרה", "title_field": "כותרת", "title_placeholder": "סיכום קצר של הודעתך", "message": "הודעה", "message_placeholder": "תאר את הבעיה או הבקשה שלך בפירוט...", "send_message": "שלח הודעה", "cancel": "ביטול", "sending": "שולח...", "success": "ההודעה נשלחה בהצלחה! תודה על המשוב שלך.", "error": "שגיאה: {error}", "network_error": "שגיאת רשת. אנא נסה שוב מאוחר יותר." },
"modal": { "notice": "הודעה", "confirm": "אשר", "warning": "אזהרה", "ok": "אישור", "cancel": "ביטול", "delete": "מחק" },
"common": { "save": "שמור", "loading": "טוען...", "error": "שגיאה", "success": "הצלחה", "close": "סגור", "yes": "כן", "no": "לא" }
}
{
"header": { "title": "AISBF डैशबोर्ड", "help": "सहायता", "docs": "दस्तावेज़", "about": "के बारे में", "license": "लाइसेंस", "restart_server": "सर्वर पुनः आरंभ करें", "logout": "लॉग आउट" },
"nav": { "overview": "अवलोकन", "providers": "प्रदाता", "rotations": "रोटेशन", "autoselect": "स्वतः चयन", "prompts": "प्रॉम्प्ट", "analytics": "विश्लेषण", "api_tokens": "API टोकन", "wallet": "वॉलेट", "usage": "उपयोग", "users": "उपयोगकर्ता", "settings": "सेटिंग्स", "tiers": "स्तर", "payment_settings": "भुगतान सेटिंग्स", "upgrade": "✨ अपग्रेड! ✨", "notifications": "सूचनाएं", "account": "खाता" },
"account_menu": { "edit_profile": "प्रोफ़ाइल संपादित करें", "api_tokens": "API टोकन", "cache_settings": "कैश सेटिंग्स", "subscription": "सदस्यता", "wallet": "वॉलेट", "billing": "बिलिंग", "usage_quotas": "उपयोग और कोटा", "change_password": "पासवर्ड बदलें" },
"notifications": { "title": "सूचनाएं", "mark_all_read": "सभी को पढ़ा हुआ चिह्नित करें", "refresh": "ताज़ा करें", "no_notifications": "कोई सूचना नहीं", "just_now": "अभी", "minutes_ago": "{n} मिनट पहले", "hours_ago": "{n} घंटे पहले", "days_ago": "{n} दिन पहले" },
"footer": { "support_development": "AISBF विकास का समर्थन करें", "privacy_policy": "गोपनीयता नीति", "terms_of_service": "सेवा की शर्तें", "contact": "संपर्क" },
"donate": { "title": "AISBF का समर्थन करें", "thank_you": "दान पर विचार करने के लिए धन्यवाद। आपका समर्थन AISBF को पूरी तरह से ओपन सोर्स और मुफ्त सॉफ्टवेयर के रूप में बनाए रखने में मदद करता है।", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "कॉपी करने के लिए किसी भी पते पर क्लिक करें", "copied": "कॉपी किया गया!" },
"welcome": { "title": "AISBF में आपका स्वागत है!", "early_adopter": "शुरुआती उपयोगकर्ता होने के लिए धन्यवाद! हम वर्तमान में गहन विकास चरण में हैं।", "may_encounter": "आपको बग, सेवा रुकावट या परिवर्तन का सामना करना पड़ सकता है।", "feedback": "आपकी प्रतिक्रिया AISBF को बेहतर बनाने में मदद करती है। संपर्क करने में संकोच न करें!", "send_feedback": "प्रतिक्रिया भेजें", "got_it": "समझ गया!" },
"contact": { "title": "हमसे संपर्क करें", "your_email": "आपका ईमेल", "type": "प्रकार", "select_type": "प्रकार चुनें...", "bug_report": "बग रिपोर्ट", "feature_request": "फीचर अनुरोध", "feedback": "प्रतिक्रिया", "question": "प्रश्न", "help": "सहायता", "title_field": "शीर्षक", "title_placeholder": "आपके संदेश का संक्षिप्त सारांश", "message": "संदेश", "message_placeholder": "अपनी समस्या या अनुरोध का विस्तार से वर्णन करें...", "send_message": "संदेश भेजें", "cancel": "रद्द करें", "sending": "भेज रहे हैं...", "success": "संदेश सफलतापूर्वक भेजा गया! आपकी प्रतिक्रिया के लिए धन्यवाद।", "error": "त्रुटि: {error}", "network_error": "नेटवर्क त्रुटि। कृपया बाद में पुनः प्रयास करें।" },
"modal": { "notice": "सूचना", "confirm": "पुष्टि करें", "warning": "चेतावनी", "ok": "ठीक है", "cancel": "रद्द करें", "delete": "हटाएं" },
"common": { "save": "सहेजें", "loading": "लोड हो रहा है...", "error": "त्रुटि", "success": "सफलता", "close": "बंद करें", "yes": "हाँ", "no": "नहीं" }
}
{
"header": { "title": "AISBF Dashboard", "help": "Súgó", "docs": "Docs", "about": "Névjegy", "license": "Licenc", "restart_server": "Szerver újraindítása", "logout": "Kijelentkezés" },
"nav": { "overview": "Áttekintés", "providers": "Szolgáltatók", "rotations": "Rotációk", "autoselect": "Automatikus kiválasztás", "prompts": "Promptok", "analytics": "Analitika", "api_tokens": "API tokenek", "wallet": "Pénztárca", "usage": "Használat", "users": "Felhasználók", "settings": "Beállítások", "tiers": "Szintek", "payment_settings": "Fizetések", "upgrade": "✨ Frissítés! ✨", "notifications": "Értesítések", "account": "Fiók" },
"account_menu": { "edit_profile": "Profil szerkesztése", "api_tokens": "API tokenek", "cache_settings": "Gyorsítótár beállítások", "subscription": "Előfizetés", "wallet": "Pénztárca", "billing": "Számlázás", "usage_quotas": "Használat és kvóták", "change_password": "Jelszó módosítása" },
"notifications": { "title": "Értesítések", "mark_all_read": "Összes megjelölése olvasottként", "refresh": "Frissítés", "no_notifications": "Nincs értesítés", "just_now": "éppen most", "minutes_ago": "{n} perce", "hours_ago": "{n} órája", "days_ago": "{n} napja" },
"footer": { "support_development": "AISBF fejlesztés támogatása", "privacy_policy": "Adatvédelmi irányelvek", "terms_of_service": "Szolgáltatási feltételek", "contact": "Kapcsolat" },
"donate": { "title": "AISBF támogatása", "thank_you": "Köszönjük, hogy adományozást fontolgat. Támogatása segít az AISBF-et teljesen nyílt forráskódú és ingyenes szoftverként fenntartani.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Kattintson bármely címre a másoláshoz", "copied": "Másolva!" },
"welcome": { "title": "Üdvözöljük az AISBF-ben!", "early_adopter": "Köszönjük, hogy korai felhasználó! Jelenleg intenzív fejlesztési fázisban vagyunk.", "may_encounter": "Hibákkal, szolgáltatáskiesésekkel vagy változásokkal találkozhat.", "feedback": "Visszajelzése segít az AISBF fejlesztésében. Ne habozzon kapcsolatba lépni velünk!", "send_feedback": "Visszajelzés küldése", "got_it": "Értettem!" },
"contact": { "title": "Kapcsolatfelvétel", "your_email": "E-mail címe", "type": "Típus", "select_type": "Típus kiválasztása...", "bug_report": "Hibajelentés", "feature_request": "Funkciókérés", "feedback": "Visszajelzés", "question": "Kérdés", "help": "Súgó", "title_field": "Cím", "title_placeholder": "Üzenetének rövid összefoglalója", "message": "Üzenet", "message_placeholder": "Írja le részletesen a problémáját vagy kérését...", "send_message": "Üzenet küldése", "cancel": "Mégse", "sending": "Küldés...", "success": "Üzenet sikeresen elküldve! Köszönjük visszajelzését.", "error": "Hiba: {error}", "network_error": "Hálózati hiba. Kérjük, próbálja újra később." },
"modal": { "notice": "Értesítés", "confirm": "Megerősítés", "warning": "Figyelmeztetés", "ok": "OK", "cancel": "Mégse", "delete": "Törlés" },
"common": { "save": "Mentés", "loading": "Betöltés...", "error": "Hiba", "success": "Siker", "close": "Bezárás", "yes": "Igen", "no": "Nem" }
}
{
"header": { "title": "Dashboard AISBF", "help": "Bantuan", "docs": "Docs", "about": "Tentang", "license": "Lisensi", "restart_server": "Mulai Ulang Server", "logout": "Keluar" },
"nav": { "overview": "Ikhtisar", "providers": "Penyedia", "rotations": "Rotasi", "autoselect": "Pilih Otomatis", "prompts": "Prompt", "analytics": "Analitik", "api_tokens": "Token API", "wallet": "Dompet", "usage": "Penggunaan", "users": "Pengguna", "settings": "Pengaturan", "tiers": "Tingkatan", "payment_settings": "Pembayaran", "upgrade": "✨ Tingkatkan! ✨", "notifications": "Notifikasi", "account": "Akun" },
"account_menu": { "edit_profile": "Edit Profil", "api_tokens": "Token API", "cache_settings": "Pengaturan Cache", "subscription": "Langganan", "wallet": "Dompet", "billing": "Penagihan", "usage_quotas": "Penggunaan & Kuota", "change_password": "Ganti Kata Sandi" },
"notifications": { "title": "Notifikasi", "mark_all_read": "Tandai semua sudah dibaca", "refresh": "Segarkan", "no_notifications": "Tidak ada notifikasi", "just_now": "baru saja", "minutes_ago": "{n}mnt lalu", "hours_ago": "{n}j lalu", "days_ago": "{n}h lalu" },
"footer": { "support_development": "Dukung Pengembangan AISBF", "privacy_policy": "Kebijakan Privasi", "terms_of_service": "Syarat Layanan", "contact": "Kontak" },
"donate": { "title": "Dukung AISBF", "thank_you": "Terima kasih telah mempertimbangkan donasi. Dukungan Anda membantu menjaga AISBF sebagai perangkat lunak open source dan gratis sepenuhnya.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Klik alamat mana saja untuk menyalinnya", "copied": "Disalin!" },
"welcome": { "title": "Selamat Datang di AISBF!", "early_adopter": "Terima kasih telah menjadi pengguna awal! Kami saat ini dalam fase pengembangan intensif.", "may_encounter": "Anda mungkin mengalami bug, gangguan layanan, atau perubahan.", "feedback": "Masukan Anda membantu kami membuat AISBF lebih baik. Jangan ragu untuk menghubungi kami!", "send_feedback": "Kirim Masukan", "got_it": "Mengerti!" },
"contact": { "title": "Hubungi Kami", "your_email": "Email Anda", "type": "Jenis", "select_type": "Pilih jenis...", "bug_report": "Laporan Bug", "feature_request": "Permintaan Fitur", "feedback": "Masukan", "question": "Pertanyaan", "help": "Bantuan", "title_field": "Judul", "title_placeholder": "Ringkasan singkat pesan Anda", "message": "Pesan", "message_placeholder": "Jelaskan masalah atau permintaan Anda secara detail...", "send_message": "Kirim Pesan", "cancel": "Batal", "sending": "Mengirim...", "success": "Pesan berhasil dikirim! Terima kasih atas masukan Anda.", "error": "Kesalahan: {error}", "network_error": "Kesalahan jaringan. Silakan coba lagi nanti." },
"modal": { "notice": "Pemberitahuan", "confirm": "Konfirmasi", "warning": "Peringatan", "ok": "OK", "cancel": "Batal", "delete": "Hapus" },
"common": { "save": "Simpan", "loading": "Memuat...", "error": "Kesalahan", "success": "Berhasil", "close": "Tutup", "yes": "Ya", "no": "Tidak" }
}
{
"header": { "title": "AISBF Dashboard", "help": "Aiuto", "docs": "Docs", "about": "Informazioni", "license": "Licenza", "restart_server": "Riavvia server", "logout": "Esci" },
"nav": { "overview": "Panoramica", "providers": "Provider", "rotations": "Rotazioni", "autoselect": "Selezione auto", "prompts": "Prompt", "analytics": "Analisi", "api_tokens": "Token API", "wallet": "Portafoglio", "usage": "Utilizzo", "users": "Utenti", "settings": "Impostazioni", "tiers": "Livelli", "payment_settings": "Pagamenti", "upgrade": "✨ Aggiorna! ✨", "notifications": "Notifiche", "account": "Account" },
"account_menu": { "edit_profile": "Modifica profilo", "api_tokens": "Token API", "cache_settings": "Impostazioni cache", "subscription": "Abbonamento", "wallet": "Portafoglio", "billing": "Fatturazione", "usage_quotas": "Utilizzo e quote", "change_password": "Cambia password" },
"notifications": { "title": "Notifiche", "mark_all_read": "Segna tutto come letto", "refresh": "Aggiorna", "no_notifications": "Nessuna notifica", "just_now": "proprio ora", "minutes_ago": "{n}min fa", "hours_ago": "{n}h fa", "days_ago": "{n}g fa" },
"footer": { "support_development": "Supporta lo sviluppo di AISBF", "privacy_policy": "Informativa sulla privacy", "terms_of_service": "Termini di servizio", "contact": "Contatto" },
"donate": { "title": "Supporta AISBF", "thank_you": "Grazie per aver considerato una donazione. Il tuo supporto aiuta a mantenere AISBF come software libero e open source.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Clicca su un indirizzo per copiarlo", "copied": "Copiato!" },
"welcome": { "title": "Benvenuto in AISBF!", "early_adopter": "Grazie per essere un utente precoce! Siamo in una fase di sviluppo intensivo.", "may_encounter": "Potresti incontrare bug o interruzioni del servizio.", "feedback": "Il tuo feedback ci aiuta a migliorare AISBF. Non esitare a contattarci!", "send_feedback": "Invia feedback", "got_it": "Capito!" },
"contact": { "title": "Contattaci", "your_email": "La tua email", "type": "Tipo", "select_type": "Seleziona tipo...", "bug_report": "Segnalazione bug", "feature_request": "Richiesta funzionalità", "feedback": "Feedback", "question": "Domanda", "help": "Aiuto", "title_field": "Titolo", "title_placeholder": "Breve riepilogo del tuo messaggio", "message": "Messaggio", "message_placeholder": "Descrivi il tuo problema o richiesta in dettaglio...", "send_message": "Invia messaggio", "cancel": "Annulla", "sending": "Invio...", "success": "Messaggio inviato con successo! Grazie per il tuo feedback.", "error": "Errore: {error}", "network_error": "Errore di rete. Riprova più tardi." },
"modal": { "notice": "Avviso", "confirm": "Conferma", "warning": "Avvertimento", "ok": "OK", "cancel": "Annulla", "delete": "Elimina" },
"common": { "save": "Salva", "loading": "Caricamento...", "error": "Errore", "success": "Successo", "close": "Chiudi", "yes": "Sì", "no": "No" }
}
{
"header": { "title": "AISBF ダッシュボード", "help": "ヘルプ", "docs": "ドキュメント", "about": "概要", "license": "ライセンス", "restart_server": "サーバー再起動", "logout": "ログアウト" },
"nav": { "overview": "概要", "providers": "プロバイダー", "rotations": "ローテーション", "autoselect": "自動選択", "prompts": "プロンプト", "analytics": "分析", "api_tokens": "APIトークン", "wallet": "ウォレット", "usage": "使用状況", "users": "ユーザー", "settings": "設定", "tiers": "プラン", "payment_settings": "支払い設定", "upgrade": "✨ アップグレード!✨", "notifications": "通知", "account": "アカウント" },
"account_menu": { "edit_profile": "プロフィール編集", "api_tokens": "APIトークン", "cache_settings": "キャッシュ設定", "subscription": "サブスクリプション", "wallet": "ウォレット", "billing": "請求", "usage_quotas": "使用量とクォータ", "change_password": "パスワード変更" },
"notifications": { "title": "通知", "mark_all_read": "すべて既読にする", "refresh": "更新", "no_notifications": "通知なし", "just_now": "たった今", "minutes_ago": "{n}分前", "hours_ago": "{n}時間前", "days_ago": "{n}日前" },
"footer": { "support_development": "AISBF開発を支援", "privacy_policy": "プライバシーポリシー", "terms_of_service": "利用規約", "contact": "お問い合わせ" },
"donate": { "title": "AISBFを支援", "thank_you": "寄付をご検討いただきありがとうございます。あなたのサポートがAISBFをオープンソースの無料ソフトウェアとして維持するのに役立ちます。", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "アドレスをクリックしてコピー", "copied": "コピーしました!" },
"welcome": { "title": "AISBFへようこそ!", "early_adopter": "早期ユーザーとしてご参加いただきありがとうございます!現在、開発の集中フェーズにあります。", "may_encounter": "バグやサービス中断が発生する場合があります。", "feedback": "フィードバックはAISBFの改善に役立ちます。お気軽にご連絡ください!", "send_feedback": "フィードバックを送る", "got_it": "了解!" },
"contact": { "title": "お問い合わせ", "your_email": "メールアドレス", "type": "種類", "select_type": "種類を選択...", "bug_report": "バグ報告", "feature_request": "機能リクエスト", "feedback": "フィードバック", "question": "質問", "help": "ヘルプ", "title_field": "タイトル", "title_placeholder": "メッセージの簡単な概要", "message": "メッセージ", "message_placeholder": "問題やリクエストを詳しく説明してください...", "send_message": "メッセージを送る", "cancel": "キャンセル", "sending": "送信中...", "success": "メッセージが正常に送信されました!フィードバックありがとうございます。", "error": "エラー: {error}", "network_error": "ネットワークエラー。後でもう一度お試しください。" },
"modal": { "notice": "お知らせ", "confirm": "確認", "warning": "警告", "ok": "OK", "cancel": "キャンセル", "delete": "削除" },
"common": { "save": "保存", "loading": "読み込み中...", "error": "エラー", "success": "成功", "close": "閉じる", "yes": "はい", "no": "いいえ" }
}
{
"header": { "title": "AISBF 대시보드", "help": "도움말", "docs": "문서", "about": "정보", "license": "라이선스", "restart_server": "서버 재시작", "logout": "로그아웃" },
"nav": { "overview": "개요", "providers": "공급자", "rotations": "로테이션", "autoselect": "자동 선택", "prompts": "프롬프트", "analytics": "분석", "api_tokens": "API 토큰", "wallet": "지갑", "usage": "사용량", "users": "사용자", "settings": "설정", "tiers": "등급", "payment_settings": "결제 설정", "upgrade": "✨ 업그레이드! ✨", "notifications": "알림", "account": "계정" },
"account_menu": { "edit_profile": "프로필 편집", "api_tokens": "API 토큰", "cache_settings": "캐시 설정", "subscription": "구독", "wallet": "지갑", "billing": "청구", "usage_quotas": "사용량 및 할당량", "change_password": "비밀번호 변경" },
"notifications": { "title": "알림", "mark_all_read": "모두 읽음으로 표시", "refresh": "새로고침", "no_notifications": "알림 없음", "just_now": "방금", "minutes_ago": "{n}분 전", "hours_ago": "{n}시간 전", "days_ago": "{n}일 전" },
"footer": { "support_development": "AISBF 개발 지원", "privacy_policy": "개인정보 처리방침", "terms_of_service": "서비스 약관", "contact": "문의" },
"donate": { "title": "AISBF 지원", "thank_you": "기부를 고려해 주셔서 감사합니다. 여러분의 지원이 AISBF를 완전한 오픈소스 무료 소프트웨어로 유지하는 데 도움이 됩니다.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "주소를 클릭하여 클립보드에 복사", "copied": "복사됨!" },
"welcome": { "title": "AISBF에 오신 것을 환영합니다!", "early_adopter": "얼리 어답터가 되어 주셔서 감사합니다! 현재 집중 개발 단계에 있습니다.", "may_encounter": "버그, 서비스 중단 또는 변경 사항이 발생할 수 있습니다.", "feedback": "여러분의 피드백이 AISBF를 더 좋게 만드는 데 도움이 됩니다. 언제든지 연락해 주세요!", "send_feedback": "피드백 보내기", "got_it": "알겠습니다!" },
"contact": { "title": "문의하기", "your_email": "이메일", "type": "유형", "select_type": "유형 선택...", "bug_report": "버그 신고", "feature_request": "기능 요청", "feedback": "피드백", "question": "질문", "help": "도움말", "title_field": "제목", "title_placeholder": "메시지의 간단한 요약", "message": "메시지", "message_placeholder": "문제나 요청을 자세히 설명해 주세요...", "send_message": "메시지 보내기", "cancel": "취소", "sending": "전송 중...", "success": "메시지가 성공적으로 전송되었습니다! 피드백 감사합니다.", "error": "오류: {error}", "network_error": "네트워크 오류. 나중에 다시 시도해 주세요." },
"modal": { "notice": "알림", "confirm": "확인", "warning": "경고", "ok": "확인", "cancel": "취소", "delete": "삭제" },
"common": { "save": "저장", "loading": "로딩 중...", "error": "오류", "success": "성공", "close": "닫기", "yes": "예", "no": "아니오" }
}
{
"header": { "title": "Papan Pemuka AISBF", "help": "Bantuan", "docs": "Dokumen", "about": "Tentang", "license": "Lesen", "restart_server": "Mulakan Semula Pelayan", "logout": "Log Keluar" },
"nav": { "overview": "Gambaran Keseluruhan", "providers": "Pembekal", "rotations": "Putaran", "autoselect": "Pilih Auto", "prompts": "Gesaan", "analytics": "Analitik", "api_tokens": "Token API", "wallet": "Dompet", "usage": "Penggunaan", "users": "Pengguna", "settings": "Tetapan", "tiers": "Peringkat", "payment_settings": "Pembayaran", "upgrade": "✨ Naik Taraf! ✨", "notifications": "Pemberitahuan", "account": "Akaun" },
"account_menu": { "edit_profile": "Edit Profil", "api_tokens": "Token API", "cache_settings": "Tetapan Cache", "subscription": "Langganan", "wallet": "Dompet", "billing": "Pengebilan", "usage_quotas": "Penggunaan & Kuota", "change_password": "Tukar Kata Laluan" },
"notifications": { "title": "Pemberitahuan", "mark_all_read": "Tandakan semua sebagai dibaca", "refresh": "Muat Semula", "no_notifications": "Tiada pemberitahuan", "just_now": "baru sahaja", "minutes_ago": "{n}min lalu", "hours_ago": "{n}j lalu", "days_ago": "{n}h lalu" },
"footer": { "support_development": "Sokong Pembangunan AISBF", "privacy_policy": "Dasar Privasi", "terms_of_service": "Terma Perkhidmatan", "contact": "Hubungi" },
"donate": { "title": "Sokong AISBF", "thank_you": "Terima kasih kerana mempertimbangkan derma. Sokongan anda membantu mengekalkan AISBF sebagai perisian sumber terbuka dan percuma sepenuhnya.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Klik mana-mana alamat untuk menyalinnya", "copied": "Disalin!" },
"welcome": { "title": "Selamat Datang ke AISBF!", "early_adopter": "Terima kasih kerana menjadi pengguna awal! Kami kini dalam fasa pembangunan intensif.", "may_encounter": "Anda mungkin menghadapi pepijat, gangguan perkhidmatan, atau perubahan.", "feedback": "Maklum balas anda membantu kami menjadikan AISBF lebih baik. Jangan teragak-agak untuk menghubungi kami!", "send_feedback": "Hantar Maklum Balas", "got_it": "Faham!" },
"contact": { "title": "Hubungi Kami", "your_email": "E-mel Anda", "type": "Jenis", "select_type": "Pilih jenis...", "bug_report": "Laporan Pepijat", "feature_request": "Permintaan Ciri", "feedback": "Maklum Balas", "question": "Soalan", "help": "Bantuan", "title_field": "Tajuk", "title_placeholder": "Ringkasan ringkas mesej anda", "message": "Mesej", "message_placeholder": "Terangkan isu atau permintaan anda secara terperinci...", "send_message": "Hantar Mesej", "cancel": "Batal", "sending": "Menghantar...", "success": "Mesej berjaya dihantar! Terima kasih atas maklum balas anda.", "error": "Ralat: {error}", "network_error": "Ralat rangkaian. Sila cuba lagi kemudian." },
"modal": { "notice": "Notis", "confirm": "Sahkan", "warning": "Amaran", "ok": "OK", "cancel": "Batal", "delete": "Padam" },
"common": { "save": "Simpan", "loading": "Memuatkan...", "error": "Ralat", "success": "Berjaya", "close": "Tutup", "yes": "Ya", "no": "Tidak" }
}
{
"header": { "title": "AISBF Dashboard", "help": "Hjelp", "docs": "Docs", "about": "Om", "license": "Lisens", "restart_server": "Start server på nytt", "logout": "Logg ut" },
"nav": { "overview": "Oversikt", "providers": "Leverandører", "rotations": "Rotasjoner", "autoselect": "Autovalg", "prompts": "Ledetekster", "analytics": "Analyse", "api_tokens": "API-tokens", "wallet": "Lommebok", "usage": "Bruk", "users": "Brukere", "settings": "Innstillinger", "tiers": "Nivåer", "payment_settings": "Betalinger", "upgrade": "✨ Oppgrader! ✨", "notifications": "Varsler", "account": "Konto" },
"account_menu": { "edit_profile": "Rediger profil", "api_tokens": "API-tokens", "cache_settings": "Cache-innstillinger", "subscription": "Abonnement", "wallet": "Lommebok", "billing": "Fakturering", "usage_quotas": "Bruk & Kvoter", "change_password": "Endre passord" },
"notifications": { "title": "Varsler", "mark_all_read": "Merk alle som lest", "refresh": "Oppdater", "no_notifications": "Ingen varsler", "just_now": "akkurat nå", "minutes_ago": "for {n}min siden", "hours_ago": "for {n}t siden", "days_ago": "for {n}d siden" },
"footer": { "support_development": "Støtt AISBF-utvikling", "privacy_policy": "Personvernpolicy", "terms_of_service": "Tjenestevilkår", "contact": "Kontakt" },
"donate": { "title": "Støtt AISBF", "thank_you": "Takk for at du vurderer en donasjon. Din støtte hjelper med å holde AISBF som helt åpen kildekode og gratis programvare.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Klikk på en adresse for å kopiere den", "copied": "Kopiert!" },
"welcome": { "title": "Velkommen til AISBF!", "early_adopter": "Takk for at du er en tidlig bruker! Vi er for øyeblikket i en intensiv utviklingsfase.", "may_encounter": "Du kan støte på feil, tjenesteavbrudd eller endringer.", "feedback": "Tilbakemeldingen din hjelper oss med å forbedre AISBF. Ikke nøl med å ta kontakt!", "send_feedback": "Send tilbakemelding", "got_it": "Forstått!" },
"contact": { "title": "Kontakt oss", "your_email": "Din e-post", "type": "Type", "select_type": "Velg type...", "bug_report": "Feilrapport", "feature_request": "Funksjonsforespørsel", "feedback": "Tilbakemelding", "question": "Spørsmål", "help": "Hjelp", "title_field": "Tittel", "title_placeholder": "Kort sammendrag av meldingen din", "message": "Melding", "message_placeholder": "Beskriv problemet eller forespørselen din i detalj...", "send_message": "Send melding", "cancel": "Avbryt", "sending": "Sender...", "success": "Melding sendt! Takk for tilbakemeldingen.", "error": "Feil: {error}", "network_error": "Nettverksfeil. Prøv igjen senere." },
"modal": { "notice": "Melding", "confirm": "Bekreft", "warning": "Advarsel", "ok": "OK", "cancel": "Avbryt", "delete": "Slett" },
"common": { "save": "Lagre", "loading": "Laster...", "error": "Feil", "success": "Suksess", "close": "Lukk", "yes": "Ja", "no": "Nei" }
}
{
"header": { "title": "AISBF Dashboard", "help": "Hulp", "docs": "Docs", "about": "Over", "license": "Licentie", "restart_server": "Server herstarten", "logout": "Uitloggen" },
"nav": { "overview": "Overzicht", "providers": "Providers", "rotations": "Rotaties", "autoselect": "Autoselectie", "prompts": "Prompts", "analytics": "Analyse", "api_tokens": "API-tokens", "wallet": "Portemonnee", "usage": "Gebruik", "users": "Gebruikers", "settings": "Instellingen", "tiers": "Niveaus", "payment_settings": "Betalingen", "upgrade": "✨ Upgraden! ✨", "notifications": "Meldingen", "account": "Account" },
"account_menu": { "edit_profile": "Profiel bewerken", "api_tokens": "API-tokens", "cache_settings": "Cache-instellingen", "subscription": "Abonnement", "wallet": "Portemonnee", "billing": "Facturering", "usage_quotas": "Gebruik & Quota's", "change_password": "Wachtwoord wijzigen" },
"notifications": { "title": "Meldingen", "mark_all_read": "Alles als gelezen markeren", "refresh": "Vernieuwen", "no_notifications": "Geen meldingen", "just_now": "zojuist", "minutes_ago": "{n}min geleden", "hours_ago": "{n}u geleden", "days_ago": "{n}d geleden" },
"footer": { "support_development": "AISBF-ontwikkeling ondersteunen", "privacy_policy": "Privacybeleid", "terms_of_service": "Servicevoorwaarden", "contact": "Contact" },
"donate": { "title": "AISBF ondersteunen", "thank_you": "Bedankt voor het overwegen van een donatie. Uw steun helpt AISBF als volledig open source en gratis software te behouden.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Klik op een adres om het te kopiëren", "copied": "Gekopieerd!" },
"welcome": { "title": "Welkom bij AISBF!", "early_adopter": "Bedankt voor het zijn van een vroege gebruiker! We bevinden ons momenteel in een intensieve ontwikkelingsfase.", "may_encounter": "U kunt bugs, serviceonderbrekingen of wijzigingen tegenkomen.", "feedback": "Uw feedback helpt ons AISBF te verbeteren. Aarzel niet om contact op te nemen!", "send_feedback": "Feedback sturen", "got_it": "Begrepen!" },
"contact": { "title": "Neem contact op", "your_email": "Uw e-mail", "type": "Type", "select_type": "Selecteer type...", "bug_report": "Bugrapport", "feature_request": "Functieverzoek", "feedback": "Feedback", "question": "Vraag", "help": "Hulp", "title_field": "Titel", "title_placeholder": "Korte samenvatting van uw bericht", "message": "Bericht", "message_placeholder": "Beschrijf uw probleem of verzoek in detail...", "send_message": "Bericht sturen", "cancel": "Annuleren", "sending": "Verzenden...", "success": "Bericht succesvol verzonden! Bedankt voor uw feedback.", "error": "Fout: {error}", "network_error": "Netwerkfout. Probeer het later opnieuw." },
"modal": { "notice": "Melding", "confirm": "Bevestigen", "warning": "Waarschuwing", "ok": "OK", "cancel": "Annuleren", "delete": "Verwijderen" },
"common": { "save": "Opslaan", "loading": "Laden...", "error": "Fout", "success": "Succes", "close": "Sluiten", "yes": "Ja", "no": "Nee" }
}
{
"header": { "title": "Panel AISBF", "help": "Pomoc", "docs": "Dokumentacja", "about": "O nas", "license": "Licencja", "restart_server": "Uruchom ponownie serwer", "logout": "Wyloguj" },
"nav": { "overview": "Przegląd", "providers": "Dostawcy", "rotations": "Rotacje", "autoselect": "Autoselect", "prompts": "Podpowiedzi", "analytics": "Analityka", "api_tokens": "Tokeny API", "wallet": "Portfel", "usage": "Użycie", "users": "Użytkownicy", "settings": "Ustawienia", "tiers": "Poziomy", "payment_settings": "Płatności", "upgrade": "✨ Ulepsz! ✨", "notifications": "Powiadomienia", "account": "Konto" },
"account_menu": { "edit_profile": "Edytuj profil", "api_tokens": "Tokeny API", "cache_settings": "Ustawienia pamięci podręcznej", "subscription": "Subskrypcja", "wallet": "Portfel", "billing": "Rozliczenia", "usage_quotas": "Użycie i limity", "change_password": "Zmień hasło" },
"notifications": { "title": "Powiadomienia", "mark_all_read": "Oznacz wszystkie jako przeczytane", "refresh": "Odśwież", "no_notifications": "Brak powiadomień", "just_now": "właśnie teraz", "minutes_ago": "{n}min temu", "hours_ago": "{n}h temu", "days_ago": "{n}d temu" },
"footer": { "support_development": "Wspieraj rozwój AISBF", "privacy_policy": "Polityka prywatności", "terms_of_service": "Warunki usługi", "contact": "Kontakt" },
"donate": { "title": "Wspieraj AISBF", "thank_you": "Dziękujemy za rozważenie darowizny. Twoje wsparcie pomaga utrzymać AISBF jako całkowicie otwartoźródłowe i darmowe oprogramowanie.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Kliknij dowolny adres, aby go skopiować", "copied": "Skopiowano!" },
"welcome": { "title": "Witamy w AISBF!", "early_adopter": "Dziękujemy za bycie wczesnym użytkownikiem! Jesteśmy w intensywnej fazie rozwoju.", "may_encounter": "Możesz napotkać błędy, przerwy w działaniu usługi lub zmiany.", "feedback": "Twoja opinia pomaga nam ulepszać AISBF. Nie wahaj się z nami skontaktować!", "send_feedback": "Wyślij opinię", "got_it": "Rozumiem!" },
"contact": { "title": "Skontaktuj się z nami", "your_email": "Twój e-mail", "type": "Typ", "select_type": "Wybierz typ...", "bug_report": "Zgłoszenie błędu", "feature_request": "Prośba o funkcję", "feedback": "Opinia", "question": "Pytanie", "help": "Pomoc", "title_field": "Tytuł", "title_placeholder": "Krótkie podsumowanie wiadomości", "message": "Wiadomość", "message_placeholder": "Opisz swój problem lub prośbę szczegółowo...", "send_message": "Wyślij wiadomość", "cancel": "Anuluj", "sending": "Wysyłanie...", "success": "Wiadomość wysłana pomyślnie! Dziękujemy za opinię.", "error": "Błąd: {error}", "network_error": "Błąd sieci. Spróbuj ponownie później." },
"modal": { "notice": "Powiadomienie", "confirm": "Potwierdź", "warning": "Ostrzeżenie", "ok": "OK", "cancel": "Anuluj", "delete": "Usuń" },
"common": { "save": "Zapisz", "loading": "Ładowanie...", "error": "Błąd", "success": "Sukces", "close": "Zamknij", "yes": "Tak", "no": "Nie" }
}
{
"header": { "title": "AISBF Dashboard", "help": "Ajuda", "docs": "Docs", "about": "Sobre", "license": "Licença", "restart_server": "Reiniciar servidor", "logout": "Sair" },
"nav": { "overview": "Visão geral", "providers": "Provedores", "rotations": "Rotações", "autoselect": "Autosseleção", "prompts": "Prompts", "analytics": "Análise", "api_tokens": "Tokens API", "wallet": "Carteira", "usage": "Uso", "users": "Usuários", "settings": "Configurações", "tiers": "Níveis", "payment_settings": "Pagamentos", "upgrade": "✨ Atualizar! ✨", "notifications": "Notificações", "account": "Conta" },
"account_menu": { "edit_profile": "Editar perfil", "api_tokens": "Tokens API", "cache_settings": "Configurações de cache", "subscription": "Assinatura", "wallet": "Carteira", "billing": "Faturamento", "usage_quotas": "Uso e cotas", "change_password": "Alterar senha" },
"notifications": { "title": "Notificações", "mark_all_read": "Marcar tudo como lido", "refresh": "Atualizar", "no_notifications": "Sem notificações", "just_now": "agora mesmo", "minutes_ago": "há {n}min", "hours_ago": "há {n}h", "days_ago": "há {n}d" },
"footer": { "support_development": "Apoiar o desenvolvimento do AISBF", "privacy_policy": "Política de privacidade", "terms_of_service": "Termos de serviço", "contact": "Contato" },
"donate": { "title": "Apoiar AISBF", "thank_you": "Obrigado por considerar uma doação. Seu apoio ajuda a manter o AISBF como software livre e de código aberto.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Clique em qualquer endereço para copiá-lo", "copied": "Copiado!" },
"welcome": { "title": "Bem-vindo ao AISBF!", "early_adopter": "Obrigado por ser um usuário inicial! Estamos em fase de desenvolvimento intensivo.", "may_encounter": "Você pode encontrar bugs ou interrupções de serviço.", "feedback": "Seu feedback nos ajuda a melhorar o AISBF. Não hesite em nos contatar!", "send_feedback": "Enviar feedback", "got_it": "Entendido!" },
"contact": { "title": "Fale conosco", "your_email": "Seu e-mail", "type": "Tipo", "select_type": "Selecionar tipo...", "bug_report": "Relatório de bug", "feature_request": "Solicitação de recurso", "feedback": "Feedback", "question": "Pergunta", "help": "Ajuda", "title_field": "Título", "title_placeholder": "Breve resumo da sua mensagem", "message": "Mensagem", "message_placeholder": "Descreva seu problema ou solicitação em detalhes...", "send_message": "Enviar mensagem", "cancel": "Cancelar", "sending": "Enviando...", "success": "Mensagem enviada com sucesso! Obrigado pelo seu feedback.", "error": "Erro: {error}", "network_error": "Erro de rede. Por favor, tente novamente mais tarde." },
"modal": { "notice": "Aviso", "confirm": "Confirmar", "warning": "Aviso", "ok": "OK", "cancel": "Cancelar", "delete": "Excluir" },
"common": { "save": "Salvar", "loading": "Carregando...", "error": "Erro", "success": "Sucesso", "close": "Fechar", "yes": "Sim", "no": "Não" }
}
{
"_note": "Quenya/Sindarin Elvish — fictional language from Tolkien's Lord of the Rings. Many technical terms have no Elvish equivalent and fall back to English.",
"header": { "title": "AISBF Palantír", "help": "Mára", "docs": "Parmar", "about": "Nó", "license": "Lestanen", "restart_server": "Restart Server", "logout": "Auta" },
"nav": { "overview": "Cenien", "providers": "Providers", "rotations": "Rotations", "autoselect": "Autoselect", "prompts": "Prompts", "analytics": "Analytics", "api_tokens": "API Tokens", "wallet": "Mírë", "usage": "Usage", "users": "Eleni", "settings": "Cantar", "tiers": "Tiers", "payment_settings": "Payment Settings", "upgrade": "✨ Ortë! ✨", "notifications": "Telpë", "account": "Nossë" },
"account_menu": { "edit_profile": "Cenda Nossë", "api_tokens": "API Tokens", "cache_settings": "Cache Settings", "subscription": "Subscription", "wallet": "Mírë", "billing": "Billing", "usage_quotas": "Usage & Quotas", "change_password": "Camta Tengwa" },
"notifications": { "title": "Telpë", "mark_all_read": "Cenda ilyë", "refresh": "Cuivë", "no_notifications": "Lá telpë", "just_now": "sí", "minutes_ago": "{n} lúmë", "hours_ago": "{n} ré", "days_ago": "{n} aure" },
"footer": { "support_development": "Auta AISBF", "privacy_policy": "Privacy Policy", "terms_of_service": "Terms of Service", "contact": "Maquenta" },
"donate": { "title": "Auta AISBF", "thank_you": "Hantanyel. Melmë lyen anta AISBF cuivëa ar lissë.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Tec i már ú-cenda", "copied": "Cendaina!" },
"welcome": { "title": "Aiya AISBF!", "early_adopter": "Hantanyel nó i minya eleni! Ná mardë i cuivëa.", "may_encounter": "Lerya quettar úcarë nó.", "feedback": "Quettalyë anta melmë AISBF. Maquenta ven!", "send_feedback": "Anta Quetta", "got_it": "Istanyel!" },
"contact": { "title": "Maquenta", "your_email": "Email", "type": "Nossë", "select_type": "Select type...", "bug_report": "Bug Report", "feature_request": "Feature Request", "feedback": "Quetta", "question": "Sac", "help": "Mára", "title_field": "Esse", "title_placeholder": "Brief summary", "message": "Quetta", "message_placeholder": "Describe your issue...", "send_message": "Anta Quetta", "cancel": "Ú-car", "sending": "Antëa...", "success": "Quetta antaina! Hantanyel.", "error": "Úcarë: {error}", "network_error": "Network error. Please try again later." },
"modal": { "notice": "Telpë", "confirm": "Námo", "warning": "Vórima", "ok": "Mára", "cancel": "Ú-car", "delete": "Heca" },
"common": { "save": "Harya", "loading": "Cuivëa...", "error": "Úcarë", "success": "Melmë", "close": "Panya", "yes": "Ná", "no": "Lá" }
}
{
"header": { "title": "AISBF Dashboard", "help": "Ajutor", "docs": "Docs", "about": "Despre", "license": "Licență", "restart_server": "Repornire server", "logout": "Deconectare" },
"nav": { "overview": "Prezentare generală", "providers": "Furnizori", "rotations": "Rotații", "autoselect": "Selecție automată", "prompts": "Prompturi", "analytics": "Analiză", "api_tokens": "Token-uri API", "wallet": "Portofel", "usage": "Utilizare", "users": "Utilizatori", "settings": "Setări", "tiers": "Niveluri", "payment_settings": "Plăți", "upgrade": "✨ Actualizare! ✨", "notifications": "Notificări", "account": "Cont" },
"account_menu": { "edit_profile": "Editare profil", "api_tokens": "Token-uri API", "cache_settings": "Setări cache", "subscription": "Abonament", "wallet": "Portofel", "billing": "Facturare", "usage_quotas": "Utilizare și cote", "change_password": "Schimbare parolă" },
"notifications": { "title": "Notificări", "mark_all_read": "Marchează toate ca citite", "refresh": "Reîmprospătare", "no_notifications": "Fără notificări", "just_now": "chiar acum", "minutes_ago": "acum {n}min", "hours_ago": "acum {n}h", "days_ago": "acum {n}z" },
"footer": { "support_development": "Susțineți dezvoltarea AISBF", "privacy_policy": "Politica de confidențialitate", "terms_of_service": "Termeni de serviciu", "contact": "Contact" },
"donate": { "title": "Susțineți AISBF", "thank_you": "Vă mulțumim că luați în considerare o donație. Sprijinul dvs. ajută la menținerea AISBF ca software complet open source și gratuit.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Faceți clic pe orice adresă pentru a o copia", "copied": "Copiat!" },
"welcome": { "title": "Bun venit la AISBF!", "early_adopter": "Vă mulțumim că sunteți un utilizator timpuriu! Suntem în prezent în faza de dezvoltare intensivă.", "may_encounter": "Puteți întâlni erori, întreruperi de serviciu sau modificări.", "feedback": "Feedback-ul dvs. ne ajută să îmbunătățim AISBF. Nu ezitați să ne contactați!", "send_feedback": "Trimite feedback", "got_it": "Am înțeles!" },
"contact": { "title": "Contactați-ne", "your_email": "E-mailul dvs.", "type": "Tip", "select_type": "Selectați tipul...", "bug_report": "Raport de eroare", "feature_request": "Solicitare funcție", "feedback": "Feedback", "question": "Întrebare", "help": "Ajutor", "title_field": "Titlu", "title_placeholder": "Scurt rezumat al mesajului dvs.", "message": "Mesaj", "message_placeholder": "Descrieți problema sau solicitarea dvs. în detaliu...", "send_message": "Trimite mesaj", "cancel": "Anulare", "sending": "Se trimite...", "success": "Mesaj trimis cu succes! Vă mulțumim pentru feedback.", "error": "Eroare: {error}", "network_error": "Eroare de rețea. Vă rugăm să încercați din nou mai târziu." },
"modal": { "notice": "Notificare", "confirm": "Confirmare", "warning": "Avertisment", "ok": "OK", "cancel": "Anulare", "delete": "Ștergere" },
"common": { "save": "Salvare", "loading": "Se încarcă...", "error": "Eroare", "success": "Succes", "close": "Închidere", "yes": "Da", "no": "Nu" }
}
{
"header": { "title": "AISBF Dashboard", "help": "Помощь", "docs": "Docs", "about": "О нас", "license": "Лицензия", "restart_server": "Перезапустить сервер", "logout": "Выйти" },
"nav": { "overview": "Обзор", "providers": "Провайдеры", "rotations": "Ротации", "autoselect": "Автовыбор", "prompts": "Запросы", "analytics": "Аналитика", "api_tokens": "API-токены", "wallet": "Кошелёк", "usage": "Использование", "users": "Пользователи", "settings": "Настройки", "tiers": "Уровни", "payment_settings": "Платежи", "upgrade": "✨ Улучшить! ✨", "notifications": "Уведомления", "account": "Аккаунт" },
"account_menu": { "edit_profile": "Редактировать профиль", "api_tokens": "API-токены", "cache_settings": "Настройки кэша", "subscription": "Подписка", "wallet": "Кошелёк", "billing": "Выставление счетов", "usage_quotas": "Использование и квоты", "change_password": "Изменить пароль" },
"notifications": { "title": "Уведомления", "mark_all_read": "Отметить все как прочитанные", "refresh": "Обновить", "no_notifications": "Нет уведомлений", "just_now": "только что", "minutes_ago": "{n}мин назад", "hours_ago": "{n}ч назад", "days_ago": "{n}д назад" },
"footer": { "support_development": "Поддержать разработку AISBF", "privacy_policy": "Политика конфиденциальности", "terms_of_service": "Условия использования", "contact": "Контакт" },
"donate": { "title": "Поддержать AISBF", "thank_you": "Спасибо за рассмотрение пожертвования. Ваша поддержка помогает поддерживать AISBF как свободное программное обеспечение.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Нажмите на адрес, чтобы скопировать его", "copied": "Скопировано!" },
"welcome": { "title": "Добро пожаловать в AISBF!", "early_adopter": "Спасибо, что вы ранний пользователь! Мы находимся в фазе интенсивной разработки.", "may_encounter": "Вы можете столкнуться с ошибками или перебоями в работе сервиса.", "feedback": "Ваши отзывы помогают нам улучшать AISBF. Не стесняйтесь обращаться к нам!", "send_feedback": "Отправить отзыв", "got_it": "Понятно!" },
"contact": { "title": "Связаться с нами", "your_email": "Ваш e-mail", "type": "Тип", "select_type": "Выберите тип...", "bug_report": "Сообщение об ошибке", "feature_request": "Запрос функции", "feedback": "Отзыв", "question": "Вопрос", "help": "Помощь", "title_field": "Заголовок", "title_placeholder": "Краткое описание вашего сообщения", "message": "Сообщение", "message_placeholder": "Опишите вашу проблему или запрос подробно...", "send_message": "Отправить сообщение", "cancel": "Отмена", "sending": "Отправка...", "success": "Сообщение успешно отправлено! Спасибо за ваш отзыв.", "error": "Ошибка: {error}", "network_error": "Ошибка сети. Пожалуйста, попробуйте позже." },
"modal": { "notice": "Уведомление", "confirm": "Подтвердить", "warning": "Предупреждение", "ok": "OK", "cancel": "Отмена", "delete": "Удалить" },
"common": { "save": "Сохранить", "loading": "Загрузка...", "error": "Ошибка", "success": "Успех", "close": "Закрыть", "yes": "Да", "no": "Нет" }
}
{
"header": { "title": "AISBF Dashboard", "help": "Pomoc", "docs": "Docs", "about": "O nás", "license": "Licencia", "restart_server": "Reštartovať server", "logout": "Odhlásiť" },
"nav": { "overview": "Prehľad", "providers": "Poskytovatelia", "rotations": "Rotácie", "autoselect": "Automatický výber", "prompts": "Výzvy", "analytics": "Analytika", "api_tokens": "API tokeny", "wallet": "Peňaženka", "usage": "Využitie", "users": "Používatelia", "settings": "Nastavenia", "tiers": "Úrovne", "payment_settings": "Platby", "upgrade": "✨ Upgradovať! ✨", "notifications": "Oznámenia", "account": "Účet" },
"account_menu": { "edit_profile": "Upraviť profil", "api_tokens": "API tokeny", "cache_settings": "Nastavenia vyrovnávacej pamäte", "subscription": "Predplatné", "wallet": "Peňaženka", "billing": "Fakturácia", "usage_quotas": "Využitie a kvóty", "change_password": "Zmeniť heslo" },
"notifications": { "title": "Oznámenia", "mark_all_read": "Označiť všetko ako prečítané", "refresh": "Obnoviť", "no_notifications": "Žiadne oznámenia", "just_now": "práve teraz", "minutes_ago": "pred {n}min", "hours_ago": "pred {n}h", "days_ago": "pred {n}d" },
"footer": { "support_development": "Podporte vývoj AISBF", "privacy_policy": "Zásady ochrany osobných údajov", "terms_of_service": "Podmienky služby", "contact": "Kontakt" },
"donate": { "title": "Podporte AISBF", "thank_you": "Ďakujeme za zváženie daru. Vaša podpora pomáha udržiavať AISBF ako úplne open source a bezplatný softvér.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Kliknutím na adresu ju skopírujete", "copied": "Skopírované!" },
"welcome": { "title": "Vitajte v AISBF!", "early_adopter": "Ďakujeme, že ste skorým používateľom! Momentálne sme v intenzívnej vývojovej fáze.", "may_encounter": "Môžete naraziť na chyby, výpadky služby alebo zmeny.", "feedback": "Vaša spätná väzba nám pomáha zlepšovať AISBF. Neváhajte nás kontaktovať!", "send_feedback": "Odoslať spätnú väzbu", "got_it": "Rozumiem!" },
"contact": { "title": "Kontaktujte nás", "your_email": "Váš e-mail", "type": "Typ", "select_type": "Vyberte typ...", "bug_report": "Hlásenie chyby", "feature_request": "Žiadosť o funkciu", "feedback": "Spätná väzba", "question": "Otázka", "help": "Pomoc", "title_field": "Názov", "title_placeholder": "Stručné zhrnutie vašej správy", "message": "Správa", "message_placeholder": "Popíšte svoj problém alebo žiadosť podrobne...", "send_message": "Odoslať správu", "cancel": "Zrušiť", "sending": "Odosielanie...", "success": "Správa úspešne odoslaná! Ďakujeme za spätnú väzbu.", "error": "Chyba: {error}", "network_error": "Chyba siete. Skúste to prosím znova." },
"modal": { "notice": "Oznámenie", "confirm": "Potvrdiť", "warning": "Varovanie", "ok": "OK", "cancel": "Zrušiť", "delete": "Zmazať" },
"common": { "save": "Uložiť", "loading": "Načítavanie...", "error": "Chyba", "success": "Úspech", "close": "Zavrieť", "yes": "Áno", "no": "Nie" }
}
{
"header": { "title": "AISBF Dashboard", "help": "Hjälp", "docs": "Docs", "about": "Om", "license": "Licens", "restart_server": "Starta om servern", "logout": "Logga ut" },
"nav": { "overview": "Översikt", "providers": "Leverantörer", "rotations": "Rotationer", "autoselect": "Autoval", "prompts": "Uppmaningar", "analytics": "Analys", "api_tokens": "API-tokens", "wallet": "Plånbok", "usage": "Användning", "users": "Användare", "settings": "Inställningar", "tiers": "Nivåer", "payment_settings": "Betalningar", "upgrade": "✨ Uppgradera! ✨", "notifications": "Aviseringar", "account": "Konto" },
"account_menu": { "edit_profile": "Redigera profil", "api_tokens": "API-tokens", "cache_settings": "Cacheinställningar", "subscription": "Prenumeration", "wallet": "Plånbok", "billing": "Fakturering", "usage_quotas": "Användning & Kvoter", "change_password": "Byt lösenord" },
"notifications": { "title": "Aviseringar", "mark_all_read": "Markera alla som lästa", "refresh": "Uppdatera", "no_notifications": "Inga aviseringar", "just_now": "just nu", "minutes_ago": "för {n}min sedan", "hours_ago": "för {n}h sedan", "days_ago": "för {n}d sedan" },
"footer": { "support_development": "Stöd AISBF-utvecklingen", "privacy_policy": "Integritetspolicy", "terms_of_service": "Användarvillkor", "contact": "Kontakt" },
"donate": { "title": "Stöd AISBF", "thank_you": "Tack för att du överväger en donation. Ditt stöd hjälper till att hålla AISBF som helt öppen källkod och gratis programvara.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Klicka på en adress för att kopiera den", "copied": "Kopierat!" },
"welcome": { "title": "Välkommen till AISBF!", "early_adopter": "Tack för att du är en tidig användare! Vi befinner oss för närvarande i en intensiv utvecklingsfas.", "may_encounter": "Du kan stöta på buggar, tjänstavbrott eller ändringar.", "feedback": "Din feedback hjälper oss att förbättra AISBF. Tveka inte att höra av dig!", "send_feedback": "Skicka feedback", "got_it": "Förstått!" },
"contact": { "title": "Kontakta oss", "your_email": "Din e-post", "type": "Typ", "select_type": "Välj typ...", "bug_report": "Felrapport", "feature_request": "Funktionsförfrågan", "feedback": "Feedback", "question": "Fråga", "help": "Hjälp", "title_field": "Titel", "title_placeholder": "Kort sammanfattning av ditt meddelande", "message": "Meddelande", "message_placeholder": "Beskriv ditt problem eller din förfrågan i detalj...", "send_message": "Skicka meddelande", "cancel": "Avbryt", "sending": "Skickar...", "success": "Meddelandet skickades! Tack för din feedback.", "error": "Fel: {error}", "network_error": "Nätverksfel. Försök igen senare." },
"modal": { "notice": "Meddelande", "confirm": "Bekräfta", "warning": "Varning", "ok": "OK", "cancel": "Avbryt", "delete": "Ta bort" },
"common": { "save": "Spara", "loading": "Laddar...", "error": "Fel", "success": "Framgång", "close": "Stäng", "yes": "Ja", "no": "Nej" }
}
{
"header": { "title": "แดชบอร์ด AISBF", "help": "ช่วยเหลือ", "docs": "เอกสาร", "about": "เกี่ยวกับ", "license": "ใบอนุญาต", "restart_server": "รีสตาร์ทเซิร์ฟเวอร์", "logout": "ออกจากระบบ" },
"nav": { "overview": "ภาพรวม", "providers": "ผู้ให้บริการ", "rotations": "การหมุนเวียน", "autoselect": "เลือกอัตโนมัติ", "prompts": "พรอมต์", "analytics": "การวิเคราะห์", "api_tokens": "โทเค็น API", "wallet": "กระเป๋าเงิน", "usage": "การใช้งาน", "users": "ผู้ใช้", "settings": "การตั้งค่า", "tiers": "ระดับ", "payment_settings": "การชำระเงิน", "upgrade": "✨ อัปเกรด! ✨", "notifications": "การแจ้งเตือน", "account": "บัญชี" },
"account_menu": { "edit_profile": "แก้ไขโปรไฟล์", "api_tokens": "โทเค็น API", "cache_settings": "การตั้งค่าแคช", "subscription": "การสมัครสมาชิก", "wallet": "กระเป๋าเงิน", "billing": "การเรียกเก็บเงิน", "usage_quotas": "การใช้งานและโควต้า", "change_password": "เปลี่ยนรหัสผ่าน" },
"notifications": { "title": "การแจ้งเตือน", "mark_all_read": "ทำเครื่องหมายทั้งหมดว่าอ่านแล้ว", "refresh": "รีเฟรช", "no_notifications": "ไม่มีการแจ้งเตือน", "just_now": "เมื่อสักครู่", "minutes_ago": "{n} นาทีที่แล้ว", "hours_ago": "{n} ชั่วโมงที่แล้ว", "days_ago": "{n} วันที่แล้ว" },
"footer": { "support_development": "สนับสนุนการพัฒนา AISBF", "privacy_policy": "นโยบายความเป็นส่วนตัว", "terms_of_service": "เงื่อนไขการให้บริการ", "contact": "ติดต่อ" },
"donate": { "title": "สนับสนุน AISBF", "thank_you": "ขอบคุณที่พิจารณาบริจาค การสนับสนุนของคุณช่วยรักษา AISBF ให้เป็นซอฟต์แวร์โอเพนซอร์สและฟรีอย่างสมบูรณ์", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "คลิกที่อยู่ใดก็ได้เพื่อคัดลอก", "copied": "คัดลอกแล้ว!" },
"welcome": { "title": "ยินดีต้อนรับสู่ AISBF!", "early_adopter": "ขอบคุณที่เป็นผู้ใช้งานรุ่นแรก! ขณะนี้เราอยู่ในช่วงการพัฒนาอย่างเข้มข้น", "may_encounter": "คุณอาจพบข้อบกพร่อง การหยุดชะงักของบริการ หรือการเปลี่ยนแปลง", "feedback": "ความคิดเห็นของคุณช่วยให้เราทำให้ AISBF ดีขึ้น อย่าลังเลที่จะติดต่อเรา!", "send_feedback": "ส่งความคิดเห็น", "got_it": "เข้าใจแล้ว!" },
"contact": { "title": "ติดต่อเรา", "your_email": "อีเมลของคุณ", "type": "ประเภท", "select_type": "เลือกประเภท...", "bug_report": "รายงานข้อบกพร่อง", "feature_request": "ขอคุณสมบัติ", "feedback": "ความคิดเห็น", "question": "คำถาม", "help": "ช่วยเหลือ", "title_field": "หัวข้อ", "title_placeholder": "สรุปสั้นๆ ของข้อความของคุณ", "message": "ข้อความ", "message_placeholder": "อธิบายปัญหาหรือคำขอของคุณโดยละเอียด...", "send_message": "ส่งข้อความ", "cancel": "ยกเลิก", "sending": "กำลังส่ง...", "success": "ส่งข้อความสำเร็จ! ขอบคุณสำหรับความคิดเห็นของคุณ", "error": "ข้อผิดพลาด: {error}", "network_error": "ข้อผิดพลาดเครือข่าย โปรดลองอีกครั้งในภายหลัง" },
"modal": { "notice": "ประกาศ", "confirm": "ยืนยัน", "warning": "คำเตือน", "ok": "ตกลง", "cancel": "ยกเลิก", "delete": "ลบ" },
"common": { "save": "บันทึก", "loading": "กำลังโหลด...", "error": "ข้อผิดพลาด", "success": "สำเร็จ", "close": "ปิด", "yes": "ใช่", "no": "ไม่" }
}
{
"_note": "Klingon (tlhIngan Hol) — fictional language from Star Trek. Technical terms without Klingon equivalents fall back to English.",
"header": { "title": "AISBF HaSta", "help": "QaH", "docs": "ghItlh", "about": "nuq", "license": "chaw'", "restart_server": "HaSta yIchoH", "logout": "mej" },
"nav": { "overview": "legh", "providers": "Providers", "rotations": "Rotations", "autoselect": "Autoselect", "prompts": "Prompts", "analytics": "Analytics", "api_tokens": "API Tokens", "wallet": "Huch", "usage": "lo'", "users": "nuv", "settings": "nab", "tiers": "Tiers", "payment_settings": "Huch nab", "upgrade": "✨ HoS! ✨", "notifications": "QIn", "account": "pong" },
"account_menu": { "edit_profile": "pong tI'", "api_tokens": "API Tokens", "cache_settings": "Cache Settings", "subscription": "Subscription", "wallet": "Huch", "billing": "Billing", "usage_quotas": "lo' & Quotas", "change_password": "mung lI' tI'" },
"notifications": { "title": "QIn", "mark_all_read": "Hoch laDlu'", "refresh": "chu' ghoS", "no_notifications": "QIn tu'be'lu'", "just_now": "DaH", "minutes_ago": "{n} tup ret", "hours_ago": "{n} rep ret", "days_ago": "{n} jaj ret" },
"footer": { "support_development": "AISBF yIQaH", "privacy_policy": "Privacy Policy", "terms_of_service": "Terms of Service", "contact": "jatlh" },
"donate": { "title": "AISBF yIQaH", "thank_you": "qatlho'. bIQaHmo' AISBF yIn.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "nav yItap cha'", "copied": "taplu'!" },
"welcome": { "title": "AISBF yIghoS!", "early_adopter": "qatlho' wa'DIch lo'wI'pu'. maQap!", "may_encounter": "Qagh DaghomlaH.", "feedback": "mu'meylIj AISBF QaH. HIjatlh!", "send_feedback": "QIn yIlI'", "got_it": "jISov!" },
"contact": { "title": "HIjatlh", "your_email": "Email", "type": "Segh", "select_type": "Select type...", "bug_report": "Qagh QIn", "feature_request": "Feature Request", "feedback": "mu'mey", "question": "ghel", "help": "QaH", "title_field": "pong", "title_placeholder": "Brief summary", "message": "QIn", "message_placeholder": "Describe your issue...", "send_message": "QIn yIlI'", "cancel": "yImev", "sending": "lI'taH...", "success": "QIn lI'lu'! qatlho'.", "error": "Qagh: {error}", "network_error": "Network error. Please try again later." },
"modal": { "notice": "QIn", "confirm": "HIja'", "warning": "yIjach", "ok": "lu'", "cancel": "yImev", "delete": "teH" },
"common": { "save": "choq", "loading": "ngeD...", "error": "Qagh", "success": "Qap", "close": "SoQ", "yes": "HIja'", "no": "ghobe'" }
}
{
"header": { "title": "AISBF Pano", "help": "Yardım", "docs": "Belgeler", "about": "Hakkında", "license": "Lisans", "restart_server": "Sunucuyu Yeniden Başlat", "logout": "Çıkış" },
"nav": { "overview": "Genel Bakış", "providers": "Sağlayıcılar", "rotations": "Rotasyonlar", "autoselect": "Otomatik Seçim", "prompts": "İstemler", "analytics": "Analitik", "api_tokens": "API Tokenları", "wallet": "Cüzdan", "usage": "Kullanım", "users": "Kullanıcılar", "settings": "Ayarlar", "tiers": "Katmanlar", "payment_settings": "Ödeme Ayarları", "upgrade": "✨ Yükselt! ✨", "notifications": "Bildirimler", "account": "Hesap" },
"account_menu": { "edit_profile": "Profili Düzenle", "api_tokens": "API Tokenları", "cache_settings": "Önbellek Ayarları", "subscription": "Abonelik", "wallet": "Cüzdan", "billing": "Faturalama", "usage_quotas": "Kullanım ve Kotalar", "change_password": "Şifre Değiştir" },
"notifications": { "title": "Bildirimler", "mark_all_read": "Tümünü okundu işaretle", "refresh": "Yenile", "no_notifications": "Bildirim yok", "just_now": "şimdi", "minutes_ago": "{n}dk önce", "hours_ago": "{n}sa önce", "days_ago": "{n}g önce" },
"footer": { "support_development": "AISBF Geliştirmesini Destekle", "privacy_policy": "Gizlilik Politikası", "terms_of_service": "Hizmet Şartları", "contact": "İletişim" },
"donate": { "title": "AISBF'yi Destekle", "thank_you": "Bağış yapmayı düşündüğünüz için teşekkürler. Desteğiniz AISBF'nin tamamen açık kaynak ve ücretsiz yazılım olarak kalmasına yardımcı olur.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Kopyalamak için herhangi bir adrese tıklayın", "copied": "Kopyalandı!" },
"welcome": { "title": "AISBF'ye Hoş Geldiniz!", "early_adopter": "Erken benimseyici olduğunuz için teşekkürler! Şu anda yoğun geliştirme aşamasındayız.", "may_encounter": "Hatalar, hizmet kesintileri veya değişikliklerle karşılaşabilirsiniz.", "feedback": "Geri bildiriminiz AISBF'yi daha iyi yapmamıza yardımcı olur. Bize ulaşmaktan çekinmeyin!", "send_feedback": "Geri Bildirim Gönder", "got_it": "Anladım!" },
"contact": { "title": "Bize Ulaşın", "your_email": "E-postanız", "type": "Tür", "select_type": "Tür seçin...", "bug_report": "Hata Raporu", "feature_request": "Özellik İsteği", "feedback": "Geri Bildirim", "question": "Soru", "help": "Yardım", "title_field": "Başlık", "title_placeholder": "Mesajınızın kısa özeti", "message": "Mesaj", "message_placeholder": "Sorununuzu veya isteğinizi ayrıntılı olarak açıklayın...", "send_message": "Mesaj Gönder", "cancel": "İptal", "sending": "Gönderiliyor...", "success": "Mesaj başarıyla gönderildi! Geri bildiriminiz için teşekkürler.", "error": "Hata: {error}", "network_error": "Ağ hatası. Lütfen daha sonra tekrar deneyin." },
"modal": { "notice": "Bildirim", "confirm": "Onayla", "warning": "Uyarı", "ok": "Tamam", "cancel": "İptal", "delete": "Sil" },
"common": { "save": "Kaydet", "loading": "Yükleniyor...", "error": "Hata", "success": "Başarı", "close": "Kapat", "yes": "Evet", "no": "Hayır" }
}
{
"header": { "title": "AISBF Dashboard", "help": "Допомога", "docs": "Docs", "about": "Про нас", "license": "Ліцензія", "restart_server": "Перезапустити сервер", "logout": "Вийти" },
"nav": { "overview": "Огляд", "providers": "Провайдери", "rotations": "Ротації", "autoselect": "Автовибір", "prompts": "Запити", "analytics": "Аналітика", "api_tokens": "API-токени", "wallet": "Гаманець", "usage": "Використання", "users": "Користувачі", "settings": "Налаштування", "tiers": "Рівні", "payment_settings": "Платежі", "upgrade": "✨ Оновити! ✨", "notifications": "Сповіщення", "account": "Акаунт" },
"account_menu": { "edit_profile": "Редагувати профіль", "api_tokens": "API-токени", "cache_settings": "Налаштування кешу", "subscription": "Підписка", "wallet": "Гаманець", "billing": "Виставлення рахунків", "usage_quotas": "Використання та квоти", "change_password": "Змінити пароль" },
"notifications": { "title": "Сповіщення", "mark_all_read": "Позначити всі як прочитані", "refresh": "Оновити", "no_notifications": "Немає сповіщень", "just_now": "щойно", "minutes_ago": "{n}хв тому", "hours_ago": "{n}год тому", "days_ago": "{n}д тому" },
"footer": { "support_development": "Підтримати розробку AISBF", "privacy_policy": "Політика конфіденційності", "terms_of_service": "Умови використання", "contact": "Контакт" },
"donate": { "title": "Підтримати AISBF", "thank_you": "Дякуємо за розгляд пожертви. Ваша підтримка допомагає підтримувати AISBF як повністю відкрите та безкоштовне програмне забезпечення.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Натисніть на адресу, щоб скопіювати її", "copied": "Скопійовано!" },
"welcome": { "title": "Ласкаво просимо до AISBF!", "early_adopter": "Дякуємо, що ви ранній користувач! Ми зараз перебуваємо у фазі інтенсивної розробки.", "may_encounter": "Ви можете зіткнутися з помилками або перебоями в роботі сервісу.", "feedback": "Ваші відгуки допомагають нам покращувати AISBF. Не соромтеся звертатися до нас!", "send_feedback": "Надіслати відгук", "got_it": "Зрозуміло!" },
"contact": { "title": "Зв'яжіться з нами", "your_email": "Ваш e-mail", "type": "Тип", "select_type": "Виберіть тип...", "bug_report": "Повідомлення про помилку", "feature_request": "Запит функції", "feedback": "Відгук", "question": "Питання", "help": "Допомога", "title_field": "Заголовок", "title_placeholder": "Короткий опис вашого повідомлення", "message": "Повідомлення", "message_placeholder": "Опишіть вашу проблему або запит детально...", "send_message": "Надіслати повідомлення", "cancel": "Скасувати", "sending": "Надсилання...", "success": "Повідомлення успішно надіслано! Дякуємо за ваш відгук.", "error": "Помилка: {error}", "network_error": "Помилка мережі. Будь ласка, спробуйте пізніше." },
"modal": { "notice": "Сповіщення", "confirm": "Підтвердити", "warning": "Попередження", "ok": "OK", "cancel": "Скасувати", "delete": "Видалити" },
"common": { "save": "Зберегти", "loading": "Завантаження...", "error": "Помилка", "success": "Успіх", "close": "Закрити", "yes": "Так", "no": "Ні" }
}
{
"header": { "title": "Bảng điều khiển AISBF", "help": "Trợ giúp", "docs": "Tài liệu", "about": "Giới thiệu", "license": "Giấy phép", "restart_server": "Khởi động lại máy chủ", "logout": "Đăng xuất" },
"nav": { "overview": "Tổng quan", "providers": "Nhà cung cấp", "rotations": "Luân chuyển", "autoselect": "Tự động chọn", "prompts": "Lời nhắc", "analytics": "Phân tích", "api_tokens": "Token API", "wallet": "Ví", "usage": "Sử dụng", "users": "Người dùng", "settings": "Cài đặt", "tiers": "Cấp độ", "payment_settings": "Thanh toán", "upgrade": "✨ Nâng cấp! ✨", "notifications": "Thông báo", "account": "Tài khoản" },
"account_menu": { "edit_profile": "Chỉnh sửa hồ sơ", "api_tokens": "Token API", "cache_settings": "Cài đặt bộ nhớ đệm", "subscription": "Đăng ký", "wallet": "Ví", "billing": "Thanh toán", "usage_quotas": "Sử dụng & Hạn ngạch", "change_password": "Đổi mật khẩu" },
"notifications": { "title": "Thông báo", "mark_all_read": "Đánh dấu tất cả đã đọc", "refresh": "Làm mới", "no_notifications": "Không có thông báo", "just_now": "vừa xong", "minutes_ago": "{n} phút trước", "hours_ago": "{n} giờ trước", "days_ago": "{n} ngày trước" },
"footer": { "support_development": "Hỗ trợ phát triển AISBF", "privacy_policy": "Chính sách bảo mật", "terms_of_service": "Điều khoản dịch vụ", "contact": "Liên hệ" },
"donate": { "title": "Hỗ trợ AISBF", "thank_you": "Cảm ơn bạn đã xem xét quyên góp. Sự hỗ trợ của bạn giúp duy trì AISBF như một phần mềm mã nguồn mở và miễn phí hoàn toàn.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Nhấp vào bất kỳ địa chỉ nào để sao chép", "copied": "Đã sao chép!" },
"welcome": { "title": "Chào mừng đến với AISBF!", "early_adopter": "Cảm ơn bạn đã là người dùng sớm! Chúng tôi hiện đang trong giai đoạn phát triển chuyên sâu.", "may_encounter": "Bạn có thể gặp lỗi, gián đoạn dịch vụ hoặc thay đổi.", "feedback": "Phản hồi của bạn giúp chúng tôi cải thiện AISBF. Đừng ngần ngại liên hệ!", "send_feedback": "Gửi phản hồi", "got_it": "Đã hiểu!" },
"contact": { "title": "Liên hệ với chúng tôi", "your_email": "Email của bạn", "type": "Loại", "select_type": "Chọn loại...", "bug_report": "Báo cáo lỗi", "feature_request": "Yêu cầu tính năng", "feedback": "Phản hồi", "question": "Câu hỏi", "help": "Trợ giúp", "title_field": "Tiêu đề", "title_placeholder": "Tóm tắt ngắn gọn tin nhắn của bạn", "message": "Tin nhắn", "message_placeholder": "Mô tả chi tiết vấn đề hoặc yêu cầu của bạn...", "send_message": "Gửi tin nhắn", "cancel": "Hủy", "sending": "Đang gửi...", "success": "Tin nhắn đã được gửi thành công! Cảm ơn phản hồi của bạn.", "error": "Lỗi: {error}", "network_error": "Lỗi mạng. Vui lòng thử lại sau." },
"modal": { "notice": "Thông báo", "confirm": "Xác nhận", "warning": "Cảnh báo", "ok": "OK", "cancel": "Hủy", "delete": "Xóa" },
"common": { "save": "Lưu", "loading": "Đang tải...", "error": "Lỗi", "success": "Thành công", "close": "Đóng", "yes": "Có", "no": "Không" }
}
{
"_note": "Vulcan — fictional language from Star Trek. Many technical terms have no Vulcan equivalent and fall back to English.",
"header": { "title": "AISBF t'Veh", "help": "Ek'tra", "docs": "Veh-kur", "about": "Ri'nah", "license": "Sochya", "restart_server": "Restart Server", "logout": "Ek'tra-tor" },
"nav": { "overview": "Kol-ut-shan", "providers": "Providers", "rotations": "Rotations", "autoselect": "Autoselect", "prompts": "Prompts", "analytics": "Analytics", "api_tokens": "API Tokens", "wallet": "Kash-naf", "usage": "Ek'naf", "users": "Vuhlkansu", "settings": "Sochya-tor", "tiers": "Tiers", "payment_settings": "Payment Settings", "upgrade": "✨ Ek'naf! ✨", "notifications": "Veh-tor", "account": "Katra" },
"account_menu": { "edit_profile": "Katra t'Veh", "api_tokens": "API Tokens", "cache_settings": "Cache Settings", "subscription": "Subscription", "wallet": "Kash-naf", "billing": "Billing", "usage_quotas": "Usage & Quotas", "change_password": "Sochya-tor Kash" },
"notifications": { "title": "Veh-tor", "mark_all_read": "Kol-ut veh", "refresh": "Ek'tra", "no_notifications": "Ri veh-tor", "just_now": "Sochya", "minutes_ago": "{n} reh", "hours_ago": "{n} kah", "days_ago": "{n} sarlah" },
"footer": { "support_development": "Ek'tra AISBF", "privacy_policy": "Privacy Policy", "terms_of_service": "Terms of Service", "contact": "Veh-tor" },
"donate": { "title": "Ek'tra AISBF", "thank_you": "Nam-tor. Ek'traik AISBF sochya t'du.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Kash t'veh ek'tra", "copied": "Ek'traik!" },
"welcome": { "title": "Sochya AISBF!", "early_adopter": "Nam-tor t'du wa'reh vuhlkansu. Sochya.", "may_encounter": "Ri'nah t'veh ek'naf.", "feedback": "Veh-tor t'du ek'tra AISBF. Veh-tor!", "send_feedback": "Veh-tor Ek'tra", "got_it": "Sochya!" },
"contact": { "title": "Veh-tor", "your_email": "Email", "type": "Kol", "select_type": "Select type...", "bug_report": "Bug Report", "feature_request": "Feature Request", "feedback": "Veh-tor", "question": "Ri'nah", "help": "Ek'tra", "title_field": "Kol-ut", "title_placeholder": "Brief summary", "message": "Veh-tor", "message_placeholder": "Describe your issue...", "send_message": "Veh-tor Ek'tra", "cancel": "Ri-tor", "sending": "Ek'traik...", "success": "Veh-tor ek'traik! Nam-tor.", "error": "Ri'nah: {error}", "network_error": "Network error. Please try again later." },
"modal": { "notice": "Veh-tor", "confirm": "Sochya", "warning": "Ri'nah", "ok": "Nam-tor", "cancel": "Ri-tor", "delete": "Ek'naf" },
"common": { "save": "Kol-ut", "loading": "Ek'traik...", "error": "Ri'nah", "success": "Sochya", "close": "Ri-tor", "yes": "Sochya", "no": "Ri" }
}
{
"header": { "title": "AISBF Dashboard", "help": "Uncedo", "docs": "Amaxwebhu", "about": "Malunga", "license": "Ilayisensi", "restart_server": "Qala kwakhona iseva", "logout": "Phuma" },
"nav": { "overview": "Uhlobo olufutshane", "providers": "Abanikezeli", "rotations": "Ukujikeleza", "autoselect": "Khetha ngokuzenzekela", "prompts": "Izikhokelo", "analytics": "Uhlalutyo", "api_tokens": "Amatokeni e-API", "wallet": "Isikhwama", "usage": "Ukusetyenziswa", "users": "Abasebenzisi", "settings": "Izicwangciso", "tiers": "Amazinga", "payment_settings": "Intlawulo", "upgrade": "✨ Phakamisa! ✨", "notifications": "Izaziso", "account": "I-akhawunti" },
"account_menu": { "edit_profile": "Hlela iprofayile", "api_tokens": "Amatokeni e-API", "cache_settings": "Izicwangciso ze-cache", "subscription": "Ukubhalisa", "wallet": "Isikhwama", "billing": "Iinvoisi", "usage_quotas": "Ukusetyenziswa neekwota", "change_password": "Tshintsha igama lokugqitha" },
"notifications": { "title": "Izaziso", "mark_all_read": "Phawula konke njengokufundiweyo", "refresh": "Hlaziya", "no_notifications": "Azikho izaziso", "just_now": "ngoku nje", "minutes_ago": "imizuzu {n} eyadlulayo", "hours_ago": "iiyure {n} eyadlulayo", "days_ago": "iintsuku {n} eyadlulayo" },
"footer": { "support_development": "Xhasa uphuhliso lwe-AISBF", "privacy_policy": "Umgaqo-nkqubo wabucala", "terms_of_service": "Imiqathango yenkonzo", "contact": "Qhagamshelana" },
"donate": { "title": "Xhasa i-AISBF", "thank_you": "Enkosi ngokuqwalasela ukupha. Inkxaso yakho inceda ukugcina i-AISBF njenge-software evulekileyo simahla.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Cofa naliphi na idilesi ukukopisha", "copied": "Ikopishiwe!" },
"welcome": { "title": "Wamkelekile kwi-AISBF!", "early_adopter": "Enkosi ngokuba umsebenzisi wokuqala! Sikwifazini yophuhliso olukhulu.", "may_encounter": "Unokudibana neempazamo okanye ukuphazamiseka kwenkonzo.", "feedback": "Impendulo yakho isinceda ukuphucula i-AISBF. Ungayi nkxalabi ukuqhagamshelana nathi!", "send_feedback": "Thumela impendulo", "got_it": "Ndiyaqonda!" },
"contact": { "title": "Qhagamshelana nathi", "your_email": "I-imeyile yakho", "type": "Uhlobo", "select_type": "Khetha uhlobo...", "bug_report": "Ingxelo yephutha", "feature_request": "Isicelo sesici", "feedback": "Impendulo", "question": "Umbuzo", "help": "Uncedo", "title_field": "Isihloko", "title_placeholder": "Isishwankathelo esifutshane somyalezo wakho", "message": "Umyalezo", "message_placeholder": "Chaza ingxaki okanye isicelo sakho ngokuthe vetshe...", "send_message": "Thumela umyalezo", "cancel": "Rhoxisa", "sending": "Iyathunywa...", "success": "Umyalezo uthunywe ngempumelelo! Enkosi ngempendulo yakho.", "error": "Impazamo: {error}", "network_error": "Impazamo yenethiwekhi. Zama kwakhona kamva." },
"modal": { "notice": "Isaziso", "confirm": "Qinisekisa", "warning": "Isilumkiso", "ok": "Kulungile", "cancel": "Rhoxisa", "delete": "Cima" },
"common": { "save": "Gcina", "loading": "Iyalayisha...", "error": "Impazamo", "success": "Impumelelo", "close": "Vala", "yes": "Ewe", "no": "Hayi" }
}
{
"header": { "title": "AISBF 控制台", "help": "帮助", "docs": "文档", "about": "关于", "license": "许可证", "restart_server": "重启服务器", "logout": "退出" },
"nav": { "overview": "概览", "providers": "提供商", "rotations": "轮换", "autoselect": "自动选择", "prompts": "提示词", "analytics": "分析", "api_tokens": "API 令牌", "wallet": "钱包", "usage": "用量", "users": "用户", "settings": "设置", "tiers": "套餐", "payment_settings": "支付设置", "upgrade": "✨ 升级!✨", "notifications": "通知", "account": "账户" },
"account_menu": { "edit_profile": "编辑资料", "api_tokens": "API 令牌", "cache_settings": "缓存设置", "subscription": "订阅", "wallet": "钱包", "billing": "账单", "usage_quotas": "用量与配额", "change_password": "修改密码" },
"notifications": { "title": "通知", "mark_all_read": "全部标为已读", "refresh": "刷新", "no_notifications": "暂无通知", "just_now": "刚刚", "minutes_ago": "{n}分钟前", "hours_ago": "{n}小时前", "days_ago": "{n}天前" },
"footer": { "support_development": "支持 AISBF 开发", "privacy_policy": "隐私政策", "terms_of_service": "服务条款", "contact": "联系我们" },
"donate": { "title": "支持 AISBF", "thank_you": "感谢您考虑捐款。您的支持有助于将 AISBF 维护为完全开源的免费软件。", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "点击任意地址复制到剪贴板", "copied": "已复制!" },
"welcome": { "title": "欢迎使用 AISBF!", "early_adopter": "感谢您成为早期用户!我们目前处于密集开发阶段。", "may_encounter": "您可能会遇到错误、服务中断或变更。", "feedback": "您的反馈有助于我们改进 AISBF。请随时联系我们!", "send_feedback": "发送反馈", "got_it": "明白了!" },
"contact": { "title": "联系我们", "your_email": "您的邮箱", "type": "类型", "select_type": "选择类型...", "bug_report": "错误报告", "feature_request": "功能请求", "feedback": "反馈", "question": "问题", "help": "帮助", "title_field": "标题", "title_placeholder": "消息的简短摘要", "message": "消息", "message_placeholder": "详细描述您的问题或请求...", "send_message": "发送消息", "cancel": "取消", "sending": "发送中...", "success": "消息发送成功!感谢您的反馈。", "error": "错误:{error}", "network_error": "网络错误,请稍后重试。" },
"modal": { "notice": "通知", "confirm": "确认", "warning": "警告", "ok": "确定", "cancel": "取消", "delete": "删除" },
"common": { "save": "保存", "loading": "加载中...", "error": "错误", "success": "成功", "close": "关闭", "yes": "是", "no": "否" }
}
{
"header": { "title": "AISBF Dashboard", "help": "Usizo", "docs": "Amadokhumenti", "about": "Mayelana", "license": "Ilayisensi", "restart_server": "Qala kabusha iseva", "logout": "Phuma" },
"nav": { "overview": "Uhlolojikelele", "providers": "Abahlinzeki", "rotations": "Ukuphenduka", "autoselect": "Khetha ngokuzenzakalelayo", "prompts": "Iziqondiso", "analytics": "Ukuhlaziya", "api_tokens": "Amathokheni e-API", "wallet": "Isikhwama", "usage": "Ukusetshenziswa", "users": "Abasebenzisi", "settings": "Izilungiselelo", "tiers": "Amazinga", "payment_settings": "Inkokhelo", "upgrade": "✨ Thuthukisa! ✨", "notifications": "Izaziso", "account": "I-akhawunti" },
"account_menu": { "edit_profile": "Hlela iphrofayili", "api_tokens": "Amathokheni e-API", "cache_settings": "Izilungiselelo ze-cache", "subscription": "Ukubhalisa", "wallet": "Isikhwama", "billing": "Iinvoisi", "usage_quotas": "Ukusetshenziswa nezilinganiso", "change_password": "Shintsha iphasiwedi" },
"notifications": { "title": "Izaziso", "mark_all_read": "Phawula konke njengokufundiwe", "refresh": "Vuselela", "no_notifications": "Azikho izaziso", "just_now": "manje nje", "minutes_ago": "imizuzu engu-{n} edlule", "hours_ago": "amahora angu-{n} adlule", "days_ago": "izinsuku ezingu-{n} ezidlule" },
"footer": { "support_development": "Xhasa ukuthuthukiswa kwe-AISBF", "privacy_policy": "Inqubomgomo yobumfihlo", "terms_of_service": "Imigomo yenkonzo", "contact": "Xhumana" },
"donate": { "title": "Xhasa i-AISBF", "thank_you": "Siyabonga ngokuqonda ukupha. Ukuxhaswa kwakho kusiza ukugcina i-AISBF njenge-software evulekile simahla.", "bitcoin": "Bitcoin (BTC)", "ethereum": "Ethereum (ETH), USDC, USDT (ERC20, Mainnet)", "click_to_copy": "Chofoza noma yiliphi ikheli ukukopisha", "copied": "Ikopishiwe!" },
"welcome": { "title": "Wamukelekile ku-AISBF!", "early_adopter": "Siyabonga ngokuba umsebenzisi wokuqala! Sikhona esigabeni sokuthuthukiswa okukhulu.", "may_encounter": "Ungahlangabezana neziphazamiso noma ukuphazamiseka kwenkonzo.", "feedback": "Impendulo yakho isixhasa ukuthuthukisa i-AISBF. Ungamanqabi ukuxhumana nathi!", "send_feedback": "Thumela impendulo", "got_it": "Ngiyaqonda!" },
"contact": { "title": "Xhumana nathi", "your_email": "I-imeyili yakho", "type": "Uhlobo", "select_type": "Khetha uhlobo...", "bug_report": "Umbiko wesiphazamiso", "feature_request": "Isicelo sesici", "feedback": "Impendulo", "question": "Umbuzo", "help": "Usizo", "title_field": "Isihloko", "title_placeholder": "Isifinyezo esifushane somyalezo wakho", "message": "Umyalezo", "message_placeholder": "Chaza inkinga noma isicelo sakho ngokuningiliziwe...", "send_message": "Thumela umyalezo", "cancel": "Khansela", "sending": "Iyathunywa...", "success": "Umyalezo uthunywe ngempumelelo! Siyabonga ngempendulo yakho.", "error": "Iphutha: {error}", "network_error": "Iphutha lenethiwekhi. Zama futhi kamuva." },
"modal": { "notice": "Isaziso", "confirm": "Qinisekisa", "warning": "Isexwayiso", "ok": "Kulungile", "cancel": "Khansela", "delete": "Susa" },
"common": { "save": "Gcina", "loading": "Iyalayisha...", "error": "Iphutha", "success": "Impumelelo", "close": "Vala", "yes": "Yebo", "no": "Cha" }
}
This diff is collapsed.
...@@ -35,4 +35,4 @@ ...@@ -35,4 +35,4 @@
<p>We do not support the Israeli genocide of Palestinian people.</p> <p>We do not support the Israeli genocide of Palestinian people.</p>
</div> </div>
</body> </body>
</html> </html>
\ No newline at end of file
import pytest import pytest
from unittest.mock import patch, Mock from unittest.mock import patch, AsyncMock, Mock
from geolocation import get_ip_country, _ip_country_cache from aisbf.geolocation import get_ip_country, _ip_country_cache
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_invalid_ip_validation(): async def test_invalid_ip_validation():
"""Test that invalid IPs return None without API call""" """Test that invalid IPs return None without API call"""
_ip_country_cache.clear() _ip_country_cache.clear()
with patch('httpx.AsyncClient.get') as mock_get: with patch('httpx.AsyncClient.get', new_callable=AsyncMock) as mock_get:
result = await get_ip_country("invalid") result = await get_ip_country("invalid")
assert result is None assert result is None
assert _ip_country_cache["invalid"] is None assert _ip_country_cache["invalid"] is None
...@@ -16,31 +16,29 @@ async def test_invalid_ip_validation(): ...@@ -16,31 +16,29 @@ async def test_invalid_ip_validation():
async def test_caching(): async def test_caching():
"""Test that results are cached and repeated calls return cached results""" """Test that results are cached and repeated calls return cached results"""
_ip_country_cache.clear() _ip_country_cache.clear()
with patch('httpx.AsyncClient.get') as mock_get: mock_response = Mock()
mock_response = Mock() mock_response.status_code = 200
mock_response.status_code = 200 mock_response.text = "US"
mock_response.text = "US" with patch('httpx.AsyncClient.get', new_callable=AsyncMock) as mock_get:
mock_get.return_value = mock_response mock_get.return_value = mock_response
# First call
result1 = await get_ip_country("1.1.1.1") result1 = await get_ip_country("1.1.1.1")
assert result1 == "US" assert result1 == "US"
assert _ip_country_cache["1.1.1.1"] == "US" assert _ip_country_cache["1.1.1.1"] == "US"
mock_get.assert_called_once() mock_get.assert_called_once()
# Second call should use cache
result2 = await get_ip_country("1.1.1.1") result2 = await get_ip_country("1.1.1.1")
assert result2 == "US" assert result2 == "US"
mock_get.assert_called_once() # Still only one call mock_get.assert_called_once() # cache hit — still only one call
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_error_handling(): async def test_error_handling():
"""Test error handling for valid IPs when API fails""" """Test error handling for valid IPs when API fails"""
_ip_country_cache.clear() _ip_country_cache.clear()
with patch('httpx.AsyncClient.get') as mock_get: with patch('httpx.AsyncClient.get', new_callable=AsyncMock) as mock_get:
mock_get.side_effect = Exception("API fail") mock_get.side_effect = Exception("API fail")
result = await get_ip_country("1.1.1.1") result = await get_ip_country("1.1.1.1")
assert result is None assert result is None
assert _ip_country_cache["1.1.1.1"] is None assert _ip_country_cache["1.1.1.1"] is None
mock_get.assert_called_once() mock_get.assert_called_once()
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment