canvas-i18n-editor 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/bin/canvas-i18n-editor +44 -27
  3. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0777905a738e9fee9146ed71fef0f70fad8018df1f834e425cd9348bc7aa98f4'
4
- data.tar.gz: da069aed8d20995f8bc51a464ea78a58a9873d93a3547a06eec987b199c8e5d0
3
+ metadata.gz: cce046eb29fbec10d9be6d2e2fb4e34c5e24f82c55d78182e62529c64e0759a9
4
+ data.tar.gz: 9f0a327f99ee1d5c947605d0a4012bf24ec28ffc84800d65c20de7d4b62636c9
5
5
  SHA512:
6
- metadata.gz: ad3f83a7151abebeff87dd96232ff801374ecd11578ecd51de02835094284dd52c6ec1e28e0c1e4cf3964b34933ec987710f3b3ae3bd7651610580c4e5636a0b
7
- data.tar.gz: ef6feaee7ba8125d6a443374a9262b129980a15c8e7837848a9e9a16c17e1f0924364553f888898b4071c346a3a5419dd9e2ec758952b763c71ff47708f0fe42
6
+ metadata.gz: 8b042981a09e3528b27e5cd1dd7a177cf3637bf3f336a6db76f8915446acfe272e3f4ff85f095d9dadd360870baf8a3d153b6cec6fe02b6301eec90a17ce66ac
7
+ data.tar.gz: 72c40f2f42a805af9d317aae0d8dc8e19515b29f88b828bc818c8935ab65463d6a84abc769b8324fd70779c1a61813d9860a5c7124c950e50920d6646fb4c817
@@ -8,8 +8,6 @@ require "json"
8
8
 
9
9
  Options = Struct.new(:translate_from, :translate_to, :mode, :apply_js)
10
10
 
11
- ACCEPTED_MODE = %w[canvas rails reverse].freeze
12
-
13
11
  LOCALE_FILE = "config/locales/zh-Hant.yml"
14
12
  JS_LOCALE_FILE = "public/javascripts/translations/zh-Hant.json"
15
13
  TMP_FILE = "/tmp/canvas-i18n"
@@ -20,26 +18,29 @@ def update_rails_i18n(args)
20
18
  # find key in config/locales/zh-Hant.yml
21
19
  data = File.readlines(LOCALE_FILE)
22
20
  keywords = raw_key.split(".")
23
- current_layer = 1
24
21
  get_layer = -> { _1.match(/^\s*/)[0].size / 2 }
22
+ current_layer = 1
23
+ found_key_count = 0
25
24
  updated_flag = false
26
25
  File.open(TMP_FILE, "w:UTF-8") do |file|
27
26
  data[0..3].each { file.write(_1) }
28
27
  (4..data.size - 1).each do |line_index|
29
28
  line = data[line_index]
