gettext-setup 0.21 → 0.23
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 +2 -2
- data/lib/generate_metadata_pot.rb +1 -0
- data/lib/gettext-setup.rb +2 -0
- data/lib/gettext-setup/gettext_setup.rb +20 -2
- data/lib/gettext-setup/metadata_pot.rb +38 -0
- data/lib/gettext-setup/pot.rb +138 -0
- data/lib/tasks/gettext.rake +33 -40
- data/lib/templates/metadata.pot.erb +23 -0
- data/spec/fixtures/fixture_locales/config.yaml +21 -0
- data/spec/fixtures/fixture_locales/fixture_locales.pot +24 -0
- data/spec/fixtures/{alt_locales/jp/alt_locales.po → fixture_locales/jp/fixture_locales.po} +0 -0
- data/spec/fixtures/fixture_locales/test_strings.rb +1 -0
- data/spec/fixtures/locales/config.yaml +2 -2
- data/spec/fixtures/locales/sinatra-i18n.pot +22 -7
- data/spec/fixtures/{alt_locales → spec_locales}/config.yaml +3 -4
- data/spec/fixtures/spec_locales/sinatra-i18n.pot +40 -0
- data/spec/fixtures/{pot_update → string_changes}/add.pot +0 -0
- data/spec/fixtures/{pot_update → string_changes}/change.pot +0 -0
- data/spec/fixtures/{pot_update → string_changes}/non_string_changes.pot +0 -0
- data/spec/fixtures/{pot_update → string_changes}/old.pot +0 -0
- data/spec/fixtures/{pot_update → string_changes}/remove.pot +0 -0
- data/spec/lib/gettext_setup_spec.rb +16 -7
- data/spec/lib/metadata_pot_spec.rb +60 -0
- data/spec/lib/pot_spec.rb +162 -0
- data/spec/spec_helper.rb +27 -2
- metadata +34 -22
- data/lib/tasks/task_helper.rb +0 -58
- data/spec/fixtures/alt_locales/alt_locales.pot +0 -25
- data/spec/tasks/update_pot_spec.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: 301f3ae1df25e57691ff9a3b68fbbaaba018fb75
|
4
|
+
data.tar.gz: ff2707b717e503eee61bdb29b4abf8368abe3603
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fba28fcc1c48d5d29a1f5944d8533e59122d93203652697e2416cc56fab2259708414156677861dbaaafc642c294ea92b45b4134669ce4e4c0802d80a4cc411c
|
7
|
+
data.tar.gz: d5b6badc80b1ab2e76e28094b6e094f76ef6fe131e49afa3c3e54977304dca13fb2f28f954b67669b3ad4ec0c774ad02c850034b59b4df28300f61738f934a1d
|
data/README.md
CHANGED
@@ -36,11 +36,11 @@ your project:
|
|
36
36
|
`GettextSetup.initialize(File.absolute_path('locales', File.dirname(__FILE__)))`
|
37
37
|
(Note that the second line may require modification to find the `locales` directory.
|
38
38
|
1. For client-side applications, add this line:
|
39
|
-
`
|
39
|
+
`GettextSetup.negotiate_locale!(GettextSetup.candidate_locales)`
|
40
40
|
1. For server-side applications, add these lines:
|
41
41
|
```
|
42
42
|
before do
|
43
|
-
|
43
|
+
GettextSetup.negotiate_locale!(env["HTTP_ACCEPT_LANGUAGE"])
|
44
44
|
end
|
45
45
|
```
|
46
46
|
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'metadata_pot/metadata_pot'
|
data/lib/gettext-setup.rb
CHANGED
@@ -5,6 +5,12 @@ require 'yaml'
|
|
5
5
|
require 'locale'
|
6
6
|
|
7
7
|
module GettextSetup
|
8
|
+
class NoConfigFoundError < RuntimeError
|
9
|
+
def initialize(path)
|
10
|
+
super("No config.yaml found! (searching: #{path})")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
8
14
|
@config = nil
|
9
15
|
@translation_repositories = {}
|
10
16
|
FastGettext.default_available_locales = []
|
@@ -16,8 +22,10 @@ module GettextSetup
|
|
16
22
|
# - if using .mo files, an LC_MESSAGES dir in each language dir, with the .mo file in it
|
17
23
|
# valid `options` fields:
|
18
24
|
# :file_format - one of the supported backends for fast_gettext (e.g. :po, :mo, :yaml, etc.)
|
19
|
-
def self.initialize(locales_path, options = {})
|
25
|
+
def self.initialize(locales_path = 'locales', options = {})
|
20
26
|
config_path = File.absolute_path('config.yaml', locales_path)
|
27
|
+
File.exist?(config_path) || raise(NoConfigFoundError, config_path)
|
28
|
+
|
21
29
|
@config = YAML.load_file(config_path)['gettext']
|
22
30
|
@locales_path = locales_path
|
23
31
|
|
@@ -41,6 +49,11 @@ module GettextSetup
|
|
41
49
|
Locale.set_default(default_locale)
|
42
50
|
end
|
43
51
|
|
52
|
+
def self.config?
|
53
|
+
raise NoConfigFoundError, File.join(locales_path, 'config.yaml') unless @config
|
54
|
+
@config
|
55
|
+
end
|
56
|
+
|
44
57
|
def self.add_repository_to_chain(project_name, options)
|
45
58
|
repository = FastGettext::TranslationRepository.build(project_name,
|
46
59
|
path: locales_path,
|
@@ -50,7 +63,7 @@ module GettextSetup
|
|
50
63
|
end
|
51
64
|
|
52
65
|
def self.locales_path
|
53
|
-
@locales_path
|
66
|
+
@locales_path ||= File.join(Dir.pwd, 'locales')
|
54
67
|
end
|
55
68
|
|
56
69
|
def self.config
|
@@ -113,4 +126,9 @@ module GettextSetup
|
|
113
126
|
default_locale
|
114
127
|
end
|
115
128
|
end
|
129
|
+
|
130
|
+
# Negotiates and sets the locale based on an accept language header.
|
131
|
+
def self.negotiate_locale!(accept_header)
|
132
|
+
FastGettext.locale = negotiate_locale(accept_header)
|
133
|
+
end
|
116
134
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'erb'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
module GettextSetup
|
7
|
+
module MetadataPot
|
8
|
+
def self.metadata_path
|
9
|
+
File.join(GettextSetup.locales_path, GettextSetup.config['project_name'] + '_metadata.pot')
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.template_path
|
13
|
+
File.join(File.dirname(__FILE__), '../templates/metadata.pot.erb')
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.metadata(metadata_file = 'metadata.json')
|
17
|
+
if File.exist?(metadata_file)
|
18
|
+
file = open(metadata_file)
|
19
|
+
json = file.read
|
20
|
+
JSON.parse(json)
|
21
|
+
else
|
22
|
+
{}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.pot_string(metadata)
|
27
|
+
b = binding.freeze
|
28
|
+
# Uses `metadata`
|
29
|
+
ERB.new(File.read(template_path)).result(b)
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.generate_metadata_pot(pot_metadata = metadata, path = metadata_path)
|
33
|
+
open(path, 'w') do |f|
|
34
|
+
f << pot_string(pot_metadata)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'open3'
|
4
|
+
require 'English'
|
5
|
+
|
6
|
+
module GettextSetup
|
7
|
+
module Pot
|
8
|
+
def self.text_domain
|
9
|
+
FastGettext.text_domain
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.files_to_translate
|
13
|
+
files = (GettextSetup.config['source_files'] || []).map do |p|
|
14
|
+
Dir.glob(p)
|
15
|
+
end.flatten
|
16
|
+
# check for optional list of files to exclude from string
|
17
|
+
# extraction
|
18
|
+
exclusions = (GettextSetup.config['exclude_files'] || []).map do |p|
|
19
|
+
Dir.glob(p)
|
20
|
+
end.flatten
|
21
|
+
|
22
|
+
# if file is a directory, take it out of the array. directories
|
23
|
+
# cause rxgettext to error out.
|
24
|
+
(files - exclusions).reject { |file| File.directory?(file) }
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.pot_file_path
|
28
|
+
return if GettextSetup.locales_path.nil?
|
29
|
+
return if GettextSetup.config['project_name'].nil?
|
30
|
+
File.join(GettextSetup.locales_path, GettextSetup.config['project_name'] + '.pot')
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.po_file_path(language)
|
34
|
+
return if GettextSetup.locales_path.nil?
|
35
|
+
return if GettextSetup.config['project_name'].nil?
|
36
|
+
return if language.nil?
|
37
|
+
File.join(GettextSetup.locales_path, language, GettextSetup.config['project_name'] + '.po')
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.string_changes?(old_pot, new_pot)
|
41
|
+
# Warnings will be in another language if locale is not set to en_US
|
42
|
+
_, stderr, status = Open3.capture3("LANG=en_US msgcmp --use-untranslated '#{old_pot}' '#{new_pot}'")
|
43
|
+
if status.exitstatus == 1 || /this message is not used/.match(stderr) || /this message is used but not defined/.match(stderr)
|
44
|
+
return true
|
45
|
+
end
|
46
|
+
return false
|
47
|
+
rescue IOError
|
48
|
+
# probably means msgcmp is not present on the system
|
49
|
+
# so return true to be on the safe side
|
50
|
+
return true
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.generate_new_pot(locales_path = GettextSetup.locales_path, path = nil)
|
54
|
+
GettextSetup.initialize(locales_path)
|
55
|
+
path ||= pot_file_path
|
56
|
+
config = GettextSetup.config
|
57
|
+
package_name = config['package_name']
|
58
|
+
bugs_address = config['bugs_address']
|
59
|
+
copyright_holder = config['copyright_holder']
|
60
|
+
# Done this way to allow the user to enter an empty string in the config.
|
61
|
+
comments_tag = config.key?('comments_tag') ? config['comments_tag'] : 'TRANSLATORS'
|
62
|
+
version = `git describe`
|
63
|
+
system("rxgettext -o #{path} --no-wrap --sort-by-file " \
|
64
|
+
"--add-comments#{comments_tag.to_s == '' ? '' : '=' + comments_tag} --msgid-bugs-address '#{bugs_address}' " \
|
65
|
+
"--package-name '#{package_name}' " \
|
66
|
+
"--package-version '#{version}' " \
|
67
|
+
"--copyright-holder='#{copyright_holder}' --copyright-year=#{Time.now.year} " +
|
68
|
+
files_to_translate.join(' '))
|
69
|
+
$CHILD_STATUS.success?
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.generate_new_po(language, locales_path = GettextSetup.locales_path,
|
73
|
+
pot_file = nil, po_file = nil)
|
74
|
+
GettextSetup.initialize(locales_path)
|
75
|
+
pot_file ||= GettextSetup::Pot.pot_file_path
|
76
|
+
po_file ||= GettextSetup::Pot.po_file_path(language)
|
77
|
+
|
78
|
+
language ||= ENV['LANGUAGE']
|
79
|
+
|
80
|
+
# Let's do some pre-verification of the environment.
|
81
|
+
if language.nil?
|
82
|
+
puts "You need to specify the language to add. Either 'LANGUAGE=eo rake gettext:po' or 'rake gettext:po[LANGUAGE]'"
|
83
|
+
return
|
84
|
+
end
|
85
|
+
|
86
|
+
language_path = File.dirname(po_file)
|
87
|
+
FileUtils.mkdir_p(language_path)
|
88
|
+
|
89
|
+
if File.exist?(po_file)
|
90
|
+
cmd = "msgmerge -U #{po_file} #{pot_file}"
|
91
|
+
_, _, _, wait = Open3.popen3(cmd)
|
92
|
+
exitstatus = wait.value
|
93
|
+
if exitstatus.success?
|
94
|
+
puts "PO file #{po_file} merged"
|
95
|
+
true
|
96
|
+
else
|
97
|
+
puts 'PO file merge failed'
|
98
|
+
false
|
99
|
+
end
|
100
|
+
else
|
101
|
+
cmd = "msginit --no-translator -l #{language} -o #{po_file} -i #{pot_file}"
|
102
|
+
_, _, _, wait = Open3.popen3(cmd)
|
103
|
+
exitstatus = wait.value
|
104
|
+
if exitstatus.success?
|
105
|
+
puts "PO file #{po_file} created"
|
106
|
+
true
|
107
|
+
else
|
108
|
+
puts 'PO file creation failed'
|
109
|
+
false
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def self.update_pot(locales_path = GettextSetup.locales_path, path = nil)
|
115
|
+
GettextSetup.initialize(locales_path)
|
116
|
+
path ||= pot_file_path
|
117
|
+
|
118
|
+
if !File.exist? path
|
119
|
+
puts 'No existing POT file, generating new'
|
120
|
+
result = GettextSetup::Pot.generate_new_pot(locales_path, path)
|
121
|
+
puts "POT file #{path} has been generated" if result
|
122
|
+
else
|
123
|
+
old_pot = path + '.old'
|
124
|
+
File.rename(path, old_pot)
|
125
|
+
result = GettextSetup::Pot.generate_new_pot(locales_path, path)
|
126
|
+
if !result
|
127
|
+
puts 'POT creation failed'
|
128
|
+
elsif GettextSetup::Pot.string_changes?(old_pot, path)
|
129
|
+
File.delete(old_pot)
|
130
|
+
puts 'String changes detected, replacing with updated POT file'
|
131
|
+
else
|
132
|
+
puts 'No string changes detected, keeping old POT file'
|
133
|
+
File.rename(old_pot, path)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
data/lib/tasks/gettext.rake
CHANGED
@@ -1,57 +1,50 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
# Bundler.read_file(File.absolute_path('Gemfile', Dir.pwd))
|
4
|
-
#
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
5
3
|
require_relative '../gettext-setup/gettext_setup'
|
6
|
-
require_relative '
|
7
|
-
|
8
|
-
# GettextSetup.initialize(File.absolute_path('locales', Dir.pwd))
|
4
|
+
require_relative '../gettext-setup/pot'
|
5
|
+
require_relative '../gettext-setup/metadata_pot'
|
9
6
|
|
10
7
|
namespace :gettext do
|
11
8
|
desc 'Generate a new POT file and replace old if strings changed'
|
9
|
+
|
12
10
|
task :update_pot do
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
old_pot = pot_file_path + '.old'
|
18
|
-
File.rename(pot_file_path, old_pot)
|
19
|
-
generate_new_pot
|
20
|
-
if string_changes?(old_pot, pot_file_path)
|
21
|
-
File.delete(old_pot)
|
22
|
-
puts 'String changes detected, replacing with updated POT file'
|
23
|
-
else
|
24
|
-
puts 'No string changes detected, keeping old POT file'
|
25
|
-
File.rename(old_pot, pot_file_path)
|
26
|
-
end
|
11
|
+
begin
|
12
|
+
GettextSetup::Pot.update_pot
|
13
|
+
rescue GettextSetup::NoConfigFoundError => e
|
14
|
+
puts e.message
|
27
15
|
end
|
28
16
|
end
|
29
17
|
|
30
18
|
desc 'Generate POT file'
|
31
19
|
task :pot do
|
32
|
-
|
33
|
-
|
20
|
+
begin
|
21
|
+
result = GettextSetup::Pot.generate_new_pot
|
22
|
+
if result
|
23
|
+
puts "POT file #{GettextSetup::Pot.pot_file_path} has been generated"
|
24
|
+
end
|
25
|
+
rescue GettextSetup::NoConfigFoundError => e
|
26
|
+
puts e.message
|
27
|
+
end
|
34
28
|
end
|
35
29
|
|
36
|
-
desc '
|
37
|
-
task :
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
30
|
+
desc 'Generate POT file for metadata'
|
31
|
+
task :metadata_pot do
|
32
|
+
begin
|
33
|
+
result = GettextSetup::MetadataPot.generate_metadata_pot
|
34
|
+
if result
|
35
|
+
puts "POT metadata file #{GettextSetup::MetadataPot.metadata_path} has been generated"
|
36
|
+
end
|
37
|
+
rescue GettextSetup::NoConfigFoundError => e
|
38
|
+
puts e.message
|
44
39
|
end
|
40
|
+
end
|
45
41
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
system("msgmerge -U #{po_file_path} #{pot_file_path}")
|
53
|
-
else
|
54
|
-
system("msginit --no-translator -l #{language} -o #{po_file_path} -i #{pot_file_path}")
|
42
|
+
desc 'Update PO file for a specific language'
|
43
|
+
task :po, [:language] do |_, args|
|
44
|
+
begin
|
45
|
+
GettextSetup::Pot.generate_new_po(args.language)
|
46
|
+
rescue GettextSetup::NoConfigFoundError => e
|
47
|
+
puts e.message
|
55
48
|
end
|
56
49
|
end
|
57
50
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
#
|
2
|
+
#, fuzzy
|
3
|
+
msgid ""
|
4
|
+
msgstr ""
|
5
|
+
"Project-Id-Version: PACKAGE VERSION\n"
|
6
|
+
"Report-Msgid-Bugs-To:\n"
|
7
|
+
"POT-Creation-Date: <%= DateTime.now %>\n"
|
8
|
+
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
9
|
+
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
10
|
+
"Language-Team: LANGUAGE <LL@li.org>\n"
|
11
|
+
"MIME-Version: 1.0\n"
|
12
|
+
"Content-Type: text/plain; charset=UTF-8\n"
|
13
|
+
"Content-Transfer-Encoding: 8bit\n"
|
14
|
+
"X-Generator: Translate Toolkit 2.0.0\n"<% if metadata.key?('summary') %>
|
15
|
+
#. metadata.json
|
16
|
+
#: .summary
|
17
|
+
msgid "<%= metadata['summary']%>"
|
18
|
+
msgstr ""<% end %><% if metadata.key?('description')%>
|
19
|
+
#. metadata.json
|
20
|
+
#: .description
|
21
|
+
msgid "<%= metadata['description']%>"
|
22
|
+
msgstr ""
|
23
|
+
<% end %>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
---
|
2
|
+
# This is the project-specific configuration file for setting up
|
3
|
+
# fast_gettext for your project.
|
4
|
+
gettext:
|
5
|
+
# This is used for the name of the .pot and .po files; they will be
|
6
|
+
# called <project_name>.pot?
|
7
|
+
project_name: 'fixture_locales'
|
8
|
+
# This is used in comments in the .pot and .po files to indicate what
|
9
|
+
# project the files belong to and should bea little more desctiptive than
|
10
|
+
# <project_name>
|
11
|
+
package_name: Fixture locales
|
12
|
+
# The locale that the default messages in the .pot file are in
|
13
|
+
default_locale: en
|
14
|
+
# The email used for sending bug reports.
|
15
|
+
bugs_address: docs@puppetlabs.com
|
16
|
+
# The holder of the copyright.
|
17
|
+
copyright_holder: Puppet, LLC.
|
18
|
+
# Patterns for +Dir.glob+ used to find all files that might contain
|
19
|
+
# translatable content, relative to the project root directory
|
20
|
+
source_files:
|
21
|
+
- 'spec/fixtures/fixture_locales/*.rb'
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# SOME DESCRIPTIVE TITLE.
|
2
|
+
# Copyright (C) 2017 Puppet, LLC.
|
3
|
+
# This file is distributed under the same license as the Fixture locales package.
|
4
|
+
# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
|
5
|
+
#
|
6
|
+
#, fuzzy
|
7
|
+
msgid ""
|
8
|
+
msgstr ""
|
9
|
+
"Project-Id-Version: Fixture locales 0.21-6-gc301398\n"
|
10
|
+
"\n"
|
11
|
+
"Report-Msgid-Bugs-To: docs@puppetlabs.com\n"
|
12
|
+
"POT-Creation-Date: 2017-04-12 00:27-0500\n"
|
13
|
+
"PO-Revision-Date: 2017-04-12 00:27-0500\n"
|
14
|
+
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
15
|
+
"Language-Team: LANGUAGE <LL@li.org>\n"
|
16
|
+
"Language: \n"
|
17
|
+
"MIME-Version: 1.0\n"
|
18
|
+
"Content-Type: text/plain; charset=UTF-8\n"
|
19
|
+
"Content-Transfer-Encoding: 8bit\n"
|
20
|
+
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
|
21
|
+
|
22
|
+
#: test_strings.rb:1
|
23
|
+
msgid "Hello, world!"
|
24
|
+
msgstr ""
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
_('Hello, world!')
|
@@ -1,16 +1,16 @@
|
|
1
1
|
# SOME DESCRIPTIVE TITLE.
|
2
|
-
# Copyright (C)
|
2
|
+
# Copyright (C) 2017 Puppet Labs, LLC.
|
3
3
|
# This file is distributed under the same license as the Sinatra i18n demo package.
|
4
|
-
# FIRST AUTHOR <EMAIL@ADDRESS>,
|
4
|
+
# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
|
5
5
|
#
|
6
6
|
#, fuzzy
|
7
7
|
msgid ""
|
8
8
|
msgstr ""
|
9
|
-
"Project-Id-Version: Sinatra i18n demo
|
9
|
+
"Project-Id-Version: Sinatra i18n demo 0.21-4-geccdac4\n"
|
10
10
|
"\n"
|
11
11
|
"Report-Msgid-Bugs-To: docs@puppetlabs.com\n"
|
12
|
-
"POT-Creation-Date:
|
13
|
-
"PO-Revision-Date:
|
12
|
+
"POT-Creation-Date: 2017-04-11 20:08-0500\n"
|
13
|
+
"PO-Revision-Date: 2017-04-11 20:08-0500\n"
|
14
14
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
15
15
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
16
16
|
"Language: \n"
|
@@ -19,7 +19,22 @@ msgstr ""
|
|
19
19
|
"Content-Transfer-Encoding: 8bit\n"
|
20
20
|
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
|
21
21
|
|
22
|
-
|
23
|
-
#: ../../lib/gettext_setup_spec.rb:25
|
22
|
+
#: ../../lib/gettext_setup_spec.rb:26 ../../lib/gettext_setup_spec.rb:89 ../../lib/gettext_setup_spec.rb:91
|
24
23
|
msgid "Hello, world!"
|
25
24
|
msgstr ""
|
25
|
+
|
26
|
+
#: ../../lib/pot_spec.rb:52
|
27
|
+
msgid "merged-po-file"
|
28
|
+
msgstr ""
|
29
|
+
|
30
|
+
#: ../../lib/pot_spec.rb:74
|
31
|
+
msgid "no-pot-file"
|
32
|
+
msgstr ""
|
33
|
+
|
34
|
+
#: ../../lib/pot_spec.rb:85
|
35
|
+
msgid "some-spec-only-string"
|
36
|
+
msgstr ""
|
37
|
+
|
38
|
+
#: ../../lib/pot_spec.rb:104
|
39
|
+
msgid "unchanged-string"
|
40
|
+
msgstr ""
|
@@ -4,11 +4,11 @@
|
|
4
4
|
gettext:
|
5
5
|
# This is used for the name of the .pot and .po files; they will be
|
6
6
|
# called <project_name>.pot?
|
7
|
-
project_name: '
|
7
|
+
project_name: 'sinatra-i18n'
|
8
8
|
# This is used in comments in the .pot and .po files to indicate what
|
9
9
|
# project the files belong to and should bea little more desctiptive than
|
10
10
|
# <project_name>
|
11
|
-
package_name:
|
11
|
+
package_name: Sinatra i18n demo
|
12
12
|
# The locale that the default messages in the .pot file are in
|
13
13
|
default_locale: en
|
14
14
|
# The email used for sending bug reports.
|
@@ -18,5 +18,4 @@ gettext:
|
|
18
18
|
# Patterns for +Dir.glob+ used to find all files that might contain
|
19
19
|
# translatable content, relative to the project root directory
|
20
20
|
source_files:
|
21
|
-
- '
|
22
|
-
- '../lib/**/*.rb'
|
21
|
+
- 'spec/**/*.rb'
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# SOME DESCRIPTIVE TITLE.
|
2
|
+
# Copyright (C) 2017 Puppet Labs, LLC.
|
3
|
+
# This file is distributed under the same license as the Sinatra i18n demo package.
|
4
|
+
# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
|
5
|
+
#
|
6
|
+
#, fuzzy
|
7
|
+
msgid ""
|
8
|
+
msgstr ""
|
9
|
+
"Project-Id-Version: Sinatra i18n demo 0.21-6-gc301398\n"
|
10
|
+
"\n"
|
11
|
+
"Report-Msgid-Bugs-To: docs@puppetlabs.com\n"
|
12
|
+
"POT-Creation-Date: 2017-04-12 00:27-0500\n"
|
13
|
+
"PO-Revision-Date: 2017-04-12 00:27-0500\n"
|
14
|
+
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
15
|
+
"Language-Team: LANGUAGE <LL@li.org>\n"
|
16
|
+
"Language: \n"
|
17
|
+
"MIME-Version: 1.0\n"
|
18
|
+
"Content-Type: text/plain; charset=UTF-8\n"
|
19
|
+
"Content-Transfer-Encoding: 8bit\n"
|
20
|
+
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
|
21
|
+
|
22
|
+
#: ../../lib/gettext_setup_spec.rb:26 ../../lib/gettext_setup_spec.rb:89 ../../lib/gettext_setup_spec.rb:91 ../fixture_locales/test_strings.rb:1
|
23
|
+
msgid "Hello, world!"
|
24
|
+
msgstr ""
|
25
|
+
|
26
|
+
#: ../../lib/pot_spec.rb:91
|
27
|
+
msgid "merged-po-file"
|
28
|
+
msgstr ""
|
29
|
+
|
30
|
+
#: ../../lib/pot_spec.rb:117
|
31
|
+
msgid "no-pot-file"
|
32
|
+
msgstr ""
|
33
|
+
|
34
|
+
#: ../../lib/pot_spec.rb:127
|
35
|
+
msgid "some-spec-only-string"
|
36
|
+
msgstr ""
|
37
|
+
|
38
|
+
#: ../../lib/pot_spec.rb:144
|
39
|
+
msgid "unchanged-string"
|
40
|
+
msgstr ""
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -12,7 +12,6 @@ describe GettextSetup do
|
|
12
12
|
end
|
13
13
|
context 'initialize' do
|
14
14
|
it 'sets up correctly' do
|
15
|
-
# GettextSetup.initialize(File.join(File.dirname(File.dirname(__FILE__)), 'fixtures'))
|
16
15
|
expect(GettextSetup.locales_path).to match(/\/spec\/fixtures/)
|
17
16
|
expect(config['project_name']).to eq('sinatra-i18n')
|
18
17
|
expect(config['package_name']).to eq('Sinatra i18n demo')
|
@@ -37,6 +36,16 @@ describe GettextSetup do
|
|
37
36
|
expect(GettextSetup.negotiate_locale('de;q=1, en;q=1')).to eq('de')
|
38
37
|
end
|
39
38
|
end
|
39
|
+
context 'negotiate_locale!' do
|
40
|
+
it 'sets the locale' do
|
41
|
+
GettextSetup.negotiate_locale!('de')
|
42
|
+
expect(FastGettext.locale).to eq('de')
|
43
|
+
expect(_('Hello, world!')).to eq('Hallo, Welt!')
|
44
|
+
GettextSetup.negotiate_locale!('en')
|
45
|
+
expect(FastGettext.locale).to eq('en')
|
46
|
+
expect(_('Hello, world!')).to eq('Hello, world!')
|
47
|
+
end
|
48
|
+
end
|
40
49
|
context 'setting default_locale' do
|
41
50
|
before :each do
|
42
51
|
GettextSetup.default_locale = 'en'
|
@@ -62,9 +71,9 @@ describe GettextSetup do
|
|
62
71
|
end
|
63
72
|
end
|
64
73
|
context 'multiple locales' do
|
65
|
-
# locales/ loads the de locale and
|
74
|
+
# locales/ loads the de locale and fixture_locales/ loads the jp locale
|
66
75
|
before(:all) do
|
67
|
-
GettextSetup.initialize(File.join(File.dirname(File.dirname(__FILE__)), 'fixtures', '
|
76
|
+
GettextSetup.initialize(File.join(File.dirname(File.dirname(__FILE__)), 'fixtures', 'fixture_locales'))
|
68
77
|
end
|
69
78
|
it 'can aggregate locales across projects' do
|
70
79
|
expect(FastGettext.default_available_locales).to include('en')
|
@@ -80,7 +89,7 @@ describe GettextSetup do
|
|
80
89
|
end
|
81
90
|
context 'translation repository chain' do
|
82
91
|
before(:all) do
|
83
|
-
GettextSetup.initialize(File.join(File.dirname(File.dirname(__FILE__)), 'fixtures', '
|
92
|
+
GettextSetup.initialize(File.join(File.dirname(File.dirname(__FILE__)), 'fixtures', 'fixture_locales'))
|
84
93
|
end
|
85
94
|
it 'chain is not nil' do
|
86
95
|
expect(GettextSetup.translation_repositories).not_to be_nil
|
@@ -92,15 +101,15 @@ describe GettextSetup do
|
|
92
101
|
expect(_('Hello, world!')).to eq('こんにちは世界')
|
93
102
|
end
|
94
103
|
it 'does not allow duplicate repositories' do
|
95
|
-
GettextSetup.initialize(File.join(File.dirname(File.dirname(__FILE__)), 'fixtures', '
|
104
|
+
GettextSetup.initialize(File.join(File.dirname(File.dirname(__FILE__)), 'fixtures', 'fixture_locales'))
|
96
105
|
repos = GettextSetup.translation_repositories
|
97
|
-
expect(repos.select { |k, _| k == '
|
106
|
+
expect(repos.select { |k, _| k == 'fixture_locales' }.size).to eq(1)
|
98
107
|
end
|
99
108
|
it 'does allow multiple unique domains' do
|
100
109
|
GettextSetup.initialize(File.join(File.dirname(File.dirname(__FILE__)), 'fixtures', 'locales'))
|
101
110
|
repos = GettextSetup.translation_repositories
|
102
111
|
expect(repos.size == 2)
|
103
|
-
expect(repos.select { |k, _| k == '
|
112
|
+
expect(repos.select { |k, _| k == 'fixture_locales' }.size).to eq(1)
|
104
113
|
expect(repos.select { |k, _| k == 'sinatra-i18n' }.size).to eq(1)
|
105
114
|
end
|
106
115
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'rspec/expectations'
|
2
|
+
require_relative '../spec_helper'
|
3
|
+
|
4
|
+
require_relative '../../lib/gettext-setup'
|
5
|
+
|
6
|
+
describe GettextSetup::MetadataPot do
|
7
|
+
before(:each) do
|
8
|
+
GettextSetup.initialize(File.join(File.dirname(File.dirname(__FILE__)), 'fixtures', 'locales'))
|
9
|
+
end
|
10
|
+
context '#metadata_path' do
|
11
|
+
it 'finds the right metadata path' do
|
12
|
+
expect(GettextSetup::MetadataPot.metadata_path).to match(/sinatra-i18n_metadata\.pot/)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
context '#pot_string' do
|
16
|
+
it 'generates a reasonable POT string' do
|
17
|
+
expect(GettextSetup::MetadataPot.pot_string({})).to match(/Last-Translator: FULL NAME <EMAIL@ADDRESS>/)
|
18
|
+
end
|
19
|
+
it 'includes summary when provided' do
|
20
|
+
metadata = { 'summary' => 'abc' }
|
21
|
+
expect(GettextSetup::MetadataPot.pot_string(metadata)).to match(/msgid "abc"/)
|
22
|
+
end
|
23
|
+
it 'includes summary when provided' do
|
24
|
+
metadata = { 'description' => 'def' }
|
25
|
+
expect(GettextSetup::MetadataPot.pot_string(metadata)).to match(/msgid "def"/)
|
26
|
+
end
|
27
|
+
it 'includes both summary and description when provided' do
|
28
|
+
metadata = { 'summary' => 'abc', 'description' => 'def' }
|
29
|
+
result = expect(GettextSetup::MetadataPot.pot_string(metadata))
|
30
|
+
result.to match(/msgid "def"/)
|
31
|
+
result.to match(/msgid "abc"/)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
context '#load_metadata' do
|
35
|
+
it 'loads metadata correctly' do
|
36
|
+
Dir.mktmpdir do |dir|
|
37
|
+
file = File.join(dir, 'metadata.json')
|
38
|
+
File.open(file, 'w') { |f| f.write('{"description":"abcdef", "summary":"ghi"}') }
|
39
|
+
metadata = GettextSetup::MetadataPot.metadata(File.join(dir, 'metadata.json').to_s)
|
40
|
+
expect(metadata).to eq('description' => 'abcdef', 'summary' => 'ghi')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
it 'uses an empty hash if no metadata.json is found' do
|
44
|
+
metadata = GettextSetup::MetadataPot.metadata(File.join(Dir.mktmpdir, 'metadata.json').to_s)
|
45
|
+
expect(metadata).to eq({})
|
46
|
+
end
|
47
|
+
end
|
48
|
+
context '#generate_metadata_pot' do
|
49
|
+
it 'works with everything supplied' do
|
50
|
+
dir = Dir.mktmpdir
|
51
|
+
file = File.join(dir, 'metadata.pot')
|
52
|
+
metadata = { 'description' => 'abc', 'summary' => 'def' }
|
53
|
+
GettextSetup::MetadataPot.generate_metadata_pot(metadata,
|
54
|
+
file)
|
55
|
+
contents = File.read(file)
|
56
|
+
expect(contents).to match(/msgid "abc"/)
|
57
|
+
expect(contents).to match(/msgid "def"/)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
require 'rspec/expectations'
|
2
|
+
require_relative '../spec_helper.rb'
|
3
|
+
|
4
|
+
require_relative '../../lib/gettext-setup'
|
5
|
+
describe GettextSetup::Pot do
|
6
|
+
NoConfigFoundError = GettextSetup::NoConfigFoundError
|
7
|
+
|
8
|
+
def fixture_locales_path
|
9
|
+
File.join(File.dirname(__FILE__), '../fixtures/fixture_locales')
|
10
|
+
end
|
11
|
+
|
12
|
+
def spec_locales_path
|
13
|
+
File.join(File.dirname(__FILE__), '../fixtures/spec_locales')
|
14
|
+
end
|
15
|
+
|
16
|
+
def locales_path
|
17
|
+
File.join(File.dirname(__FILE__), '../fixtures/locales')
|
18
|
+
end
|
19
|
+
|
20
|
+
describe 'string_changes?', if: msgcmp_present? do
|
21
|
+
old_pot = File.absolute_path('../fixtures/string_changes/old.pot', File.dirname(__FILE__))
|
22
|
+
|
23
|
+
it 'should detect string addition' do
|
24
|
+
new_pot = File.absolute_path('../fixtures/string_changes/add.pot', File.dirname(__FILE__))
|
25
|
+
expect(GettextSetup::Pot.string_changes?(old_pot, new_pot)).to eq(true)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should detect string removal' do
|
29
|
+
new_pot = File.absolute_path('../fixtures/string_changes/remove.pot', File.dirname(__FILE__))
|
30
|
+
expect(GettextSetup::Pot.string_changes?(old_pot, new_pot)).to eq(true)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should detect string changes' do
|
34
|
+
new_pot = File.absolute_path('../fixtures/string_changes/change.pot', File.dirname(__FILE__))
|
35
|
+
expect(GettextSetup::Pot.string_changes?(old_pot, new_pot)).to eq(true)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should not detect non-string changes' do
|
39
|
+
new_pot = File.absolute_path('../fixtures/string_changes/non_string_changes.pot', File.dirname(__FILE__))
|
40
|
+
expect(GettextSetup::Pot.string_changes?(old_pot, new_pot)).to eq(false)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'generate_new_pot' do
|
45
|
+
it "fails when GettextSetup can't find a config.yaml" do
|
46
|
+
path = File.join(Dir.mktmpdir, 'empty.pot')
|
47
|
+
with_captured_stdout do
|
48
|
+
expect { GettextSetup::Pot.generate_new_pot(Dir.mktmpdir, path) }.to raise_error(NoConfigFoundError)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
it 'builds a POT file' do
|
52
|
+
path = File.join(Dir.mktmpdir, 'new.pot')
|
53
|
+
out = with_captured_stdout do
|
54
|
+
GettextSetup::Pot.generate_new_pot(fixture_locales_path, path)
|
55
|
+
end
|
56
|
+
expect(out).to eq('') # STDOUT is determined in `update_pot`.
|
57
|
+
contents = File.read(path)
|
58
|
+
expect(contents).to match(/Fixture locales/)
|
59
|
+
expect(contents).to match(/docs@puppetlabs.com/)
|
60
|
+
expect(contents).to match(/Puppet, LLC/)
|
61
|
+
expect(contents).to match(/test_strings.rb:1/)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'generate_new_po' do
|
66
|
+
it "fails when GettextSetup can't find a config.yaml" do
|
67
|
+
path = File.join(Dir.mktmpdir, 'fails.pot')
|
68
|
+
po_path = File.join(Dir.mktmpdir, 'fails.po')
|
69
|
+
with_captured_stdout do
|
70
|
+
expect { GettextSetup::Pot.generate_new_po('ja', Dir.mktmpdir, path, po_path) }.to raise_error(NoConfigFoundError)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
it 'complains when no language is supplied' do
|
74
|
+
stdout = with_captured_stdout do
|
75
|
+
GettextSetup::Pot.generate_new_po(nil, fixture_locales_path, Dir.mktmpdir, Dir.mktmpdir)
|
76
|
+
end
|
77
|
+
result = "You need to specify the language to add. Either 'LANGUAGE=eo rake gettext:po' or 'rake gettext:po[LANGUAGE]'\n"
|
78
|
+
expect(stdout).to eq(result)
|
79
|
+
end
|
80
|
+
it 'generates new PO file', if: msginit_present? do
|
81
|
+
po_path = File.join(Dir.mktmpdir, 'aa', 'tmp.po')
|
82
|
+
pot_path = File.join(locales_path, 'sinatra-i18n.pot')
|
83
|
+
|
84
|
+
stdout = with_captured_stdout do
|
85
|
+
GettextSetup::Pot.generate_new_po('aa', locales_path, pot_path, po_path)
|
86
|
+
end
|
87
|
+
expect(stdout).to eq("PO file #{po_path} created\n")
|
88
|
+
end
|
89
|
+
it 'merges PO files', if: [msginit_present?, msgmerge_present?] do
|
90
|
+
_('merged-po-file')
|
91
|
+
po_path = File.join(Dir.mktmpdir, 'aa', 'tmp.po')
|
92
|
+
pot_path = GettextSetup::Pot.pot_file_path
|
93
|
+
|
94
|
+
stdout = with_captured_stdout do
|
95
|
+
GettextSetup::Pot.generate_new_po('aa', fixture_locales_path, pot_path, po_path)
|
96
|
+
end
|
97
|
+
expect(stdout).to eq("PO file #{po_path} created\n")
|
98
|
+
contents = File.read(po_path)
|
99
|
+
expect(contents).to match(/msgid "Hello, world!"/)
|
100
|
+
|
101
|
+
new_pot_path = File.join(spec_locales_path, 'sinatra-i18n.pot')
|
102
|
+
new_stdout = with_captured_stdout do
|
103
|
+
GettextSetup::Pot.generate_new_po('aa', spec_locales_path, new_pot_path, po_path)
|
104
|
+
end
|
105
|
+
expect(new_stdout).to eq("PO file #{po_path} merged\n")
|
106
|
+
new_contents = File.read(po_path)
|
107
|
+
expect(new_contents).to match(/merged-po-file/)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context 'update_pot' do
|
112
|
+
it "fails when GettextSetup can't find a config.yaml" do
|
113
|
+
path = File.join(Dir.mktmpdir, 'fail-update.pot')
|
114
|
+
with_captured_stdout do
|
115
|
+
expect { GettextSetup::Pot.update_pot(Dir.mktmpdir, path) }.to raise_error(NoConfigFoundError)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
it 'creates POT when absent' do
|
119
|
+
_('no-pot-file')
|
120
|
+
path = File.join(Dir.mktmpdir, 'some-pot.pot')
|
121
|
+
stdout = with_captured_stdout do
|
122
|
+
GettextSetup::Pot.update_pot(spec_locales_path, path)
|
123
|
+
end
|
124
|
+
expect(stdout).to eq("No existing POT file, generating new\nPOT file #{path} has been generated\n")
|
125
|
+
contents = File.read(path)
|
126
|
+
expect(contents).to match(/msgid "no-pot-file"/)
|
127
|
+
end
|
128
|
+
it 'updates POT when something changes', if: [msginit_present?, msgmerge_present?] do
|
129
|
+
_('some-spec-only-string')
|
130
|
+
path = File.join(Dir.mktmpdir, 'some-pot.pot')
|
131
|
+
stdout = with_captured_stdout do
|
132
|
+
GettextSetup::Pot.update_pot(fixture_locales_path, path)
|
133
|
+
end
|
134
|
+
expect(stdout).to eq("No existing POT file, generating new\nPOT file #{path} has been generated\n")
|
135
|
+
contents = File.read(path)
|
136
|
+
expect(contents).to match(/Language-Team: LANGUAGE <LL@li.org>/)
|
137
|
+
expect(contents).not_to match(/some-spec-only-string/)
|
138
|
+
output = with_captured_stdout do
|
139
|
+
GettextSetup::Pot.update_pot(spec_locales_path, path)
|
140
|
+
end
|
141
|
+
new_contents = File.read(path)
|
142
|
+
expect(new_contents).to match(/some-spec-only-string/)
|
143
|
+
expect(output).to eq("String changes detected, replacing with updated POT file\n")
|
144
|
+
end
|
145
|
+
it "doesn't update the POT when nothing changes", if: [msginit_present?, msgcmp_present?] do
|
146
|
+
_('unchanged-string')
|
147
|
+
path = File.join(Dir.mktmpdir, 'some-pot.pot')
|
148
|
+
stdout = with_captured_stdout do
|
149
|
+
GettextSetup::Pot.update_pot(spec_locales_path, path)
|
150
|
+
end
|
151
|
+
expect(stdout).to eq("No existing POT file, generating new\nPOT file #{path} has been generated\n")
|
152
|
+
contents = File.read(path)
|
153
|
+
expect(contents).to match(/unchanged-string/)
|
154
|
+
new_stdout = with_captured_stdout do
|
155
|
+
GettextSetup::Pot.update_pot(spec_locales_path, path)
|
156
|
+
end
|
157
|
+
new_contents = File.read(path)
|
158
|
+
expect(new_contents).to eq(contents)
|
159
|
+
expect(new_stdout).to eq("No string changes detected, keeping old POT file\n")
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,12 +1,37 @@
|
|
1
1
|
require 'simplecov'
|
2
|
+
require_relative '../lib/gettext-setup'
|
3
|
+
|
4
|
+
GettextSetup.initialize(File.join(File.dirname(__FILE__), 'fixtures', 'locales'))
|
5
|
+
|
2
6
|
SimpleCov.start do
|
3
7
|
add_filter '/spec/'
|
4
8
|
end
|
5
9
|
|
6
|
-
def
|
10
|
+
def cmd_present?(cmd)
|
7
11
|
# Try to call out to msgcmp, if it doesn't error, we have the tool
|
8
|
-
`
|
12
|
+
`#{cmd} --version`
|
9
13
|
return true
|
10
14
|
rescue IOError
|
11
15
|
return false
|
12
16
|
end
|
17
|
+
|
18
|
+
def msgcmp_present?
|
19
|
+
cmd_present?('msgcmp')
|
20
|
+
end
|
21
|
+
|
22
|
+
def msginit_present?
|
23
|
+
cmd_present?('msginit')
|
24
|
+
end
|
25
|
+
|
26
|
+
def msgmerge_present?
|
27
|
+
cmd_present?('msgmerge')
|
28
|
+
end
|
29
|
+
|
30
|
+
def with_captured_stdout
|
31
|
+
old_stdout = $stdout
|
32
|
+
$stdout = StringIO.new('', 'w')
|
33
|
+
yield
|
34
|
+
$stdout.string
|
35
|
+
ensure
|
36
|
+
$stdout = old_stdout
|
37
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gettext-setup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.23'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04-
|
11
|
+
date: 2017-04-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fast_gettext
|
@@ -201,25 +201,32 @@ extra_rdoc_files: []
|
|
201
201
|
files:
|
202
202
|
- LICENSE
|
203
203
|
- README.md
|
204
|
+
- lib/generate_metadata_pot.rb
|
204
205
|
- lib/gettext-setup.rb
|
205
206
|
- lib/gettext-setup/gettext_setup.rb
|
207
|
+
- lib/gettext-setup/metadata_pot.rb
|
208
|
+
- lib/gettext-setup/pot.rb
|
206
209
|
- lib/tasks/gettext.rake
|
207
|
-
- lib/
|
210
|
+
- lib/templates/metadata.pot.erb
|
208
211
|
- locales/config-sample.yaml
|
209
|
-
- spec/fixtures/
|
210
|
-
- spec/fixtures/
|
211
|
-
- spec/fixtures/
|
212
|
+
- spec/fixtures/fixture_locales/config.yaml
|
213
|
+
- spec/fixtures/fixture_locales/fixture_locales.pot
|
214
|
+
- spec/fixtures/fixture_locales/jp/fixture_locales.po
|
215
|
+
- spec/fixtures/fixture_locales/test_strings.rb
|
212
216
|
- spec/fixtures/locales/config.yaml
|
213
217
|
- spec/fixtures/locales/de/sinatra-i18n.po
|
214
218
|
- spec/fixtures/locales/sinatra-i18n.pot
|
215
|
-
- spec/fixtures/
|
216
|
-
- spec/fixtures/
|
217
|
-
- spec/fixtures/
|
218
|
-
- spec/fixtures/
|
219
|
-
- spec/fixtures/
|
219
|
+
- spec/fixtures/spec_locales/config.yaml
|
220
|
+
- spec/fixtures/spec_locales/sinatra-i18n.pot
|
221
|
+
- spec/fixtures/string_changes/add.pot
|
222
|
+
- spec/fixtures/string_changes/change.pot
|
223
|
+
- spec/fixtures/string_changes/non_string_changes.pot
|
224
|
+
- spec/fixtures/string_changes/old.pot
|
225
|
+
- spec/fixtures/string_changes/remove.pot
|
220
226
|
- spec/lib/gettext_setup_spec.rb
|
227
|
+
- spec/lib/metadata_pot_spec.rb
|
228
|
+
- spec/lib/pot_spec.rb
|
221
229
|
- spec/spec_helper.rb
|
222
|
-
- spec/tasks/update_pot_spec.rb
|
223
230
|
homepage: https://github.com/puppetlabs/gettext-setup-gem
|
224
231
|
licenses:
|
225
232
|
- Apache-2.0
|
@@ -240,22 +247,27 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
240
247
|
version: '0'
|
241
248
|
requirements: []
|
242
249
|
rubyforge_project:
|
243
|
-
rubygems_version: 2.5.
|
250
|
+
rubygems_version: 2.5.1
|
244
251
|
signing_key:
|
245
252
|
specification_version: 4
|
246
253
|
summary: A gem to ease internationalization with fast_gettext
|
247
254
|
test_files:
|
248
|
-
- spec/fixtures/
|
249
|
-
- spec/fixtures/
|
250
|
-
- spec/fixtures/
|
255
|
+
- spec/fixtures/fixture_locales/config.yaml
|
256
|
+
- spec/fixtures/fixture_locales/fixture_locales.pot
|
257
|
+
- spec/fixtures/fixture_locales/jp/fixture_locales.po
|
258
|
+
- spec/fixtures/fixture_locales/test_strings.rb
|
251
259
|
- spec/fixtures/locales/config.yaml
|
252
260
|
- spec/fixtures/locales/de/sinatra-i18n.po
|
253
261
|
- spec/fixtures/locales/sinatra-i18n.pot
|
254
|
-
- spec/fixtures/
|
255
|
-
- spec/fixtures/
|
256
|
-
- spec/fixtures/
|
257
|
-
- spec/fixtures/
|
258
|
-
- spec/fixtures/
|
262
|
+
- spec/fixtures/spec_locales/config.yaml
|
263
|
+
- spec/fixtures/spec_locales/sinatra-i18n.pot
|
264
|
+
- spec/fixtures/string_changes/add.pot
|
265
|
+
- spec/fixtures/string_changes/change.pot
|
266
|
+
- spec/fixtures/string_changes/non_string_changes.pot
|
267
|
+
- spec/fixtures/string_changes/old.pot
|
268
|
+
- spec/fixtures/string_changes/remove.pot
|
259
269
|
- spec/lib/gettext_setup_spec.rb
|
270
|
+
- spec/lib/metadata_pot_spec.rb
|
271
|
+
- spec/lib/pot_spec.rb
|
260
272
|
- spec/spec_helper.rb
|
261
|
-
|
273
|
+
has_rdoc:
|
data/lib/tasks/task_helper.rb
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
require 'open3'
|
2
|
-
|
3
|
-
def locale_path
|
4
|
-
GettextSetup.locales_path
|
5
|
-
end
|
6
|
-
|
7
|
-
def text_domain
|
8
|
-
FastGettext.text_domain
|
9
|
-
end
|
10
|
-
|
11
|
-
def files_to_translate
|
12
|
-
files = GettextSetup.config['source_files'].map do |p|
|
13
|
-
Dir.glob(p)
|
14
|
-
end.flatten
|
15
|
-
# check for optional list of files to exclude from string
|
16
|
-
# extraction
|
17
|
-
exclusions = (GettextSetup.config['exclude_files'] || []).map do |p|
|
18
|
-
Dir.glob(p)
|
19
|
-
end.flatten
|
20
|
-
|
21
|
-
# if file is a directory, take it out of the array. directories
|
22
|
-
# cause rxgettext to error out.
|
23
|
-
(files - exclusions).reject { |file| File.directory?(file) }
|
24
|
-
end
|
25
|
-
|
26
|
-
def pot_file_path
|
27
|
-
File.join(locale_path, GettextSetup.config['project_name'] + '.pot')
|
28
|
-
end
|
29
|
-
|
30
|
-
def generate_new_pot
|
31
|
-
config = GettextSetup.config
|
32
|
-
package_name = config['package_name']
|
33
|
-
project_name = config['project_name']
|
34
|
-
bugs_address = config['bugs_address']
|
35
|
-
copyright_holder = config['copyright_holder']
|
36
|
-
# Done this way to allow the user to enter an empty string in the config.
|
37
|
-
comments_tag = config.key?('comments_tag') ? config['comments_tag'] : 'TRANSLATORS'
|
38
|
-
version = `git describe`
|
39
|
-
system("rxgettext -o locales/#{project_name}.pot --no-wrap --sort-by-file " \
|
40
|
-
"--add-comments#{comments_tag.to_s == '' ? '' : '=' + comments_tag} --msgid-bugs-address '#{bugs_address}' " \
|
41
|
-
"--package-name '#{package_name}' " \
|
42
|
-
"--package-version '#{version}' " \
|
43
|
-
"--copyright-holder='#{copyright_holder}' --copyright-year=#{Time.now.year} " +
|
44
|
-
files_to_translate.join(' '))
|
45
|
-
end
|
46
|
-
|
47
|
-
def string_changes?(old_pot, new_pot)
|
48
|
-
# Warnings will be in another language if locale is not set to en_US
|
49
|
-
_, stderr, status = Open3.capture3("LANG=en_US msgcmp --use-untranslated '#{old_pot}' '#{new_pot}'")
|
50
|
-
if status.exitstatus == 1 || /this message is not used/.match(stderr) || /this message is used but not defined/.match(stderr)
|
51
|
-
return true
|
52
|
-
end
|
53
|
-
return false
|
54
|
-
rescue IOError
|
55
|
-
# probably means msgcmp is not present on the system
|
56
|
-
# so return true to be on the safe side
|
57
|
-
return true
|
58
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# SOME DESCRIPTIVE TITLE.
|
2
|
-
# Copyright (C) 2016 Puppet Labs, LLC.
|
3
|
-
# This file is distributed under the same license as the Sinatra i18n demo package.
|
4
|
-
# FIRST AUTHOR <EMAIL@ADDRESS>, 2016.
|
5
|
-
#
|
6
|
-
#, fuzzy
|
7
|
-
msgid ""
|
8
|
-
msgstr ""
|
9
|
-
"Project-Id-Version: alt_locales init-11-ga532a06\n"
|
10
|
-
"\n"
|
11
|
-
"Report-Msgid-Bugs-To: docs@puppetlabs.com\n"
|
12
|
-
"POT-Creation-Date: 2016-06-07 17:38-0500\n"
|
13
|
-
"PO-Revision-Date: 2016-06-07 17:38-0500\n"
|
14
|
-
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
15
|
-
"Language-Team: LANGUAGE <LL@li.org>\n"
|
16
|
-
"Language: \n"
|
17
|
-
"MIME-Version: 1.0\n"
|
18
|
-
"Content-Type: text/plain; charset=UTF-8\n"
|
19
|
-
"Content-Transfer-Encoding: 8bit\n"
|
20
|
-
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
|
21
|
-
|
22
|
-
#. GettextSetup.initialize(File::join(File::dirname(File::dirname(__FILE__)), 'fixtures'))
|
23
|
-
#: ../../lib/gettext_setup_spec.rb:25
|
24
|
-
msgid "Hello, world!"
|
25
|
-
msgstr ""
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'rspec/expectations'
|
2
|
-
require_relative '../spec_helper.rb'
|
3
|
-
|
4
|
-
require_relative '../../lib/tasks/task_helper.rb'
|
5
|
-
|
6
|
-
describe 'string_changes?', if: msgcmp_present? do
|
7
|
-
old_pot = File.absolute_path('../fixtures/pot_update/old.pot', File.dirname(__FILE__))
|
8
|
-
|
9
|
-
it 'should detect string addition' do
|
10
|
-
new_pot = File.absolute_path('../fixtures/pot_update/add.pot', File.dirname(__FILE__))
|
11
|
-
expect(string_changes?(old_pot, new_pot)).to eq(true)
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'should detect string removal' do
|
15
|
-
new_pot = File.absolute_path('../fixtures/pot_update/remove.pot', File.dirname(__FILE__))
|
16
|
-
expect(string_changes?(old_pot, new_pot)).to eq(true)
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'should detect string changes' do
|
20
|
-
new_pot = File.absolute_path('../fixtures/pot_update/change.pot', File.dirname(__FILE__))
|
21
|
-
expect(string_changes?(old_pot, new_pot)).to eq(true)
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'should not detect non-string changes' do
|
25
|
-
new_pot = File.absolute_path('../fixtures/pot_update/non_string_changes.pot', File.dirname(__FILE__))
|
26
|
-
expect(string_changes?(old_pot, new_pot)).to eq(false)
|
27
|
-
end
|
28
|
-
end
|