Skip to content

Commit

Permalink
Fixed pluralization bug due to dashed-locale names instead of undersc…
Browse files Browse the repository at this point in the history
…ored

Our locale directories are named things like 'en-US'. But the pluralization
code used by Laravel (through Symfony) requires locale names to be
in the format en_US. This change introduces a new Translator,
SnipeTranslator, which is a tiny set of changes against the built-in
one. It additionally adds a SnipeTranslationServiceProvider, which
loads up the new Translator.
  • Loading branch information
uberbrady committed Jan 26, 2024
1 parent b39d11c commit 401e184
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 1 deletion.
35 changes: 35 additions & 0 deletions app/Providers/SnipeTranslationServiceProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

namespace App\Providers;

use App\Services\SnipeTranslator;
use Illuminate\Translation\TranslationServiceProvider;

class SnipeTranslationServiceProvider extends TranslationServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//This is almost an *EXACT* carbon-copy of the TranslationServiceProvider, except with a modified Translator
$this->registerLoader();

$this->app->singleton('translator', function ($app) {
$loader = $app['translation.loader'];

// When registering the translator component, we'll need to set the default
// locale as well as the fallback locale. So, we'll grab the application
// configuration so we can easily get both of these values from there.
$locale = $app['config']['app.locale'];

$trans = new SnipeTranslator($loader, $locale); //the ONLY changed line

$trans->setFallback($app['config']['app.fallback_locale']);

return $trans;
});
}
}
42 changes: 42 additions & 0 deletions app/Services/SnipeTranslator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php

namespace App\Services;

use Illuminate\Translation\Translator;

/***************************************************************
* This is just a very, very light modification to the default Laravel Translator.
* The only difference it has is that it modifies the $locale
* value when the pluralizations are done so we can switch over from en-US to en_US (for example).
*
* This means our translation directories can stay where they are (en-US), but the
* pluralization code can get executed against a locale of en_US
* (Which is required by Symfony, for some inexplicable reason)
*
* This method is called by the trans_choice() helper, which we *do* use a lot.
***************************************************************/
class SnipeTranslator extends Translator {

//This is copied-and-pasted (almost) verbatim from Illuminate\Translation\Translator
public function choice($key, $number, array $replace = [], $locale = null)
{
$line = $this->get(
$key, $replace, $locale = $this->localeForChoice($locale)
);

// If the given "number" is actually an array or countable we will simply count the
// number of elements in an instance. This allows developers to pass an array of
// items without having to count it on their end first which gives bad syntax.
if (is_array($number) || $number instanceof Countable) {
$number = count($number);
}

$replace['count'] = $number;

$underscored_locale = str_replace("-","_",$locale); // OUR CHANGE.
return $this->makeReplacements( // BELOW - that $underscored_locale is the *ONLY* modified part
$this->getSelector()->choose($line, $number, $underscored_locale), $replace
);
}

}
3 changes: 2 additions & 1 deletion config/app.php
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,8 @@
Illuminate\Redis\RedisServiceProvider::class,
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
Illuminate\Session\SessionServiceProvider::class,
Illuminate\Translation\TranslationServiceProvider::class,
// Illuminate\Translation\TranslationServiceProvider::class, //replaced on next line
App\Providers\SnipeTranslationServiceProvider::class, //we REPLACE the default Laravel translator with our own
Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class,
Barryvdh\DomPDF\ServiceProvider::class,
Expand Down

0 comments on commit 401e184

Please sign in to comment.