Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -613,6 +613,30 @@ installed yet; the slides introduce the installed one. The demo animations are r
The tray app runs one per rule (`WatchFolderService`, Settings → Watch folders, conversions in the toast and
history); `filee watch` runs one on its own, with a stable `cli` rule identity across command restarts.

## Preset gallery

Presets shared by users live in the `KnifeLemon/Filee-Presets` repository and on filee.sh (#1530); the app reads
them, it never uploads.

- `Filee.Core/Gallery/SharedPresetRules` is the allow-list: every field a shared preset.json (a `PresetBundle`) may
have, with its range, and the fields left out (folders of one's own, passwords, picture and sound paths, metadata
naming people, places or owners), which may only be empty. A field added to `Preset` fails the check until it is
listed there (`PresetGalleryCheckTests` compares the list with the model). Settings that touch the installer's files
pass with a warning (`SharedPresetWarnings`, codes shared with the gallery's repository and filee.sh); the window
shows them and asks for a tick before installing a preset with a high one.
- `SharedBundleCheck` checks a preset.json against it, as JSON first (unknown fields, types, ranges, links, personal
paths) and then as presets (kinds, tools, targets, references), and derives what meta.json needs.
`SharedPresetFolderCheck` checks a whole submission folder, pictures included (`GalleryImageHeader` reads their
header before anything decodes them). `filee presets check <folder> [--json]` runs it, with SkiaSharp decoding each
picture; the gallery's CI calls it.
- `GalleryInstaller` checks the downloaded file's SHA-256 and the rules again, then adds its presets and donut under
new ids (" (2)" on a name the library has); nothing is ever replaced, unlike Settings → General → Import.
`GalleryExport` builds the preset.json "Export for the gallery…" saves (Presets page).
- The app's `PresetGalleryWindow` (from the Presets page) reads `index.json` through `PresetGalleryClient`, only while
it is open, with the proxy setting, time and size limits, and falls back to the repository on GitHub when filee.sh
can't be reached. Paths in the index are relative to the URL it came from; Install uses the entry's counted
`download` link. Pictures are cached in the work folder's `gallery/` (64 MB, 30 days).

## Platform code

Everything OS-specific goes through `IPlatformServices` (`Filee.Core/Platform`). Windows lives in
Expand Down
88 changes: 87 additions & 1 deletion src/Filee.App/Assets/i18n/ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -1850,5 +1850,91 @@
"connect.pin_label": "رمز PIN:",
"connect.firewall_hint_generic": "ملاحظة: إذا لم يتمكن هاتفك من الاتصال، اسمح لـ Filee في جدار الحماية الخاص بالنظام.",
"connect.no_network_message": "تعذر بدء Filee Connect. يرجى التأكد من اتصال هذا الجهاز بشبكة Wi-Fi أو شبكة إيثرنت محلية.",
"connect.save_as": "حفظ باسم…"
"connect.save_as": "حفظ باسم…",
"gallery.title": "معرض الإعدادات المسبقة",
"gallery.open": "معرض الإعدادات المسبقة",
"gallery.open_tip": "إعدادات مسبقة شاركها آخرون على filee.sh",
"gallery.lead": "إعدادات مسبقة شاركها آخرون على filee.sh. عند تثبيتها تُضاف كإعدادات مسبقة جديدة وتبقى إعداداتك كما هي. لا يتصل Filee بـ filee.sh إلا أثناء فتح هذه النافذة.",
"gallery.sort": "الترتيب",
"gallery.sort.Hot": "الرائج",
"gallery.sort.Best": "الأفضل",
"gallery.sort.New": "الأحدث",
"gallery.period": "الفترة",
"gallery.period.day": "اليوم",
"gallery.period.week": "هذا الأسبوع",
"gallery.period.month": "هذا الشهر",
"gallery.period.year": "هذا العام",
"gallery.period.all": "كل الأوقات",
"gallery.filter.kind": "النوع",
"gallery.kind.all": "كل الأنواع",
"gallery.kind.convert": "التحويلات",
"gallery.kind.tool": "الأدوات",
"gallery.kind.toolbar": "الأشرطة الدائرية",
"gallery.filter.format": "الصيغة",
"gallery.format.all": "كل الصيغ",
"gallery.filter.tag": "الوسم",
"gallery.tag.all": "كل الوسوم",
"gallery.filter.language": "اللغة",
"gallery.language.all": "كل اللغات",
"gallery.loading": "جارٍ تحميل الإعدادات المسبقة من filee.sh…",
"gallery.failed": "تعذّر الوصول إلى filee.sh. تحقّق من الاتصال بالإنترنت ومن الوكيل في الإعدادات ← عام، ثم أعد المحاولة.",
"gallery.empty": "لا يوجد إعداد مسبق يطابق البحث وعوامل التصفية.",
"gallery.none": "لم يشارك أحد إعدادات مسبقة بعد.",
"gallery.newer": "{0} أخرى تحتاج إلى إصدار أحدث من Filee.",
"gallery.by": "من {0}",
"gallery.likes": "{0} إعجاب",
"gallery.downloads": "{0} تنزيل",
"gallery.select": "اختر إعدادًا مسبقًا لترى صوره وما يفعله.",
"gallery.image": "الصورة {0} من {1}",
"gallery.what": "ما سيُضاف",
"gallery.what_group": "مجموعة: {0}",
"gallery.loading_details": "جارٍ التحميل…",
"gallery.donut_new": "يضيف الشريط الدائري «{0}» لـ {1}. لا يُفتح إلا للملفات التي لا يتولاها أي من أشرطتك الدائرية؛ يمكنك تغيير ذلك من الإعدادات ← شريط الأدوات الدائري.",
"gallery.donut_mixed": "الملفات المختلطة",
"gallery.donut_none": "لا يوضع على أي شريط دائري: أضفه إلى أحدها من الإعدادات ← شريط الأدوات الدائري.",
"gallery.license": "شاركه {0} بموجب CC0: حرّ الاستخدام والتعديل والمشاركة.",
"gallery.comments": "التعليقات",
"gallery.install": "تثبيت",
"gallery.installing": "جارٍ التثبيت…",
"gallery.installed": "أُضيف {0} من الإعدادات المسبقة. تجدها في قائمة الإعدادات المسبقة.",
"gallery.installed_donut": "أُضيف {0} من الإعدادات المسبقة والشريط الدائري «{1}».",
"gallery.install_failed": "تعذّر التثبيت: {0}",
"gallery.not_installable": "لا يمكن تثبيت هذا الإعداد المسبق: {0}",
"gallery.download_failed": "تعذّر تنزيل الإعداد المسبق. تحقّق من الاتصال وأعد المحاولة.",
"gallery.mismatch": "الملف الذي نُزّل ليس الملف الذي يذكره المعرض، لذا لم يُثبَّت شيء.",
"gallery.option.size": "{0} × {1} px",
"gallery.option.pixels": "{0} px",
"gallery.option.max_size": "{0} ميغابايت كحد أقصى",
"gallery.option.no_metadata": "يزيل البيانات الوصفية",
"gallery.option.merge": "يدمج في ملف واحد",
"gallery.option.pages": "الصفحات {0}",
"gallery.option.max_height": "حتى {0}p",
"gallery.option.translate": "يترجم إلى {0}",
"gallery.option.ask_compression": "يسأل عن درجة الضغط في كل مرة",
"gallery.option.subfolder": "يحفظ في المجلد «{0}»",
"gallery.option.file_name": "اسم الملف: {0}",
"gallery.warnings_title": "قبل التثبيت",
"gallery.warning.replaces_original": "يستبدل ملفاتك الأصلية: تحل النتيجة محلها وتنتقل الملفات الأصلية إلى سلة المحذوفات.",
"gallery.warning.moves_original": "ينقل ملفاتك الأصلية إلى مجلد بدلًا من نسخها.",
"gallery.warning.overwrites_existing": "يكتب فوق ملف يحمل اسم النتيجة نفسه بدلًا من إضافة رقم.",
"gallery.warning.copies_to_folder": "ينسخ الملفات إلى مجلد. اختر المجلد في الإعداد المسبق بعد التثبيت.",
"gallery.warning.edits_metadata": "يكتب حقول بيانات وصفية في الملفات التي يحوّلها.",
"gallery.warning.fixed_edits": "يضع العلامات أو المناطق المخفية أو الخلفية أو المقطع نفسه في كل ملف يحوّله.",
"gallery.warning.strips_metadata": "يزيل البيانات الوصفية (بيانات الكاميرا والتواريخ والموقع) من الملفات التي يحوّلها.",
"gallery.warning.uses_translate_model": "يترجم بنموذج ذكاء اصطناعي محدد قد تحتاج إلى تنزيله في Ollama.",
"gallery.accept_risk": "أفهم أن هذا الإعداد المسبق قد يستبدل ملفاتي أو ينقلها أو يكتب فوقها.",
"presets.from_gallery": "مثبّت من معرض الإعدادات المسبقة ({0}). يحتفظ بالإعدادات التي شورك بها.",
"gallery.export": "تصدير للمعرض…",
"gallery.export_title": "تصدير لمعرض الإعدادات المسبقة",
"gallery.export_lead": "حدّد الإعدادات المسبقة التي تريد مشاركتها، واختر شريطًا دائريًا إن شئت. يُفحص الملف بالطريقة التي يفحص بها المعرض. احفظه ثم أرسله مع صورة إلى 4 صور عبر النموذج.",
"gallery.export_presets": "الإعدادات المسبقة",
"gallery.export_donut": "الشريط الدائري",
"gallery.export_no_donut": "بلا شريط دائري",
"gallery.export_problems": "لا يمكن مشاركته بعد: أصلح ما هو مذكور أدناه.",
"gallery.export_ok": "جاهز للمشاركة: {0} من الإعدادات المسبقة.",
"gallery.export_save": "حفظ preset.json…",
"gallery.export_saved": "تم الحفظ.",
"gallery.export_submit": "فتح نموذج الإرسال",
"gallery.export_none": "حدّد إعدادًا مسبقًا واحدًا على الأقل أو اختر شريطًا دائريًا.",
"gallery.export_warnings": "سيعرض المعرض هذه التحذيرات:"
}
Loading
Loading