Packages

phoenix_kit

1.6.4
1.7.208 1.7.207 1.7.206 1.7.205 1.7.204 1.7.203 1.7.202 1.7.201 1.7.200 1.7.199 1.7.198 1.7.197 1.7.196 1.7.194 1.7.193 1.7.192 1.7.191 1.7.190 1.7.189 1.7.187 1.7.186 1.7.185 1.7.184 1.7.183 1.7.182 1.7.181 1.7.180 1.7.179 1.7.178 1.7.177 1.7.176 1.7.175 1.7.174 1.7.173 1.7.172 1.7.171 1.7.170 1.7.169 1.7.168 1.7.167 1.7.166 1.7.165 1.7.164 1.7.162 1.7.161 1.7.160 1.7.159 1.7.157 1.7.156 1.7.155 1.7.154 1.7.153 1.7.152 1.7.151 1.7.150 1.7.149 1.7.146 1.7.145 1.7.144 1.7.143 1.7.138 1.7.133 1.7.132 1.7.131 1.7.130 1.7.128 1.7.126 1.7.125 1.7.121 1.7.120 1.7.119 1.7.118 1.7.117 1.7.116 1.7.115 1.7.114 1.7.113 1.7.112 1.7.111 1.7.110 1.7.109 1.7.108 1.7.107 1.7.106 1.7.105 1.7.104 1.7.103 1.7.102 1.7.101 1.7.100 1.7.99 1.7.98 1.7.97 1.7.96 1.7.95 1.7.94 1.7.93 1.7.92 1.7.91 1.7.90 1.7.89 1.7.88 1.7.87 1.7.86 1.7.85 1.7.84 1.7.83 1.7.82 1.7.81 1.7.80 1.7.79 1.7.78 1.7.77 1.7.76 1.7.75 1.7.74 1.7.71 1.7.70 1.7.69 1.7.66 1.7.65 1.7.64 1.7.63 1.7.62 1.7.61 1.7.59 1.7.58 1.7.57 1.7.56 1.7.55 1.7.54 1.7.53 1.7.52 1.7.51 1.7.49 1.7.44 1.7.43 1.7.42 1.7.41 1.7.39 1.7.38 1.7.37 1.7.36 1.7.34 1.7.33 1.7.31 1.7.30 1.7.29 1.7.28 1.7.27 1.7.26 1.7.25 1.7.24 1.7.23 1.7.22 1.7.21 1.7.20 1.7.19 1.7.18 1.7.17 1.7.16 1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 1.7.9 1.7.8 1.7.7 1.7.6 1.7.5 1.7.4 1.7.3 1.7.2 1.7.1 1.7.0 1.6.20 1.6.19 1.6.18 1.6.17 1.6.16 1.6.15 1.6.14 1.6.13 1.6.12 1.6.11 1.6.10 1.6.9 1.6.8 1.6.7 1.6.6 1.6.5 1.6.4 1.6.3 1.5.2 1.5.1 1.5.0 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.2 1.3.1 1.3.0 1.2.10 1.2.9 1.2.8 1.2.7 1.2.5 1.2.4 1.2.2 1.2.1 1.2.0 1.1.0 1.0.0

A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more

Current section

Files

Jump to
phoenix_kit lib phoenix_kit_web live modules languages.ex
Raw

lib/phoenix_kit_web/live/modules/languages.ex

