applyrics 0.0.2 → 0.0.3.pre
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +32 -17
- data/lib/applyrics/cli.rb +55 -21
- data/lib/applyrics/command.rb +1 -1
- data/lib/applyrics/info.rb +1 -1
- data/lib/applyrics/languagefile.rb +42 -0
- data/lib/applyrics/project.rb +18 -0
- data/lib/applyrics/project_ios.rb +58 -10
- data/lib/applyrics/stringsfile.rb +4 -12
- data/lib/applyrics/tools/genstrings.rb +1 -1
- data/lib/applyrics/tools/ibtool.rb +1 -1
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7f8c09970f5298b306a1f05ff6c89f36fb8db206
|
4
|
+
data.tar.gz: d7226737efbd8949a1e5eaa135809d7a20457251
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c05ad2a2ee39d8854a7487f96ac1efaa4e70c4f7c828df7a8785a547a43bd430f0d7ca1f6a6eb629009e1cc218e6d03fa3359ac2f8489d2a5e35d1872a92180
|
7
|
+
data.tar.gz: a65d253e07a1cf8a45e2a9362073b9bc7114344321869cf47684583591bf58e3e0488854f62a8f0b4b5f917c091a3f569d4839e4903bf86f898aaece54f0abdb
|
data/README.md
CHANGED
@@ -8,49 +8,64 @@ Manage your localization with confidence.
|
|
8
8
|
|
9
9
|
## Disclaimer
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
**This software should be considered _pre-alpha_ and may thus change at any time, be incomplete or contain bugs.**
|
12
|
+
|
13
|
+
## Why Applyrics?
|
14
|
+
|
15
|
+
Managing translations for mobile projects can be a mess, especially if you are working with multiple platforms.
|
16
|
+
iOS projects use key-value \*.strings files, Android use xmls, and variables are defined differently.
|
17
|
+
|
18
|
+
*Applyrics* removes these obstacles and lets you manage languages using unified json files.
|
14
19
|
|
15
20
|
## Status
|
16
21
|
|
17
22
|
| Feature | iOS | Android |
|
18
23
|
| --------- | --- | --------|
|
19
|
-
|
|
20
|
-
| rebuild | :x: | :x: |
|
24
|
+
| extract | :x: | :x: |
|
21
25
|
| apply | :x: | :x: |
|
22
|
-
| sync | :x: | :x: |
|
23
26
|
|
24
27
|
## Installation
|
25
28
|
|
26
29
|
Install using ruby gems:
|
27
30
|
|
28
|
-
|
31
|
+
sudo gem install applyrics --verbose
|
29
32
|
|
30
33
|
|
31
34
|
## Usage
|
32
35
|
|
33
|
-
|
34
|
-
(iOS: :x: Android: :x:)
|
36
|
+
Usually you start out by extracting the strings from an existing project into a json file by running the following command in your projects directory:
|
35
37
|
|
36
|
-
|
38
|
+
applyrics extract
|
37
39
|
|
38
40
|
|
39
|
-
|
40
|
-
|
41
|
+
After you've made changes to the translations you can apply those changes to the projects.
|
42
|
+
Notice the addition of the *--rebuild* flag. This will ensure that we don't miss any new keys that might have been added.
|
41
43
|
|
42
|
-
|
44
|
+
applyrics apply --rebuild
|
43
45
|
|
44
46
|
|
45
|
-
|
47
|
+
### Global flags
|
48
|
+
|
49
|
+
| Flag | Default | Description |
|
50
|
+
| --------------- | ------- | ---------------------------- |
|
51
|
+
| --verbose | false | Output more detailed logs |
|
52
|
+
| --rebuild | false | Rebuilds strings from source |
|
53
|
+
| --lang CODE | *All* | Language to work with |
|
54
|
+
| --project PATH | "./" | Path to project |
|
55
|
+
|
56
|
+
|
57
|
+
### Actions
|
58
|
+
|
59
|
+
Extract strings from project and create strings.json file
|
46
60
|
(iOS: :x: Android: :x:)
|
47
61
|
|
48
|
-
applyrics
|
62
|
+
applyrics extract
|
49
63
|
|
50
|
-
|
64
|
+
|
65
|
+
Apply a json language file
|
51
66
|
(iOS: :x: Android: :x:)
|
52
67
|
|
53
|
-
|
68
|
+
applyrics apply
|
54
69
|
|
55
70
|
|
56
71
|
## License
|
data/lib/applyrics/cli.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'commander'
|
2
|
+
require 'colored'
|
2
3
|
require 'applyrics/setup'
|
4
|
+
require 'applyrics/languagefile'
|
3
5
|
|
4
6
|
module Applyrics
|
5
7
|
class CLI
|
@@ -14,48 +16,80 @@ module Applyrics
|
|
14
16
|
program :version, Applyrics::VERSION
|
15
17
|
program :description, Applyrics::DESCRIPTION
|
16
18
|
program :help_formatter, :compact
|
19
|
+
global_option '--project PATH', String, 'Path to iOS or Android project'
|
20
|
+
global_option '--[no-]rebuild', TrueClass, 'Rebuild language files from source'
|
21
|
+
global_option '--lang CODE', String, 'Only perform the action for the specified language'
|
17
22
|
|
18
23
|
command :init do |c|
|
19
24
|
c.syntax = "applyrics init"
|
20
|
-
c.description = "
|
25
|
+
c.description = "Setup the project for applyrics"
|
21
26
|
c.action do |args, options|
|
22
|
-
|
27
|
+
project = Applyrics::Project.new()
|
28
|
+
|
29
|
+
if project.nil?
|
30
|
+
puts "Error"
|
31
|
+
else
|
32
|
+
case project.platform
|
33
|
+
when :ios
|
34
|
+
puts "Located ".green + "iOS".bold.green + " project".green
|
35
|
+
when :android
|
36
|
+
puts "Located ".green + "Android".bold.green + " project".green
|
37
|
+
end
|
38
|
+
|
39
|
+
langs = project.detected_languages
|
40
|
+
puts "Found #{langs.length} languages: #{langs.join(', ')}".green
|
41
|
+
puts ""
|
42
|
+
|
43
|
+
lang_files = project.language_files
|
44
|
+
langs.each do |lang|
|
45
|
+
if !lang_files.key?(lang)
|
46
|
+
puts "[#{lang}] No files detected for language!".yellow
|
47
|
+
next
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
23
52
|
end
|
24
53
|
end
|
25
54
|
|
26
|
-
command :
|
27
|
-
c.syntax = "applyrics
|
28
|
-
c.description = "
|
29
|
-
c.option '--
|
55
|
+
command :extract do |c|
|
56
|
+
c.syntax = "applyrics extract"
|
57
|
+
c.description = "Pull strings from the project into a strings.json file"
|
58
|
+
c.option '--force-split', TrueClass, 'Saves one language file per language instead of a single one for all languages'
|
30
59
|
c.action do |args, options|
|
31
|
-
|
32
|
-
puts "rebuilding..."
|
60
|
+
|
33
61
|
project = Applyrics::Project.new()
|
34
|
-
project.
|
62
|
+
detect_lang = project.detected_languages
|
63
|
+
|
64
|
+
langs = project.string_files()
|
65
|
+
|
66
|
+
puts "Found files for #{langs.length} languages".green
|
67
|
+
|
68
|
+
if options.rebuild
|
69
|
+
puts "Rebuilding...".blue
|
70
|
+
rebuilt = project.rebuild_files()
|
71
|
+
langs = langs.merge(rebuilt)
|
72
|
+
puts "Language \"#{project.default_language}\" is rebuilt from source into #{rebuilt[project.default_language].length} files".blue
|
73
|
+
end
|
74
|
+
|
75
|
+
puts "Writing #{langs.length} languages: #{langs.keys.join(', ')}".green
|
76
|
+
|
77
|
+
file = LanguageFile.new(File.join("./", "strings.json"), langs)
|
78
|
+
file.write
|
79
|
+
|
35
80
|
end
|
36
81
|
end
|
37
82
|
|
38
83
|
command :apply do |c|
|
39
84
|
c.syntax = "applyrics apply"
|
40
85
|
c.description = "Applies language from a .json file"
|
41
|
-
c.option '--
|
42
|
-
c.option '--data STRING', String, 'Path to .json file (Default: lyrics.json)'
|
86
|
+
c.option '--data STRING', String, 'Path to .json file (Default: strings.json)'
|
43
87
|
c.action do |args, options|
|
44
88
|
options.default :project => './', :data => './lyrics.json'
|
45
89
|
puts "Not implemented yet... Sorry!"
|
46
90
|
end
|
47
91
|
end
|
48
92
|
|
49
|
-
command :sync do |c|
|
50
|
-
c.syntax = "applyrics sync"
|
51
|
-
c.description = "Syncs language from applyrics.io"
|
52
|
-
c.option '--project STRING', String, 'Path to iOS or Android project'
|
53
|
-
c.action do |args, options|
|
54
|
-
options.default :project => './'
|
55
|
-
puts "Not implemented yet... Sorry!"
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
93
|
run!
|
60
94
|
end
|
61
95
|
end
|
data/lib/applyrics/command.rb
CHANGED
data/lib/applyrics/info.rb
CHANGED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'multi_json'
|
2
|
+
|
3
|
+
# encoding=utf-8
|
4
|
+
module Applyrics
|
5
|
+
class LanguageFile
|
6
|
+
|
7
|
+
def initialize(path, data=nil)
|
8
|
+
@path = path
|
9
|
+
@hash = data
|
10
|
+
if data.nil?
|
11
|
+
read
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def [](key)
|
16
|
+
@hash[key]
|
17
|
+
end
|
18
|
+
|
19
|
+
def []=(key, value)
|
20
|
+
@hash[key] = value
|
21
|
+
end
|
22
|
+
|
23
|
+
def language?(key)
|
24
|
+
@hash.key?(key)
|
25
|
+
end
|
26
|
+
|
27
|
+
def languages
|
28
|
+
@hash.keys
|
29
|
+
end
|
30
|
+
|
31
|
+
def read
|
32
|
+
@hash = {}
|
33
|
+
data = File.read(@path)
|
34
|
+
@hash = MultiJson.load(data)
|
35
|
+
end
|
36
|
+
|
37
|
+
def write()
|
38
|
+
File.open(@path, 'w') { |file| file.write(MultiJson.dump(@hash, :pretty => true)) }
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
data/lib/applyrics/project.rb
CHANGED
@@ -47,15 +47,33 @@ module Applyrics
|
|
47
47
|
@project.detected_languages()
|
48
48
|
end
|
49
49
|
|
50
|
+
def language_files
|
51
|
+
@project.language_files()
|
52
|
+
end
|
53
|
+
|
54
|
+
# @return [String] The language which are the default language in the project
|
55
|
+
def default_language
|
56
|
+
@project.default_language
|
57
|
+
end
|
58
|
+
|
50
59
|
# @param [String] the name of the setting to read.
|
51
60
|
# @return [String, nil] the value of the setting or nil if not found.
|
52
61
|
def platform_project_settings(name)
|
53
62
|
@project.platform_project_settings(name)
|
54
63
|
end
|
55
64
|
|
65
|
+
# @return [Object, nil] the strings files found in the project
|
66
|
+
def string_files
|
67
|
+
@project.string_files()
|
68
|
+
end
|
69
|
+
|
56
70
|
# Rebuild the language files.
|
57
71
|
def rebuild_files
|
58
72
|
@project.rebuild_files()
|
59
73
|
end
|
74
|
+
|
75
|
+
def platform
|
76
|
+
@platform
|
77
|
+
end
|
60
78
|
end
|
61
79
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'i18n_data'
|
3
3
|
require 'multi_json'
|
4
|
+
require 'fileutils'
|
4
5
|
require 'applyrics/tools/genstrings'
|
5
6
|
require 'applyrics/tools/ibtool'
|
6
7
|
require 'applyrics/stringsfile'
|
@@ -15,22 +16,47 @@ module Applyrics
|
|
15
16
|
end
|
16
17
|
@path = path
|
17
18
|
@platform_settings = nil
|
18
|
-
@langs =
|
19
|
+
@langs = []
|
20
|
+
@default_language = nil
|
19
21
|
end
|
20
22
|
|
21
23
|
# Return a list of detected languages in the project
|
22
24
|
def detected_languages
|
25
|
+
@langs = []
|
23
26
|
folder = self.platform_project_settings("SOURCE_ROOT")
|
24
|
-
base_language = I18nData.language_code(self.platform_project_settings("DEVELOPMENT_LANGUAGE")).downcase
|
25
27
|
lang_folders = Dir.glob(File.join(folder, "**", "*.lproj"))
|
26
28
|
lang_folders.each do |lang_folder|
|
27
29
|
lang = /([A-Za-z\-]*?)\.lproj/.match(lang_folder)[1]
|
28
|
-
lang = (lang == "Base" ?
|
29
|
-
@langs
|
30
|
+
lang = (lang == "Base" ? default_language : lang)
|
31
|
+
@langs << lang
|
30
32
|
end
|
31
33
|
return @langs
|
32
34
|
end
|
33
35
|
|
36
|
+
def language_files
|
37
|
+
folder = self.platform_project_settings("SOURCE_ROOT") unless !folder.nil?
|
38
|
+
out = {}
|
39
|
+
Dir[File.join(folder, "**","*.strings")].each do |file|
|
40
|
+
lang = /(\w*).lproj/.match(file)[1]
|
41
|
+
lang = (lang == "Base" ? default_language : lang)
|
42
|
+
|
43
|
+
if !out.key?(lang)
|
44
|
+
out[lang] = []
|
45
|
+
end
|
46
|
+
|
47
|
+
out[lang] << file
|
48
|
+
end
|
49
|
+
|
50
|
+
out
|
51
|
+
end
|
52
|
+
|
53
|
+
def default_language
|
54
|
+
if @default_language.nil?
|
55
|
+
@default_language = I18nData.language_code(self.platform_project_settings("DEVELOPMENT_LANGUAGE")).downcase
|
56
|
+
end
|
57
|
+
@default_language
|
58
|
+
end
|
59
|
+
|
34
60
|
def platform_project_settings(name)
|
35
61
|
if @platform_settings.nil?
|
36
62
|
cmd = ["set -o pipefail && xcrun xcodebuild -showBuildSettings"]
|
@@ -42,9 +68,29 @@ module Applyrics
|
|
42
68
|
return result.split(" = ").last
|
43
69
|
end
|
44
70
|
|
71
|
+
def string_files(folder=nil)
|
72
|
+
folder = self.platform_project_settings("SOURCE_ROOT") unless !folder.nil?
|
73
|
+
|
74
|
+
out = {}
|
75
|
+
|
76
|
+
Dir[File.join(folder, "**", "*.lproj", "*.strings")].each do |file|
|
77
|
+
strings = StringsFile.new(file)
|
78
|
+
lang = /(\w*).lproj/.match(file)[1]
|
79
|
+
|
80
|
+
if !out.key?(lang)
|
81
|
+
out[lang] = {}
|
82
|
+
end
|
83
|
+
|
84
|
+
out[lang][File.basename(file)] = strings.hash
|
85
|
+
end
|
86
|
+
|
87
|
+
out
|
88
|
+
end
|
89
|
+
|
90
|
+
# NOTE: This will only rebuild the base language
|
45
91
|
def rebuild_files
|
46
92
|
folder = self.platform_project_settings("SOURCE_ROOT")
|
47
|
-
tmp_folder = "
|
93
|
+
tmp_folder = "./tmp/"
|
48
94
|
|
49
95
|
if !Dir.exist?(tmp_folder)
|
50
96
|
Dir.mkdir(tmp_folder, 0700)
|
@@ -53,16 +99,18 @@ module Applyrics
|
|
53
99
|
GenStrings.run("#{folder}", tmp_folder)
|
54
100
|
IBTool.run("#{folder}", tmp_folder)
|
55
101
|
|
56
|
-
|
102
|
+
lang = default_language
|
103
|
+
out = {"#{lang}" => {}}
|
104
|
+
langHash = out["#{lang}"]
|
105
|
+
|
57
106
|
Dir[File.join(tmp_folder, "*.strings")].each do |file|
|
58
|
-
puts file
|
59
107
|
strings = StringsFile.new(file)
|
60
|
-
|
108
|
+
langHash[File.basename(file)] = strings.hash
|
61
109
|
end
|
62
110
|
|
63
|
-
|
64
|
-
|
111
|
+
FileUtils.remove_dir(tmp_folder)
|
65
112
|
|
113
|
+
out
|
66
114
|
end
|
67
115
|
end
|
68
116
|
end
|
@@ -2,9 +2,9 @@
|
|
2
2
|
module Applyrics
|
3
3
|
class StringsFile
|
4
4
|
|
5
|
-
def initialize(
|
6
|
-
@
|
7
|
-
@hash = data
|
5
|
+
def initialize(path, data=nil)
|
6
|
+
@path = path
|
7
|
+
@hash = data
|
8
8
|
if data.nil?
|
9
9
|
read
|
10
10
|
end
|
@@ -13,7 +13,7 @@ module Applyrics
|
|
13
13
|
def read
|
14
14
|
@hash = {}
|
15
15
|
parser = Parser.new(@hash)
|
16
|
-
File.open(@
|
16
|
+
File.open(@path, 'rb:bom|utf-16LE:utf-8') { |fd| parser.parse fd }
|
17
17
|
self
|
18
18
|
end
|
19
19
|
|
@@ -44,16 +44,8 @@ module Applyrics
|
|
44
44
|
|
45
45
|
def parse(data)
|
46
46
|
@hash.clear
|
47
|
-
found_bad_bytes = false
|
48
47
|
data.each_line do |line|
|
49
48
|
@line = line.chomp
|
50
|
-
if !found_bad_bytes
|
51
|
-
first_bytes = @line[0..1].bytes.to_a
|
52
|
-
if first_bytes.length == 2 && first_bytes[0] == 255
|
53
|
-
@line = @line[2,@line.length].force_encoding('UTF-8')
|
54
|
-
found_bad_bytes = true
|
55
|
-
end
|
56
|
-
end
|
57
49
|
|
58
50
|
case @line
|
59
51
|
when @comment_regex
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: applyrics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Frederik Wallner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-04-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: commander
|
@@ -125,6 +125,7 @@ files:
|
|
125
125
|
- lib/applyrics/command.rb
|
126
126
|
- lib/applyrics/environment.rb
|
127
127
|
- lib/applyrics/info.rb
|
128
|
+
- lib/applyrics/languagefile.rb
|
128
129
|
- lib/applyrics/lyricsfile.rb
|
129
130
|
- lib/applyrics/project.rb
|
130
131
|
- lib/applyrics/project_ios.rb
|
@@ -141,8 +142,10 @@ files:
|
|
141
142
|
homepage: https://github.com/applyrics/applyrics-gem
|
142
143
|
licenses:
|
143
144
|
- MIT
|
144
|
-
metadata:
|
145
|
-
|
145
|
+
metadata:
|
146
|
+
issue_tracker: https://github.com/applyrics/applyrics-gem/issues
|
147
|
+
post_install_message: Thank you for using applyrics! Please keep in mind that this
|
148
|
+
software is in early development, things might break.
|
146
149
|
rdoc_options: []
|
147
150
|
require_paths:
|
148
151
|
- lib
|
@@ -153,9 +156,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
153
156
|
version: '0'
|
154
157
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
158
|
requirements:
|
156
|
-
- - '
|
159
|
+
- - '>'
|
157
160
|
- !ruby/object:Gem::Version
|
158
|
-
version:
|
161
|
+
version: 1.3.1
|
159
162
|
requirements: []
|
160
163
|
rubyforge_project:
|
161
164
|
rubygems_version: 2.0.14
|