From 9ad58a8563de39dc45bdeb64cb961a29a51731a6 Mon Sep 17 00:00:00 2001 From: Huei Tan Date: Wed, 15 Apr 2026 13:06:26 +0200 Subject: [PATCH 1/7] Add getTerritories() as the method in JS and PHP utils --- src/LanguageUtil.php | 8 ++++++++ src/index.js | 11 +++++++++++ tests/js/index.js | 8 ++++++++ tests/php/LanguageUtilTest.php | 20 ++++++++++++++++++++ 4 files changed, 47 insertions(+) diff --git a/src/LanguageUtil.php b/src/LanguageUtil.php index 692ef246..19e35727 100644 --- a/src/LanguageUtil.php +++ b/src/LanguageUtil.php @@ -365,6 +365,14 @@ public function getDir( string $languageCode ) { return false; } + /** + * Returns all territories. + * @return stdClass + */ + public function getTerritories() { + return $this->data->territories; + } + /** * Returns the languages spoken in a territory * @param string $territory Territory code diff --git a/src/index.js b/src/index.js index 1ba2a3aa..dab3092c 100644 --- a/src/index.js +++ b/src/index.js @@ -284,6 +284,16 @@ function getDir( language ) { return isRtl( language ) ? 'rtl' : 'ltr'; } +/** + * Returns all territories and the languages spoken in each. + * + * @return {Object} An object whose keys are territory codes and whose values + * are arrays of language codes spoken in that territory. + */ +function getTerritories() { + return languageData.territories; +} + /** * Returns the languages spoken in a territory. * @@ -328,6 +338,7 @@ module.exports = { getRegionGroups, getScript, getScriptGroupOfLanguage, + getTerritories, isKnown, isRedirect, isRtl, diff --git a/tests/js/index.js b/tests/js/index.js index d3ed4a8d..13d43258 100644 --- a/tests/js/index.js +++ b/tests/js/index.js @@ -151,6 +151,14 @@ describe( 'languagedata', () => { 'An invalid country has no languages and returns an empty array' ); + const territories = languageData.getTerritories(); + assert.ok( typeof territories === 'object' && territories !== null, 'getTerritories() returns an object' ); + assert.ok( Array.isArray( territories[ 'US' ] ), 'US territory entry is an array' ); + assert.ok( territories[ 'US' ].includes( 'en' ), 'English is listed for the US territory' ); + assert.ok( territories[ 'RU' ].includes( 'sah' ), 'Sakha is listed for the RU territory via getTerritories()' ); + assert.ok( Object.keys( territories ).length > 0, 'getTerritories() returns a non-empty set of territories' ); + assert.strictEqual( territories[ 'no-such-country' ], undefined, 'An invalid territory code is not present in getTerritories()' ); + const languagesAM = [ 'atj', 'chr', 'chy', 'cr', 'en', 'es', 'fr', 'gn', 'haw', 'ike-cans', 'ik', 'kl', 'nl', 'pt', 'qu', 'srn', 'yi' ]; assert.deepEqual( languageData.sortByScriptGroup( languagesAM.sort( languageData.sortByAutonym ) ), diff --git a/tests/php/LanguageUtilTest.php b/tests/php/LanguageUtilTest.php index eec2603b..18592601 100644 --- a/tests/php/LanguageUtilTest.php +++ b/tests/php/LanguageUtilTest.php @@ -198,6 +198,26 @@ public function testGetLanguagesInTerritory() { $this->assertNotContains( 'de', $actualsAFG ); } + public function testGetTerritories() { + $territories = $this->languageUtil->getTerritories(); + + $this->assertInstanceOf( \stdClass::class, $territories, 'getTerritories() returns a stdClass object' ); + + $this->assertObjectHasProperty( 'US', $territories, 'US is a known territory' ); + $this->assertContains( 'en', $territories->US, 'English is listed for the US territory' ); + + $this->assertObjectHasProperty( 'AT', $territories, 'AT is a known territory' ); + $this->assertContains( 'de', $territories->AT, 'German is listed for the AT territory' ); + + $this->assertObjectNotHasProperty( + 'no-such-country', + $territories, + 'An invalid territory code is not present in getTerritories()' + ); + + $this->assertGreaterThan( 0, count( (array)$territories ), 'getTerritories() returns a non-empty set of territories' ); + } + public function testAddLanguage() { $this->assertFalse( $this->languageUtil->isKnown( 'xyz' ) ); $this->assertNotContains( From b162267e933a13271d9939db989753e456fa63dd Mon Sep 17 00:00:00 2001 From: Huei Tan Date: Wed, 15 Apr 2026 13:25:00 +0200 Subject: [PATCH 2/7] fix linter --- tests/php/LanguageUtilTest.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/php/LanguageUtilTest.php b/tests/php/LanguageUtilTest.php index 18592601..b942549c 100644 --- a/tests/php/LanguageUtilTest.php +++ b/tests/php/LanguageUtilTest.php @@ -215,7 +215,11 @@ public function testGetTerritories() { 'An invalid territory code is not present in getTerritories()' ); - $this->assertGreaterThan( 0, count( (array)$territories ), 'getTerritories() returns a non-empty set of territories' ); + $this->assertGreaterThan( + 0, + count( (array)$territories ), + 'getTerritories() returns a non-empty set of territories' + ); } public function testAddLanguage() { From 39801ca934322314d7c7c8bb9ced7773221c7c88 Mon Sep 17 00:00:00 2001 From: Huei Tan Date: Wed, 15 Apr 2026 16:02:10 +0200 Subject: [PATCH 3/7] update feedback --- src/LanguageUtil.php | 7 ++++--- src/index.js | 4 ++-- tests/js/index.js | 10 +++++----- tests/php/LanguageUtilTest.php | 10 ++++------ 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/LanguageUtil.php b/src/LanguageUtil.php index 19e35727..28c8d0cc 100644 --- a/src/LanguageUtil.php +++ b/src/LanguageUtil.php @@ -366,10 +366,11 @@ public function getDir( string $languageCode ) { } /** - * Returns all territories. - * @return stdClass + * Returns all territories and the languages spoken in each. + * @return object An object whose keys are territory codes and whose values + * are arrays of language codes spoken in that territory. */ - public function getTerritories() { + public function getTerritoriesWithLanguages(): object { return $this->data->territories; } diff --git a/src/index.js b/src/index.js index dab3092c..8d81c2d2 100644 --- a/src/index.js +++ b/src/index.js @@ -290,7 +290,7 @@ function getDir( language ) { * @return {Object} An object whose keys are territory codes and whose values * are arrays of language codes spoken in that territory. */ -function getTerritories() { +function getTerritoriesWithLanguages() { return languageData.territories; } @@ -338,7 +338,7 @@ module.exports = { getRegionGroups, getScript, getScriptGroupOfLanguage, - getTerritories, + getTerritoriesWithLanguages, isKnown, isRedirect, isRtl, diff --git a/tests/js/index.js b/tests/js/index.js index 13d43258..ed67127e 100644 --- a/tests/js/index.js +++ b/tests/js/index.js @@ -151,13 +151,13 @@ describe( 'languagedata', () => { 'An invalid country has no languages and returns an empty array' ); - const territories = languageData.getTerritories(); - assert.ok( typeof territories === 'object' && territories !== null, 'getTerritories() returns an object' ); + const territories = languageData.getTerritoriesWithLanguages(); + assert.ok( typeof territories === 'object' && territories !== null, 'getTerritoriesWithLanguages() returns an object' ); assert.ok( Array.isArray( territories[ 'US' ] ), 'US territory entry is an array' ); assert.ok( territories[ 'US' ].includes( 'en' ), 'English is listed for the US territory' ); - assert.ok( territories[ 'RU' ].includes( 'sah' ), 'Sakha is listed for the RU territory via getTerritories()' ); - assert.ok( Object.keys( territories ).length > 0, 'getTerritories() returns a non-empty set of territories' ); - assert.strictEqual( territories[ 'no-such-country' ], undefined, 'An invalid territory code is not present in getTerritories()' ); + assert.ok( territories[ 'RU' ].includes( 'sah' ), 'Sakha is listed for the RU territory via getTerritoriesWithLanguages()' ); + assert.ok( Object.keys( territories ).length > 0, 'getTerritoriesWithLanguages() returns a non-empty set of territories' ); + assert.strictEqual( territories[ 'no-such-country' ], undefined, 'An invalid territory code is not present in getTerritoriesWithLanguages()' ); const languagesAM = [ 'atj', 'chr', 'chy', 'cr', 'en', 'es', 'fr', 'gn', 'haw', 'ike-cans', 'ik', 'kl', 'nl', 'pt', 'qu', 'srn', 'yi' ]; assert.deepEqual( diff --git a/tests/php/LanguageUtilTest.php b/tests/php/LanguageUtilTest.php index b942549c..658ec8f9 100644 --- a/tests/php/LanguageUtilTest.php +++ b/tests/php/LanguageUtilTest.php @@ -198,10 +198,8 @@ public function testGetLanguagesInTerritory() { $this->assertNotContains( 'de', $actualsAFG ); } - public function testGetTerritories() { - $territories = $this->languageUtil->getTerritories(); - - $this->assertInstanceOf( \stdClass::class, $territories, 'getTerritories() returns a stdClass object' ); + public function testGetTerritoriesWithLanguages() { + $territories = $this->languageUtil->getTerritoriesWithLanguages(); $this->assertObjectHasProperty( 'US', $territories, 'US is a known territory' ); $this->assertContains( 'en', $territories->US, 'English is listed for the US territory' ); @@ -212,13 +210,13 @@ public function testGetTerritories() { $this->assertObjectNotHasProperty( 'no-such-country', $territories, - 'An invalid territory code is not present in getTerritories()' + 'An invalid territory code is not present in getTerritoriesWithLanguages()' ); $this->assertGreaterThan( 0, count( (array)$territories ), - 'getTerritories() returns a non-empty set of territories' + 'getTerritoriesWithLanguages() returns a non-empty set of territories' ); } From d1d7ab09ac4432f9eb2172fd0c1eab4227ec4153 Mon Sep 17 00:00:00 2001 From: Huei Tan Date: Wed, 15 Apr 2026 16:04:17 +0200 Subject: [PATCH 4/7] update feedback --- src/LanguageUtil.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/LanguageUtil.php b/src/LanguageUtil.php index 28c8d0cc..1fe6765d 100644 --- a/src/LanguageUtil.php +++ b/src/LanguageUtil.php @@ -7,6 +7,8 @@ namespace Wikimedia\LanguageData; +use stdClass; + /** * A singleton utility class to query the language data. */ @@ -367,10 +369,10 @@ public function getDir( string $languageCode ) { /** * Returns all territories and the languages spoken in each. - * @return object An object whose keys are territory codes and whose values + * @return stdClass An object whose keys are territory codes and whose values * are arrays of language codes spoken in that territory. */ - public function getTerritoriesWithLanguages(): object { + public function getTerritoriesWithLanguages(): stdClass { return $this->data->territories; } From de6913955a8e6a0bec5536306f137da78461226a Mon Sep 17 00:00:00 2001 From: Huei Tan Date: Wed, 15 Apr 2026 16:12:28 +0200 Subject: [PATCH 5/7] update doc --- docs/index.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/index.rst b/docs/index.rst index fa90db8c..ba511f5e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -86,6 +86,11 @@ The basic usage is like this: languageData.getAutonym( 'en'); // Returns version of the language data or UNKNOWN if not declared languageData.getVersion(); + // Returns an object mapping all territory codes to their language arrays + // e.g. { US: ['en', 'es', ...], DE: ['de'], ... } + languageData.getTerritoriesWithLanguages(); + // Returns the languages spoken in a specific territory + languageData.getLanguagesInTerritory( 'US' ); The exposed methods are similar to the methods present in the PHP `LanguageUtil `_ class. From e7dead4fe0545fd1834286e4e6f1b319f19b65f3 Mon Sep 17 00:00:00 2001 From: Huei Tan Date: Wed, 15 Apr 2026 16:20:32 +0200 Subject: [PATCH 6/7] Bump version to 2.0.3 and update changelog --- CHANGELOG.md | 6 ++++++ data/language-data.json | 2 +- package.json | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5dd4b43d..48f57c40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -303,6 +303,9 @@ Language data related changes, 10. [Add Madurese (mad)](https://github.com/wikimedia/language-data/pull/#104) ## PHP +### PHP 1.1.13 (2026-04-15) +- [Add getTerritoriesWithLanguages method to retrieve territory-based language information](https://github.com/wikimedia/language-data/pull/T423319) + ### PHP 1.1.12 (2026-04-13) - [Add a getVersion method to return language data version](https://github.com/wikimedia/language-data/pull/494) @@ -391,6 +394,9 @@ Language data related changes, - Add PHP support. [Documentation](https://language-data.readthedocs.io/en/latest/api/languagedata/languageutil.html). [Packagist](https://packagist.org/packages/wikimedia/language-data). ## Node.js +### Node.js 2.0.3 (2026-04-15) +- [Add getTerritoriesWithLanguages method to retrieve territory-based language information](https://github.com/wikimedia/language-data/pull/T423319) + ### Node.js 2.0.2 (2026-04-13) - [Add a getVersion method to return language data version](https://github.com/wikimedia/language-data/pull/494) diff --git a/data/language-data.json b/data/language-data.json index 93a436df..92184496 100644 --- a/data/language-data.json +++ b/data/language-data.json @@ -7767,5 +7767,5 @@ "tn" ] }, - "version": "2026-04-13T11:10:55+00:00" + "version": "2026-04-15T14:20:00+00:00" } diff --git a/package.json b/package.json index f1ede357..be0151c9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@wikimedia/language-data", - "version": "2.0.2", + "version": "2.0.3", "description": "Language data and utilities.", "homepage": "https://language-data.readthedocs.io/en/latest/index.html", "keywords": [ From 8bae716ca705a5bd96e3d3524ee9ac9ecd4a3cbe Mon Sep 17 00:00:00 2001 From: Huei Tan Date: Wed, 15 Apr 2026 16:53:00 +0200 Subject: [PATCH 7/7] Revert "Bump version to 2.0.3 and update changelog" This reverts commit e7dead4fe0545fd1834286e4e6f1b319f19b65f3. --- CHANGELOG.md | 6 ------ data/language-data.json | 2 +- package.json | 2 +- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48f57c40..5dd4b43d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -303,9 +303,6 @@ Language data related changes, 10. [Add Madurese (mad)](https://github.com/wikimedia/language-data/pull/#104) ## PHP -### PHP 1.1.13 (2026-04-15) -- [Add getTerritoriesWithLanguages method to retrieve territory-based language information](https://github.com/wikimedia/language-data/pull/T423319) - ### PHP 1.1.12 (2026-04-13) - [Add a getVersion method to return language data version](https://github.com/wikimedia/language-data/pull/494) @@ -394,9 +391,6 @@ Language data related changes, - Add PHP support. [Documentation](https://language-data.readthedocs.io/en/latest/api/languagedata/languageutil.html). [Packagist](https://packagist.org/packages/wikimedia/language-data). ## Node.js -### Node.js 2.0.3 (2026-04-15) -- [Add getTerritoriesWithLanguages method to retrieve territory-based language information](https://github.com/wikimedia/language-data/pull/T423319) - ### Node.js 2.0.2 (2026-04-13) - [Add a getVersion method to return language data version](https://github.com/wikimedia/language-data/pull/494) diff --git a/data/language-data.json b/data/language-data.json index 92184496..93a436df 100644 --- a/data/language-data.json +++ b/data/language-data.json @@ -7767,5 +7767,5 @@ "tn" ] }, - "version": "2026-04-15T14:20:00+00:00" + "version": "2026-04-13T11:10:55+00:00" } diff --git a/package.json b/package.json index be0151c9..f1ede357 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@wikimedia/language-data", - "version": "2.0.3", + "version": "2.0.2", "description": "Language data and utilities.", "homepage": "https://language-data.readthedocs.io/en/latest/index.html", "keywords": [