defmodule PhoenixKitWeb.Live.Modules.Languages do
@moduledoc """
Languages module settings LiveView for PhoenixKit admin panel.
Provides interface for managing available languages and localization settings.
"""
use PhoenixKitWeb, :live_view
alias PhoenixKit.Module.Languages
alias PhoenixKit.Settings
alias PhoenixKit.Utils.Routes
def mount(params, session, socket) do
# Handle locale
locale = params["locale"] || socket.assigns[:current_locale] || "en"
Gettext.put_locale(PhoenixKitWeb.Gettext, locale)
Process.put(:phoenix_kit_current_locale, locale)
# Get current path for navigation
current_path = get_current_path(socket, session)
# Get project title from settings
project_title = Settings.get_setting("project_title", "PhoenixKit")
# Load languages configuration
ml_config = Languages.get_config()
display_languages = Languages.get_display_languages()
in_configured_mode = Languages.in_configured_mode?()
socket =
socket
|> assign(:current_path, current_path)
|> assign(:current_locale, locale)
|> assign(:page_title, "Languages")
|> assign(:project_title, project_title)
|> assign(:ml_enabled, ml_config.enabled)
|> assign(:languages, display_languages)
|> assign(:in_configured_mode, in_configured_mode)
|> assign(:language_count, length(display_languages))
|> assign(:enabled_count, Enum.count(display_languages, & &1["is_enabled"]))
|> assign(:default_language, Enum.find(display_languages, & &1["is_default"]))
|> assign(
:available_languages_for_selection,
Languages.get_available_languages_for_selection()
)
# Switcher preview settings
|> assign(:switcher_show_names, true)
|> assign(:switcher_show_flags, true)
|> assign(:switcher_goto_home, false)
|> assign(:switcher_hide_current, false)
{:ok, socket}
end
def handle_event("toggle_languages", _params, socket) do
# Toggle languages
new_enabled = !socket.assigns.ml_enabled
result =
if new_enabled do
Languages.enable_system()
else
Languages.disable_system()
end
case result do
{:ok, _} ->
# Reload configuration to get fresh data
socket =
socket
|> reload_display_languages(new_enabled)
|> put_flash(
:info,
if(new_enabled,
do: "Languages enabled with default English",
else: "Languages disabled"
)
)
{:noreply, socket}
{:error, _changeset} ->
socket = put_flash(socket, :error, "Failed to update languages")
{:noreply, socket}
end
end
def handle_event("toggle_language", %{"code" => code}, socket) do
# Find the language to toggle
language = Enum.find(socket.assigns.languages, &(&1["code"] == code))
if language do
# Toggle the language enabled state
new_enabled = !language["is_enabled"]
result =
if new_enabled do
Languages.enable_language(code)
else
Languages.disable_language(code)
end
case result do
{:ok, _config} ->
socket =
socket
|> reload_display_languages()
|> put_flash(
:info,
"Language #{language["name"]} #{if new_enabled, do: "enabled", else: "disabled"}"
)
{:noreply, socket}
{:error, reason} when is_binary(reason) ->
socket = put_flash(socket, :error, reason)
{:noreply, socket}
{:error, _changeset} ->
socket = put_flash(socket, :error, "Failed to update language")
{:noreply, socket}
end
else
socket = put_flash(socket, :error, "Language not found")
{:noreply, socket}
end
end
def handle_event("set_default", %{"code" => code}, socket) do
case Languages.set_default_language(code) do
{:ok, _config} ->
language = Enum.find(socket.assigns.languages, &(&1["code"] == code))
socket =
socket
|> reload_display_languages()
|> put_flash(:info, "#{language["name"]} set as default language")
{:noreply, socket}
{:error, reason} when is_binary(reason) ->
socket = put_flash(socket, :error, reason)
{:noreply, socket}
{:error, _changeset} ->
socket = put_flash(socket, :error, "Failed to set default language")
{:noreply, socket}
end
end
def handle_event("add_language", %{"language_code" => language_code}, socket) do
case Languages.add_language(language_code) do
{:ok, _config} ->
# Get language name for flash message
predefined_lang = Languages.get_predefined_language(language_code)
language_name = (predefined_lang && predefined_lang.name) || language_code
socket =
socket
|> reload_display_languages()
|> assign(
:available_languages_for_selection,
Languages.get_available_languages_for_selection()
)
|> put_flash(:info, "Language #{language_name} added successfully")
{:noreply, socket}
{:error, reason} when is_binary(reason) ->
socket = put_flash(socket, :error, reason)
{:noreply, socket}
{:error, _changeset} ->
socket = put_flash(socket, :error, "Failed to add language")
{:noreply, socket}
end
end
def handle_event("remove_language", %{"code" => code}, socket) do
language = Enum.find(socket.assigns.languages, &(&1["code"] == code))
if language do
case Languages.remove_language(code) do
{:ok, _config} ->
socket =
socket
|> reload_display_languages()
|> assign(
:available_languages_for_selection,
Languages.get_available_languages_for_selection()
)
|> put_flash(:info, "Language #{language["name"]} removed successfully")
{:noreply, socket}
{:error, reason} when is_binary(reason) ->
socket = put_flash(socket, :error, reason)
{:noreply, socket}
{:error, _changeset} ->
socket = put_flash(socket, :error, "Failed to remove language")
{:noreply, socket}
end
else
socket = put_flash(socket, :error, "Language not found")
{:noreply, socket}
end
end
def handle_event("move_up", %{"code" => code}, socket) do
language = Enum.find(socket.assigns.languages, &(&1["code"] == code))
if language do
case Languages.move_language_up(code) do
{:ok, _config} ->
socket =
socket
|> reload_display_languages()
|> put_flash(:info, "#{language["name"]} moved up")
{:noreply, socket}
{:error, reason} when is_binary(reason) ->
socket = put_flash(socket, :error, reason)
{:noreply, socket}
{:error, _changeset} ->
socket = put_flash(socket, :error, "Failed to move language")
{:noreply, socket}
end
else
socket = put_flash(socket, :error, "Language not found")
{:noreply, socket}
end
end
def handle_event("move_down", %{"code" => code}, socket) do
language = Enum.find(socket.assigns.languages, &(&1["code"] == code))
if language do
case Languages.move_language_down(code) do
{:ok, _config} ->
socket =
socket
|> reload_display_languages()
|> put_flash(:info, "#{language["name"]} moved down")
{:noreply, socket}
{:error, reason} when is_binary(reason) ->
socket = put_flash(socket, :error, reason)
{:noreply, socket}
{:error, _changeset} ->
socket = put_flash(socket, :error, "Failed to move language")
{:noreply, socket}
end
else
socket = put_flash(socket, :error, "Language not found")
{:noreply, socket}
end
end
def handle_event("toggle_switcher_setting", %{"setting" => setting}, socket) do
setting_atom = String.to_atom(setting)
current_value = socket.assigns[setting_atom]
{:noreply, assign(socket, setting_atom, !current_value)}
end
defp get_current_path(_socket, _session) do
# For LanguagesLive, return the settings path
Routes.path("/admin/settings/languages")
end
# Helper function to reload display languages from the Languages module
defp reload_display_languages(socket, enabled \\ nil) do
enabled = enabled || Languages.enabled?()
display_languages = Languages.get_display_languages()
in_configured_mode = Languages.in_configured_mode?()
socket
|> assign(:ml_enabled, enabled)
|> assign(:languages, display_languages)
|> assign(:in_configured_mode, in_configured_mode)
|> assign(:language_count, length(display_languages))
|> assign(:enabled_count, Enum.count(display_languages, & &1["is_enabled"]))
|> assign(:default_language, Enum.find(display_languages, & &1["is_default"]))
end
# Helper function to generate the language switcher code based on current settings
defp generate_switcher_code(show_flags, show_names, goto_home, hide_current) do
flags_line = if show_flags, do: "\n show_flags={true}", else: ""
names_line = if show_names, do: "\n show_names={true}", else: ""
home_line = if goto_home, do: "\n goto_home={true}", else: ""
hide_line = if hide_current, do: "\n hide_current={true}", else: ""
"""
<.language_switcher_dropdown
current_locale={@current_locale}#{flags_line}#{names_line}#{home_line}#{hide_line}
/>
"""
end
# Helper function to get language flag emoji
defp get_language_flag(code) when is_binary(code) do
case Languages.get_predefined_language(code) do
%{flag: flag} -> flag
nil -> "🌐"
end
end
end