Skip to content

Commit 9b8a42a

Browse files
locale:en, zh-TW complete!
Remove useless code Add some comment Workaround for i18n ordinal
1 parent 09a8e6e commit 9b8a42a

File tree

4 files changed

+128
-96
lines changed

4 files changed

+128
-96
lines changed

_locales/en/messages.json

Lines changed: 95 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,97 @@
11
{
2-
"extensionName": {
3-
"message": "Reverse Image Search"
4-
},
5-
6-
"extensionDescription": {
7-
"message": "Adds an option to the context menu to reverse search an image on various services"
8-
},
9-
10-
"contextMenuTitle": {
11-
"message": "Reverse Image Search"
12-
},
13-
14-
"optionsPageTitle": {
15-
"message": "Options"
16-
},
17-
18-
"openTabAtLabel": {
19-
"message": "Open the search page"
20-
},
21-
22-
"openAtRight": {
23-
"message": "Right to the current tab"
24-
},
25-
26-
"openAtLeft": {
27-
"message": "Left to the current tab"
28-
},
29-
30-
"openAtEnd": {
31-
"message": "At the end"
32-
},
33-
34-
"openInBackground": {
35-
"message": "Open in background"
36-
},
37-
38-
"searchProviderLabel": {
39-
"message": "Search provider"
40-
},
41-
42-
"customSearchProviderLabel": {
43-
"message": "Custom search provider"
44-
},
45-
46-
"searchProvidersError": {
47-
"message": "Please choose at least one search engine!"
48-
},
49-
50-
"customSearchProviderPlaceholder": {
51-
"message": "Type a URL and use %s as placeholder for the image URL..."
52-
},
53-
54-
"cseError": {
55-
"message": "This is not a valid URL. Does it contain %s, begins with http(s):// and doesn't contain any quotes or spaces?"
56-
},
57-
58-
"saveOptions": {
59-
"message": "Save options"
60-
},
61-
62-
"saved": {
63-
"message": "Saved!"
64-
},
65-
66-
"error": {
67-
"message": "Error, settings were not saved!"
68-
}
2+
"extensionName": {
3+
"message": "Reverse Image Search"
4+
},
5+
6+
"extensionDescription": {
7+
"message": "Adds an option to the context menu to reverse search an image on various services"
8+
},
9+
10+
"contextMenuTitle": {
11+
"message": "Reverse Image Search"
12+
},
13+
14+
"openInBackgroundLabel": {
15+
"message": "Open in background"
16+
},
17+
18+
"optionsPageTitle": {
19+
"message": "Options"
20+
},
21+
22+
"openTabAtLabel": {
23+
"message": "Open the Search page"
24+
},
25+
26+
"openTabAtRight": {
27+
"message": "Right to the current tab"
28+
},
29+
30+
"openTabAtLeft": {
31+
"message": "Left to the current tab"
32+
},
33+
34+
"openTabAtEnd": {
35+
"message": "At the end"
36+
},
37+
38+
"searchProviderLabel": {
39+
"message": "Search provider"
40+
},
41+
42+
"providerNamePlaceholder": {
43+
"message": "2-9 letters without space"
44+
},
45+
46+
"providerURLPlaceholder": {
47+
"message": "http(s):// at begin and %s for image url..."
48+
},
49+
50+
"addSearchProvider": {
51+
"message": "Add Provider"
52+
},
53+
54+
"restoreDefaultSearchProviders": {
55+
"message": "Restore Default"
56+
},
57+
58+
"providerNamePlaceholderError": {
59+
"message": "The name of $index$ provider is invalid. Please use 2-9 letters without space",
60+
"placeholders": {
61+
"index": {
62+
"content": "$1",
63+
"description": "Modified options/options.js#i18nOrdinal if need"
64+
}
65+
}
66+
},
67+
68+
"providerURLPlaceholderError": {
69+
"message": "The url of $index$ provider is invalid. Use http(s):// at begin and %s as placeholder for image url.",
70+
"placeholders": {
71+
"index": {
72+
"content": "$1",
73+
"description": "Modified options/options.js#i18nOrdinal if need"
74+
}
75+
}
76+
},
77+
78+
"saveOptions": {
79+
"message": "Save Options"
80+
},
81+
82+
"msgAtLeastOneSearchProvider": {
83+
"message": "Please choose at least one search provider!"
84+
},
85+
86+
"msgExistEdittingSearchProviders": {
87+
"message": "Some search provider is editting! Click ✓ to finish editting."
88+
},
89+
90+
"msgDuplicatedProviderName": {
91+
"message": "Some search provider name duplicated!"
92+
},
93+
94+
"msgSuccessSaveOptions": {
95+
"message": "Saved!"
96+
}
6997
}

