| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Tests; | 
					
						
							| 
									
										
										
										
											2017-03-05 23:10:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-12 23:45:30 +08:00
										 |  |  | use BookStack\Activity\ActivityType; | 
					
						
							| 
									
										
										
										
											2023-09-17 23:20:21 +08:00
										 |  |  | use BookStack\Translation\LocaleManager; | 
					
						
							| 
									
										
										
										
											2023-06-12 23:45:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 23:10:06 +08:00
										 |  |  | class LanguageTest extends TestCase | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2023-02-28 03:09:20 +08:00
										 |  |  |     protected array $langs; | 
					
						
							| 
									
										
										
										
											2017-03-05 23:34:54 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * LanguageTest constructor. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-10-31 04:29:59 +08:00
										 |  |  |     protected function setUp(): void | 
					
						
							| 
									
										
										
										
											2017-03-05 23:34:54 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         parent::setUp(); | 
					
						
							| 
									
										
										
										
											2023-02-07 04:41:33 +08:00
										 |  |  |         $this->langs = array_diff(scandir(lang_path('')), ['..', '.']); | 
					
						
							| 
									
										
										
										
											2017-03-05 23:34:54 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-17 23:20:21 +08:00
										 |  |  |     public function test_locales_list_set_properly() | 
					
						
							| 
									
										
										
										
											2017-04-29 23:47:41 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-09-17 23:20:21 +08:00
										 |  |  |         $appLocales = $this->app->make(LocaleManager::class)->getAllAppLocales(); | 
					
						
							|  |  |  |         sort($appLocales); | 
					
						
							| 
									
										
										
										
											2017-04-29 23:47:41 +08:00
										 |  |  |         sort($this->langs); | 
					
						
							| 
									
										
										
										
											2023-09-17 23:20:21 +08:00
										 |  |  |         $this->assertEquals(implode(':', $this->langs), implode(':', $appLocales), 'app.locales configuration variable does not match those found in lang files'); | 
					
						
							| 
									
										
										
										
											2017-04-29 23:47:41 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-05 20:07:19 +08:00
										 |  |  |     // Not part of standard phpunit test runs since we sometimes expect non-added langs.
 | 
					
						
							|  |  |  |     public function do_test_locales_all_have_language_dropdown_entry() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $dropdownLocales = array_keys(trans('settings.language_select', [], 'en')); | 
					
						
							|  |  |  |         sort($dropdownLocales); | 
					
						
							|  |  |  |         sort($this->langs); | 
					
						
							|  |  |  |         $diffs = array_diff($this->langs, $dropdownLocales); | 
					
						
							|  |  |  |         if (count($diffs) > 0) { | 
					
						
							|  |  |  |             $diffText = implode(',', $diffs); | 
					
						
							| 
									
										
										
										
											2024-10-04 17:59:34 +08:00
										 |  |  |             $warning = "Languages: {$diffText} found in files but not in language select dropdown."; | 
					
						
							|  |  |  |             $this->fail($warning); | 
					
						
							| 
									
										
										
										
											2020-04-05 20:07:19 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |         $this->assertTrue(true); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-29 23:47:41 +08:00
										 |  |  |     public function test_correct_language_if_not_logged_in() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $loginReq = $this->get('/login'); | 
					
						
							|  |  |  |         $loginReq->assertSee('Log In'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $loginPageFrenchReq = $this->get('/login', ['Accept-Language' => 'fr']); | 
					
						
							|  |  |  |         $loginPageFrenchReq->assertSee('Se Connecter'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 20:34:14 +08:00
										 |  |  |     public function test_public_lang_autodetect_can_be_disabled() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         config()->set('app.auto_detect_locale', false); | 
					
						
							|  |  |  |         $loginReq = $this->get('/login'); | 
					
						
							|  |  |  |         $loginReq->assertSee('Log In'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $loginPageFrenchReq = $this->get('/login', ['Accept-Language' => 'fr']); | 
					
						
							|  |  |  |         $loginPageFrenchReq->assertDontSee('Se Connecter'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 23:34:54 +08:00
										 |  |  |     public function test_all_lang_files_loadable() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-02-07 04:41:33 +08:00
										 |  |  |         $files = array_diff(scandir(lang_path('en')), ['..', '.']); | 
					
						
							| 
									
										
										
										
											2017-03-05 23:34:54 +08:00
										 |  |  |         foreach ($this->langs as $lang) { | 
					
						
							|  |  |  |             foreach ($files as $file) { | 
					
						
							|  |  |  |                 $loadError = false; | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 23:34:54 +08:00
										 |  |  |                 try { | 
					
						
							|  |  |  |                     $translations = trans(str_replace('.php', '', $file), [], $lang); | 
					
						
							|  |  |  |                 } catch (\Exception $e) { | 
					
						
							|  |  |  |                     $loadError = true; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 $this->assertFalse($loadError, "Translation file {$lang}/{$file} failed to load"); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-17 23:20:21 +08:00
										 |  |  |     public function test_views_use_rtl_if_rtl_language_is_set() | 
					
						
							| 
									
										
										
										
											2018-09-22 20:18:26 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-09-17 23:20:21 +08:00
										 |  |  |         $this->asEditor()->withHtml($this->get('/'))->assertElementExists('html[dir="ltr"]'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-21 19:08:34 +08:00
										 |  |  |         setting()->putUser($this->users->editor(), 'language', 'ar'); | 
					
						
							| 
									
										
										
										
											2023-09-17 23:20:21 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->withHtml($this->get('/'))->assertElementExists('html[dir="rtl"]'); | 
					
						
							| 
									
										
										
										
											2018-09-22 20:18:26 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-02-28 03:09:20 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     public function test_unknown_lang_does_not_break_app() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         config()->set('app.locale', 'zz'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $loginReq = $this->get('/login', ['Accept-Language' => 'zz']); | 
					
						
							|  |  |  |         $loginReq->assertOk(); | 
					
						
							|  |  |  |         $loginReq->assertSee('Log In'); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-06-12 23:45:30 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     public function test_all_activity_types_have_activity_text() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         foreach (ActivityType::all() as $activityType) { | 
					
						
							|  |  |  |             $langKey = 'activities.' . $activityType; | 
					
						
							|  |  |  |             $this->assertNotEquals($langKey, trans($langKey, [], 'en')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | } |