locale_base 0.0.2
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.
- data/lib/locale_base/tracking_token.rb +18 -0
- data/lib/locale_base/translation_tracker.rb +49 -0
- data/lib/locale_base/translator.rb +65 -0
- data/lib/locale_base/version.rb +5 -0
- data/lib/locale_base.rb +14 -0
- metadata +98 -0
@@ -0,0 +1,49 @@
|
|
1
|
+
module LocaleBase
|
2
|
+
|
3
|
+
# VVV this is pretty awesome
|
4
|
+
|
5
|
+
# analyze performance implications
|
6
|
+
# TODO consider using a hash instead of any array - may have performance help
|
7
|
+
# on many duplicates in yaml file - is that a use case that's valid?
|
8
|
+
# is there a better structure?
|
9
|
+
class TranslationTracker
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@tracking_array = []
|
13
|
+
@holdings = {}
|
14
|
+
end
|
15
|
+
|
16
|
+
# translate every token
|
17
|
+
# TODO make translate! in easy translate
|
18
|
+
# TODO move out of this class and into the Base**
|
19
|
+
def translate_all(options)
|
20
|
+
@tracking_array = EasyTranslate.translate(@tracking_array, options.merge(:html => true))
|
21
|
+
end
|
22
|
+
|
23
|
+
# for things that should be hidden and not translated
|
24
|
+
# return they key that will be put in place and unheld later
|
25
|
+
#
|
26
|
+
# Note: this workaround is needed due to how google translate
|
27
|
+
# doesn't cleanly handle .notranslate spans
|
28
|
+
def hold(value)
|
29
|
+
key = "h%020x" % rand(1 << 80)
|
30
|
+
@holdings[key] = value
|
31
|
+
key
|
32
|
+
end
|
33
|
+
|
34
|
+
def unhold(key)
|
35
|
+
@holdings[key]
|
36
|
+
end
|
37
|
+
|
38
|
+
def track(value)
|
39
|
+
@tracking_array << value
|
40
|
+
TrackingToken.new(self, @tracking_array.size - 1)
|
41
|
+
end
|
42
|
+
|
43
|
+
def retrieve(token)
|
44
|
+
@tracking_array[token.position]
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module LocaleBase
|
2
|
+
|
3
|
+
class Translator
|
4
|
+
|
5
|
+
# Initialize a new LocaleBase for translating
|
6
|
+
# locale files
|
7
|
+
#
|
8
|
+
# +hash+ The object to convert
|
9
|
+
def initialize(hash = [])
|
10
|
+
@original = hash
|
11
|
+
end
|
12
|
+
|
13
|
+
# place track tokens
|
14
|
+
# translate all of them
|
15
|
+
# and then replace the tokens with their string equivelants
|
16
|
+
def translate(options = {})
|
17
|
+
|
18
|
+
tracker = TranslationTracker.new
|
19
|
+
|
20
|
+
# we use divs here instead of spans so that google doesn't mess us up
|
21
|
+
# by combining spans on requests
|
22
|
+
@created = crazy_walk(@original) do |obj|
|
23
|
+
obj.gsub!(/\{\{([^\}]+)\}\}/) do |m|
|
24
|
+
"<div class='notranslate'>#{tracker.hold($1)}</div>"
|
25
|
+
end
|
26
|
+
# insert trackers
|
27
|
+
tracker.track(obj)
|
28
|
+
end
|
29
|
+
|
30
|
+
# translate everything
|
31
|
+
tracker.translate_all(options)
|
32
|
+
|
33
|
+
# replace the tokens with the tranlated text
|
34
|
+
@created = crazy_walk(@created) do |obj|
|
35
|
+
obj = tracker.retrieve(obj) if obj.is_a?(TrackingToken)
|
36
|
+
# remove divs and replace with hold text - don't let google near this stuff
|
37
|
+
# whitespace split also needed cause google messess with our shit
|
38
|
+
obj.gsub!('><', '> <')
|
39
|
+
obj.gsub!(/<div\sclass='notranslate'>([^<]+)<\/div>/) do |m|
|
40
|
+
"{{#{tracker.unhold($1)}}}"
|
41
|
+
end
|
42
|
+
|
43
|
+
obj
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
# nice little recursive walker
|
51
|
+
def crazy_walk(obj, &block)
|
52
|
+
if obj.is_a?(Array)
|
53
|
+
obj.map { |item| crazy_walk(item, &block) }
|
54
|
+
elsif obj.is_a?(Hash)
|
55
|
+
hash = Hash.new
|
56
|
+
obj.each_pair { |key, value| hash[key] = crazy_walk(value, &block) }
|
57
|
+
hash
|
58
|
+
else
|
59
|
+
yield obj
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
data/lib/locale_base.rb
ADDED
metadata
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: locale_base
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- John Crepezzi
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-02-01 00:00:00 -05:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rspec
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
33
|
+
type: :development
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: easy_translate
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
version: "0"
|
47
|
+
type: :runtime
|
48
|
+
version_requirements: *id002
|
49
|
+
description: locale_base is a way to easily translate yaml locale files from one language to another
|
50
|
+
email: john@crepezzi.com
|
51
|
+
executables: []
|
52
|
+
|
53
|
+
extensions: []
|
54
|
+
|
55
|
+
extra_rdoc_files: []
|
56
|
+
|
57
|
+
files:
|
58
|
+
- lib/locale_base/tracking_token.rb
|
59
|
+
- lib/locale_base/translation_tracker.rb
|
60
|
+
- lib/locale_base/translator.rb
|
61
|
+
- lib/locale_base/version.rb
|
62
|
+
- lib/locale_base.rb
|
63
|
+
has_rdoc: true
|
64
|
+
homepage: http://github.com/seejohnrun/locale_base/
|
65
|
+
licenses: []
|
66
|
+
|
67
|
+
post_install_message:
|
68
|
+
rdoc_options: []
|
69
|
+
|
70
|
+
require_paths:
|
71
|
+
- lib
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 3
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
version: "0"
|
81
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
hash: 3
|
87
|
+
segments:
|
88
|
+
- 0
|
89
|
+
version: "0"
|
90
|
+
requirements: []
|
91
|
+
|
92
|
+
rubyforge_project: locale_base
|
93
|
+
rubygems_version: 1.3.7
|
94
|
+
signing_key:
|
95
|
+
specification_version: 3
|
96
|
+
summary: EasyTranslate backed YAML locale translation
|
97
|
+
test_files: []
|
98
|
+
|