bisu 1.9.0 → 1.10.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 14ce8b0b059747d79f5a63fc910129774a634d015bf02563ac888dc80c735ed0
4
- data.tar.gz: 5158d8f04815351d0850c52d948a2dcebb5bb267a8154e716c31d01334fdd379
3
+ metadata.gz: a1a7abda3e27e23715ea0f2fb7b3e4bcb916c7a12b7eb691f5a5e3e8e1288a5c
4
+ data.tar.gz: 9a82418e8e0783d4d78783f895a95749a011defaa39332bb6732816d6222454a
5
5
  SHA512:
6
- metadata.gz: 2773ab4e5ea6f8b0f419650e2cd4f551dacfb43d438e892a98bb9ca317774a82c61122ad232de1cd1ede184178ac502352bc356702144b70f73b7912a23adcba
7
- data.tar.gz: 1bae10ebc6fb6a915d2c2122b4ceff3341b426eb47543b9e1502242e47804aa9599ef3c22f4abd62b915177d83d4a0b6a3cf08f8e7fa4aaa5ae505a8c3538429
6
+ metadata.gz: 6c5d8bdcc8bf58bed26a44d949a9094c20382b9853b562c63165e6211b76cb9aa4c2f70db7e0577bf94358a9d83b4b64d8c8d1dbabadc8e2e7da056c01fce5b1
7
+ data.tar.gz: 508e86e0a9c4db4f3e7d5e691d9d5e4bf42656de4fcd52f0acd42acbb92836dc84d928aae9125466622cbde55a3a6a9f31482f3853aa805c890ac87451c1ee15
data/Gemfile CHANGED
@@ -3,7 +3,6 @@ ruby '2.7.3'
3
3
 
4
4
  gem 'safe_yaml', '~> 1.0'
5
5
  gem 'colorize', '~> 0.7'
6
- gem 'xml-simple', '~> 1.1'
7
6
 
8
7
  group :test do
9
8
  gem 'rake'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
- addressable (2.7.0)
4
+ addressable (2.8.0)
5
5
  public_suffix (>= 2.0.2, < 5.0)
6
6
  colorize (0.8.1)
7
7
  crack (0.4.5)
data/README.md CHANGED
@@ -66,14 +66,14 @@ Setup your configuration file
66
66
 
67
67
  1. First ["Publish to the web"](https://www.google.com/search?q=google+sheets+publish+to+web) your Google Sheet
68
68
  1. Share only the sheet that contains the translations
69
+ 1. Make sure you CSV format
69
70
  1. First column should contain the translation keys
70
71
  1. First row should contain the locale for each language
71
72
 
72
73
  ```
73
74
  dictionary:
74
75
  type: google_sheet
75
- sheet_id: <GOOGLE-DRIVE-SHEET-ID>
76
- keys_column: <GOOGLE-DRIVE-KEY-COLUMN-TITLE>
76
+ url: <GOOGLE-DRIVE-SHEET-CSV-URL>
77
77
  ```
78
78
 
79
79
  ##### OneSky integration:
data/bisu.gemspec CHANGED
@@ -18,7 +18,4 @@ Gem::Specification.new do |s|
18
18
 
19
19
  s.add_runtime_dependency 'safe_yaml', '~> 1.0'
20
20
  s.add_runtime_dependency 'colorize', '~> 0.7'
21
- s.add_runtime_dependency 'xml-simple', '~> 1.1'
22
-
23
- s.add_development_dependency 'webmock', '~> 1.20'
24
21
  end
@@ -3,8 +3,7 @@ type: iOS
3
3
 
4
4
  dictionary:
5
5
  type: google_sheet
6
- sheet_id: <GOOGLE-DRIVE-SHEET-ID>
7
- keys_column: <GOOGLE-DRIVE-KEY-COLUMN-TITLE>
6
+ url: <GOOGLE-DRIVE-SHEET-CSV-URL>
8
7
 
9
8
  translate:
10
9
  - in: path/to/1st/file.translatable
data/lib/bisu/config.rb CHANGED
@@ -61,9 +61,8 @@ module Bisu
61
61
  type: Hash,
62
62
  elements: {
63
63
  type: { type: String },
64
- sheet_id: { type: String },
65
- keys_column: { type: String }
66
- }
64
+ url: { type: String },
65
+ },
67
66
  }
