Files
objecttothis 6db3dde491 Bugfix tax names (#4677)
bugfix(items, validation): reject unsafe tax names and fix payments temp table collision

- Add unicode_alpha_numeric_punct rule (OSPOSRules) to allow accented/CJK
  chars in text fields while blocking HTML-unsafe chars (<, >) as
  defense-in-depth against injection
- Items controller: extract validateItemFields/validateBulkUpdateFields,
  validate tax_names on save and bulk update using new rule; add shared
  validateFields helper in Secure_Controller to DRY up validation +
  JSON error response
- Escape tax_group output in sales/quote.php and receipt_email.php views
  to harden output encoding at render time
- Rename sales_payments_temp -> sales_report_payments_temp (Summary_report)
  and -> sales_search_payments_temp (Sale model) to avoid name collision
  between concurrently-created temp tables
- AGENTS.md: document alignment rule for => columns when inserting new
  language keys

Tests:
- Add ItemsControllerTest covering postSave/bulkupdate tax_names validation
- Reject <, > in tax_names on /items/save and /items/bulkupdate
- Verify unicode and apostrophe-containing tax names are accepted
- Cover CSV import helpers: header generation (basic, multiple locations,
  attributes), stock-location/attribute header builders, get_csv_file
  parsing (plain, BOM-prefixed, multi-row)
- Validate required-header detection for import templates
- Remove outdated tax name test from SalesControllerTest
- Simplify Database class references in SalesControllerTest

i18n:
- Add tax_name_invalid translation to Items.php for 20+ locales, inserted
  alphabetically after tax_category in each file
- Normalize quote style in ar-EG/Items.php to single quotes
- Add ka/Items.php Georgian locale scaffold

Signed-off-by: objecttothis <17935339+objecttothis@users.noreply.github.com>
2026-09-01 10:59:29 +04:00

125 lines
9.4 KiB
PHP

<?php
return [
'add_minus' => 'الكمية المطلوب خصمها أو اضافتها.',
'allow_alt_description' => 'السماح بوصف بديل',
'amount_entry' => 'إدخال القيمة',
'bulk_edit' => 'تحرير جماعى',
'buy_price_required' => 'سعر الشراء مطلوب.',
'cannot_be_deleted' => 'لايمكن حذف الأصناف المختارة، واحد أو أكثر منها لديه مبيعات.',
'cannot_find_item' => 'لايمكن ايجاد معلومات حول الصنف.',
'categories' => '',
'category' => 'التصنيف',
'category_new' => '',
'category_required' => 'التصنيف مطلوب.',
'change_all_to_allow_alt_desc' => 'السماح بوصف بديل للجميع.',
'change_all_to_not_allow_allow_desc' => 'عدم السماح بوصف بديل للجميع.',
'change_all_to_serialized' => 'تغير الجميع لمتسلسل',
'change_all_to_unserialized' => 'تغيير الجميع لغير متسلسل',
'change_image' => 'تغيير الصورة',
'confirm_bulk_edit' => 'هل أنت متأكد انك تريد تحرير كل الأصناف المختارة؟',
'confirm_bulk_edit_wipe_taxes' => 'سوف يتم مسح معلومات الضرائب لجميع الأصناف.',
'confirm_delete' => 'هل أنت متأكد انك تريد حذف كل الأصناف المختارة؟',
'confirm_restore' => 'هل انت متاكد من إستعادة الاصناف المخطارة؟',
'cost_price' => 'سعر التكلفة',
'cost_price_number' => 'سعر التكلفة يجب أن يكون رقم.',
'cost_price_required' => 'سعر التكلفة مطلوب.',
'count' => 'تحديث المخزون',
'csv_import_failed' => 'فشل الإستيراد من اكسل',
'csv_import_invalid_location' => '',
'csv_import_nodata_wrongformat' => 'الملف الذى رفعته إما فارغ أو أنه مختلف البنية.',
'csv_import_partially_failed' => 'يوجد خطأ بنسبة {0} في استيراد الاصناف في السطر: {1}. لم يتم استيرادهم.',
'csv_import_success' => 'تم استيراد الأصناف بنجاح.',
'current_quantity' => 'الكمية الحالية',
'default_pack_name' => 'كل',
'description' => 'الوصف',
'details_count' => 'حركة الصنف',
'do_nothing' => 'لاتفعل شئ',
'edit' => '',
'edit_fields_you_want_to_update' => 'قم بتحديث الحقول المراد تحديثها لكل الأصناف المختارة.',
'edit_multiple_items' => 'تحريد مجموعة اصناف',
'empty_upc_items' => 'تفريغ اصناف UPC',
'error_adding_updating' => 'خطاء فى إضافة/تحديث صنف',
'error_updating_multiple' => 'خطاء فى تحديث بيانات أصناف',
'generate_barcodes' => 'توليد أكواد الباركود',
'hsn_code' => 'تسميات النظام المنسق',
'image' => 'صورة',
'import_items_csv' => 'استيراد من اكسل',
'info_provided_by' => 'المعلومات مقدمة بواسطة',
'inventory' => 'المخزن',
'inventory_CSV_import_quantity' => 'العدد المستورد من ملفات ال CSV',
'inventory_comments' => 'تعليقات',
'inventory_data_tracking' => 'تتبع بيانات المخزون',
'inventory_date' => 'التاريخ',
'inventory_employee' => 'الموظف',
'inventory_in_out_quantity' => '+- كمية',
'inventory_remarks' => 'ملاحظات',
'is_deleted' => 'حذفت',
'is_printed' => '',
'is_serialized' => 'الصنف له رقم مسلسل',
'item' => 'صنف',
'item_id' => '',
'item_number' => 'الباركود UPC/EAN/ISBN',
'item_number_duplicate' => 'رقم الصنف موجود فى قاعدة البيانات من قبل.',
'item_number_invalid' => 'رقم الصنف يحتوي على أحرف غير مسموح بها.',
'kit' => 'مجموعة اصناف',
'location' => 'مكان',
'low_inventory_items' => 'الأصناف التى لا يوجد لها مخزون',
'low_sell_item' => 'الصنف المركب',
'manually_editing_of_quantity' => 'تحرير الكمية يدوياً',
'markup' => '',
'name' => 'اسم الصنف',
'name_required' => 'اسم الصنف مطلوب.',
'new' => 'صنف جديد',
'no_description_items' => 'الأصناف التى بلا وصف',
'no_items_to_display' => 'لايوجد أصناف لعرضها.',
'none' => 'لاشىء',
'none_selected' => 'لم تختار أى أصناف لتحريرها',
'nonstock' => 'غير مخزنة',
'number_information' => 'رقم الصنف',
'number_required' => 'مطلوب UPC/EAN/ISBN رقم الباركود.',
'one_or_multiple' => 'صنف/أصناف',
'pack_name' => 'اسم الحزمة',
'qty_per_pack' => 'العدد بكل الحزمة',
'quantity' => 'الكمية',
'quantity_number' => 'الكمية يجب أن تكون رقم.',
'quantity_required' => 'الكمية مطلوبة.',
'receiving_quantity' => 'الكمية المستلمة',
'remove_image' => 'ازالة الصورة',
'reorder_level' => 'نقطة إعادة الطلب',
'reorder_level_number' => 'نقطة إعادة الطلب يجب أن تكون رقم.',
'reorder_level_required' => 'نقطة إعادة الطلب مطلوبة.',
'retrive_item_info' => 'الحصول على بيانات الصنف',
'sales_tax_1' => 'ضريبة المبيعات',
'sales_tax_2' => 'ضريبة المبيعات 2',
'search_attributes' => 'بحث الحقول المخصصة',
'select_image' => 'اختار صورة',
'serialized_items' => 'أصناف مسلسلة',
'standard' => 'اساسي',
'stock' => 'مخزن',
'stock_location' => 'مكان المخزون',
'stock_type' => 'نوع المخزن',
'successful_adding' => 'لقد تم إضافة صنف بنجاح',
'successful_bulk_edit' => 'لقد تم تحديث بيانات صنف/أصناف بنجاح',
'successful_deleted' => 'لقد تم الحذف بنجاح',
'successful_updating' => 'لقد تم تحديث بيانات صنف بنجاح',
'supplier' => 'المورد',
'tax_1' => 'الضريبة 1',
'tax_2' => 'الضريبة 2',
'tax_3' => '',
'tax_category' => 'الفئة الضريبية',
'tax_name_invalid' => 'اسم الضريبة يحتوي على أحرف غير مسموح بها.',
'tax_percent' => 'نسبة الضريبة',
'tax_percent_number' => 'نسبة الضريبة يجب ان تكون رقم',
'tax_percent_required' => 'نسبة الضريبة مطلوبة.',
'tax_percents' => 'نسبة/نسب الضريبة',
'temp' => 'مؤقت',
'type' => 'نوع الصنف',
'unit_price' => 'السعر',
'unit_price_number' => 'السعر يجب أن يكون رقم.',
'unit_price_required' => 'السعر مطلوب.',
'upc_database' => 'UPC قاعدة بيانات',
'update' => 'تحديث بيانات صنف',
'use_inventory_menu' => 'استخدام تحديث المخزن',
];