| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- <?php
- namespace App\Support;
- use Illuminate\Support\Facades\Validator;
- use Illuminate\Validation\ValidationException;
- final class LocalizedContent
- {
- public const LANGUAGES = ['zh' => '中文', 'en' => '英文', 'vi' => '越南语'];
- public static function parse($input, int $titleLimit, int $contentLimit, bool $subtitle = false): array
- {
- if (!is_array($input) || array_diff(array_keys($input), array_keys(self::LANGUAGES))) {
- self::invalid('translations', '请按zh/en/vi提交多语言内容');
- }
- $result = [];
- foreach (self::LANGUAGES as $language => $_) {
- if (!array_key_exists($language, $input)) continue;
- $block = $input[$language];
- if (!is_array($block)) self::invalid('translations.' . $language, '语言内容必须为对象');
- $data = Validator::make($block, [
- 'title' => ['nullable', 'string', 'max:' . $titleLimit],
- 'content' => ['nullable', 'string', 'max:' . $contentLimit],
- 'subtitle' => ['nullable', 'string', 'max:500'],
- ])->validate();
- if (trim((string) ($data['content'] ?? '')) === '') continue;
- if (trim((string) ($data['title'] ?? '')) === '') self::invalid('translations.' . $language . '.title', '已填写正文的语言必须填写标题');
- $result[$language] = ['title' => trim($data['title']), 'content' => $data['content']];
- if ($subtitle) $result[$language]['subtitle'] = (string) ($data['subtitle'] ?? '');
- }
- if (!$result) self::invalid('translations', '至少填写一个语言的标题和正文');
- return $result;
- }
- public static function invalid(string $field, string $message): void
- {
- throw ValidationException::withMessages([$field => $message]);
- }
- }
|