الوثائق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.