68
67
 
69
68
  ONE_SKY_STRUCT = {
@@ -72,15 +71,15 @@ module Bisu
72
71
  api_key: { type: String },
73
72
  api_secret: { type: String },
74
73
  project_id: { type: Integer },
75
- file_name: { type: String }
76
- }
74
+ file_name: { type: String },
75
+ },
77
76
  }
78
77
 
79
78
  URL_STRUCT = {
80
79
  type: Hash,
81
80
  elements: {
82
- url: { type: String }
83
- }
81
+ url: { type: String },
82
+ },
84
83
  }
85
84
 
86
85
  DICTIONARY_STRUCT = {
@@ -1,64 +1,60 @@
1
1
  require "net/https"
2
- require "xmlsimple"
2
+ require "csv"
3
3
 
4
4
  module Bisu
5
5
  module Source
6
6
  class GoogleSheet
7
- def initialize(sheet_id, keys_column)
8
- @sheet_id = sheet_id
9
- @key_column = keys_column
7
+ def initialize(url)
8
+ @url = url
10
9
  end
11
10
 
12
11
  def to_i18
13
- raw = raw_data(@sheet_id)
12
+ Logger.info("Downloading Google Sheet from #{@url}...")
14
13
 
15
- Logger.info("Downloading dictionary from Google Sheet...")
14
+ csv = get_csv(@url)
16
15
 
17
- non_language_columns = ["id", "updated", "category", "title", "content", "link", @key_column]
16
+ hash = {}
18
17
 
19
- kb = {}
20
- raw["entry"].each do |entry|
21
- unless (key = entry[@key_column]) && key = key.first
22
- raise "Bisu::Source::GoogleSheet: Cannot find key column '#{@key_column}'"
23
- end
18
+ languages = csv.headers[1..]
19
+ languages.each { |lang| hash[lang] = {} }
24
20
 
25
- entry.select { |c| !non_language_columns.include?(c) }.each do |lang, texts|
26
- kb[lang] ||= {}
27
- kb[lang][key] = texts.first unless texts.first == {}
21
+ csv.each do |row|
22
+ languages.each do |lang|
23
+ hash[lang][row["key"]] = row[lang] unless row[lang].nil?
28
24
  end
29
25
  end
30
26
 
31
27
  Logger.info("Google Sheet parsed successfully!")
32
- Logger.info("Found #{kb.count} languages.")
28
+ Logger.info("Found #{languages.count} languages.")
33
29
 
34
- kb
30
+ hash
35
31
  end
36
32
 
37
33
  private
38
34
 
39
- def xml_data(uri, headers=nil)
40
- uri = URI.parse(uri)
35
+ def get_csv(url)
36
+ data = get(url)
37
+
38
+ begin
39
+ CSV.parse(data, headers: true)
40
+ rescue StandardError => e
41
+ raise "Bisu::Source::GoogleSheet: Cannot parse. Expected CSV at #{url}: #{e}"
42
+ end
43
+ end
44
+
45
+ def get(url)
46
+ uri = URI(url)
47
+
41
48
  http = Net::HTTP.new(uri.host, uri.port)
42
49
  http.use_ssl = true
43
50
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
44
- data = http.get(uri.path, headers)
45
51
 
46
- unless data.code.to_i == 200
47
- raise "Bisu::Source::GoogleSheet: Cannot access sheet at #{uri} - HTTP #{data.code}"
48
- end
52
+ request = Net::HTTP::Get.new(uri.request_uri)
53
+ response = http.request(request)
49
54
 
50
- begin
51
- XmlSimple.xml_in(data.body, 'KeyAttr' => 'name')
52
- rescue
53
- raise "Bisu::Source::GoogleSheet: Cannot parse. Expected XML at #{uri}"
54
- end
55
- end
55
+ raise "Bisu::Source::GoogleSheet: Http Error #{response.body}" if response.code.to_i >= 400
56
56
 
57
- def raw_data(sheet_id)
58
- Logger.info("Downloading Google Sheet...")
59
- sheet = xml_data("https://spreadsheets.google.com/feeds/worksheets/#{sheet_id}/public/full")
60
- url = sheet["entry"][0]["link"][0]["href"]
61
- xml_data(url)
57
+ response.body
62
58
  end
63
59
  end
64
60
  end
data/lib/bisu/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Bisu
2
- VERSION = '1.9.0'
3
- VERSION_UPDATED_AT = '2021-05-21'
2
+ VERSION = '1.10.0'
3
+ VERSION_UPDATED_AT = '2021-08-30'
4
4
  end
data/lib/bisu.rb CHANGED
@@ -59,7 +59,7 @@ module Bisu
59
59
  source =
60
60
  case config[:type]
61
61
  when "google_sheet"
62
- Bisu::Source::GoogleSheet.new(config[:sheet_id], config[:keys_column])
62
+ Bisu::Source::GoogleSheet.new(config[:url])
63
63
  when "one_sky"
64
64
  Bisu::Source::OneSky.new(config[:api_key], config[:api_secret], config[:project_id], config[:file_name])
65
65
  when "url"
@@ -2,8 +2,7 @@ type: iOS
2
2
 
3
3
  dictionary:
4
4
  type: google_sheet
5
- sheet_id: sheet-id
6
- keys_column: keys-column
5
+ url: sheet-public-url
7
6
 
8
7
  translate:
9
8
  - in: hole19/Localizable.strings.translatable
@@ -0,0 +1,4 @@
1
+ key,en,ja,fr,de,ko
2
+ kConnectFacebook,Connect with Facebook,フェイスブックへ接続,Connexion par Facebook,Mit Facebook verbinden,페이스북으로 접속
3
+ kNoNoNoMr,"No, no, no. Mr %{name} not here",,,,
4
+ kTwitterServer,,,,,트위터 서버연결 실패. \n잠시 후 재시도.
@@ -4,24 +4,23 @@ describe Bisu::Config do
4
4
  let(:hash) { {
5
5
  type: "BisuOS",
6
6
  dictionary: {
7
- type: "google_sheet",
8
- sheet_id: "abc1234567890",
9
- keys_column: "key_name"
7
+ type: "google_sheet",
8
+ url: "https://abc1234567890",
10
9
  },
11
10
  translate: [
12
- { in: "path/to/file/to/1.ext.translatable",
13
- out: "path/to/final-%{locale}/1.ext",
11
+ { in: "path/to/file/to/1.ext.translatable",
12
+ out: "path/to/final-%{locale}/1.ext",
14
13
  out_en_us: "path/to/default/1.ext"
15
14
  },
16
- { in: "path/to/file/to/2.ext.translatable",
17
- out: "path/to/final-%{locale}/2.ext",
15
+ { in: "path/to/file/to/2.ext.translatable",
16
+ out: "path/to/final-%{locale}/2.ext",
18
17
  out_en_us: "path/to/default/2.ext"
19
18
  },
20
19
  ],
21
20
  languages: [
22
- { locale: "en-US", language: "english" },
23
- { locale: "pt", language: "portuguese" },
24
- { locale: "pt-PT", language: "portuguese" },
21
+ { locale: "en-US", language: "english" },
22
+ { locale: "pt", language: "portuguese" },
23
+ { locale: "pt-PT", language: "portuguese" },
25
24
  { locale: "pt-Batatas", language: "portuguese-bt", fallback_language: "portuguese" }
26
25
  ]
27
26
  } }
@@ -37,16 +36,16 @@ describe Bisu::Config do
37
36
  describe "#dictionary" do
38
37
  subject(:dictionary) { config.dictionary }
39
38
 
40
- it { should eq({ type: "google_sheet", sheet_id: "abc1234567890", keys_column: "key_name" }) }
39
+ it { should eq({ type: "google_sheet", url: "https://abc1234567890" }) }
41
40
 
42
41
  context "when given a OneSky type dictionary" do
43
42
  before do
44
43
  hash[:dictionary] = {
45
- type: "one_sky",
46
- api_key: "as387oavh48",
44
+ type: "one_sky",
45
+ api_key: "as387oavh48",
47
46
  api_secret: "bp0s5avo8a59",
48
47
  project_id: 328742,
49
- file_name: "file.json"
48
+ file_name: "file.json"
50
49
  }
51
50
  end
52
51
 
@@ -57,7 +56,7 @@ describe Bisu::Config do
57
56
  before do
58
57
  hash[:dictionary] = {
59
58
  type: "url",
60
- url: "a_url"
59
+ url: "a_url"
61
60
  }
62
61
  end
63
62
 
@@ -1,68 +1,43 @@
1
1
  describe Bisu::Source::GoogleSheet do
2
- subject(:to_i18) { Bisu::Source::GoogleSheet.new(sheet_id, key_column).to_i18 }
2
+ subject(:to_i18) { Bisu::Source::GoogleSheet.new(url).to_i18 }
3
3
 
4
- let(:sheet_id) { "abc1234567890" }
5
- let(:url_info) { "https://spreadsheets.google.com/feeds/worksheets/#{sheet_id}/public/full" }
6
- let(:url_sheet) { "https://spreadsheets.google.com/feeds/list/#{sheet_id}/od6/public/full" }
4
+ let(:url) { "https://docs.google.com/spreadsheets/d/e/2PACX-1vTm6yu_zfbxKizC-PvUE1HVFCsplmiyz0s0qLSIGeokA7KtS3BgtqaA79CsfYfPsXH6xzUaP8HDTcj8/pub?gid=0&single=true&output=csv" }
5
+ let(:response) { File.read("spec/fixtures/sample_google_response.csv") }
7
6
 
8
- let(:key_column) { "key_column" }
9
-
10
- context "when given a valid sheet" do
11
- let(:file_info) { File.read("spec/fixtures/sample_kb_public_info.html") }
12
- let(:file_sheet) { File.read("spec/fixtures/sample_kb_public_sheet.html") }
13
-
14
- before do
15
- stub_request(:get, url_info).to_return(:status => 200, :body => file_info, :headers => {})
16
- stub_request(:get, url_sheet).to_return(:status => 200, :body => file_sheet, :headers => {})
17
- end
18
-
19
- it do
20
- expect { to_i18 }.not_to raise_error
21
- end
22
-
23
- it "returns an hash in i18 format" do
24
- expect(to_i18).to eq({
25
- "english" => { "kConnectFacebook" => "Connect with Facebook", "kConnectEmail" => "Connect with Email" },
26
- "german" => { "kConnectFacebook" => "Mit Facebook verbinden", "kConnectEmail" => "Mit E-Mail verbinden" },
27
- "portuguese" => { "kConnectFacebook" => "Registar com Facebook", "kConnectEmail" => "Registar com Email" },
28
- "spanish" => { "kConnectFacebook" => "Conéctate con Facebook", "kConnectEmail" => "Conéctate con Email" },
29
- "french" => { "kConnectFacebook" => "Connecter Facebook" },
30
- "dutch" => { "kConnectFacebook" => "Facebook Verbinden", "kConnectEmail" => "Email Verbinden" },
31
- "korean" => { "kConnectFacebook" => "페이스북으로 접속", "kConnectEmail" => "이메일로 접속" },
32
- "japanese" => { "kConnectFacebook" => "フェイスブックへ接続", "kConnectEmail" => "電子メールアカウントに接続" }
33
- })
34
- end
7
+ def stub_url(status:, response:)
8
+ stub_request(:get, url).
9
+ to_return(:status => status, :body => response, :headers => {})
10
+ end
35
11
 
36
- context "but the key column is not present in the first sheet" do
37
- let(:key_column) { "expecting_another_key_column" }
12
+ before { stub_url(status: 200, response: response) }
38
13
 
39
- it do
40
- expect { to_i18 }.to raise_error /Cannot find key column/
41
- end
42
- end
14
+ it do
15
+ expect { to_i18 }.not_to raise_error
43
16
  end
44
17
 
45
- context "when given an inexistent sheet" do
46
- before { stub_request(:get, url_info).to_return(:status => 400, :body => "Not Found", :headers => {}) }
47
-
48
- it do
49
- expect { to_i18 }.to raise_error /Cannot access sheet/
50
- end
18
+ it "returns an hash in i18 format" do
19
+ expect(to_i18).to eq({
20
+ "en" => { "kConnectFacebook" => "Connect with Facebook", "kNoNoNoMr" => "No, no, no. Mr %{name} not here" },
21
+ "ja" => { "kConnectFacebook" => "フェイスブックへ接続" },
22
+ "fr" => { "kConnectFacebook" => "Connexion par Facebook" },
23
+ "de" => { "kConnectFacebook" => "Mit Facebook verbinden" },
24
+ "ko" => { "kConnectFacebook" => "페이스북으로 접속", "kTwitterServer" => "트위터 서버연결 실패. \\n잠시 후 재시도." }
25
+ })
51
26
  end
52
27
 
53
- context "when given a private sheet" do
54
- before { stub_request(:get, url_info).to_return(:status => 302, :body => "<HTML></HTML>", :headers => {}) }
28
+ context "when given an inexistent sheet" do
29
+ before { stub_url(status: 400, response: "Not Found") }
55
30
 
56
31
  it do
57
- expect { to_i18 }.to raise_error /Cannot access sheet/
32
+ expect { to_i18 }.to raise_error /Http Error/
58
33
  end
59
34
  end
60
35
 
61
- context "when url content is not XML" do
62
- before { stub_request(:get, url_info).to_return(:status => 200, :body => "This is not XML; { this: \"is json\" }", :headers => {}) }
36
+ context "when url content is not CSV" do
37
+ before { stub_url(status: 200, response: "{\"asdsa\": \"This is a json\"}") }
63
38
 
64
39
  it do
65
- expect { to_i18 }.to raise_error /Cannot parse. Expected XML/
40
+ expect { to_i18 }.to raise_error /Cannot parse. Expected CSV/
66
41
  end
67
42
  end
68
43
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bisu
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.0
4
+ version: 1.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - joaoffcosta
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-21 00:00:00.000000000 Z
11
+ date: 2021-08-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: safe_yaml
@@ -38,34 +38,6 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0.7'
41
- - !ruby/object:Gem::Dependency
42
- name: xml-simple
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '1.1'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '1.1'
55
- - !ruby/object:Gem::Dependency
56
- name: webmock
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '1.20'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '1.20'
69
41
  description: Bisu manages your app iOS and Android localization files for you. No
70
42
  more copy+paste induced errors!
71
43
  email: joaostacosta@gmail.com
@@ -97,9 +69,8 @@ files:
97
69
  - lib/bisu/source/url.rb
98
70
  - lib/bisu/version.rb
99
71
  - spec/fixtures/sample.translatable.yml
72
+ - spec/fixtures/sample_google_response.csv
100
73
  - spec/fixtures/sample_json_response.json
101
- - spec/fixtures/sample_kb_public_info.html
102
- - spec/fixtures/sample_kb_public_sheet.html
103
74
  - spec/fixtures/sample_one_sky_response.json
104
75
  - spec/fixtures/sample_one_sky_response_with_bug.json
105
76
  - spec/lib/bisu/config_spec.rb
@@ -1 +0,0 @@
1
- <?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gs='http://schemas.google.com/spreadsheets/2006'><id>https://spreadsheets.google.com/feeds/worksheets/abc1234567890/public/full</id><updated>2015-02-09T18:59:53.874Z</updated><category scheme='http://schemas.google.com/spreadsheets/2006' term='http://schemas.google.com/spreadsheets/2006#worksheet'/><title type='text'>H19: Translation Knowledge Base</title><link rel='alternate' type='application/atom+xml' href='https://docs.google.com/spreadsheets/d/abc1234567890/pubhtml'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/worksheets/abc1234567890/public/full'/><link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/worksheets/abc1234567890/public/full'/><link rel='self' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/worksheets/abc1234567890/public/full'/><author><name>anthony.douglas</name><email>anthony.douglas@hole19golf.com</email></author><openSearch:totalResults>1</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><entry><id>https://spreadsheets.google.com/feeds/worksheets/abc1234567890/public/full/od6</id><updated>2015-02-09T18:59:53.874Z</updated><category scheme='http://schemas.google.com/spreadsheets/2006' term='http://schemas.google.com/spreadsheets/2006#worksheet'/><title type='text'>Translations</title><content type='text'>Translations</content><link rel='http://schemas.google.com/spreadsheets/2006#listfeed' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/abc1234567890/od6/public/full'/><link rel='http://schemas.google.com/spreadsheets/2006#cellsfeed' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/cells/abc1234567890/od6/public/full'/><link rel='http://schemas.google.com/visualization/2008#visualizationApi' type='application/atom+xml' href='https://docs.google.com/spreadsheets/d/abc1234567890/gviz/tq?gid=0&amp;pub=1'/><link rel='http://schemas.google.com/spreadsheets/2006#exportcsv' type='text/csv' href='https://docs.google.com/spreadsheets/d/abc1234567890/export?gid=0&amp;format=csv'/><link rel='self' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/worksheets/abc1234567890/public/full/od6'/><gs:colCount>25</gs:colCount><gs:rowCount>665</gs:rowCount></entry></feed>
@@ -1 +0,0 @@
1
- <?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gsx='http://schemas.google.com/spreadsheets/2006/extended'><id>https://spreadsheets.google.com/feeds/list/abc1234567890/od6/public/full</id><updated>2015-02-09T18:59:53.874Z</updated><category scheme='http://schemas.google.com/spreadsheets/2006' term='http://schemas.google.com/spreadsheets/2006#list'/><title type='text'>Translations</title><link rel='alternate' type='application/atom+xml' href='https://docs.google.com/spreadsheets/d/abc1234567890/pubhtml'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/abc1234567890/od6/public/full'/><link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/abc1234567890/od6/public/full'/><link rel='self' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/abc1234567890/od6/public/full'/><author><name>anthony.douglas</name><email>anthony.douglas@hole19golf.com</email></author><openSearch:totalResults>664</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><entry><id>https://spreadsheets.google.com/feeds/list/abc1234567890/od6/public/full/cokwr</id><updated>2015-02-09T18:59:53.874Z</updated><category scheme='http://schemas.google.com/spreadsheets/2006' term='http://schemas.google.com/spreadsheets/2006#list'/><title type='text'>kConnectFacebook</title><content type='text'>english: Connect with Facebook, german: Mit Facebook verbinden, portuguese: Registar com Facebook, spanish: Conéctate con Facebook, french: Connecter Facebook, dutch: Facebook Verbinden, korean: 페이스북으로 접속, japanese: フェイスブックへ接続, key_column_2: kConnectFacebook</content><link rel='self' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/abc1234567890/od6/public/full/cokwr'/><gsx:key_column>kConnectFacebook</gsx:key_column><gsx:english>Connect with Facebook</gsx:english><gsx:german>Mit Facebook verbinden</gsx:german><gsx:portuguese>Registar com Facebook</gsx:portuguese><gsx:spanish>Conéctate con Facebook</gsx:spanish><gsx:french>Connecter Facebook</gsx:french><gsx:dutch>Facebook Verbinden</gsx:dutch><gsx:korean>페이스북으로 접속</gsx:korean><gsx:japanese>フェイスブックへ接続</gsx:japanese></entry><entry><id>https://spreadsheets.google.com/feeds/list/abc1234567890/od6/public/full/cpzh4</id><updated>2015-02-09T18:59:53.874Z</updated><category scheme='http://schemas.google.com/spreadsheets/2006' term='http://schemas.google.com/spreadsheets/2006#list'/><title type='text'>kConnectEmail</title><content type='text'>english: Connect with Email, german: Mit E-Mail verbinden, portuguese: Registar com Email, spanish: Conéctate con Email, dutch: Email Verbinden, korean: 이메일로 접속, japanese: 電子メールアカウントに接続, key_column_2: kConnectEmail</content><link rel='self' type='application/atom+xml' href='https://spreadsheets.google.com/feeds/list/abc1234567890/od6/public/full/cpzh4'/><gsx:key_column>kConnectEmail</gsx:key_column><gsx:english>Connect with Email</gsx:english><gsx:german>Mit E-Mail verbinden</gsx:german><gsx:portuguese>Registar com Email</gsx:portuguese><gsx:spanish>Conéctate con Email</gsx:spanish><gsx:french></gsx:french><gsx:dutch>Email Verbinden</gsx:dutch><gsx:korean>이메일로 접속</gsx:korean><gsx:japanese>電子メールアカウントに接続</gsx:japanese></entry></feed>