Latte: One Line and Localization Done for You
Good news for all developers using Latte: the new version brings significant improvements in localization. Let's see how these updates can make your work easier and save you time.
The key feature of Latte version 3.0.18 is the ability to set the locale. It's just a matter of one line of code:
$latte = new Latte\Engine;
$latte->setLocale('cs_CZ');
With this simple step, all localized filters will respect the Czech locale. You can, of course, use any valid IETF language tag, such as en_US for English in the United States or de_DE for German in Germany.
Setting the locale affects the sort
, number
,
bytes
, and the brand new localDate
filters.
New Filter |localDate
This filter is a real gem of the new version. It allows you to display dates and times according to local customs. It offers two main ways to use it, covering practically all your needs for formatting time data.
Parameter format
This is a string that allows you to specify exactly how the resulting date
should look. It's similar to PHP functions date()
or
strftime()
. But be careful, this format is somewhat magical. It
adapts to any language. Let's demonstrate.
{$date|localDate: 'd MMMM yyyy'}
The letters d
, M
, and y
represent the
day, month, and year. yyyy
indicates that the year should be
written in full four-digit form, and similarly, the “long” MMMM
indicates the full month name. But what about the order of the day and month? Or
the separators? These differ significantly across locales!
Leave that to Latte. You don't need to worry about the order of the day and month or which separators to use. Latte handles all that for you and displays the date correctly:
- In English:
August 6, 2024
- In Czech:
6. srpna 2024
- In German:
6. August 2024
As you can see, the format is completely independent of the locale setting.
It could actually be written like this: yyyyMMMMd
, as the order of
symbols and spaces between them does not matter.
Let's look at more examples:
{* year and month *}
{$date|localDate: 'yyyyMMMM'}
{* EN: April 2024, CZ: duben 2024 *}
{* short date format *}
{$date|localDate: 'yMd'}
{* EN: 4/15/2024, CZ: 15. 4. 2024 *}
{* basic time format *}
{$time|localDate: 'jm'}
{* EN: 2:30 PM, CZ: 14:30 *}
{* short format without AM/PM *}
{$time|localDate: 'Hm'}
{* EN: 14:30, CZ: 14:30 *}
You can find a similar description in the localDate filter documentation.
Predefined Templates with
date
and time
The second way to use the localDate
filter offers predefined
templates date
and time
. These act as shortcuts for
the most common date and time formats. There are four levels of detail
available: full
, long
, medium
, and
short
. You can combine them or use them separately:
{* date only *}
{$date|localDate: date: short}
{* EN: 4/15/24, CZ: 15.04.2024 *}
{* time only *}
{$date|localDate: time: medium}
{* EN: 2:30:45 PM, CZ: 14:30:45 *}
{* short date and time format *}
{$date|localDate: date: short, time: short}
{* EN: 4/23/24, 2:30 PM, CZ: 23.04.2024 14:30 *}
A bonus is the ability to use the relative-
prefix for dates,
which outputs relatively close dates as yesterday
,
today
, and tomorrow
. This is handy for applications
that need to display dates naturally:
{$yesterday|localDate: date: relative-short}
{* Output: yesterday *}
If you call the filter without parameters, it outputs in long date format:
{$date|localDate}
{* EN: April 23, 2024, CZ: 23. dubna 2024 *}
Using the localDate
filter for formatting time allows you to
create international applications with minimal effort. It's also great if
you're creating an application in just one language.
- Automatic adaptation: One format automatically adapts to local customs. You don't need to write conditions for different languages.
- Code readability: Your code remains clean and understandable, no matter how many different locales you support.
- Consistency: Ensures that times are always displayed correctly according to users' expectations in each country.
Filter |number: A Familiar Face with New Tricks
The number
filter has been in Latte since the beginning. Its
standard behavior remains unchanged and fully backward compatible in the new
version. Once you set
the locale, it automatically uses national separators for decimal points and
thousands:
{* With English (US) locale set *}
{1234.56|number} {* Output: 1,234.56 *}
{* With Czech locale set *}
{1234.56|number} {* Output: 1 234,56 *}
And now for the best part – you can customize the appearance of numbers as never before. With a new parameter for number formatting, you gain unprecedented control over how they are displayed. Here are a few examples:
{1234.5|number: '#,##0.00'} {* 1,234.50 *}
{1234.5|number: '#,##0.##'} {* 1,234.5 *}
{1234.5|number: '@@'} {* 1200 *}
{1234.5|number: '@@@'} {* 1230 *}
{1234.56|number: '#,##0.00 ¤'} {* 1 234,56 Kč *}
You can find a similar format description in the number filter documentation.
With the number
filter, you get the best of both worlds –
ease of use and detailed control over number formatting. Whether you're creating
an e-shop, a financial application, or anything where numbers are important,
this filter will make your work easier and ensure your data always looks
professional and is understandable to users worldwide.
Enhancements to |sort and |bytes Filters
These filters have been upgraded in the new Latte version and now fully respect the set locale. The sort filter now sorts according to local rules, which is especially important for languages with diacritics or special characters:
{['Železo', 'Jablko', 'Čaj']|sort}
{* Output in CZ: ['Čaj', 'Jablko', 'Železo'] *}
This ensures that all template data not coming from the database will always be sorted correctly according to user expectations in each country. If this is not desirable, you can pass a different comparison function to the filter.
The bytes filter now automatically uses the correct decimal separator according to the set locale:
{120000|bytes}
{* Output in US: 117.19 KB *}
{* Output in CZ: 117,19 KB *}
How to Start with New Features in Presenters
Implementing these features in your projects is simple and straightforward.
The key is setting the correct locale using the setLocale()
function. You can set it in presenters like this:
$this->template->getLatte()->setLocale($locale);
For projects that run in only one language, it's more efficient to set the locale globally in the configuration:
latte:
locale: cs
This setting ensures that all Latte instances used by presenters and components throughout the application will automatically use the Czech locale.
Note: To use these new localization features, you need to have the PHP
intl
extension installed. Also, using the format in the
localDate
filter requires PHP 8.1.
Sign in to submit a comment