متعدد اللغات
تستخدم متعدد اللغات مكون 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'); // 你好 管理员!