1
0
mirror of https://github.com/flarum/core.git synced 2025-07-26 11:10:41 +02:00

Refactor translation and validation

We now use Symfony's Translation component. Yay! We get more powerful pluralisation and better a fallback mechanism. Will want to implement the caching mechanism at some point too. The API is replicated in JavaScript, which could definitely use some testing.

Validators have been refactored so that they are decoupled from models completely (i.e. they simply validate arrays of user input). Language packs should include Laravel's validation messages.

ref #267
This commit is contained in:
Toby Zerner
2015-10-15 22:30:45 +10:30
parent 154465069d
commit bc3fa5d451
32 changed files with 578 additions and 4096 deletions

View File

@@ -129,7 +129,7 @@ abstract class AbstractClientController extends AbstractHtmlController
{
$actor = $request->getAttribute('actor');
$assets = $this->getAssets();
$locale = $this->getLocale($actor, $request);
$locale = $this->locales->getLocale();
$localeCompiler = $locale ? $this->getLocaleCompiler($locale) : null;
$view = new ClientView(
@@ -157,7 +157,7 @@ abstract class AbstractClientController extends AbstractHtmlController
);
if ($localeCompiler) {
$translations = $this->locales->getTranslations($locale);
$translations = $this->locales->getTranslator()->getMessages()['messages'];
$translations = $this->filterTranslations($translations, $keys);
@@ -293,30 +293,6 @@ abstract class AbstractClientController extends AbstractHtmlController
return $compiler;
}
/**
* Get the name of the locale to use.
*
* @param User $actor
* @param Request $request
* @return string
*/
protected function getLocale(User $actor, Request $request)
{
if ($actor->exists) {
$locale = $actor->getPreference('locale');
} else {
$locale = array_get($request->getCookieParams(), 'locale');
}
if (! $locale || ! $this->locales->hasLocale($locale)) {
$locale = $this->settings->get('default_locale', 'en');
}
if ($this->locales->hasLocale($locale)) {
return $locale;
}
}
/**
* Get the path to the directory where assets should be written.
*
@@ -336,19 +312,12 @@ abstract class AbstractClientController extends AbstractHtmlController
*/
protected function filterTranslations(array $translations, array $keys)
{
$filtered = [];
foreach ($keys as $key) {
$parts = explode('.', $key);
$level = &$filtered;
foreach ($parts as $part) {
$level = &$level[$part];
return array_filter($translations, function ($id) use ($keys) {
foreach ($keys as $key) {
if (substr($id, 0, strlen($key)) === $key) {
return true;
}
}
$level = array_get($translations, $key);
}
return $filtered;
}, ARRAY_FILTER_USE_KEY);
}
}

View File

@@ -96,22 +96,22 @@ class ClientView implements Renderable
protected $request;
/**
* @var \Flarum\Asset\AssetManager
* @var AssetManager
*/
protected $assets;
/**
* @var JsCompiler
*/
protected $locale;
protected $localeJs;
/**
* @param Client $api
* @param Request $request
* @param User $actor
* @param \Flarum\Asset\AssetManager $assets
* @param AssetManager $assets
* @param string $layout
* @param JsCompiler $locale
* @param JsCompiler $localeJs
*/
public function __construct(
Client $api,
@@ -119,14 +119,14 @@ class ClientView implements Renderable
User $actor,
AssetManager $assets,
$layout,
JsCompiler $locale = null
JsCompiler $localeJs = null
) {
$this->api = $api;
$this->request = $request;
$this->actor = $actor;
$this->assets = $assets;
$this->layout = $layout;
$this->locale = $locale;
$this->localeJs = $localeJs;
}
/**
@@ -214,7 +214,7 @@ class ClientView implements Renderable
/**
* Get the view's asset manager.
*
* @return \Flarum\Asset\AssetManager
* @return AssetManager
*/
public function getAssets()
{
@@ -264,8 +264,8 @@ class ClientView implements Renderable
$view->styles = [$this->assets->getCssFile()];
$view->scripts = [$this->assets->getJsFile()];
if ($this->locale) {
$view->scripts[] = $this->locale->getFile();
if ($this->localeJs) {
$view->scripts[] = $this->localeJs->getFile();
}
$view->head = implode("\n", $this->headStrings);

View File

@@ -12,12 +12,26 @@ namespace Flarum\Http\Middleware;
use Flarum\Api\AccessToken;
use Flarum\Core\Guest;
use Flarum\Locale\LocaleManager;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Zend\Stratigility\MiddlewareInterface;
class AuthenticateWithCookie implements MiddlewareInterface
{
/**
* @var LocaleManager
*/
protected $locales;
/**
* @param LocaleManager $locales
*/
public function __construct(LocaleManager $locales)
{
$this->locales = $locales;
}
/**
* {@inheritdoc}
*/
@@ -36,17 +50,27 @@ class AuthenticateWithCookie implements MiddlewareInterface
*/
protected function logIn(Request $request)
{
$actor = new Guest;
if ($token = $this->getToken($request)) {
if (! $token->isValid()) {
// TODO: https://github.com/flarum/core/issues/253
} elseif ($user = $token->user) {
$user->updateLastSeen()->save();
return $request->withAttribute('actor', $user);
} elseif ($actor = $token->user) {
$actor->updateLastSeen()->save();
}
}
return $request->withAttribute('actor', new Guest);
if ($actor->exists) {
$locale = $actor->getPreference('locale');
} else {
$locale = array_get($request->getCookieParams(), 'locale');
}
if ($locale && $this->locales->hasLocale($locale)) {
$this->locales->setLocale($locale);
}
return $request->withAttribute('actor', $actor);
}
/**