mirror of
https://github.com/flarum/core.git
synced 2025-08-05 07:57:46 +02:00
[1.x] Implement Support for Translatable Validation Attribute Errors (#4070)
* chore: add validation translations * feat: implement ability to translate validation attributes * chore: change translation key * style: formatting * perf: cache `getAttributeNames` * perf: cache `getAttributeNames` * chore * style: formatting
This commit is contained in:
@@ -161,3 +161,23 @@ flarum-extension-manager:
|
||||
|
||||
why_not_modal:
|
||||
title: Why Won't it Update
|
||||
|
||||
validation:
|
||||
attributes:
|
||||
minimum_stability: minimum stability
|
||||
repositories: repositories
|
||||
repositories.*: repositories
|
||||
repositories.*.type: repository type
|
||||
repositories.*.url: repository URL
|
||||
extension_id: extension ID
|
||||
update_mode: update mode
|
||||
package: package
|
||||
version: version
|
||||
github_oauth: GitHub OAuth
|
||||
github_oauth.*: GitHub OAuth
|
||||
gitlab_oauth: GitLab OAuth
|
||||
gitlab_oauth.*: GitLab OAuth
|
||||
gitlab_token: GitLab Token
|
||||
gitlab_token.*: GitLab Token
|
||||
bearer: HTTP Bearer
|
||||
bearer.*: HTTP Bearer
|
||||
|
@@ -69,3 +69,7 @@ flarum-suspend:
|
||||
You have been unsuspended. You can head back to the forum by clicking on the following link:
|
||||
|
||||
{forum_url}
|
||||
|
||||
validation:
|
||||
attributes:
|
||||
suspendedUntil: suspended until
|
||||
|
@@ -127,3 +127,13 @@ flarum-tags:
|
||||
choose_tags_placeholder: "{count, plural, one {Choose 1 more tag} other {Choose # more tags}}"
|
||||
name: Name
|
||||
tags: Tags
|
||||
|
||||
validation:
|
||||
attributes:
|
||||
name: name
|
||||
slug: slug
|
||||
is_hidden: hidden
|
||||
description: description
|
||||
color: color
|
||||
tag_count_primary: => validation.attributes.tag_count_primary
|
||||
tag_count_secondary: => validation.attributes.tag_count_secondary
|
||||
|
@@ -79,6 +79,7 @@ validation:
|
||||
present: "The :attribute field must be present."
|
||||
regex: "The :attribute format is invalid."
|
||||
required: "The :attribute field is required."
|
||||
required_array_keys: "The :attribute array must contain entries for: :values."
|
||||
required_if: "The :attribute field is required when :other is :value."
|
||||
required_unless: "The :attribute field is required unless :other is in :values."
|
||||
required_with: "The :attribute field is required when :values is present."
|
||||
|
@@ -333,6 +333,19 @@ class Extension implements Arrayable
|
||||
return $this->composerJsonAttribute('extra.flarum-extension.title');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string|null
|
||||
*/
|
||||
public function getNamespace(): ?string
|
||||
{
|
||||
return Collection::make($this->composerJsonAttribute('autoload.psr-4'))
|
||||
->filter(function ($source) {
|
||||
return $source === 'src/';
|
||||
})
|
||||
->keys()
|
||||
->first();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
|
@@ -9,6 +9,7 @@
|
||||
|
||||
namespace Flarum\Foundation;
|
||||
|
||||
use Illuminate\Contracts\Cache\Store as Cache;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Validation\Factory;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
@@ -16,6 +17,13 @@ use Symfony\Contracts\Translation\TranslatorInterface;
|
||||
|
||||
abstract class AbstractValidator
|
||||
{
|
||||
use ExtensionIdTrait;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public static $CORE_VALIDATION_CACHE_KEY = 'core.validation.extension_id_class_names';
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
@@ -81,6 +89,30 @@ abstract class AbstractValidator
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function getAttributeNames()
|
||||
{
|
||||
$cache = resolve(Cache::class);
|
||||
|
||||
if ($cache->get(self::$CORE_VALIDATION_CACHE_KEY) !== null) {
|
||||
return $cache->get(self::$CORE_VALIDATION_CACHE_KEY);
|
||||
}
|
||||
|
||||
$extId = $this->getClassExtensionId();
|
||||
$attributeNames = [];
|
||||
|
||||
foreach (array_keys($this->rules) as $attribute) {
|
||||
$key = $extId ? "$extId.validation.attributes.$attribute" : "validation.attributes.$attribute";
|
||||
$attributeNames[$attribute] = $this->translator->trans($key);
|
||||
}
|
||||
|
||||
$cache->forever(self::$CORE_VALIDATION_CACHE_KEY, $attributeNames);
|
||||
|
||||
return $attributeNames;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a new validator instance for this model.
|
||||
*
|
||||
@@ -92,6 +124,7 @@ abstract class AbstractValidator
|
||||
$rules = Arr::only($this->getRules(), array_keys($attributes));
|
||||
|
||||
$validator = $this->validator->make($attributes, $rules, $this->getMessages());
|
||||
$validator->setAttributeNames($this->getAttributeNames());
|
||||
|
||||
foreach ($this->configuration as $callable) {
|
||||
$callable($this, $validator);
|
||||
|
31
framework/core/src/Foundation/ExtensionIdTrait.php
Normal file
31
framework/core/src/Foundation/ExtensionIdTrait.php
Normal file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Flarum.
|
||||
*
|
||||
* For detailed copyright and license information, please view the
|
||||
* LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Flarum\Foundation;
|
||||
|
||||
use Flarum\Extension\Extension;
|
||||
use Flarum\Extension\ExtensionManager;
|
||||
|
||||
trait ExtensionIdTrait
|
||||
{
|
||||
protected function getClassExtensionId(): ?string
|
||||
{
|
||||
$extensions = resolve(ExtensionManager::class);
|
||||
|
||||
return $extensions->getExtensions()
|
||||
->mapWithKeys(function (Extension $extension) {
|
||||
return [$extension->getId() => $extension->getNamespace()];
|
||||
})
|
||||
->filter(function ($namespace) {
|
||||
return $namespace && str_starts_with(static::class, $namespace);
|
||||
})
|
||||
->keys()
|
||||
->first();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user