From 88e5ba4e571ad0473e988ea88cf6f5d5df700ef0 Mon Sep 17 00:00:00 2001 From: rechosen Date: Thu, 15 Aug 2013 14:27:52 +0200 Subject: [PATCH 1/3] [ticket/11792] Add variable 'lang_set_ext' to event core.user_setup To allow extensions to add global language strings just like mods can, add the 'lang_set_ext' variable to the core.user_setup event. It requires an ext_name to be specified as well as a lang_set, and loads the specified lang_set in the context of the extension. PHPBB3-11792 --- phpBB/phpbb/user.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/phpBB/phpbb/user.php b/phpBB/phpbb/user.php index b39438e315..94cf77990e 100644 --- a/phpBB/phpbb/user.php +++ b/phpBB/phpbb/user.php @@ -128,6 +128,7 @@ class phpbb_user extends phpbb_session } $user_data = $this->data; + $lang_set_ext = array(); /** * Event to load language files and modify user data on every page @@ -139,10 +140,15 @@ class phpbb_user extends phpbb_session * @var string user_timezone User's timezone, should be one of * http://www.php.net/manual/en/timezones.php * @var mixed lang_set String or array of language files + * @var array lang_set_ext Array containing entries of format + * array( + * 'ext_name' => (string) [extension name], + * 'lang_set' => (string|array) [language files], + * ) * @var mixed style_id Style we are going to display * @since 3.1-A1 */ - $vars = array('user_data', 'user_lang_name', 'user_date_format', 'user_timezone', 'lang_set', 'style_id'); + $vars = array('user_data', 'user_lang_name', 'user_date_format', 'user_timezone', 'lang_set', 'lang_set_ext', 'style_id'); extract($phpbb_dispatcher->trigger_event('core.user_setup', compact($vars))); $this->data = $user_data; @@ -173,6 +179,12 @@ class phpbb_user extends phpbb_session $this->add_lang($lang_set); unset($lang_set); + foreach ($lang_set_ext as $ext_lang_pair) + { + $this->add_lang_ext($ext_lang_pair['ext_name'], $ext_lang_pair['lang_set']); + } + unset($lang_set_ext); + $style_request = request_var('style', 0); if ($style_request && $auth->acl_get('a_styles') && !defined('ADMIN_START')) { From 953ca1785f1493f2e50e566b3c744dbb65615b9f Mon Sep 17 00:00:00 2001 From: rechosen Date: Fri, 16 Aug 2013 14:41:15 +0200 Subject: [PATCH 2/3] [ticket/11792] Add performance remark to core.user_setup event PHPDoc To prevent extension authors from loading all their translations globally, a remark on this was added to the PHPDoc documentation of the core.user_setup event. PHPBB3-11792 --- phpBB/phpbb/user.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/phpBB/phpbb/user.php b/phpBB/phpbb/user.php index 94cf77990e..656c17aadd 100644 --- a/phpBB/phpbb/user.php +++ b/phpBB/phpbb/user.php @@ -145,6 +145,9 @@ class phpbb_user extends phpbb_session * 'ext_name' => (string) [extension name], * 'lang_set' => (string|array) [language files], * ) + * For performance reasons, only load translations + * that are absolutely needed globally using this + * event. Use local events otherwise. * @var mixed style_id Style we are going to display * @since 3.1-A1 */ From e113b468101a24fbc02157e1ada0d7ead5ccf1ae Mon Sep 17 00:00:00 2001 From: rechosen Date: Thu, 22 Aug 2013 11:06:04 +0200 Subject: [PATCH 3/3] [ticket/11792] Add functional test for var lang_set_ext of core.user_setup To ensure that the new lang_set_ext variable available with the core.user_setup event works properly, a functional test was added. It overwrites the value of the 'SKIP' language key, which is assumed to remain in use for some time to come. PHPBB3-11792 --- .../functional/extension_global_lang_test.php | 63 +++++++++++++++++++ .../fixtures/ext/foo/bar/event/user_setup.php | 43 +++++++++++++ .../ext/foo/bar/language/en/foo_global.php | 5 ++ 3 files changed, 111 insertions(+) create mode 100644 tests/functional/extension_global_lang_test.php create mode 100644 tests/functional/fixtures/ext/foo/bar/event/user_setup.php create mode 100644 tests/functional/fixtures/ext/foo/bar/language/en/foo_global.php diff --git a/tests/functional/extension_global_lang_test.php b/tests/functional/extension_global_lang_test.php new file mode 100644 index 0000000000..fb8f87e6de --- /dev/null +++ b/tests/functional/extension_global_lang_test.php @@ -0,0 +1,63 @@ +copy_ext_fixtures(dirname(__FILE__) . '/fixtures/ext/', self::$fixtures); + } + + static public function tearDownAfterClass() + { + parent::tearDownAfterClass(); + + self::$helper->restore_original_ext_dir(); + } + + public function setUp() + { + parent::setUp(); + + $this->get_db(); + + $this->phpbb_extension_manager = $this->get_extension_manager(); + + $this->purge_cache(); + } + + public function test_load_extension_lang_globally() + { + $this->phpbb_extension_manager->enable('foo/bar'); + + // The board index, which should contain an overwritten translation + $crawler = self::request('GET', 'index.php'); + + // language from language/en/common.php + $this->assertNotContains('Skip to content', $crawler->filter('.skiplink')->text()); + + // language from ext/foo/bar/language/en/foo_global.php + $this->assertContains('Overwritten by foo', $crawler->filter('.skiplink')->text()); + } +} diff --git a/tests/functional/fixtures/ext/foo/bar/event/user_setup.php b/tests/functional/fixtures/ext/foo/bar/event/user_setup.php new file mode 100644 index 0000000000..3d2d0c5325 --- /dev/null +++ b/tests/functional/fixtures/ext/foo/bar/event/user_setup.php @@ -0,0 +1,43 @@ + 'add_global_translations', + ); + } + + public function add_global_translations($event) + { + $lang_set_ext = $event['lang_set_ext']; + $lang_set_ext[] = array( + 'ext_name' => 'foo/bar', + 'lang_set' => 'foo_global', + ); + $event['lang_set_ext'] = $lang_set_ext; + } +} diff --git a/tests/functional/fixtures/ext/foo/bar/language/en/foo_global.php b/tests/functional/fixtures/ext/foo/bar/language/en/foo_global.php new file mode 100644 index 0000000000..a6af8680d3 --- /dev/null +++ b/tests/functional/fixtures/ext/foo/bar/language/en/foo_global.php @@ -0,0 +1,5 @@ + 'Overwritten by foo', +));