diff --git a/app/Providers/TranslationServiceProvider.php b/app/Providers/TranslationServiceProvider.php index 3610a1e22..6bf57e021 100644 --- a/app/Providers/TranslationServiceProvider.php +++ b/app/Providers/TranslationServiceProvider.php @@ -3,10 +3,41 @@ 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. diff --git a/app/Translation/MessageSelector.php b/app/Translation/MessageSelector.php new file mode 100644 index 000000000..1a4771b3f --- /dev/null +++ b/app/Translation/MessageSelector.php @@ -0,0 +1,19 @@ +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); + } }