mirror of
				https://github.com/BookStackApp/BookStack.git
				synced 2025-10-29 16:09:29 +03:00 
			
		
		
		
	Fixed incorrect pluralisation for de_informal
Updated language system to only use initial part of locale for translation pluralisation to better match the hard-coded logic of the built-in MessageSelector. Extends and overrides Laravel's default for this system. Added test to cover. Related to #3976.
This commit is contained in:
		| @@ -3,10 +3,41 @@ | |||||||
| namespace BookStack\Providers; | namespace BookStack\Providers; | ||||||
|  |  | ||||||
| use BookStack\Translation\FileLoader; | use BookStack\Translation\FileLoader; | ||||||
|  | use BookStack\Translation\MessageSelector; | ||||||
| use Illuminate\Translation\TranslationServiceProvider as BaseProvider; | use Illuminate\Translation\TranslationServiceProvider as BaseProvider; | ||||||
|  | use Illuminate\Translation\Translator; | ||||||
|  |  | ||||||
| class TranslationServiceProvider extends BaseProvider | 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. |      * Register the translation line loader. | ||||||
|      * Overrides the default register action from Laravel so a custom loader can be used. |      * Overrides the default register action from Laravel so a custom loader can be used. | ||||||
|   | |||||||
							
								
								
									
										19
									
								
								app/Translation/MessageSelector.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								app/Translation/MessageSelector.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | <?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); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -4,7 +4,7 @@ namespace Tests; | |||||||
|  |  | ||||||
| class LanguageTest extends TestCase | class LanguageTest extends TestCase | ||||||
| { | { | ||||||
|     protected $langs; |     protected array $langs; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * LanguageTest constructor. |      * LanguageTest constructor. | ||||||
| @@ -81,4 +81,16 @@ class LanguageTest extends TestCase | |||||||
|         $this->get('/'); |         $this->get('/'); | ||||||
|         $this->assertTrue(config('app.rtl'), 'App RTL config should have been set to true by middleware'); |         $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); | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user