Skip to content

Commit

Permalink
bug #3257 IntlExtension > Handle MissingResourceException (ruudk)
Browse files Browse the repository at this point in the history
This PR was submitted for the 3.x branch but it was merged into the 2.x branch instead (closes #3257).

Discussion
----------

IntlExtension > Handle MissingResourceException

When you want to get the language name of a language you can type:
```twig
{{ inputLanguage | language_name }}
```

But if `inputLanguage` is not a valid language, a `MissingResourceException` is thrown, blowing up the whole page.

Since in Twig, there is no way to catch this exception, it becomes extremely hard to work with these helpers if you have no control over the input. There is also no way to first check if the language exists before invoking the filter.

Commits
-------

2df6814 IntlExtension > Handle MissingResourceException
  • Loading branch information
fabpot committed Feb 5, 2020
2 parents a086a37 + 2df6814 commit 67dda21
Show file tree
Hide file tree
Showing 8 changed files with 50 additions and 7 deletions.
43 changes: 36 additions & 7 deletions extra/intl-extra/src/IntlExtension.php
Expand Up @@ -13,6 +13,7 @@

use Symfony\Component\Intl\Countries;
use Symfony\Component\Intl\Currencies;
use Symfony\Component\Intl\Exception\MissingResourceException;
use Symfony\Component\Intl\Languages;
use Symfony\Component\Intl\Locales;
use Symfony\Component\Intl\Timezones;
Expand Down Expand Up @@ -156,37 +157,65 @@ public function getFunctions()

public function getCountryName(string $country, string $locale = null): string
{
return Countries::getName($country, $locale);
try {
return Countries::getName($country, $locale);
} catch (MissingResourceException $exception) {
return $country;
}
}

public function getCurrencyName(string $currency, string $locale = null): string
{
return Currencies::getName($currency, $locale);
try {
return Currencies::getName($currency, $locale);
} catch (MissingResourceException $exception) {
return $currency;
}
}

public function getCurrencySymbol(string $currency, string $locale = null): string
{
return Currencies::getSymbol($currency, $locale);
try {
return Currencies::getSymbol($currency, $locale);
} catch (MissingResourceException $exception) {
return $currency;
}
}

public function getLanguageName(string $language, string $locale = null): string
{
return Languages::getName($language, $locale);
try {
return Languages::getName($language, $locale);
} catch (MissingResourceException $exception) {
return $language;
}
}

public function getLocaleName(string $data, string $locale = null): string
{
return Locales::getName($data, $locale);
try {
return Locales::getName($data, $locale);
} catch (MissingResourceException $exception) {
return $data;
}
}

public function getTimezoneName(string $timezone, string $locale = null): string
{
return Timezones::getName($timezone, $locale);
try {
return Timezones::getName($timezone, $locale);
} catch (MissingResourceException $exception) {
return $timezone;
}
}

public function getCountryTimezones(string $country): array
{
return Timezones::forCountryCode($country);
try {
return Timezones::forCountryCode($country);
} catch (MissingResourceException $exception) {
return [];
}
}

public function formatCurrency($amount, string $currency, array $attrs = [], string $locale = null): string
Expand Down
2 changes: 2 additions & 0 deletions extra/intl-extra/tests/Fixtures/country_name.test
@@ -1,13 +1,15 @@
--TEST--
"country_name" filter
--TEMPLATE--
{{ 'UNKNOWN'|country_name }}
{{ 'FR'|country_name }}
{{ 'US'|country_name }}
{{ 'US'|country_name('fr') }}
{{ 'CH'|country_name('fr_CA') }}
--DATA--
return [];
--EXPECT--
UNKNOWN
France
United States
États-Unis
Expand Down
2 changes: 2 additions & 0 deletions extra/intl-extra/tests/Fixtures/country_timezones.test
@@ -1,10 +1,12 @@
--TEST--
"country_timezones" function
--TEMPLATE--
{{ country_timezones('UNKNOWN')|length }}
{{ country_timezones('FR')|join(', ') }}
{{ country_timezones('US')|join(', ') }}
--DATA--
return [];
--EXPECT--
0
Europe/Paris
America/Adak, America/Anchorage, America/Boise, America/Chicago, America/Denver, America/Detroit, America/Indiana/Knox, America/Indiana/Marengo, America/Indiana/Petersburg, America/Indiana/Tell_City, America/Indiana/Vevay, America/Indiana/Vincennes, America/Indiana/Winamac, America/Indianapolis, America/Juneau, America/Kentucky/Monticello, America/Los_Angeles, America/Louisville, America/Menominee, America/Metlakatla, America/New_York, America/Nome, America/North_Dakota/Beulah, America/North_Dakota/Center, America/North_Dakota/New_Salem, America/Phoenix, America/Sitka, America/Yakutat, Pacific/Honolulu
2 changes: 2 additions & 0 deletions extra/intl-extra/tests/Fixtures/currency_name.test
@@ -1,13 +1,15 @@
--TEST--
"currency_name" filter
--TEMPLATE--
{{ 'UNKNOWN'|currency_name }}
{{ 'EUR'|currency_name }}
{{ 'JPY'|currency_name }}
{{ 'EUR'|currency_name('fr') }}
{{ 'JPY'|currency_name('fr_FR') }}
--DATA--
return [];
--EXPECT--
UNKNOWN
Euro
Japanese Yen
euro
Expand Down
2 changes: 2 additions & 0 deletions extra/intl-extra/tests/Fixtures/currency_symbol.test
@@ -1,10 +1,12 @@
--TEST--
"currency_symbol" filter
--TEMPLATE--
{{ 'UNKNOWN'|currency_symbol }}
{{ 'EUR'|currency_symbol }}
{{ 'JPY'|currency_symbol }}
--DATA--
return [];
--EXPECT--
UNKNOWN
¥
2 changes: 2 additions & 0 deletions extra/intl-extra/tests/Fixtures/language_name.test
@@ -1,6 +1,7 @@
--TEST--
"language_name" filter
--TEMPLATE--
{{ 'UNKNOWN'|language_name }}
{{ 'de'|language_name }}
{{ 'fr'|language_name }}
{{ 'de'|language_name('fr') }}
Expand All @@ -9,6 +10,7 @@
--DATA--
return [];
--EXPECT--
UNKNOWN
German
French
allemand
Expand Down
2 changes: 2 additions & 0 deletions extra/intl-extra/tests/Fixtures/locale_name.test
@@ -1,6 +1,7 @@
--TEST--
"locale_name" filter
--TEMPLATE--
{{ 'UNKNOWN'|locale_name }}
{{ 'de'|locale_name }}
{{ 'fr'|locale_name }}
{{ 'de'|locale_name('fr') }}
Expand All @@ -9,6 +10,7 @@
--DATA--
return [];
--EXPECT--
UNKNOWN
German
French
allemand
Expand Down
2 changes: 2 additions & 0 deletions extra/intl-extra/tests/Fixtures/timezone_name.test
@@ -1,12 +1,14 @@
--TEST--
"timezone_name" filter
--TEMPLATE--
{{ 'UNKNOWN'|timezone_name }}
{{ 'Europe/Paris'|timezone_name }}
{{ 'America/Los_Angeles'|timezone_name }}
{{ 'America/Los_Angeles'|timezone_name('fr') }}
--DATA--
return [];
--EXPECT--
UNKNOWN
Central European Time (Paris)
Pacific Time (Los Angeles)
heure du Pacifique nord-américain (Los Angeles)

0 comments on commit 67dda21

Please sign in to comment.