restore
This commit is contained in:
parent
86001f2a57
commit
c27f77fcb4
2 changed files with 475 additions and 225 deletions
|
@ -3424,170 +3424,227 @@ const app = new Vue({
|
|||
},
|
||||
loadMXM() {
|
||||
let attempt = 0;
|
||||
const track = encodeURIComponent(this.mk.nowPlayingItem != null ? this.mk.nowPlayingItem.title ?? "" : "");
|
||||
const artist = encodeURIComponent(this.mk.nowPlayingItem != null ? this.mk.nowPlayingItem.artistName ?? "" : "");
|
||||
const time = encodeURIComponent(this.mk.nowPlayingItem != null ? Math.round((this.mk.nowPlayingItem.attributes["durationInMillis"] ?? -1000) / 1000) ?? -1 : -1);
|
||||
let id = null;
|
||||
let vanity_id = null;
|
||||
if (this.mk.nowPlayingItem != null && app.mk.nowPlayingItem.localFilesMetadata != null) {
|
||||
const id = encodeURIComponent("");
|
||||
} else {
|
||||
id = encodeURIComponent(this.mk.nowPlayingItem != null ? app.mk.nowPlayingItem._songId ?? app.mk.nowPlayingItem["songId"] ?? "" : "");
|
||||
}
|
||||
|
||||
const track = encodeURIComponent((this.mk.nowPlayingItem != null) ? this.mk.nowPlayingItem.title ?? '' : '');
|
||||
const artist = encodeURIComponent((this.mk.nowPlayingItem != null) ? this.mk.nowPlayingItem.artistName ?? '' : '');
|
||||
const time = encodeURIComponent((this.mk.nowPlayingItem != null) ? (Math.round((this.mk.nowPlayingItem.attributes["durationInMillis"] ?? -1000) / 1000) ?? -1) : -1);
|
||||
const id = encodeURIComponent((this.mk.nowPlayingItem != null) ? app.mk.nowPlayingItem._songId ?? (app.mk.nowPlayingItem["songId"] ?? '') : '');
|
||||
let lrcfile = "";
|
||||
let richsync = [];
|
||||
const lang = app.cfg.lyrics.mxm_language; // translation language
|
||||
|
||||
function getMXMSubs(track, artist, lang, time, id) {
|
||||
let richsyncQuery = app.cfg.lyrics.mxm_karaoke;
|
||||
let itunesid = id && id != "" ? id : ""; // Mode 1 -> Subs
|
||||
let url = "https://api.cider.sh/v1/lyrics?" + "mode=1" + "&richsyncQuery=" + richsyncQuery + "&track=" + track + "&artist=" + artist + "&songID=" + itunesid + "&source=mxm" + "&lang=" + lang + "&time=" + time;
|
||||
let req = new XMLHttpRequest();
|
||||
req.overrideMimeType("application/json");
|
||||
req.onload = function () {
|
||||
try {
|
||||
let jsonResponse = JSON.parse(this.responseText);
|
||||
console.debug(jsonResponse);
|
||||
let status1 = jsonResponse["message"]["header"]["status_code"];
|
||||
|
||||
if (status1 == 200) {
|
||||
let id,
|
||||
songLang = "";
|
||||
try {
|
||||
if (jsonResponse["message"]["body"]["macro_calls"]["matcher.track.get"]["message"]["header"]["status_code"] == 200 && jsonResponse["message"]["body"]["macro_calls"]["track.subtitles.get"]["message"]["header"]["status_code"] == 200) {
|
||||
id = jsonResponse["message"]["body"]["macro_calls"]["matcher.track.get"]["message"]["body"]["track"]["track_id"] ?? "";
|
||||
lrcfile = jsonResponse["message"]["body"]["macro_calls"]["track.subtitles.get"]["message"]["body"]["subtitle_list"][0]["subtitle"]["subtitle_body"];
|
||||
vanity_id = jsonResponse["message"]["body"]["macro_calls"]["matcher.track.get"]["message"]["body"]["track"]["commontrack_vanity_id"];
|
||||
songLang = jsonResponse["message"]["body"]["macro_calls"]["track.lyrics.get"]["message"]["body"]["lyrics"]["lyrics_language_description"];
|
||||
const lang = app.cfg.lyrics.mxm_language // translation language
|
||||
function revisedRandId() {
|
||||
return Math.random().toString(36).replace(/[^a-z]+/g, '').slice(2, 10);
|
||||
}
|
||||
|
||||
/* get token */
|
||||
function getToken(mode, track, artist, songid, lang, time, id) {
|
||||
if (attempt > 2) {
|
||||
app.loadNeteaseLyrics();
|
||||
// app.loadAMLyrics();
|
||||
} else {
|
||||
attempt = attempt + 1;
|
||||
let url = "https://apic-desktop.musixmatch.com/ws/1.1/token.get?app_id=web-desktop-app-v1.0&t=" + revisedRandId();
|
||||
let req = new XMLHttpRequest();
|
||||
req.overrideMimeType("application/json");
|
||||
req.open('GET', url, true);
|
||||
req.setRequestHeader("authority", "apic-desktop.musixmatch.com");
|
||||
req.onload = function () {
|
||||
try {
|
||||
let lrcrich = jsonResponse["message"]["body"]["macro_calls"]["track.richsync.get"]["message"]["body"]["richsync"]["richsync_body"];
|
||||
richsync = JSON.parse(lrcrich);
|
||||
app.richlyrics = richsync;
|
||||
} catch (_) {}
|
||||
}
|
||||
let jsonResponse = JSON.parse(this.responseText);
|
||||
let status2 = jsonResponse["message"]["header"]["status_code"];
|
||||
if (status2 == 200) {
|
||||
let token = jsonResponse["message"]["body"]["user_token"] ?? '';
|
||||
if (token != "" && token != "UpgradeOnlyUpgradeOnlyUpgradeOnlyUpgradeOnly") {
|
||||
console.debug('200 token', mode);
|
||||
// token good
|
||||
app.mxmtoken = token;
|
||||
|
||||
if (lrcfile === "") {
|
||||
app.loadAMLyrics();
|
||||
} else {
|
||||
if (richsync == [] || richsync.length == 0) {
|
||||
console.log("musixmatch worki");
|
||||
// process lrcfile to json here
|
||||
app.lyricsMediaItem = lrcfile;
|
||||
let u = app.lyricsMediaItem.split(/[\r\n]/);
|
||||
let preLrc = [];
|
||||
for (var i = u.length - 1; i >= 0; i--) {
|
||||
let xline = /(\[[0-9.:\[\]]*\])+(.*)/.exec(u[i]);
|
||||
let end = preLrc.length > 0 ? preLrc[preLrc.length - 1].startTime ?? 99999 : 99999;
|
||||
preLrc.push({
|
||||
startTime: app.toMS(xline[1].substring(1, xline[1].length - 2)) ?? 0,
|
||||
endTime: end,
|
||||
line: xline[2],
|
||||
translation: "",
|
||||
});
|
||||
}
|
||||
if (preLrc.length > 0)
|
||||
preLrc.push({
|
||||
startTime: 0,
|
||||
endTime: preLrc[preLrc.length - 1].startTime,
|
||||
line: "lrcInstrumental",
|
||||
translation: "",
|
||||
});
|
||||
app.lyrics = preLrc.reverse();
|
||||
} else {
|
||||
let preLrc = richsync.map(function (item) {
|
||||
return {
|
||||
startTime: item.ts,
|
||||
endTime: item.te,
|
||||
line: item.x,
|
||||
translation: "",
|
||||
};
|
||||
});
|
||||
if (preLrc.length > 0)
|
||||
preLrc.unshift({
|
||||
startTime: 0,
|
||||
endTime: preLrc[0].startTime,
|
||||
line: "lrcInstrumental",
|
||||
translation: "",
|
||||
});
|
||||
app.lyrics = preLrc;
|
||||
}
|
||||
|
||||
// Load translation
|
||||
if (songLang.toLowerCase() !== lang) {
|
||||
getMXMTrans(lang, vanity_id);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
app.loadAMLyrics();
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
app.loadAMLyrics();
|
||||
}
|
||||
};
|
||||
req.onerror = function () {
|
||||
console.log("error");
|
||||
app.loadAMLyrics();
|
||||
};
|
||||
req.open("POST", url, true);
|
||||
req.send();
|
||||
}
|
||||
|
||||
function getMXMTrans(lang, vanity_id) {
|
||||
try {
|
||||
if (lang !== "disabled" && vanity_id !== "") {
|
||||
// Mode 2 -> Trans
|
||||
let url = "https://api.cider.sh/v1/lyrics?mode=2&vanityID=" + vanity_id + "&source=mxm&lang=" + lang;
|
||||
let req = new XMLHttpRequest();
|
||||
req.overrideMimeType("application/json");
|
||||
req.onload = function () {
|
||||
if (req.status == 200) {
|
||||
// If it's not 200, 237890127389012 things could go wrong and I don't really care what those things are.
|
||||
let jsonResponse = JSON.parse(this.responseText);
|
||||
let applied = 0;
|
||||
for (let i = 0; applied < app.lyrics.length; i++) {
|
||||
if (app.lyrics[applied].line.trim() === "") {
|
||||
applied += 1;
|
||||
}
|
||||
if (app.lyrics[applied].line.trim() === jsonResponse[i]) {
|
||||
// Do Nothing
|
||||
applied += 1;
|
||||
} else {
|
||||
if (app.lyrics[applied].line === "lrcInstrumental") {
|
||||
if (app.lyrics[applied + 1].line.trim() === jsonResponse[i]) {
|
||||
// Do Nothing
|
||||
applied += 2;
|
||||
if (mode == 1) {
|
||||
getMXMSubs(track, artist, app.mxmtoken, lang, time, id);
|
||||
} else {
|
||||
getMXMTrans(songid, lang, app.mxmtoken);
|
||||
}
|
||||
} else {
|
||||
console.debug('fake 200 token');
|
||||
getToken(mode, track, artist, songid, lang, time)
|
||||
}
|
||||
} else {
|
||||
app.lyrics[applied + 1].translation = jsonResponse[i];
|
||||
applied += 2;
|
||||
// console.log('token 4xx');
|
||||
getToken(mode, track, artist, songid, lang, time)
|
||||
}
|
||||
} else {
|
||||
app.lyrics[applied].translation = jsonResponse[i];
|
||||
applied += 1;
|
||||
}
|
||||
} catch (e) {
|
||||
console.log('error');
|
||||
app.loadQQLyrics();
|
||||
//app.loadAMLyrics();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
req.onerror = function () {
|
||||
console.log("MXM Translation somehow died. Don't need to know why.");
|
||||
};
|
||||
req.open("POST", url, true);
|
||||
req.send();
|
||||
};
|
||||
req.onerror = function () {
|
||||
console.log('error');
|
||||
app.loadQQLyrics();
|
||||
// app.loadAMLyrics();
|
||||
};
|
||||
req.send();
|
||||
}
|
||||
} catch (e) {
|
||||
console.debug("Error while parsing MXM Trans: " + e);
|
||||
}
|
||||
}
|
||||
|
||||
if ((track != "") & (track != "No Title Found")) {
|
||||
getMXMSubs(track, artist, lang, time, id);
|
||||
function getMXMSubs(track, artist, token, lang, time, id) {
|
||||
let usertoken = encodeURIComponent(token);
|
||||
let richsyncQuery = (app.cfg.lyrics.mxm_karaoke) ? "&optional_calls=track.richsync" : ""
|
||||
let timecustom = (!time || (time && time < 0)) ? '' : `&f_subtitle_length=${time}&q_duration=${time}&f_subtitle_length_max_deviation=40`;
|
||||
let itunesid = (id && id != "") ? `&track_itunes_id=${id}` : '';
|
||||
let url = "https://apic-desktop.musixmatch.com/ws/1.1/macro.subtitles.get?format=json&namespace=lyrics_richsynched" + richsyncQuery + "&subtitle_format=lrc&q_artist=" + artist + "&q_track=" + track + itunesid + "&usertoken=" + usertoken + timecustom + "&app_id=web-desktop-app-v1.0&t=" + revisedRandId();
|
||||
let req = new XMLHttpRequest();
|
||||
req.overrideMimeType("application/json");
|
||||
req.open('GET', url, true);
|
||||
req.setRequestHeader("authority", "apic-desktop.musixmatch.com");
|
||||
req.onload = function () {
|
||||
try {
|
||||
let jsonResponse = JSON.parse(this.responseText);
|
||||
console.debug(jsonResponse);
|
||||
let status1 = jsonResponse["message"]["header"]["status_code"];
|
||||
|
||||
if (status1 == 200) {
|
||||
let id = '';
|
||||
try {
|
||||
if (jsonResponse["message"]["body"]["macro_calls"]["matcher.track.get"]["message"]["header"]["status_code"] == 200 && jsonResponse["message"]["body"]["macro_calls"]["track.subtitles.get"]["message"]["header"]["status_code"] == 200) {
|
||||
id = jsonResponse["message"]["body"]["macro_calls"]["matcher.track.get"]["message"]["body"]["track"]["track_id"] ?? '';
|
||||
lrcfile = jsonResponse["message"]["body"]["macro_calls"]["track.subtitles.get"]["message"]["body"]["subtitle_list"][0]["subtitle"]["subtitle_body"];
|
||||
|
||||
try {
|
||||
let lrcrich = jsonResponse["message"]["body"]["macro_calls"]["track.richsync.get"]["message"]["body"]["richsync"]["richsync_body"];
|
||||
richsync = JSON.parse(lrcrich);
|
||||
app.richlyrics = richsync;
|
||||
} catch (_) {
|
||||
}
|
||||
}
|
||||
|
||||
if (lrcfile == "") {
|
||||
app.loadQQLyrics();
|
||||
// app.loadAMLyrics()
|
||||
} else {
|
||||
if (richsync == [] || richsync.length == 0) {
|
||||
console.log("ok");
|
||||
// process lrcfile to json here
|
||||
app.lyricsMediaItem = lrcfile
|
||||
let u = app.lyricsMediaItem.split(/[\r\n]/);
|
||||
let preLrc = []
|
||||
for (var i = u.length - 1; i >= 0; i--) {
|
||||
let xline = (/(\[[0-9.:\[\]]*\])+(.*)/).exec(u[i])
|
||||
let end = (preLrc.length > 0) ? ((preLrc[preLrc.length - 1].startTime) ?? 99999) : 99999
|
||||
preLrc.push({
|
||||
startTime: app.toMS(xline[1].substring(1, xline[1].length - 2)) ?? 0,
|
||||
endTime: end,
|
||||
line: xline[2],
|
||||
translation: ''
|
||||
})
|
||||
}
|
||||
if (preLrc.length > 0)
|
||||
preLrc.push({
|
||||
startTime: 0,
|
||||
endTime: preLrc[preLrc.length - 1].startTime,
|
||||
line: "lrcInstrumental",
|
||||
translation: ''
|
||||
});
|
||||
app.lyrics = preLrc.reverse();
|
||||
} else {
|
||||
let preLrc = richsync.map(function (item) {
|
||||
return {
|
||||
startTime: item.ts,
|
||||
endTime: item.te,
|
||||
line: item.x,
|
||||
translation: ''
|
||||
}
|
||||
})
|
||||
if (preLrc.length > 0)
|
||||
preLrc.unshift({
|
||||
startTime: 0,
|
||||
endTime: preLrc[0].startTime,
|
||||
line: "lrcInstrumental",
|
||||
translation: ''
|
||||
});
|
||||
app.lyrics = preLrc;
|
||||
}
|
||||
if (lrcfile != null && lrcfile != '') {
|
||||
// load translation
|
||||
getMXMTrans(id, lang, token);
|
||||
} else {
|
||||
// app.loadAMLyrics()
|
||||
app.loadQQLyrics();
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
app.loadQQLyrics();
|
||||
// app.loadAMLyrics()
|
||||
}
|
||||
} else { //4xx rejected
|
||||
getToken(1, track, artist, '', lang, time);
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
app.loadQQLyrics();
|
||||
//app.loadAMLyrics()
|
||||
}
|
||||
}
|
||||
req.onerror = function () {
|
||||
app.loadQQLyrics();
|
||||
console.log('error');
|
||||
// app.loadAMLyrics();
|
||||
};
|
||||
req.send();
|
||||
}
|
||||
},
|
||||
|
||||
function getMXMTrans(id, lang, token) {
|
||||
if (lang != "disabled" && id != '') {
|
||||
let usertoken = encodeURIComponent(token);
|
||||
let url2 = "https://apic-desktop.musixmatch.com/ws/1.1/crowd.track.translations.get?translation_fields_set=minimal&selected_language=" + lang + "&track_id=" + id + "&comment_format=text&part=user&format=json&usertoken=" + usertoken + "&app_id=web-desktop-app-v1.0&t=" + revisedRandId();
|
||||
let req2 = new XMLHttpRequest();
|
||||
req2.overrideMimeType("application/json");
|
||||
req2.open('GET', url2, true);
|
||||
req2.setRequestHeader("authority", "apic-desktop.musixmatch.com");
|
||||
req2.onload = function () {
|
||||
try {
|
||||
let jsonResponse2 = JSON.parse(this.responseText);
|
||||
console.log(jsonResponse2);
|
||||
let status2 = jsonResponse2["message"]["header"]["status_code"];
|
||||
if (status2 == 200) {
|
||||
try {
|
||||
let preTrans = []
|
||||
let u = app.lyrics;
|
||||
let translation_list = jsonResponse2["message"]["body"]["translations_list"];
|
||||
if (translation_list.length > 0) {
|
||||
for (var i = 0; i < u.length - 1; i++) {
|
||||
preTrans[i] = ""
|
||||
for (var trans_line of translation_list) {
|
||||
if (u[i].line == " " + trans_line["translation"]["matched_line"] || u[i].line == trans_line["translation"]["matched_line"]) {
|
||||
u[i].translation = trans_line["translation"]["description"];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
app.lyrics = u;
|
||||
}
|
||||
} catch (e) {
|
||||
/// not found trans -> ignore
|
||||
}
|
||||
} else { //4xx rejected
|
||||
getToken(2, '', '', id, lang, '');
|
||||
}
|
||||
} catch (e) {
|
||||
}
|
||||
}
|
||||
req2.send();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (track != "" & track != "No Title Found") {
|
||||
if (app.mxmtoken != null && app.mxmtoken != '') {
|
||||
getMXMSubs(track, artist, app.mxmtoken, lang, time, id)
|
||||
} else {
|
||||
getToken(1, track, artist, '', lang, time);
|
||||
}
|
||||
}
|
||||
},
|
||||
loadNeteaseLyrics() {
|
||||
const track = encodeURIComponent(this.mk.nowPlayingItem != null ? this.mk.nowPlayingItem.title ?? "" : "");
|
||||
const artist = encodeURIComponent(this.mk.nowPlayingItem != null ? this.mk.nowPlayingItem.artistName ?? "" : "");
|
||||
|
|
|
@ -778,79 +778,272 @@
|
|||
<div class="md-option-segment md-option-segment_auto">
|
||||
<label>
|
||||
<select class="md-select" v-model="app.cfg.lyrics.mxm_language">
|
||||
<option value='disabled'>Disabled</option>
|
||||
<option value='afrikaans'>Afrikaans</option>
|
||||
<option value='albanian'>Albanian</option>
|
||||
<option value='arab'>Arabic</option>
|
||||
<option value='armenian'>Armenian</option>
|
||||
<option value='azerbaijani'>Azerbaijani</option>
|
||||
<option value='bengali'>Bengali</option>
|
||||
<option value='bosnian'>Bosnian</option>
|
||||
<option value='brazilian'>Brazilian</option>
|
||||
<option value='bulgarian'>Bulgarian</option>
|
||||
<option value='chinese'>Chinese (Simplified)</option>
|
||||
<option value='chinese-trad'>Chinese (Traditional)</option>
|
||||
<option value='chinese-romaji'>Romanized Chinese</option>
|
||||
<option value='croatian'>Croatian</option>
|
||||
<option value='czech'>Czech</option>
|
||||
<option value='danish'>Danish</option>
|
||||
<option value='dutch'>Dutch</option>
|
||||
<option value='estonian'>Estonian</option>
|
||||
<option value='english'>English</option>
|
||||
<option value='farsi'>Farsi</option>
|
||||
<option value='filipino'>Filipino</option>
|
||||
<option value='french'>French</option>
|
||||
<option value='georgian'>Georgian</option>
|
||||
<option value='german'>German</option>
|
||||
<option value='greek'>Greek</option>
|
||||
<option value='gujarati'>Gujarati</option>
|
||||
<option value='gujarati-romanized'>Romanized Gujarati</option>
|
||||
<option value='haitian-creole'>Haitian-Creole</option>
|
||||
<option value='hebrew'>Hebrew</option>
|
||||
<option value='hindi'>Hindi</option>
|
||||
<option value='hindi-romanized'>Romanized Hindi</option>
|
||||
<option value='hungarian'>Hungarian</option>
|
||||
<option value='icelandic'>Icelandic</option>
|
||||
<option value='bahasa-indonesia'>Indonesian</option>
|
||||
<option value='italian'>Italian</option>
|
||||
<option value='japanese'>Japanese</option>
|
||||
<option value='japanese-romaji'>Romanized Japanese</option>
|
||||
<option value='kannada'>Kannada</option>
|
||||
<option value='kazakh'>Kazakh</option>
|
||||
<option value='kirghiz'>Kirghiz</option>
|
||||
<option value='korean'>Korean</option>
|
||||
<option value='korean-romaji'>Romanized Korean</option>
|
||||
<option value='lao'>Lao</option>
|
||||
<option value='latvian'>Latvian</option>
|
||||
<option value='lithuanian'>Lithuanian</option>
|
||||
<option value='macedonian'>Macedonian</option>
|
||||
<option value='malay'>Malay</option>
|
||||
<option value='malayalam'>Malayalam</option>
|
||||
<option value='mongolian'>Mongolian</option>
|
||||
<option value='nepali'>Nepali</option>
|
||||
<option value='norwegian'>Norwegian</option>
|
||||
<option value='panjabi'>Panjabi</option>
|
||||
<option value='polish'>Polish</option>
|
||||
<option value='portuguese'>Portuguese</option>
|
||||
<option value='romanian'>Romanian</option>
|
||||
<option value='russian'>Russian</option>
|
||||
<option value='serbian'>Serbian</option>
|
||||
<option value='slovak'>Slovak</option>
|
||||
<option value='slovenian'>Slovenian</option>
|
||||
<option value='spanish'>Spanish</option>
|
||||
<option value='suomi'>Suomi</option>
|
||||
<option value='swedish'>Swedish</option>
|
||||
<option value='tamil'>Tamil</option>
|
||||
<option value='tamil-romanized'>Romanized Tamil</option>
|
||||
<option value='telugu'>Telugu</option>
|
||||
<option value='telugu-romanized'>Romanized Telugu</option>
|
||||
<option value='thai'>Thai</option>
|
||||
<option value='turkish'>Turkish</option>
|
||||
<option value='ukrainian'>Ukrainian</option>
|
||||
<option value='urdu'>Urdu</option>
|
||||
<option value='urdu-romaji'>Romanized Urdu</option>
|
||||
<option value='uzbek'>Uzbek</option>
|
||||
<option value='vietnamese'>Vietnamese</option>
|
||||
<option value='disabled'>Disabled</option>
|
||||
<option value='ab'>Abkhazian</option>
|
||||
<option value='aa'>Afar</option>
|
||||
<option value='af'>Afrikaans</option>
|
||||
<option value='ak'>Akan</option>
|
||||
<option value='sq'>Albanian</option>
|
||||
<option value='am'>Amharic</option>
|
||||
<option value='ar'>Arabic</option>
|
||||
<option value='an'>Aragonese</option>
|
||||
<option value='hy'>Armenian</option>
|
||||
<option value='as'>Assamese</option>
|
||||
<option value='a5'>Assamese-romaji</option>
|
||||
<option value='a3'>Asturian</option>
|
||||
<option value='av'>Avaric</option>
|
||||
<option value='ae'>Avestan</option>
|
||||
<option value='ay'>Aymara</option>
|
||||
<option value='az'>Azerbaijani</option>
|
||||
<option value='bm'>Bambara</option>
|
||||
<option value='ba'>Bashkir</option>
|
||||
<option value='eu'>Basque</option>
|
||||
<option value='b1'>Bavarian</option>
|
||||
<option value='be'>Belarusian</option>
|
||||
<option value='bn'>Bengali</option>
|
||||
<option value='b5'>Bengali-romaji</option>
|
||||
<option value='bh'>Bihari languages</option>
|
||||
<option value='b3'>Bishnupriya</option>
|
||||
<option value='bi'>Bislama</option>
|
||||
<option value='bs'>Bosnian</option>
|
||||
<option value='br'>Breton</option>
|
||||
<option value='bg'>Bulgarian</option>
|
||||
<option value='my'>Burmese</option>
|
||||
<option value='ca'>Catalan</option>
|
||||
<option value='c2'>Cebuano</option>
|
||||
<option value='b2'>Central bikol</option>
|
||||
<option value='c3'>Central kurdish</option>
|
||||
<option value='ch'>Chamorro</option>
|
||||
<option value='c1'>Chavacano</option>
|
||||
<option value='ce'>Chechen</option>
|
||||
<option value='ny'>Chichewa</option>
|
||||
<option value='zh'>Chinese (simplified)</option>
|
||||
<option value='z1'>Chinese (traditional)</option>
|
||||
<option value='rz'>Chinese-romaji</option>
|
||||
<option value='cu'>Church slavic</option>
|
||||
<option value='cv'>Chuvash</option>
|
||||
<option value='kw'>Cornish</option>
|
||||
<option value='co'>Corsican</option>
|
||||
<option value='cr'>Cree</option>
|
||||
<option value='c4'>Creoles and pidgins</option>
|
||||
<option value='c5'>Creoles and pidgins, english based</option>
|
||||
<option value='c6'>Creoles and pidgins, french-based</option>
|
||||
<option value='c7'>Creoles and pidgins, portuguese-based</option>
|
||||
<option value='hr'>Croatian</option>
|
||||
<option value='cs'>Czech</option>
|
||||
<option value='da'>Danish</option>
|
||||
<option value='d1'>Dimli (individual language)</option>
|
||||
<option value='dv'>Divehi</option>
|
||||
<option value='d3'>Dotyali</option>
|
||||
<option value='nl'>Dutch</option>
|
||||
<option value='dz'>Dzongkha</option>
|
||||
<option value='m2'>Eastern mari</option>
|
||||
<option value='a2'>Egyptian arabic</option>
|
||||
<option value='e1'>Emilian-romagnol</option>
|
||||
<option value='en'>English</option>
|
||||
<option value='m6'>Erzya</option>
|
||||
<option value='eo'>Esperanto</option>
|
||||
<option value='et'>Estonian</option>
|
||||
<option value='ee'>Ewe</option>
|
||||
<option value='fo'>Faroese</option>
|
||||
<option value='h1'>Fiji hindi</option>
|
||||
<option value='fj'>Fijian</option>
|
||||
<option value='f1'>Filipino</option>
|
||||
<option value='fi'>Finnish</option>
|
||||
<option value='fr'>French</option>
|
||||
<option value='f2'>Frisian, northern</option>
|
||||
<option value='fy'>Frisian, western</option>
|
||||
<option value='ff'>Fulah</option>
|
||||
<option value='gl'>Galician</option>
|
||||
<option value='lg'>Ganda</option>
|
||||
<option value='ka'>Georgian</option>
|
||||
<option value='de'>German</option>
|
||||
<option value='n2'>German, low</option>
|
||||
<option value='g1'>Goan konkani</option>
|
||||
<option value='el'>Greek</option>
|
||||
<option value='e2'>Greek-romaji</option>
|
||||
<option value='kl'>Greenlandic</option>
|
||||
<option value='gn'>Guarani</option>
|
||||
<option value='gu'>Gujarati</option>
|
||||
<option value='g2'>Gujarati-romaji</option>
|
||||
<option value='ht'>Haitian creole</option>
|
||||
<option value='ha'>Hausa</option>
|
||||
<option value='he'>Hebrew</option>
|
||||
<option value='hz'>Herero</option>
|
||||
<option value='hi'>Hindi</option>
|
||||
<option value='h3'>Hindi-romaji</option>
|
||||
<option value='ho'>Hiri motu</option>
|
||||
<option value='hu'>Hungarian</option>
|
||||
<option value='is'>Icelandic</option>
|
||||
<option value='io'>Ido</option>
|
||||
<option value='ig'>Igbo</option>
|
||||
<option value='i1'>Iloko</option>
|
||||
<option value='id'>Indonesian</option>
|
||||
<option value='ia'>Interlingua</option>
|
||||
<option value='ie'>Interlingue</option>
|
||||
<option value='iu'>Inuktitut</option>
|
||||
<option value='ik'>Inupiaq</option>
|
||||
<option value='ga'>Irish</option>
|
||||
<option value='it'>Italian</option>
|
||||
<option value='ja'>Japanese</option>
|
||||
<option value='rj'>Japanese-romaji</option>
|
||||
<option value='jv'>Javanese</option>
|
||||
<option value='x1'>Kalmyk</option>
|
||||
<option value='kn'>Kannada</option>
|
||||
<option value='k2'>Kannada-romaji</option>
|
||||
<option value='kr'>Kanuri</option>
|
||||
<option value='k1'>Karachay-balkar</option>
|
||||
<option value='ks'>Kashmiri</option>
|
||||
<option value='kk'>Kazakh</option>
|
||||
<option value='km'>Khmer, central</option>
|
||||
<option value='ki'>Kikuyu</option>
|
||||
<option value='rw'>Kinyarwanda</option>
|
||||
<option value='ky'>Kirghiz</option>
|
||||
<option value='kv'>Komi</option>
|
||||
<option value='kg'>Kongo</option>
|
||||
<option value='ko'>Korean</option>
|
||||
<option value='rk'>Korean-romaji</option>
|
||||
<option value='kj'>Kuanyama</option>
|
||||
<option value='ku'>Kurdish</option>
|
||||
<option value='lo'>Lao</option>
|
||||
<option value='la'>Latin</option>
|
||||
<option value='lv'>Latvian</option>
|
||||
<option value='l1'>Lezghian</option>
|
||||
<option value='li'>Limburgish</option>
|
||||
<option value='ln'>Lingala</option>
|
||||
<option value='lt'>Lithuanian</option>
|
||||
<option value='j1'>Lojban</option>
|
||||
<option value='l2'>Lombard</option>
|
||||
<option value='lu'>Luba-katanga</option>
|
||||
<option value='lb'>Luxembourgish</option>
|
||||
<option value='mk'>Macedonian</option>
|
||||
<option value='m1'>Maithili</option>
|
||||
<option value='mg'>Malagasy</option>
|
||||
<option value='ms'>Malay</option>
|
||||
<option value='ml'>Malayalam</option>
|
||||
<option value='m8'>Malayalam-romaji</option>
|
||||
<option value='mt'>Maltese</option>
|
||||
<option value='gv'>Manx</option>
|
||||
<option value='mi'>Maori</option>
|
||||
<option value='mr'>Marathi</option>
|
||||
<option value='m9'>Marathi-romaji</option>
|
||||
<option value='mh'>Marshallese</option>
|
||||
<option value='m7'>Mazanderani</option>
|
||||
<option value='m3'>Minangkabau</option>
|
||||
<option value='x2'>Mingrelian</option>
|
||||
<option value='m5'>Mirandese</option>
|
||||
<option value='mo'>Moldavian</option>
|
||||
<option value='mn'>Mongolian</option>
|
||||
<option value='n4'>Nahuatl</option>
|
||||
<option value='na'>Nauru</option>
|
||||
<option value='nv'>Navajo</option>
|
||||
<option value='nd'>Ndebele, north</option>
|
||||
<option value='nr'>Ndebele, south</option>
|
||||
<option value='ng'>Ndonga</option>
|
||||
<option value='n1'>Neapolitan</option>
|
||||
<option value='n3'>Nepal bhasa</option>
|
||||
<option value='ne'>Nepali</option>
|
||||
<option value='n5'>Nepali-romaji</option>
|
||||
<option value='l3'>Northern luri</option>
|
||||
<option value='no'>Norwegian</option>
|
||||
<option value='nb'>Norwegian bokmål</option>
|
||||
<option value='nn'>Norwegian nynorsk</option>
|
||||
<option value='oc'>Occitan</option>
|
||||
<option value='oj'>Ojibwa</option>
|
||||
<option value='or'>Oriya</option>
|
||||
<option value='o1'>Oriya-romaji</option>
|
||||
<option value='om'>Oromo</option>
|
||||
<option value='os'>Ossetian</option>
|
||||
<option value='pi'>Pali</option>
|
||||
<option value='p1'>Pampanga</option>
|
||||
<option value='pa'>Panjabi</option>
|
||||
<option value='p5'>Panjabi-romaji</option>
|
||||
<option value='fa'>Persian</option>
|
||||
<option value='p2'>Pfaelzisch</option>
|
||||
<option value='p3'>Piemontese</option>
|
||||
<option value='pl'>Polish</option>
|
||||
<option value='pt'>Portuguese</option>
|
||||
<option value='ps'>Pushto</option>
|
||||
<option value='qu'>Quechua</option>
|
||||
<option value='ro'>Romanian</option>
|
||||
<option value='rm'>Romansh</option>
|
||||
<option value='rn'>Rundi</option>
|
||||
<option value='b4'>Russia buriat</option>
|
||||
<option value='ru'>Russian</option>
|
||||
<option value='r2'>Russian-romaji</option>
|
||||
<option value='r1'>Rusyn</option>
|
||||
<option value='se'>Sami, northern</option>
|
||||
<option value='sm'>Samoan</option>
|
||||
<option value='sg'>Sango</option>
|
||||
<option value='sa'>Sanskrit</option>
|
||||
<option value='s4'>Sanskrit-romaji</option>
|
||||
<option value='sc'>Sardinian</option>
|
||||
<option value='s3'>Scots</option>
|
||||
<option value='gd'>Scottish gaelic</option>
|
||||
<option value='sr'>Serbian</option>
|
||||
<option value='sh'>Serbo-croatian</option>
|
||||
<option value='sn'>Shona</option>
|
||||
<option value='ii'>Sichuan yi</option>
|
||||
<option value='s2'>Sicilian</option>
|
||||
<option value='sd'>Sindhi</option>
|
||||
<option value='si'>Sinhala</option>
|
||||
<option value='sk'>Slovak</option>
|
||||
<option value='sl'>Slovenian</option>
|
||||
<option value='so'>Somali</option>
|
||||
<option value='d2'>Sorbian, lower</option>
|
||||
<option value='h2'>Sorbian, upper</option>
|
||||
<option value='st'>Sotho, southern</option>
|
||||
<option value='a4'>South azerbaijani</option>
|
||||
<option value='es'>Spanish</option>
|
||||
<option value='su'>Sundanese</option>
|
||||
<option value='sw'>Swahili</option>
|
||||
<option value='ss'>Swati</option>
|
||||
<option value='sv'>Swedish</option>
|
||||
<option value='tl'>Tagalog</option>
|
||||
<option value='ty'>Tahitian</option>
|
||||
<option value='tg'>Tajik</option>
|
||||
<option value='ta'>Tamil</option>
|
||||
<option value='t2'>Tamil-romaji</option>
|
||||
<option value='tt'>Tatar</option>
|
||||
<option value='te'>Telugu</option>
|
||||
<option value='t3'>Telugu-romaji</option>
|
||||
<option value='th'>Thai</option>
|
||||
<option value='t4'>Thai-romaji</option>
|
||||
<option value='bo'>Tibetan</option>
|
||||
<option value='ti'>Tigrinya</option>
|
||||
<option value='to'>Tonga (tonga islands)</option>
|
||||
<option value='a1'>Tosk albanian</option>
|
||||
<option value='ts'>Tsonga</option>
|
||||
<option value='tn'>Tswana</option>
|
||||
<option value='tr'>Turkish</option>
|
||||
<option value='tk'>Turkmen</option>
|
||||
<option value='t1'>Tuvinian</option>
|
||||
<option value='tw'>Twi</option>
|
||||
<option value='ug'>Uighur</option>
|
||||
<option value='uk'>Ukrainian</option>
|
||||
<option value='ur'>Urdu</option>
|
||||
<option value='u1'>Urdu-romaji</option>
|
||||
<option value='uz'>Uzbek</option>
|
||||
<option value='ve'>Venda</option>
|
||||
<option value='v1'>Venetian</option>
|
||||
<option value='v2'>Veps</option>
|
||||
<option value='vi'>Vietnamese</option>
|
||||
<option value='v3'>Vlaams</option>
|
||||
<option value='vo'>Volapük</option>
|
||||
<option value='wa'>Walloon</option>
|
||||
<option value='w1'>Waray</option>
|
||||
<option value='cy'>Welsh</option>
|
||||
<option value='m4'>Western mari</option>
|
||||
<option value='p4'>Western panjabi</option>
|
||||
<option value='wo'>Wolof</option>
|
||||
<option value='w2'>Wu chinese</option>
|
||||
<option value='xh'>Xhosa</option>
|
||||
<option value='s1'>Yakut</option>
|
||||
<option value='yi'>Yiddish</option>
|
||||
<option value='yo'>Yoruba</option>
|
||||
<option value='y1'>Yue chinese</option>
|
||||
<option value='za'>Zhuang</option>
|
||||
<option value='zu'>Zulu</option>
|
||||
</select>
|
||||
</label>
|
||||
</div>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue