railsmechanic
Localization: how to use ex_cldr (correctly) in phoenix templates?
Hi all!
I’m currently working on a phoenix web application which should be available in different languages. Therefore I need to localize e.g. numbers, datetimes etc. I’ve correctly set up ex_cldr, but I wonder how to use it correctly in phoenix templates? The default Cldr.to_string/1 function works for numbers but I need to use different formats for datetimes throughout the application. As the Cldr.to_string/1 function cannot take further parameters (e.g. a keyword list), I think the only option is to use one of the Cldr.Datetime.to_string functions, but the returned data is an ok/error tuple {:ok, "formated_string"} | {:error, ...}. Using the “bang function” is not always possible, because some datetime fields in the schema are allowed to be nil.
So, do I need to write some kind of “wrapper function(s)” on my own? In Rails, when the type of data is not the expected one, either nil or a string with the unformatted data is returned. What is the best practice here?
I’ve written the following wrapper function, but is there a default way to work with ex_cldr in phoenix?
def l(formatter, value, options \\ []) when is_atom(formatter) do
case apply(formatter, :to_string, [value, options]) do
{:ok, formatted_value} -> formatted_value
_formatting_failed -> Keyword.get(options, :default, "")
end
end
which is called in a template with e.g.
<%= l(Cldr.DateTime, schema.my_datetime, format: "dd.MM.YYYY - HH:mm") %>
# => 03.10.2022 - 09:32
Many thanks!
First Post!
kip
@railsmechanic I’m definitely open to suggestions.
I thought about this a lot when I implemented the Cldr.Chars protocol. There are many common options for formatting numbers, dates, units and so on - but not always the case. Given that the contract for Cldr.to_string/1 is return a string its likely the right approach (things like templates were part of the motivation for it). I’m just not sure what to do if an error is returned in the underlying protocol implementation. Just return ""? Return "" and log an error?
What do you think would work best?







