LocalizedContent.php 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. <?php
  2. namespace App\Support;
  3. use Illuminate\Support\Facades\Validator;
  4. use Illuminate\Validation\ValidationException;
  5. final class LocalizedContent
  6. {
  7. public const LANGUAGES = ['zh' => '中文', 'en' => '英文', 'vi' => '越南语'];
  8. public static function parse($input, int $titleLimit, int $contentLimit, bool $subtitle = false): array
  9. {
  10. if (!is_array($input) || array_diff(array_keys($input), array_keys(self::LANGUAGES))) {
  11. self::invalid('translations', '请按zh/en/vi提交多语言内容');
  12. }
  13. $result = [];
  14. foreach (self::LANGUAGES as $language => $_) {
  15. if (!array_key_exists($language, $input)) continue;
  16. $block = $input[$language];
  17. if (!is_array($block)) self::invalid('translations.' . $language, '语言内容必须为对象');
  18. $data = Validator::make($block, [
  19. 'title' => ['nullable', 'string', 'max:' . $titleLimit],
  20. 'content' => ['nullable', 'string', 'max:' . $contentLimit],
  21. 'subtitle' => ['nullable', 'string', 'max:500'],
  22. ])->validate();
  23. if (trim((string) ($data['content'] ?? '')) === '') continue;
  24. if (trim((string) ($data['title'] ?? '')) === '') self::invalid('translations.' . $language . '.title', '已填写正文的语言必须填写标题');
  25. $result[$language] = ['title' => trim($data['title']), 'content' => $data['content']];
  26. if ($subtitle) $result[$language]['subtitle'] = (string) ($data['subtitle'] ?? '');
  27. }
  28. if (!$result) self::invalid('translations', '至少填写一个语言的标题和正文');
  29. return $result;
  30. }
  31. public static function invalid(string $field, string $message): void
  32. {
  33. throw ValidationException::withMessages([$field => $message]);
  34. }
  35. }