_locales/zh_TW/messages.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"extensionName": {
3-
"message": "Image Reverse Search"
3+
"message": "Reverse Image Search"
44
},
55

66
"extensionDescription": {
@@ -59,7 +59,8 @@
5959
"message": "第 $index$ 個搜尋引擎的名字不符合格式,請使用 2 ~ 9 個非空白的字",
6060
"placeholders": {
6161
"index": {
62-
"content": "$1"
62+
"content": "$1",
63+
"description": "Modified options/options.js#i18nOrdinal if need"
6364
}
6465
}
6566
},
@@ -68,7 +69,8 @@
6869
"message": "第 $index$ 個搜尋引擎的網址不符合格式,請以 http(s):// 開頭且包含 %s",
6970
"placeholders": {
7071
"index": {
71-
"content": "$1"
72+
"content": "$1",
73+
"description": "Modified options/options.js#i18nOrdinal if need"
7274
}
7375
}
7476
},

background.js

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,6 @@ class Provider {
55
this.url = url;
66
this.selected = selected;
77
}
8-
toStorage() {
9-
return {
10-
name: this.name,
11-
icon: this.icon,
12-
url: this.url,
13-
selected: this.selected,
14-
};
15-
}
168
clone() {
179
return new Provider(this.name, this.icon, this.url, this.selected);
1810
}
@@ -29,7 +21,7 @@ const defaultProviders = [
2921
new Provider('SauceNAO', '../icons/saucenao.png', 'https://saucenao.com/search.php?db=999&url=%s'),
3022
];
3123

