Packages

ex_cldr

2.2.3
2.47.5 2.47.4 2.47.3 2.47.2 2.47.1 2.47.0 2.46.0 2.45.2 2.45.1 2.45.0 2.44.1 2.44.0 2.43.2 2.43.1 2.43.0 2.42.0 2.41.1 2.41.0 2.40.4 2.40.3 2.40.2 2.40.1 2.40.0 2.39.2 2.39.1 2.39.0 2.38.1 2.38.0 2.37.5 2.37.4 2.37.3 retired 2.37.2 2.37.1 2.37.0 2.36.0 2.35.1 2.35.0 retired 2.34.2 2.34.1 2.34.0 2.33.2 2.33.1 2.33.1-rc.0 2.33.0 2.32.1 2.32.0 2.31.0 2.30.0 2.29.0 2.28.0 2.27.1 2.27.0 retired 2.26.3 2.26.2 2.26.1 2.26.0 2.25.0 2.24.2 2.24.1 2.24.0 2.24.0-rc.6 2.24.0-rc.5 2.24.0-rc.4 2.24.0-rc.3 2.24.0-rc.2 2.24.0-rc.1 2.24.0-rc.0 2.23.2 2.23.1 2.23.0 2.22.1 2.22.0 2.21.0 2.20.0 2.20.0-rc.3 2.20.0-rc.2 2.20.0-rc.1 2.20.0-rc.0 2.19.1 2.19.0 2.18.2 2.18.1 2.18.0 2.18.0-rc.0 2.17.2 2.17.1 2.17.0 2.16.2 2.16.1 2.16.1-rc.0 2.16.0 2.15.0 2.14.1 2.14.0 2.14.0-rc.0 2.13.0 2.12.1 2.12.0 2.11.1 2.11.0 2.10.2 2.10.1 2.10.0 retired 2.9.0 2.8.1 2.8.0 2.7.2 2.7.1 2.7.0 2.6.2 2.6.1 2.6.0 2.5.0 2.4.3 2.4.2 2.4.1 2.4.0 2.3.2 2.3.1 2.3.0 2.2.7 2.2.6 2.2.5 2.2.4 2.2.3 2.2.2 2.2.1 2.2.0 2.1.0 2.0.4 2.0.3 2.0.2 2.0.1 2.0.0 2.0.0-rc.3 retired 2.0.0-rc.2 retired 2.0.0-rc.1 retired 2.0.0-rc.0 retired 1.8.2 1.8.1 1.8.0 1.7.1 1.7.0 1.6.4 1.6.3 1.6.2 1.6.1 1.6.0 1.5.2 1.5.1 1.5.0 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 retired 1.4.0-rc.3 retired 1.4.0-rc.2 retired 1.4.0-rc.1 retired 1.4.0-rc.0 retired 1.3.2 1.3.1 1.3.0 1.2.0 1.1.0 1.0.0 1.0.0-rc.3 retired 1.0.0-rc.2 retired 1.0.0-rc.1 retired 1.0.0-rc.0 retired 0.13.1 0.13.0 0.12.2 retired 0.12.1 retired 0.12.0 retired 0.11.0 retired 0.10.0 retired 0.9.0 retired 0.8.3 retired 0.8.2 retired 0.8.1 retired 0.8.0 retired 0.7.0 retired 0.6.2 retired 0.6.1 retired 0.6.0 retired 0.5.2 retired 0.5.1 retired 0.5.0 retired 0.4.2 retired 0.4.1 retired 0.4.0 retired 0.3.0 retired 0.2.1 retired 0.2.0 retired 0.1.3 retired 0.1.2 retired 0.1.1 retired 0.1.0 retired 0.0.20 retired 0.0.19 retired 0.0.18 retired 0.0.17 retired 0.0.16 retired 0.0.15 retired 0.0.14 retired 0.0.13 retired 0.0.12 retired 0.0.11 retired 0.0.10 retired 0.0.8 retired 0.0.7 retired 0.0.6 retired 0.0.5 retired 0.0.4 retired 0.0.3 retired

Common Locale Data Repository (CLDR) functions for Elixir to localize and format numbers, dates, lists, messages, languages, territories and units with support for over 700 locales for internationalized (i18n) and localized (L10N) applications.

Current section

Files

Jump to
ex_cldr lib cldr compiler_locale_cache.ex
Raw

lib/cldr/compiler_locale_cache.ex

defmodule Cldr.Locale.Cache do
@moduledoc false
use GenServer
require Logger
@table_name :cldr_locales
@gen_server_name :cldr_locale_cache
# @timeout 5_000
# Client
def start(args \\ []) do
GenServer.start(__MODULE__, args, name: @gen_server_name)
end
def get_locale(locale, path) do
if compiling?() and not gen_server_started?() do
{:ok, _pid} = Cldr.Locale.Cache.start()
end
# GenServer.call(@gen_server_name, {:get_locale, locale, path}, @timeout)
do_get_locale(locale, path)
end
# Server (callbacks)
def init(_args) do
# Create the ets table and return its reference
# as the state. State therefore is only the
# reference to the ets table we use for caching
create_ets_table!()
{:ok, @table_name}
end
def handle_call({:get_locale, locale_name, path}, _from, state) do
locale = do_get_locale(locale_name, path)
{:reply, locale, state}
end
def terminate(_, _) do
IO.inspect(:terminating)
end
def compiling? do
case Process.get(:elixir_compiler_pid) do
nil -> false
pid when is_pid(pid) -> true
end
end
def gen_server_started? do
case Process.whereis(@gen_server_name) do
nil -> false
pid when is_pid(pid) -> true
end
end
defp do_get_locale(locale, path) do
case :ets.lookup(@table_name, locale) do
[{^locale, locale_data}] ->
# Logger.debug "Found cached locale for #{inspect locale}"
locale_data
[] ->
# Logger.debug "#{inspect locale} not found in cache so retrieving"
locale_data = Cldr.Config.do_get_locale(locale, path, false)
try do
:ets.insert(@table_name, {locale, locale_data})
rescue
ArgumentError ->
nil
# This may actually happen because of timing conditions: someone else may
# have inserted behind our back. But since we've now already generated
# the locale again just use it.
# Logger.debug "#{inspect self()}: Could not insert locale #{inspect locale} into :ets."
end
locale_data
other ->
raise RuntimeError, inspect(other)
end
end
# We assign the compiler pid as the heir for our table so
# that the table doesn't die with each compilation thread
# This is undoubtedly hacky.
defp create_ets_table! do
case :ets.info(@table_name) do
:undefined ->
:ets.new(@table_name, [:named_table, :public, {:read_concurrency, true}])
# Logger.debug "#{inspect self()}: Created :ets table"
_ ->
:ok
end
end
end