Skip to content

Commit

Permalink
[1.x] Implement Support for Translatable Validation Attribute Errors (#…
Browse files Browse the repository at this point in the history
…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
  • Loading branch information
DavideIadeluca authored Nov 20, 2024
1 parent 79e17b3 commit 397642a
Show file tree
Hide file tree
Showing 7 changed files with 112 additions and 0 deletions.
20 changes: 20 additions & 0 deletions extensions/package-manager/locale/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 4 additions & 0 deletions extensions/suspend/locale/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
10 changes: 10 additions & 0 deletions extensions/tags/locale/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
1 change: 1 addition & 0 deletions framework/core/locale/validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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."
Expand Down
13 changes: 13 additions & 0 deletions framework/core/src/Extension/Extension.php
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,19 @@ public function getTitle()
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
*/
Expand Down
33 changes: 33 additions & 0 deletions framework/core/src/Foundation/AbstractValidator.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,21 @@

namespace Flarum\Foundation;

use Illuminate\Contracts\Cache\Store as Cache;
use Illuminate\Support\Arr;
use Illuminate\Validation\Factory;
use Illuminate\Validation\ValidationException;
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
*/
Expand Down Expand Up @@ -81,6 +89,30 @@ protected function getMessages()
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.
*
Expand All @@ -92,6 +124,7 @@ protected function makeValidator(array $attributes)
$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);
Expand Down
31 changes: 31 additions & 0 deletions framework/core/src/Foundation/ExtensionIdTrait.php
Original file line number Diff line number Diff line change
@@ -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();
}
}

0 comments on commit 397642a

Please sign in to comment.