gettext-setup 0.21 → 0.23
Sign up to get free protection for your applications and to get access to all the features.
- 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
|