applocale 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/applocale/Command/init.rb +11 -6
- data/lib/applocale/Core/Compare/compare_xlsx_str.rb +2 -0
- data/lib/applocale/Core/{client_secret.json → GoogleHepler/client_secret.json} +0 -0
- data/lib/applocale/Core/{google_helper.rb → GoogleHepler/google_helper.rb} +20 -16
- data/lib/applocale/Core/ParseXLSX/parse_xlsx.rb +155 -0
- data/lib/applocale/Core/{parse_xlsx_module.rb → ParseXLSX/parse_xlsx_module.rb} +19 -19
- data/lib/applocale/Core/ParserStringFile/parse_localized_resource.rb +17 -31
- data/lib/applocale/Core/ParserStringFile/parse_strings_file.rb +8 -2
- data/lib/applocale/Core/ParserStringFile/parse_xml_file.rb +2 -3
- data/lib/applocale/Core/{convert_to_str_file.rb → convert_to_localefile.rb} +18 -24
- data/lib/applocale/Core/init.rb +15 -11
- data/lib/applocale/Core/setting.rb +3 -2
- data/lib/applocale/Util/config_util.rb +65 -50
- data/lib/applocale/Util/error_util.rb +78 -20
- data/lib/applocale/Util/file_util.rb +26 -26
- data/lib/applocale/Util/lang.rb +1 -1
- data/lib/applocale/Util/platform.rb +17 -2
- data/lib/applocale/Util/regex_util.rb +18 -18
- data/lib/applocale/version.rb +1 -1
- metadata +7 -7
- data/lib/applocale/Core/parse_xlsx.rb +0 -166
- data/lib/applocale/Util/color_util.rb +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d8869b79798773984196bbfc33f3358f9c52e50
|
4
|
+
data.tar.gz: aaab67885d67212dc783ed7be4560e3549739315
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0f6ee6f3cde1bcc235fb7cb6eefb042ad54bdb711921212f925e0f7ac978bd6066110d031b5da420ea486438dc173046b66128f3dd8d782b5941a113a93703e7
|
7
|
+
data.tar.gz: 81d2a69a19d328b2b9568783d9ce436d491eb4bdf25930febebc054795dd4efb7a809736ec20779e2eeda8f273730549ec7871f1dadeae73c9c11707a7dd0cf8
|
@@ -4,6 +4,7 @@ require File.expand_path('../../Util/error_util.rb', __FILE__)
|
|
4
4
|
require File.expand_path('../../Core/setting.rb', __FILE__)
|
5
5
|
require File.expand_path('../../Core/init.rb', __FILE__)
|
6
6
|
require File.expand_path('../../Core/ParserStringFile/parse_localized_resource.rb', __FILE__)
|
7
|
+
require File.expand_path('../../version', __FILE__)
|
7
8
|
|
8
9
|
require 'thor'
|
9
10
|
|
@@ -30,7 +31,7 @@ module Applocale
|
|
30
31
|
self.class.help(shell)
|
31
32
|
ErrorUtil::CommandError.new("Invalid [platform] : ios | android ").raise
|
32
33
|
else
|
33
|
-
ConfigUtil.
|
34
|
+
ConfigUtil.create_configfile_ifneed(platformsybom)
|
34
35
|
end
|
35
36
|
end
|
36
37
|
|
@@ -38,19 +39,23 @@ module Applocale
|
|
38
39
|
option :local, :desc => "Convert local xlsx file to localization string file"
|
39
40
|
def update()
|
40
41
|
is_local = !options[:local].nil?
|
41
|
-
|
42
|
-
ConfigUtil.loadAndValidateForXlsxToStringFile(false)
|
42
|
+
ConfigUtil.load_and_validate_xlsx_to_localefile(is_local)
|
43
43
|
Setting.printlog
|
44
|
-
Applocale.
|
44
|
+
Applocale.start_update(is_local, Applocale::Setting)
|
45
45
|
end
|
46
46
|
|
47
47
|
desc "reverse", "Convert localization string file to xlsx"
|
48
48
|
option :skip, :desc => "Skip Error"
|
49
49
|
def reverse()
|
50
50
|
is_skip = !options[:skip].nil?
|
51
|
-
ConfigUtil.
|
51
|
+
ConfigUtil.load_and_validate_localefile_to_xlsx()
|
52
52
|
Setting.printlog
|
53
|
-
Applocale::
|
53
|
+
Applocale::start_reverse(is_skip)
|
54
|
+
end
|
55
|
+
|
56
|
+
desc "version", "show the AppLocale verions"
|
57
|
+
def version()
|
58
|
+
puts Applocale::VERSION
|
54
59
|
end
|
55
60
|
|
56
61
|
end
|
File without changes
|
@@ -3,9 +3,9 @@ require 'googleauth'
|
|
3
3
|
require 'googleauth/stores/file_token_store'
|
4
4
|
require 'google/apis/sheets_v4'
|
5
5
|
require 'fileutils'
|
6
|
-
require
|
7
|
-
require File.expand_path('
|
8
|
-
require File.expand_path('
|
6
|
+
require 'colorize'
|
7
|
+
require File.expand_path('../../../Util/file_util.rb', __FILE__)
|
8
|
+
require File.expand_path('../../../Util/error_util.rb', __FILE__)
|
9
9
|
|
10
10
|
module Applocale
|
11
11
|
|
@@ -14,10 +14,10 @@ module Applocale
|
|
14
14
|
APPLICATION_NAME = 'AppLocale'
|
15
15
|
CLIENT_SECRETS_PATH = 'client_secret.json'
|
16
16
|
CREDENTIALS_PATH = File.join(Dir.home, '.applan_credentials',
|
17
|
-
|
17
|
+
'drive-ruby-applocale.yaml')
|
18
18
|
SCOPE = [Google::Apis::DriveV3::AUTH_DRIVE_METADATA_READONLY, Google::Apis::DriveV3::AUTH_DRIVE, Google::Apis::DriveV3::AUTH_DRIVE_FILE]
|
19
19
|
|
20
|
-
def self.
|
20
|
+
def self.is_googlelink(link)
|
21
21
|
if !link.nil? && link.length > 0
|
22
22
|
if link.match(/https:\/\/docs.google.com\/spreadsheets\/d\/([^\/]*)/i)
|
23
23
|
if $1.length > 0
|
@@ -27,18 +27,22 @@ module Applocale
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
def self.
|
31
|
-
puts "Start download from google, fileId: #{
|
30
|
+
def self.download_spreadsheet(spreadsheet_Id, filename)
|
31
|
+
puts "Start download from google, fileId: #{spreadsheet_Id} ...".green
|
32
32
|
service = Google::Apis::DriveV3::DriveService.new
|
33
33
|
service.client_options.application_name = APPLICATION_NAME
|
34
34
|
service.authorization = self.authorize
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
35
|
+
begin
|
36
|
+
content = service.export_file(spreadsheet_Id,
|
37
|
+
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
38
|
+
download_dest: filename)
|
39
|
+
if File.exist? filename
|
40
|
+
puts 'Download from google finished'.green
|
41
|
+
else
|
42
|
+
ErrorUtil::DownloadFromGoogleFail.new.raise
|
43
|
+
end
|
44
|
+
rescue
|
45
|
+
ErrorUtil::DownloadFromGoogleFail.new.raise
|
42
46
|
end
|
43
47
|
end
|
44
48
|
|
@@ -55,8 +59,8 @@ module Applocale
|
|
55
59
|
if credentials.nil?
|
56
60
|
url = authorizer.get_authorization_url(
|
57
61
|
base_url: OOB_URI)
|
58
|
-
puts
|
59
|
-
|
62
|
+
puts '!!! Open the following URL in the browser and enter the '.red +
|
63
|
+
'resulting code after authorization:'.red
|
60
64
|
puts url.blue.on_white
|
61
65
|
code = STDIN.gets.chomp
|
62
66
|
credentials = authorizer.get_and_store_credentials_from_code(
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require File.expand_path('../../setting.rb', __FILE__)
|
2
|
+
require File.expand_path('../parse_xlsx_module.rb', __FILE__)
|
3
|
+
require File.expand_path('../../../Util/error_util.rb', __FILE__)
|
4
|
+
require File.expand_path('../../../Util/regex_util.rb', __FILE__)
|
5
|
+
|
6
|
+
require 'rubyXL'
|
7
|
+
require 'colorize'
|
8
|
+
|
9
|
+
module Applocale
|
10
|
+
class ParseXLSX
|
11
|
+
|
12
|
+
@xlsx = nil
|
13
|
+
@sheetcontent_list = nil
|
14
|
+
@allkey_dict = {}
|
15
|
+
@all_error = nil
|
16
|
+
@setting = Setting
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
@setting = Setting
|
20
|
+
puts "Start to Parse XLSX: \"#{@setting.xlsxpath}\" ...".green
|
21
|
+
@sheetcontent_list = Array.new
|
22
|
+
@allkey_dict = {}
|
23
|
+
@all_error = Array.new
|
24
|
+
self.parse
|
25
|
+
end
|
26
|
+
|
27
|
+
def result
|
28
|
+
return @sheetcontent_list
|
29
|
+
end
|
30
|
+
|
31
|
+
def parse
|
32
|
+
begin
|
33
|
+
workbook = RubyXL::Parser.parse(@setting.xlsxpath)
|
34
|
+
rescue
|
35
|
+
ErrorUtil::CannotOpenXlsxFile.new(@setting.xlsxpath).raise
|
36
|
+
end
|
37
|
+
workbook.worksheets.each do |worksheet|
|
38
|
+
sheetname = worksheet.sheet_name
|
39
|
+
sheetcontent = ParseXLSXModule::SheetContent.new(sheetname)
|
40
|
+
rowno = -1
|
41
|
+
worksheet.each {|row|
|
42
|
+
rowno += 1
|
43
|
+
# colno = 0
|
44
|
+
next if row.nil?
|
45
|
+
cells = row && row.cells
|
46
|
+
if sheetcontent.header_rowno.nil?
|
47
|
+
headerinfo = find_header(cells)
|
48
|
+
unless headerinfo.nil?
|
49
|
+
sheetcontent.header_rowno = rowno
|
50
|
+
sheetcontent.keyStr_with_colno = headerinfo[:keystr_colno]
|
51
|
+
sheetcontent.lang_with_colno_list = headerinfo[:lang_colno]
|
52
|
+
end
|
53
|
+
else
|
54
|
+
begin
|
55
|
+
rowcontent = parse_row(sheetname, rowno, worksheet.sheet_data[rowno], sheetcontent.keyStr_with_colno, sheetcontent.lang_with_colno_list)
|
56
|
+
unless rowcontent.nil?
|
57
|
+
prev_rowcontent = @allkey_dict[rowcontent.key_str.downcase]
|
58
|
+
if prev_rowcontent.nil?
|
59
|
+
@allkey_dict[rowcontent.key_str.downcase] = rowcontent
|
60
|
+
sheetcontent.rowinfo_list.push(rowcontent)
|
61
|
+
else
|
62
|
+
error = ErrorUtil::ParseXlsxError::DuplicateKey.new(rowcontent, prev_rowcontent.sheetname, prev_rowcontent.rowno)
|
63
|
+
@all_error.push(error)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
rescue ErrorUtil::ParseXlsxError::ParseError => e
|
67
|
+
@all_error.push(e)
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
}
|
72
|
+
if sheetcontent.header_rowno.nil?
|
73
|
+
ErrorUtil::ParseXlsxError::HeadeNotFound.new(sheetname).to_warn
|
74
|
+
end
|
75
|
+
@sheetcontent_list.push(sheetcontent)
|
76
|
+
end
|
77
|
+
if @all_error.length > 0
|
78
|
+
ErrorUtil::ParseXlsxError::ParseError.raiseArr(@all_error)
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
def parse_row(sheetname, rowno, cells, keystr_with_colno, lang_with_colno_list)
|
84
|
+
begin
|
85
|
+
cell = cells[keystr_with_colno.colno]
|
86
|
+
val = cell && cell.value
|
87
|
+
keystr = to_value_key(val)
|
88
|
+
rescue ErrorUtil::ParseXlsxError::InValidKey => e
|
89
|
+
e.rowinfo.sheetname = sheetname
|
90
|
+
e.rowinfo.rowno = rowno
|
91
|
+
raise e
|
92
|
+
end
|
93
|
+
|
94
|
+
unless keystr.nil?
|
95
|
+
rowinfo = ParseXLSXModule::RowInfo.new(sheetname, rowno, keystr)
|
96
|
+
(0..lang_with_colno_list.length-1).each do |k|
|
97
|
+
lang_with_colno = lang_with_colno_list[k]
|
98
|
+
cell = cells[lang_with_colno.colno]
|
99
|
+
val = cell && cell.value
|
100
|
+
cell_value = val.to_s
|
101
|
+
lang_name = lang_with_colno.lang
|
102
|
+
rowinfo.content_dict[lang_name] = convert_contect(cell_value)
|
103
|
+
end
|
104
|
+
return rowinfo
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def to_value_key(value)
|
109
|
+
if !value.nil? && value != ''
|
110
|
+
new_value = value.to_s
|
111
|
+
if ValidKey.is_validkey(@setting.platform, new_value)
|
112
|
+
return new_value
|
113
|
+
else
|
114
|
+
rowinfo = ParseXLSXModule::RowInfo.new(nil, nil, value)
|
115
|
+
raise ErrorUtil::ParseXlsxError::InValidKey.new(rowinfo)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def convert_contect(cell_value)
|
121
|
+
if cell_value.nil?
|
122
|
+
return ''
|
123
|
+
else
|
124
|
+
return ContentUtil.add_escaped_double_quote(cell_value)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def find_header(cells)
|
129
|
+
keystr_with_colno = nil
|
130
|
+
lang_with_colno_list = Array.new
|
131
|
+
k_header_lang_dict = []
|
132
|
+
colno = 0
|
133
|
+
cells.each{ |cell|
|
134
|
+
value = cell && cell.value
|
135
|
+
unless value.nil?
|
136
|
+
if value == @setting.keystr && keystr_with_colno.nil?
|
137
|
+
keystr_with_colno = ParseXLSXModule::KeyStrWithColNo.new(value, colno)
|
138
|
+
else
|
139
|
+
@setting.langlist.each do |lang, info|
|
140
|
+
if value == info[:xlsheader] && k_header_lang_dict.index(lang).nil?
|
141
|
+
lang_with_colno_list.push(ParseXLSXModule::LangWithColNo.new(info[:xlsheader], lang, colno))
|
142
|
+
k_header_lang_dict.push(lang)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
colno += 1
|
148
|
+
}
|
149
|
+
if !keystr_with_colno.nil? && lang_with_colno_list.length == @setting.langlist.length
|
150
|
+
return {:keystr_colno => keystr_with_colno, :lang_colno => lang_with_colno_list}
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
end
|
@@ -2,41 +2,40 @@ module Applocale
|
|
2
2
|
|
3
3
|
module ParseXLSXModule
|
4
4
|
class SheetContent
|
5
|
-
attr_accessor :sheetname, :header_rowno, :
|
5
|
+
attr_accessor :sheetname, :header_rowno, :keyStr_with_colno, :lang_with_colno_list, :rowinfo_list, :comment
|
6
6
|
|
7
7
|
def initialize(sheetname)
|
8
8
|
self.sheetname = sheetname
|
9
|
-
self.rowinfo_list = Array.new
|
10
|
-
self.
|
9
|
+
self.rowinfo_list = Array.new
|
10
|
+
self.lang_with_colno_list = Array.new
|
11
11
|
self.comment = sheetname
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
14
|
+
def get_rowInfo_sortby_key
|
15
15
|
return self.rowinfo_list.sort_by { |obj| obj.key_str.to_s }
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
18
|
+
def get_rowInfo_sortby_rowno
|
19
19
|
return self.rowinfo_list.sort_by { |obj| obj.rowno.to_i }
|
20
20
|
end
|
21
21
|
|
22
22
|
def to_s
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
str_keyStr_with_colno = ''
|
24
|
+
unless keyStr_with_colno.nil?
|
25
|
+
str_keyStr_with_colno = "\n\t#{keyStr_with_colno.to_s}"
|
26
26
|
end
|
27
|
-
|
28
|
-
self.
|
29
|
-
|
27
|
+
str_lang_with_colno_list = ''
|
28
|
+
self.lang_with_colno_list.each do |langWithColNo|
|
29
|
+
str_lang_with_colno_list += "\n\t#{langWithColNo.to_s}"
|
30
30
|
end
|
31
|
-
str_contentlist =
|
32
|
-
self.
|
31
|
+
str_contentlist = '\n'
|
32
|
+
self.get_rowInfo_sortby_rowno.each do |value|
|
33
33
|
str_contentlist += "\t #{value.to_s}\n"
|
34
34
|
end
|
35
|
-
|
36
35
|
"sheetname = #{sheetname}\n" +
|
37
36
|
"header_rowno = #{header_rowno}\n" +
|
38
|
-
"keyStrWithColNo = #{
|
39
|
-
"langWithColNo_list = #{
|
37
|
+
"keyStrWithColNo = #{str_keyStr_with_colno}\n" +
|
38
|
+
"langWithColNo_list = #{str_lang_with_colno_list}\n" +
|
40
39
|
"rowinfo_list = #{str_contentlist}"
|
41
40
|
end
|
42
41
|
end
|
@@ -53,7 +52,7 @@ module Applocale
|
|
53
52
|
end
|
54
53
|
|
55
54
|
def to_s
|
56
|
-
"sheetname = #{sheetname}, rowno = #{rowno}, key_str = #{key_str}, content_dict = #{content_dict}"
|
55
|
+
"sheetname = #{sheetname}, rowno = #{rowno+1}, key_str = #{key_str}, content_dict = #{content_dict}"
|
57
56
|
end
|
58
57
|
|
59
58
|
end
|
@@ -68,7 +67,7 @@ module Applocale
|
|
68
67
|
end
|
69
68
|
|
70
69
|
def to_s
|
71
|
-
"{header_str => #{header_str}, colno => #{colno}}"
|
70
|
+
"{header_str => #{header_str}, colno => #{colno+1}}"
|
72
71
|
end
|
73
72
|
|
74
73
|
end
|
@@ -83,8 +82,9 @@ module Applocale
|
|
83
82
|
end
|
84
83
|
|
85
84
|
def to_s
|
86
|
-
"{header_str => #{header_str}, lang => #{lang}, colno => #{colno}}"
|
85
|
+
"{header_str => #{header_str}, lang => #{lang}, colno => #{colno+1}}"
|
87
86
|
end
|
87
|
+
|
88
88
|
end
|
89
89
|
|
90
90
|
end
|
@@ -1,71 +1,58 @@
|
|
1
1
|
require File.expand_path('../../setting.rb', __FILE__)
|
2
2
|
require File.expand_path('../../../Util/platform.rb', __FILE__)
|
3
|
-
require File.expand_path('../../parse_xlsx_module', __FILE__)
|
4
|
-
require File.expand_path('../../../Util/color_util.rb', __FILE__)
|
3
|
+
require File.expand_path('../../ParseXLSX/parse_xlsx_module', __FILE__)
|
5
4
|
require File.expand_path('../parse_strings_file', __FILE__)
|
6
5
|
require File.expand_path('../parse_xml_file', __FILE__)
|
7
6
|
|
8
7
|
require 'rubyXL'
|
8
|
+
require 'colorize'
|
9
9
|
|
10
10
|
module Applocale
|
11
11
|
class ParseLocalizedResource
|
12
|
-
|
13
|
-
# @xlsx = nil
|
14
|
-
|
15
12
|
@skip_error = false
|
16
13
|
@setting = Setting
|
17
|
-
# @xlsx = RubyXL::Workbook
|
18
|
-
# @allError = Array
|
19
|
-
# @sheetcontent_list = Array
|
20
14
|
|
21
15
|
def initialize(skip_error = false)
|
22
16
|
@skip_error = skip_error
|
23
17
|
@setting = Setting
|
24
|
-
|
25
18
|
FileUtils.mkdir_p(File.dirname(@setting.xlsxpath))
|
26
19
|
FileUtils.rm(@setting.xlsxpath) if File.exist? @setting.xlsxpath
|
27
|
-
|
28
|
-
|
29
|
-
langwithColNolist = Array.new
|
20
|
+
keystr_with_colno = ParseXLSXModule::KeyStrWithColNo.new(@setting.keystr, 0)
|
21
|
+
lang_with_colno_list = Array.new
|
30
22
|
colno = 1
|
31
|
-
|
32
23
|
@setting.langlist.each do |key, langinfo|
|
33
|
-
|
24
|
+
langwith_colno = ParseXLSXModule::LangWithColNo.new(langinfo[:xlsheader], key, colno)
|
34
25
|
colno+=1
|
35
|
-
|
26
|
+
lang_with_colno_list.push(langwith_colno)
|
36
27
|
end
|
37
|
-
|
38
28
|
if @setting.platform == Platform::IOS
|
39
|
-
result = self.
|
40
|
-
|
29
|
+
result = self.parse_ios
|
30
|
+
write_to_xlsx(@setting.xlsxpath, keystr_with_colno, lang_with_colno_list, result[:errorlist], result[:content], result[:keylist])
|
41
31
|
else
|
42
|
-
result = self.
|
43
|
-
|
32
|
+
result = self.parse_android
|
33
|
+
write_to_xlsx(@setting.xlsxpath, keystr_with_colno, lang_with_colno_list, result[:errorlist], result[:content], result[:keylist])
|
44
34
|
end
|
45
|
-
|
46
|
-
|
47
35
|
end
|
48
36
|
|
49
|
-
def
|
50
|
-
result = ParseStringsFile.new
|
37
|
+
def parse_ios
|
38
|
+
result = ParseStringsFile.new
|
51
39
|
errorlist = result.errorlist
|
52
40
|
content = result.strings_keys
|
53
41
|
keylist = result.keys_list
|
54
42
|
return {:errorlist => errorlist, :content => content, :keylist => keylist}
|
55
43
|
end
|
56
44
|
|
57
|
-
def
|
58
|
-
result = ParseXMLFile.new
|
45
|
+
def parse_android
|
46
|
+
result = ParseXMLFile.new
|
59
47
|
errorlist = result.errorlist
|
60
48
|
content = result.strings_keys
|
61
49
|
keylist = result.keys_list
|
62
50
|
return {:errorlist => errorlist, :content => content, :keylist => keylist}
|
63
51
|
end
|
64
52
|
|
65
|
-
def
|
53
|
+
def write_to_xlsx(path, keystrwithColNo, langwithColNolist, errorlist, content, keylist)
|
66
54
|
ErrorUtil::ParseLocalizedError::ParseLocalizedError.raiseArr(errorlist, !@skip_error)
|
67
55
|
puts "Start write to file: \"#{path}\" ...".green
|
68
|
-
|
69
56
|
workbook = RubyXL::Workbook.new
|
70
57
|
worksheet = workbook.worksheets[0]
|
71
58
|
rowno = 0
|
@@ -73,11 +60,10 @@ module Applocale
|
|
73
60
|
langwithColNolist.each do |langwithColNo|
|
74
61
|
worksheet.add_cell(rowno, langwithColNo.colno, langwithColNo.header_str)
|
75
62
|
end
|
76
|
-
|
77
63
|
rowno+=1
|
78
64
|
keylist.each do |key|
|
79
65
|
worksheet.add_cell(rowno, keystrwithColNo.colno, key)
|
80
|
-
|
66
|
+
unless content[key].nil?
|
81
67
|
langwithColNolist.each do |langwithColNo|
|
82
68
|
lang = langwithColNo.lang.to_s
|
83
69
|
worksheet.add_cell(rowno, langwithColNo.colno, content[key][lang][:value]) if !content[key][lang].nil? && !content[key][lang][:value].nil?
|
@@ -86,7 +72,7 @@ module Applocale
|
|
86
72
|
rowno+=1
|
87
73
|
end
|
88
74
|
workbook.write(path)
|
89
|
-
|
90
75
|
end
|
76
|
+
|
91
77
|
end
|
92
78
|
end
|