From 2d5f6833fb5054937752c64f0c5bf64ddb91c2c1 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Mon, 28 Feb 2022 15:40:15 +0000 Subject: [PATCH] I18N: Add a `$locale` parameter for `remove_accents()`. This highlights the fact that `remove_accents()` is locale-aware and makes it easier to utilize the function with different locales without having to use `switch_to_locale()` or the `locale` filter. Additionally, this commit relaxes the check for character replacements in German locales to include formal and informal variants of any `de_*` locale, even if WordPress does not have a native translation for some of them yet. Props malthert, johnbillion, knutsp, ocean90, SergeyBiryukov. Fixes #54415. git-svn-id: https://develop.svn.wordpress.org/trunk@52809 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/formatting.php | 19 +++++++-- .../tests/formatting/removeAccents.php | 42 ++----------------- 2 files changed, 19 insertions(+), 42 deletions(-) diff --git a/src/wp-includes/formatting.php b/src/wp-includes/formatting.php index 41c6afbec2..ff90ebd022 100644 --- a/src/wp-includes/formatting.php +++ b/src/wp-includes/formatting.php @@ -1583,11 +1583,15 @@ function utf8_uri_encode( $utf8_string, $length = 0, $encode_ascii_characters = * @since 4.7.0 Added locale support for `sr_RS`. * @since 4.8.0 Added locale support for `bs_BA`. * @since 5.7.0 Added locale support for `de_AT`. + * @since 6.0.0 Added the `$locale` parameter. * - * @param string $string Text that might have accent characters + * @param string $string Text that might have accent characters. + * @param string $locale Optional. The locale to use for accent removal. Some character + * replacements depend on the locale being used (e.g. 'de_DE'). + * Defaults to the current locale. * @return string Filtered string with replaced "nice" characters. */ -function remove_accents( $string ) { +function remove_accents( $string, $locale = '' ) { if ( ! preg_match( '/[\x80-\xff]/', $string ) ) { return $string; } @@ -1923,9 +1927,16 @@ function remove_accents( $string ) { ); // Used for locale-specific rules. - $locale = get_locale(); + if ( empty( $locale ) ) { + $locale = get_locale(); + } - if ( in_array( $locale, array( 'de_DE', 'de_DE_formal', 'de_CH', 'de_CH_informal', 'de_AT' ), true ) ) { + /* + * German has various locales (de_DE, de_CH, de_AT, ...) with formal and informal variants. + * There is no 3-letter locale like 'def', so checking for 'de' instead of 'de_' is safe, + * since 'de' itself would be a valid locale too). + */ + if ( str_starts_with( $locale, 'de' ) ) { $chars['Ä'] = 'Ae'; $chars['ä'] = 'ae'; $chars['Ö'] = 'Oe'; diff --git a/tests/phpunit/tests/formatting/removeAccents.php b/tests/phpunit/tests/formatting/removeAccents.php index 19fd50586b..2ebea564a5 100644 --- a/tests/phpunit/tests/formatting/removeAccents.php +++ b/tests/phpunit/tests/formatting/removeAccents.php @@ -80,67 +80,33 @@ class Tests_Formatting_RemoveAccents extends WP_UnitTestCase { $this->assertSame( 'aaeiouuAEIOUU', remove_accents( 'aɑeiouüAEIOUÜ' ) ); } - public function remove_accents_germanic_umlauts_cb() { - return 'de_DE'; - } - /** * @ticket 3782 */ public function test_remove_accents_germanic_umlauts() { - add_filter( 'locale', array( $this, 'remove_accents_germanic_umlauts_cb' ) ); - - $this->assertSame( 'AeOeUeaeoeuess', remove_accents( 'ÄÖÜäöüß' ) ); - - remove_filter( 'locale', array( $this, 'remove_accents_germanic_umlauts_cb' ) ); - } - - public function set_locale_to_danish() { - return 'da_DK'; + $this->assertSame( 'AeOeUeaeoeuess', remove_accents( 'ÄÖÜäöüß', 'de_DE' ) ); } /** * @ticket 23907 */ public function test_remove_danish_accents() { - add_filter( 'locale', array( $this, 'set_locale_to_danish' ) ); - - $this->assertSame( 'AeOeAaaeoeaa', remove_accents( 'ÆØÅæøå' ) ); - - remove_filter( 'locale', array( $this, 'set_locale_to_danish' ) ); - } - - public function set_locale_to_catalan() { - return 'ca'; + $this->assertSame( 'AeOeAaaeoeaa', remove_accents( 'ÆØÅæøå', 'da_DK' ) ); } /** * @ticket 37086 */ public function test_remove_catalan_middot() { - add_filter( 'locale', array( $this, 'set_locale_to_catalan' ) ); - - $this->assertSame( 'allallalla', remove_accents( 'al·lallaŀla' ) ); - - remove_filter( 'locale', array( $this, 'set_locale_to_catalan' ) ); - + $this->assertSame( 'allallalla', remove_accents( 'al·lallaŀla', 'ca' ) ); $this->assertSame( 'al·lallalla', remove_accents( 'al·lallaŀla' ) ); } - public function set_locale_to_serbian() { - return 'sr_RS'; - } - /** * @ticket 38078 */ public function test_transcribe_serbian_crossed_d() { - add_filter( 'locale', array( $this, 'set_locale_to_serbian' ) ); - - $this->assertSame( 'DJdj', remove_accents( 'Đđ' ) ); - - remove_filter( 'locale', array( $this, 'set_locale_to_serbian' ) ); - + $this->assertSame( 'DJdj', remove_accents( 'Đđ', 'sr_RS' ) ); $this->assertSame( 'Dd', remove_accents( 'Đđ' ) ); } }