summaryrefslogtreecommitdiffstats
path: root/scripts/propagate-new-locale-keys.cr
blob: 39910c6eb811a013bb419636f0e6b7c102abe92e (plain)
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
require "json"
require "../src/invidious/helpers/i18n.cr"

def locale_to_array(locale_name)
  arrayifed_locale_data = [] of Tuple(String, JSON::Any | String)
  keys_only_array = [] of String
  LOCALES[locale_name].each do |k, v|
    if v.as_h?
      arrayifed_locale_data << {k, JSON.parse(v.as_h.to_json)}
    elsif v.as_s?
      arrayifed_locale_data << {k, v.as_s}
    end

    keys_only_array << k
  end

  return arrayifed_locale_data, keys_only_array
end

# Invidious currently has some unloaded localization files. We shouldn't need to propagate new keys onto those.
# We'll also remove the reference locale (english) from the list to process.
loaded_locales = LOCALES.keys.select! { |key| key != "en-US" }
english_locale = locale_to_array("en-US")[0]

# In order to automatically propagate locale keys we're going to be needing two arrays.
# One is an array containing each locale data encoded as tuples. The other would contain
# sets of only the keys of each locale files.
#
# The second array is to make sure that an key from the english reference file is present
# in whatever the current locale we're scanning is.
locale_list = [] of Array(Tuple(String, JSON::Any | String))
locale_list_with_only_keys = [] of Array(String)

# Populates the created arrays from above
loaded_locales.each do |name|
  arrayifed_locale_data, keys_only_locale = locale_to_array(name)

  locale_list << arrayifed_locale_data
  locale_list_with_only_keys << keys_only_locale
end

locale_list_with_only_keys.each_with_index do |keys_of_locale_in_processing, index_of_locale_in_processing|
  insert_at = {} of Int32 => Tuple(String, JSON::Any | String)

  LOCALES["en-US"].each_with_index do |ref_locale_data, ref_locale_key_index|
    ref_locale_key, ref_locale_value = ref_locale_data

    # Found an new key that isn't present in the current locale..
    if !keys_of_locale_in_processing.includes? ref_locale_key
      # In terms of structure there's currently only two types; one for plural and the other for singular translations.
      if ref_locale_value.as_h?
        insert_at[ref_locale_key_index] = {ref_locale_key, JSON.parse({"([^.,0-9]|^)1([^.,0-9]|$)" => "", "" => ""}.to_json)}
      else
        insert_at[ref_locale_key_index] = {ref_locale_key, ""}
      end
    end
  end

  insert_at.each do |location_to_insert, data|
    locale_list[index_of_locale_in_processing].insert(location_to_insert, data)
  end
end

# Now we convert back to our original format.
final_locale_list = [] of String
locale_list.each do |locale|
  intermediate_hash = {} of String => (JSON::Any | String)
  locale.each { |k, v| intermediate_hash[k] = v }
  final_locale_list << intermediate_hash.to_pretty_json(indent = "    ")
end

locale_map = Hash.zip(loaded_locales, final_locale_list)

# Export
locale_map.each do |locale_name, locale_contents|
  File.write("locales/#{locale_name}.json", "#{locale_contents}\n")
end