/
language.rb
157 lines (121 loc) · 3.8 KB
/
language.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# frozen_string_literal: true
class Multilingual::Language
KEY ||= 'language'.freeze
include ActiveModel::Serialization
attr_accessor :locale,
:name,
:nativeName,
:content_enabled,
:content_tag_conflict,
:interface_enabled,
:interface_supported,
:custom
def initialize(locale, opts = {})
@locale = locale.to_s
opts = opts.with_indifferent_access
@name = opts[:name].to_s
@nativeName = opts[:nativeName].to_s
@content_enabled = Multilingual::ContentLanguage.enabled?(@locale)
@content_tag_conflict = Multilingual::ContentTag::Conflict.exists?(@locale)
@interface_enabled = Multilingual::InterfaceLanguage.enabled?(@locale)
@interface_supported = Multilingual::InterfaceLanguage.supported?(@locale)
@custom = Multilingual::CustomLanguage.is_custom?(@locale)
end
def self.get(locales)
[*locales].map { |locale| self.new(locale, self.all[locale]) }
end
def self.all
Multilingual::Cache.wrap(KEY) { base.merge(Multilingual::CustomLanguage.all) }
end
## Some regional locales (e.g. bs_BA, fa_IR, nb_NO, pl_PL, tr_TR, zh_CN]) are
## not directly represented in the Discourse language names list.
def self.base
result = ::LocaleSiteSetting.language_names
::LocaleSiteSetting.supported_locales.each do |locale|
if !::LocaleSiteSetting.language_names[locale]
parts = locale.split('_')
primary_locale = parts.first
region = parts.second
if region && result[primary_locale]
result[locale] = result.delete(primary_locale)
end
end
end
result
end
def self.exists?(locale)
self.all[locale.to_s].present?
end
def self.list
self.all.map { |k, v| self.new(k, v) }.sort_by(&:locale)
end
def self.filter(params = {})
languages = self.list
if params[:query].present?
q = params[:query].downcase
languages = languages.select do |l|
l.locale.downcase.include?(q) ||
l.name.downcase.include?(q)
end
end
type = params[:order].present? ? params[:order].to_sym : :locale
languages = languages.sort_by do |l|
val = l.send(type)
if [:locale, :name, :nativeName].include?(type)
val
elsif [:content_enabled, :custom].include?(type)
(val ? 0 : 1)
elsif type == :interface_enabled
[ (val ? 0 : 1), (l.interface_supported ? 0 : 1) ]
end
end
if params[:order].present? && !ActiveModel::Type::Boolean.new.cast(params[:ascending])
languages = languages.reverse
end
languages
end
def self.update(language, opts = {})
language = language.with_indifferent_access
updated = false
['interface', 'content'].each do |type|
exclusion_prop = "#{type}_enabled".to_sym
exclusion_key = "#{type}_language"
if language[exclusion_prop].in? ["true", "false", true, false]
updated = Multilingual::LanguageExclusion.set(
language[:locale],
exclusion_key,
enabled: language[exclusion_prop]
)
end
end
after_update([language[:locale]]) if opts[:run_hooks]
updated
end
def self.after_update(updated)
after_change(updated)
Multilingual::ContentTag.update_all
end
def self.before_change
Multilingual::Cache.state = 'changing'
end
def self.after_change(locales = [])
Multilingual::Cache.refresh!(reload_i18n: true)
Multilingual::Cache.refresh_clients(locales)
end
def self.bulk_update(languages)
updated = []
before_change
PluginStoreRow.transaction do
[*languages].each do |l|
if update(l)
updated.push(l['locale'])
end
end
after_update(updated)
end
updated
end
def self.setup
# no setup required
end
end