الوثائقFlutter6 دقيقة قراءة
Flutter
تبقي siyak_flutter نصّك الأصلي في شجرة الودجت، وتدع الخادم يتعلم ترجمته. بلا جداول مفاتيح ولا توليد كود ولا Intl — وأول إطار لا ينتظر الشبكة.
pubspec.yaml
dependencies:
flutter:
sdk: flutter
siyak_flutter:
path: ../vendor/siyak_flutter # the folder from the downloaded archive
# pub.dev hosting is announced later; until then the archive is the install path.lib/main.dart
import 'package:siyak_flutter/siyak_flutter.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
final siyak = Siyak.init(
apiKey: const String.fromEnvironment('SIYAK_API_KEY'),
endpoint: const String.fromEnvironment('SIYAK_ENDPOINT'),
target: 'ar-EG',
source: 'en',
context: 'home screen',
onLog: debugPrint,
);
unawaited(siyak.preload()); // one request, every approved string
runApp(MyApp(siyak: siyak));
}نمط إعادة البناء
لا فائدة من ذاكرة لا يعيد الرسمَ شيءٌ عند وصول الترجمة إليها، لذلك يوفّر الكائن مؤشرَين تتغيّر قيمتُهما: translationRevision يُطلق كلما دخلت ترجمة جديدة إلى الذاكرة، وlastError يُطلق برمز خطأ الخدمة — وبقيمة null عندما يعود الاتصال للعمل.
class _HomeState extends State<Home> {
final siyak = Siyak.shared;
@override
void initState() {
super.initState();
siyak.translationRevision.addListener(_repaint);
}
void _repaint() => setState(() {});
@override
void dispose() {
siyak.translationRevision.removeListener(_repaint);
super.dispose();
}
@override
Widget build(BuildContext context) => Text(siyak.t('Settings'));
}من اليمين إلى اليسار
if (siyak.isRightToLeft) { // ar, fa, he, ur, ckb, … (region-insensitive)
// Flip the whole app, not one Text.
return Directionality(textDirection: TextDirection.rtl, child: ...);
}- isRtlTag("ar-EG") صحيحة؛ والفحص على الوسم الأساسي، فلا يعطّله رمز المنطقة.
- warmUp(قائمة نصوص) قبل شاشة تعرف ثقلها؛ فيُرسل الطلب موحَّدًا وتُنتظر النتيجة، فلا يُرسم النص الأصلي مرتين.
- تبقى الذاكرة عبر shared_preferences وهي LRU بألف مدخل لثلاثين يومًا افتراضيًا؛ وفي اختبار Dart بلا منصّة تتحوّل إلى الذاكرة بدل أن ترمي.
- الأخطاء مصنّفة: QuotaExceededException وRateLimitedException وInvalidApiKeyException وOriginNotAllowedException وBackendUnavailableException وSiyakNetworkException. ولا ترمي t() شيئًا — بل تظهر عبر lastError وonLog.
التشغيل مقابل خادمٍ محلي
flutter run --dart-define=SIYAK_ENDPOINT=http://10.0.2.2:8787 \
--dart-define=SIYAK_API_KEY=sk_test_…
// and pass allowInsecureEndpoint: true to Siyak.init — it refuses plain http
// by default, because a release build pointing at http:// is almost always a bug.