30
- unless updated_flag
31
- if data[line_index].match?(/^\s*#{keywords[0]}:/)
29
+ next_line = data[line_index + 1]
30
+ current_layer = get_layer[line]
31
+ if !updated_flag && current_layer == found_key_count + 1
32
+ if line.match?(/^\s{#{current_layer * 2}}#{keywords[0]}:/)
32
33
  line_number = line_index + 1
33
34
  key = keywords.shift
34
- current_layer += 1
35
+ found_key_count += 1
35
36
  puts "find #{key} in line #{line_number}"
36
37
  # find last key, should update content now
37
38
  if keywords.empty?
38
39
  line = line.sub(/#{key}:\s?/, "#{key}: ").sub(/(?<=#{key}:\s).+/, "\"#{args.translate_to}\"")
39
40
  updated_flag = true
40
41
  end
41
- elsif line_index < data.size - 1 && get_layer[data[line_index + 1]] < current_layer
42
- # determine can't find key early, update with nested structure
42
+ elsif keywords.join(".") != raw_key && (line_index >= data.size - 1 || get_layer[next_line] < current_layer)
43
+ # there's at least one key found and reach last line in this scope
43
44
  update_nested_key(file, keywords, current_layer, args)
44
45
  updated_flag = true
45
46
  end
@@ -48,7 +49,9 @@ def update_rails_i18n(args)
48
49
  file.write(line)
49
50
  end
50
51
 
51
- update_nested_key(file, keywords, current_layer, args) unless updated_flag
52
+ unless updated_flag
53
+ update_nested_key(file, keywords, current_layer, args)
54
+ end
52
55
  file.close
53
56
  end
54
57
  FileUtils.mv(TMP_FILE, LOCALE_FILE)
@@ -57,21 +60,32 @@ end
57
60
 
58
61
  def update_nested_key(file, keywords, current_layer, args)
59
62
  keywords[0..-2].each do |key|
60
- file.write("#{' ' * 2 * current_layer}#{key}: \n")
63
+ file.write("#{" " * 2 * current_layer}#{key}: \n")
61
64
  current_layer += 1
62
65
  end
63
- file.write("#{' ' * 2 * current_layer}#{keywords[-1]}: #{args.translate_to}\n")
66
+ file.write("#{" " * 2 * current_layer}#{keywords[-1]}: #{args.translate_to}\n")
64
67
  end
65
68
 
66
69
  def update_js(key, translate_to, apply_js)
70
+ add_js_key unless File.exist?(JS_LOCALE_FILE)
67
71
  data = File.read(JS_LOCALE_FILE)
68
- data = data.sub(/(?<="#{key}":)"[^"]+"/, "\"#{translate_to}\"")
69
- puts "update js translations"
72
+ key_part = data.match(/(?<="#{key}":)"[^"]+"/)
73
+ if key_part
74
+ data = data.sub(key_part[0], "\"#{translate_to}\"")
75
+ puts "update js translations"
76
+ File.write(JS_LOCALE_FILE, data)
77
+ else
78
+ add_js_key
79
+ end
70
80
 
71
- File.write(JS_LOCALE_FILE, data)
72
81
  generate_hashed_js if apply_js
73
82
  end
74
83
 
84
+ def add_js_key
85
+ puts "regenerate js translations"
86
+ `bundle exec rails i18n:generate_js`
87
+ end
88
+
75
89
  def generate_hashed_js
76
90
  `rm public/dist/javascripts/translations/zh-Hant-*.json`
77
91
  puts "generate scoped js translations"
@@ -116,22 +130,24 @@ def update_from_content(args)
116
130
  # TODO: use key(full key) to update_js
117
131
  end
118
132
 
133
+ def ask_translate_to(translate_from)
134
+ printf "what's the content you want to translate \"#{translate_from}\" to ? "
135
+ STDIN.gets
136
+ end
137
+
119
138
  class Parser
120
139
  def self.parse(user_input)
140
+ user_input.push("-h") if user_input.empty?
121
141
  args = Options.new
122
142
 
123
143
  opt_parser = OptionParser.new do |opts|
124
144
  opts.banner = "Usage:
125
145
  cool_i18n_edit translateFrom translateTo [options]
126
146
 
127
- cool_i18n_edit -t canvas 'Click Me' '點我' # edit i18n using canvas liner-style key
128
- cool_i18n_edit -t rails 'controller_name.action_name.click_me' '點我' # edit i18n using rails i18n key
147
+ cool_i18n_edit 'Click Me' '點我' # edit i18n using canvas liner-style key
148
+ cool_i18n_edit 'controller_name.action_name.click_me' '點我' # edit i18n using rails i18n key
129
149
  "
130
150
 
131
- opts.on("-m MODE", "--mode MODE", "canvas, rails or reverse") do |mode|
132
- args.mode = mode
133
- end
134
-
135
151
  opts.on("-a", "--apply", "apply js translations") do
136
152
  args.apply_js = true
137
153
  end
@@ -143,11 +159,14 @@ class Parser
143
159
  end
144
160
 
145
161
  opt_parser.parse!(user_input) # options are remove after this line
146
- raise "-m option not set" unless args.mode
147
- raise "invalid -m option #{args.mode}\nonly below types are allowed\n#{ACCEPTED_MODE.join(",")}" unless ACCEPTED_MODE.include?(args.mode)
148
162
 
149
163
  args.translate_from = user_input[0].strip
150
- args.translate_to = user_input[1].strip
164
+ args.translate_to = (user_input[1] || ask_translate_to(args.translate_from)).strip
165
+ args.mode = if args.translate_from.match?(/([a-zA-Z]+\.)+[a-zA-Z]+/)
166
+ :rails
167
+ else
168
+ :canvas
169
+ end
151
170
 
152
171
  args
153
172
  end
@@ -155,10 +174,8 @@ end
155
174
 
156
175
  args = Parser.parse(ARGV)
157
176
  case args.mode
158
- in "rails"
177
+ in :rails
159
178
  update_rails_i18n(args)
160
- in "canvas"
179
+ in :canvas
161
180
  update_canvas_i18n(args)
162
- in "reverse"
163
- update_from_content(args)
164
181
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: canvas-i18n-editor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pero
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-06-28 00:00:00.000000000 Z
11
+ date: 2023-06-29 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: i18n edit
14
14
  email: 0711kps@gmail.com
@@ -18,7 +18,7 @@ extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
20
  - bin/canvas-i18n-editor
21
- homepage: https://rubygems.org/gems/hola
21
+ homepage: https://rubygems.org/gems/canvas-i18n-editor
22
22
  licenses:
23
23
  - MIT
24
24
  metadata: {}