متعدد اللغات

تستخدم متعدد اللغات مكون symfony/translation.

التثبيت

composer require symfony/translation

إنشاء حزمة اللغة

يضع webman افتراضيًا حزمة اللغة في دليل resource/translations (إذا لم يكن موجودًا يرجى إنشاؤه بنفسك). إذا كنت بحاجة إلى تغيير الدليل، يرجى تعيينه في config/translation.php.
كل لغة تتوافق مع أحد المجلدات الفرعية. يتم تعريف اللغة افتراضيًا في messages.php. المثال كما يلي:

resource/
└── translations
    ├── en
    │   └── messages.php
    └── zh_CN
        └── messages.php

جميع ملفات اللغة تُعيد مصفوفة مثل:

// resource/translations/en/messages.php

return [
    'hello' => 'Hello webman',
];

التكوين

config/translation.php

return [
    // اللغة الافتراضية
    'locale' => 'zh_CN',
    // اللغة الاحتياطية، عند عدم العثور على ترجمة في اللغة الحالية، سيتم محاولة استخدام الترجمة في اللغة الاحتياطية
    'fallback_locale' => ['zh_CN', 'en'],
    // مجلد تخزين ملفات اللغة
    'path' => base_path() . '/resource/translations',
];

الترجمة

تُستخدم الترجمة بواسطة دالة trans().

إنشاء ملف اللغة resource/translations/zh_CN/messages.php كما يلي:

return [
    'hello' => '你好 世界!',
];

إنشاء ملف app/controller/UserController.php

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function get(Request $request)
    {
        $hello = trans('hello'); // 你好 世界!
        return response($hello);
    }
}

زيارة http://127.0.0.1:8787/user/get ستعيد "你好 世界!"

تغيير اللغة الافتراضية

لتغيير اللغة، نستخدم دالة locale().

إضافة ملف لغة جديد resource/translations/en/messages.php كما يلي:

return [
    'hello' => 'hello world!',
];
<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function get(Request $request)
    {
        // تغيير اللغة
        locale('en');
        $hello = trans('hello'); // hello world!
        return response($hello);
    }
}

زيارة http://127.0.0.1:8787/user/get ستعيد "hello world!"

يمكنك أيضًا استخدام المعامل الرابع لدالة trans() لتغيير اللغة مؤقتًا، مثل المثال أعلاه والمثال أدناه متكافئ:

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function get(Request $request)
    {
        // تغيير اللغة باستخدام المعامل الرابع
        $hello = trans('hello', [], null, 'en'); // hello world!
        return response($hello);
    }
}

تعيين اللغة بشكل محدد لكل طلب

الترجمة هي حالة مفرد، مما يعني أن جميع الطلبات تتشارك نفس المثال. إذا استخدم طلب معين دالة locale() لتعيين اللغة الافتراضية، فسيؤثر ذلك على جميع الطلبات اللاحقة في هذه العملية. لذا، يجب علينا تعيين اللغة بشكل محدد لكل طلب. على سبيل المثال، استخدام الوسطاء التالي

إنشاء ملف app/middleware/Lang.php (إذا لم يكن الدليل موجودًا، يرجى إنشاؤه بنفسك) كما يلي:

<?php
namespace app\middleware;

use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;

class Lang implements MiddlewareInterface
{
    public function process(Request $request, callable $handler) : Response
    {
        locale(session('lang', 'zh_CN'));
        return $handler($request);
    }
}

في config/middleware.php، إضافة الوسطاء العالمي كما يلي:

return [
    // الوسطاء العالميون
    '' => [
        // ... هنا تم اختصار الوسطاء الآخرين
        app\middleware\Lang::class,
    ]
];

استخدام العناصر النائبة

في بعض الأحيان، تحتوي رسالة على متغيرات تحتاج إلى ترجمة، مثل

trans('hello ' . $name);

في هذه الحالة، نقوم باستخدام العناصر النائبة للتعامل معها.

تغيير resource/translations/zh_CN/messages.php كما يلي:

return [
    'hello' => '你好 %name%!',
];

أثناء الترجمة، يتم تمرير القيم المقابلة للعناصر النائبة من خلال المعامل الثاني

trans('hello', ['%name%' => 'webman']); // 你好 webman!

معالجة الجمع

بعض اللغات تحتوي على صيغ مختلفة بناءً على عدد العناصر، مثل هناك %count% تفاحة، عندما تكون %count% تساوي 1 تكون الصيغة صحيحة، وعندما تزيد عن 1 تكون غير صحيحة.

في هذه الحالة، نستخدم الأنابيب (|) لإدراج صيغ الجمع.

ملف اللغة resource/translations/en/messages.php لإضافة apple_count كما يلي:

return [
    // ...
    'apple_count' => 'There is one apple|There are %count% apples',
];
trans('apple_count', ['%count%' => 10]); // There are 10 apples

يمكننا حتى تحديد نطاق الأرقام وإنشاء قواعد جمع أكثر تعقيدًا:

return [
    // ...
    'apple_count' => '{0} There are no apples|{1} There is one apple|]1,19] There are %count% apples|[20,Inf[ There are many apples'
];
trans('apple_count', ['%count%' => 20]); // There are many apples

تحديد ملف اللغة

الاسم الافتراضي لملف اللغة هو messages.php، وفي الواقع يمكنك إنشاء ملفات لغات بأسماء أخرى.

إنشاء ملف اللغة resource/translations/zh_CN/admin.php كما يلي:

return [
    'hello_admin' => '你好 管理员!',
];

يمكنك تحديد ملف اللغة من خلال المعامل الثالث لدالة trans() (مع حذف اللاحقة .php).

trans('hello', [], 'admin', 'zh_CN'); // 你好 管理员!

المزيد من المعلومات

راجع المستندات الخاصة بـ symfony/translation