32-
function getCloneDefaultProviders() {
24+
function getDefaultProvidersClone() {
3325
const DPs = [];
3426
for (let p of defaultProviders) {
3527
DPs.push(p.clone());
@@ -84,7 +76,7 @@ function createContextMenu(storageProviders) {
8476
const defaultSettings = {
8577
openInBackground: false,
8678
openTabAt: 'right',
87-
storageProviders: getCloneDefaultProviders(),
79+
storageProviders: getDefaultProvidersClone(),
8880
};
8981

9082
/**
@@ -107,8 +99,6 @@ function checkStoredSettings(storedSettings) {
10799
}
108100

109101
function reverseSearch(info, storedSettings) {
110-
console.log('reverseSearch', info, storedSettings);
111-
112102
function getTabIndex(openTabAt, tabs) {
113103
if (openTabAt == 'right') {
114104
return tabs[0].index + 1;
@@ -149,6 +139,5 @@ chrome.storage.sync.get(null, checkStoredSettings);
149139

150140
/* On click, fetch stored settings and reverse search. */
151141
chrome.contextMenus.onClicked.addListener((info, tab) => {
152-
console.log('onclick', info, tab);
153142
chrome.storage.sync.get(null, reverseSearch.bind(null, info));
154143
});

options/options.js

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
1-
/* Utility Functions */
1+
/** Utility Functions **/
22
const $ = document.querySelector.bind(document);
33
const $$ = document.querySelectorAll.bind(document);
44
const $el = document.createElement.bind(document);
5+
function i18nOrdinal(n) {
6+
const [prefix, suffix] = chrome.i18n.getUILanguage().split('-', 2);
7+
if (prefix === 'en') {
8+
if (n == 1) return '1st';
9+
if (n == 2) return '2nd';
10+
if (n == 3) return '3rd';
11+
return `${n}th`;
12+
}
13+
return `${n}`;
14+
}
515

6-
function alertErrorMsg(text) {
16+
function alertErrorMsgElement(text) {
717
const msg = createErrorMsgElement(text);
818
$('#alertMessages').appendChild(msg);
919
setTimeout(() => {
@@ -21,17 +31,17 @@ function createErrorMsgElement(text) {
2131

2232
function validateSpName(name, index) {
2333
if (!/^\S{2,9}$/.test(name)) {
24-
const msg = chrome.i18n.getMessage('providerNamePlaceholderError', index);
25-
alertErrorMsg(msg);
34+
const msg = chrome.i18n.getMessage('providerNamePlaceholderError', i18nOrdinal(index));
35+
alertErrorMsgElement(msg);
2636
return false;
2737
}
2838
return true;
2939
}
3040

3141
function validateSpUrl(url, index) {
3242
if (!/^https?:\/\/.*%s.*$/.test(url)) {
33-
const msg = chrome.i18n.getMessage('providerURLPlaceholderError', index);
34-
alertErrorMsg(msg);
43+
const msg = chrome.i18n.getMessage('providerURLPlaceholderError', i18nOrdinal(index));
44+
alertErrorMsgElement(msg);
3545
return false;
3646
}
3747
return true;
@@ -153,7 +163,7 @@ function createSearchProviderElement(name = '', icon = '../icons/other.png', url
153163
return root;
154164
}
155165

156-
/* View Binding */
166+
/** View binding **/
157167

158168
document.title = `${chrome.i18n.getMessage('extensionName')} | ${chrome.i18n.getMessage('optionsPageTitle')}`;
159169

@@ -165,6 +175,7 @@ $('#openTabAtRight').textContent = chrome.i18n.getMessage('openTabAtRight');
165175
$('#openTabAtLeft').textContent = chrome.i18n.getMessage('openTabAtLeft');
166176
$('#openTabAtEnd').textContent = chrome.i18n.getMessage('openTabAtEnd');
167177

178+
/* Search Provider List */
168179
const searchProviderList = $('#searchProviderList');
169180

170181
$('#searchProviderLabel').textContent = chrome.i18n.getMessage('searchProviderLabel');
@@ -174,22 +185,25 @@ addSearchProvider.onclick = () => {
174185
searchProviderList.appendChild(createSearchProviderElement());
175186
};
176187

188+
/* Restore default */
177189
const restoreDefaultSearchProviders = $('#restoreDefaultSearchProviders');
178190
restoreDefaultSearchProviders.textContent = chrome.i18n.getMessage('restoreDefaultSearchProviders');
179191
restoreDefaultSearchProviders.onclick = () => {
180192
while (searchProviderList.firstChild) {
181193
searchProviderList.removeChild(searchProviderList.firstChild);
182194
}
183-
for (let p of chrome.extension.getBackgroundPage().getCloneDefaultProviders()) {
195+
for (let p of chrome.extension.getBackgroundPage().getDefaultProvidersClone()) {
184196
searchProviderList.appendChild(createSearchProviderElement(p.name, p.icon, p.url, p.selected, false));
185197
}
186198
};
187199

200+
/* Save button */
188201
const saveOptions = $('#saveOptions');
189202
saveOptions.textContent = chrome.i18n.getMessage('saveOptions');
190203
$('.alert-success').textContent = chrome.i18n.getMessage('msgSuccessSaveOptions');
191204

192205
saveOptions.onclick = () => {
206+
/* Make sure all input valid */
193207
let selectedCount = 0;
194208
const nameSet = new Set();
195209
const storedSettings = {
@@ -200,7 +214,6 @@ saveOptions.onclick = () => {
200214

201215
for (let li of searchProviderList.children) {
202216
const index = Array.from(searchProviderList.children).indexOf(li) + 1;
203-
console.log(li, index);
204217
const selected = li.children[0].firstElementChild.firstElementChild.checked;
205218
const icon = li.children[1].firstElementChild.src;
206219
const name = li.children[2].value;
@@ -219,7 +232,7 @@ saveOptions.onclick = () => {
219232
}
220233

221234
if (li.children[2].classList.contains('sp-edit')) {
222-
alertErrorMsg(chrome.i18n.getMessage('msgExistEdittingSearchProviders'));
235+
alertErrorMsgElement(chrome.i18n.getMessage('msgExistEdittingSearchProviders'));
223236
return;
224237
}
225238

@@ -228,16 +241,16 @@ saveOptions.onclick = () => {
228241
}
229242

230243
if (selectedCount < 1) {
231-
alertErrorMsg(chrome.i18n.getMessage('msgAtLeastOneSearchProvider'));
244+
alertErrorMsgElement(chrome.i18n.getMessage('msgAtLeastOneSearchProvider'));
232245
return;
233246
}
234247

235248
if (nameSet.size < storedSettings.storageProviders.length) {
236-
/* send an error that name dulplicated */
237-
alertErrorMsg(chrome.i18n.getMessage('msgDuplicatedProviderName'));
249+
alertErrorMsgElement(chrome.i18n.getMessage('msgDuplicatedProviderName'));
238250
return;
239251
}
240252

253+
/* All input valid */
241254
chrome.contextMenus.removeAll();
242255
chrome.extension.getBackgroundPage().createContextMenu(storedSettings.storageProviders);
243256
chrome.storage.sync.set(storedSettings, () => {

0 commit comments

Comments
 (0)