namespace BookStack\Providers;
use BookStack\Translation\FileLoader;
+use BookStack\Translation\MessageSelector;
use Illuminate\Translation\TranslationServiceProvider as BaseProvider;
+use Illuminate\Translation\Translator;
class TranslationServiceProvider extends BaseProvider
{
+ /**
+ * Register the service provider.
+ *
+ * @return void
+ */
+ public function register()
+ {
+ $this->registerLoader();
+
+ // This is a tweak upon Laravel's based translation service registration to allow
+ // usage of a custom MessageSelector class
+ $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 Translator($loader, $locale);
+ $trans->setFallback($app['config']['app.fallback_locale']);
+ $trans->setSelector(new MessageSelector());
+
+ return $trans;
+ });
+ }
+
+
+
/**
* Register the translation line loader.
* Overrides the default register action from Laravel so a custom loader can be used.
--- /dev/null
+<?php
+
+namespace BookStack\Translation;
+
+use Illuminate\Translation\MessageSelector as BaseClass;
+
+/**
+ * This is a customization of the default Laravel MessageSelector class to tweak pluralization,
+ * so that is uses just the first part of the locale string to provide support with
+ * non-standard locales such as "de_informal".
+ */
+class MessageSelector extends BaseClass
+{
+ public function getPluralIndex($locale, $number)
+ {
+ $locale = explode('_', $locale)[0];
+ return parent::getPluralIndex($locale, $number);
+ }
+}
class LanguageTest extends TestCase
{
- protected $langs;
+ protected array $langs;
/**
* LanguageTest constructor.
$this->get('/');
$this->assertTrue(config('app.rtl'), 'App RTL config should have been set to true by middleware');
}
+
+ public function test_pluralisation_for_non_standard_locales()
+ {
+ $text = trans_choice('entities.x_pages', 1, [], 'de_informal');
+ $this->assertEquals('1 Seite', $text);
+
+ $text = trans_choice('entities.x_pages', 2, [], 'de_informal');
+ $this->assertEquals('2 Seiten', $text);
+
+ $text = trans_choice('entities.x_pages', 0, [], 'de_informal');
+ $this->assertEquals('0 Seiten', $text);
+ }
}