diff options
author | joop <Joop Kiefte> | 2022-04-02 02:43:16 +0100 |
---|---|---|
committer | joop <Joop Kiefte> | 2022-04-02 02:43:16 +0100 |
commit | 603446228ab0dab7e7c2f5b38cba597897d59341 (patch) | |
tree | e121e1010329ed301379182f1bd386d9ec49d3b1 |
Initial commit
-rw-r--r-- | main.go | 322 | ||||
-rw-r--r-- | rel/code.list | 230 | ||||
-rw-r--r-- | rel/lang.csv | 106 |
3 files changed, 658 insertions, 0 deletions
@@ -0,0 +1,322 @@ +// Phelpsify is a tool to help assign prayer codes to prayers. +// It requests prayers from bahaiprayers.net via the API url. +// It reads already assigned prayer codes from rel/code.list. +// It reads the conversion from number to language code from rel/lang.csv. +// It writes the new prayer codes to rel/code.list. +// rel/code.list is structured as prayer code, comma, prayer ids from bahaiprayers.net all separated by commas per line. +// rel/lang.csv is a csv file with header id,iso,iso_type,name,english,flag_link,rtl. +// The tool is a command line tool that first asks which languages you want to complete. +// It then presents you a random prayer from those languages that doesn't have +// a prayer code yet. It will then help you find the prayer among the prayers that already have a prayer code using keyword based search. +// When a match is found, the id of the prayer will be added to the list after the prayer code. +// The tool then asks you if you want to add another prayer and repeat the process. +package main + +import ( + "encoding/csv" + "encoding/json" + "fmt" + "math/rand" + "net/http" + "os" + "strconv" + "strings" +) + +//BPNAPI is the API link of bahaiprayers.net +//It is used to get the list of prayers per language by numerical id from lang.csv +var BPNAPI = "https://bahaiprayers.net/api/prayer/prayersystembylanguage?languageid=" + +type BPNKind string + +type Language struct { + Id int + Iso string + IsoType string + Name string + English string + FlagLink string + Rtl bool +} + +//BPNAPIOutput is the JSON structure of the API output +type BPNAPIOutput struct { + ErrorMessage string + IsInError bool + Version int + Prayers []Prayer + Tags []struct { + Id int + LanguageId int + Name string + Kind BPNKind + PrayerCount int + } + TagRelations []struct { + Id int + PrayerId int + PrayerTagId int + LanguageId int + } + Urls []interface{} + Languages []struct { + Id int + Name string + English string + IsLeftToRight bool + FlagLink string + } +} + +type Prayer struct { + Id int + AuthorId int + LanguageId int + Text string + Tags []struct { + Id int + Name string + Kind BPNKind + } + Tagkind struct { + Kind BPNKind + } + Urls []interface{} +} + +func (p Prayer) Author() string { + if p.AuthorId > 0 && p.AuthorId < 4 { + return []string{"Báb", "Bahá'u'lláh", "Abdu'l-Bahá"}[p.AuthorId-1] + } + return "Unknown Author" +} + +type PrayerCode struct { + Code string + Language string +} + +var Languages []Language +var CodeList map[string][]int +var PrayersWithCode map[PrayerCode]Prayer + +// ReadLangCSV reads rel/lang.csv and puts it in Languages +// It does so by matching each CSV field to a struct field +func ReadLangCSV() error { + file, err := os.Open("rel/lang.csv") + if err != nil { + return err + } + defer file.Close() + reader := csv.NewReader(file) + langCSV, err := reader.ReadAll() + if err != nil { + return err + } + for _, lang := range langCSV { + var language Language + language.Id, _ = strconv.Atoi(lang[0]) + language.Iso = lang[1] + language.IsoType = lang[2] + language.Name = lang[3] + language.English = lang[4] + language.FlagLink = lang[5] + language.Rtl, _ = strconv.ParseBool(lang[6]) + Languages = append(Languages, language) + } + return nil +} + +func ReadCodeList() error { + file, err := os.Open("rel/code.list") + if err != nil { + return err + } + defer file.Close() + CodeList = make(map[string][]int) + reader := csv.NewReader(file) + for { + line, err := reader.Read() + if err != nil { + break + } + CodeList[line[0]] = make([]int, 0) + for _, prayerIDstr := range line[1:] { + prayerID, err := strconv.Atoi(prayerIDstr) + if err != nil { + return err + } + CodeList[line[0]] = append(CodeList[line[0]], prayerID) + } + } + return nil +} + +func WriteCodeList(codeList map[string][]int) error { + file, err := os.Create("rel/code.list") + if err != nil { + return err + } + defer file.Close() + writer := csv.NewWriter(file) + for code, prayerIDs := range codeList { + line := make([]string, 0) + line = append(line, code) + for _, prayerID := range prayerIDs { + line = append(line, strconv.Itoa(prayerID)) + } + writer.Write(line) + } + writer.Flush() + return nil +} + +func AskLanguages() []Language { + // Ask "Which languages do you want to complete?" + // The answer is a list of language codes that must be converted to numbers + // using the conversion from lang.csv in Languages + fmt.Print("Which languages do you want to complete? ") + var languages []string + fmt.Scanln(&languages) + var outLangs []Language + for _, language := range languages { + for _, lang := range Languages { + if lang.Iso == language || lang.English == language { + outLangs = append(outLangs, lang) + } + } + } + return outLangs +} + +func Code(p Prayer) string { + // Get the prayer code for a prayer via CodeList + // or return an empty string if it's not on the list + for code, prayerIDs := range CodeList { + for _, prayerID := range prayerIDs { + if p.Id == prayerID { + return code + } + } + } + return "" +} + +func ReadPrayers(lang []Language) []Prayer { + var prayers []Prayer + for _, language := range lang { + response, err := http.Get(BPNAPI + strconv.Itoa(language.Id)) + if err != nil { + fmt.Println(err) + return nil + } + defer response.Body.Close() + var output BPNAPIOutput + err = json.NewDecoder(response.Body).Decode(&output) + if err != nil { + fmt.Println(err) + return nil + } + for _, prayer := range output.Prayers { + if Code(prayer) == "" { + prayers = append(prayers, prayer) + } + } + } + return prayers +} + +func main() { + err := ReadLangCSV() + if err != nil { + panic(err) + } + err = ReadCodeList() + if err != nil { + panic(err) + } + // Iterate over all languages and read in all prayers + // with a language code to PrayersWithCode + for _, language := range Languages { + prayers := ReadPrayers([]Language{language}) + for _, prayer := range prayers { + code := Code(prayer) + if code != "" { + prayerCode := PrayerCode{code, language.Iso} + PrayersWithCode[prayerCode] = prayer + } + } + } + for { + languages := AskLanguages() + prayers := ReadPrayers(languages) + // randomize the order of the prayers + for i := len(prayers) - 1; i > 0; i-- { + j := rand.Intn(i + 1) + prayers[i], prayers[j] = prayers[j], prayers[i] + } + // pick the first prayer from the resulting list that + // doesn't have a code in CodeList. + var prayer Prayer + var code string + for _, p := range prayers { + if Code(p) == "" { + prayer = p + break + } + } + // Present the text, id and author of the prayer + fmt.Println(prayer.Text) + fmt.Println("ID:", prayer.Id) + fmt.Println("Author:", prayer.Author()) + for code == "" { + // Ask for a keyword + fmt.Print("Input a keyword for this prayer: ") + var keyword string + fmt.Scanln(&keyword) + var Matches []Prayer + // Check for the prayer text of each prayer in + // PrayersWithCode if there is a match with the keyword + // and add it to Matches + for _, prayer := range PrayersWithCode { + if strings.Contains(prayer.Text, keyword) { + Matches = append(Matches, prayer) + } + } + // If there are no matches, ask again + if len(Matches) == 0 { + fmt.Println("No matches found.") + continue + } + // Ask which of the matches to use + fmt.Println("Which of the following matches?") + for i, match := range Matches { + fmt.Println(i+1, ":", match.Text) + fmt.Print("Does this match? (y/n) ") + var answer string + fmt.Scanln(&answer) + if answer == "y" { + prayer = match + code = Code(match) + break + } + } + } + // Add the code to CodeList + CodeList[code] = append(CodeList[code], prayer.Id) + // Ask if the user wants to identify another prayer + // or if they want to quit + // To identify another prayer, continue + // To quit, save the CodeList and quit + fmt.Print("Identify another prayer? (y/n) ") + var answer string + fmt.Scanln(&answer) + if answer == "n" { + err = WriteCodeList(CodeList) + if err != nil { + panic(err) + } + break + } + } +} diff --git a/rel/code.list b/rel/code.list new file mode 100644 index 0000000..678ed83 --- /dev/null +++ b/rel/code.list @@ -0,0 +1,230 @@ +BH00074BLE,4966 +BH00976INT,262 +BH11209,391 +BH03447,392 +BH00987,393 +BH10973,180 +BH00438,181 +BB00553,182 +BB00018DET,394 +AB00431PIT,184 +AB00073SER,396 +AB10275,186 +ABU0268AME,187 +BH10076,188 +ABU0129EDU,189 +AB10714,406 +AB10701,191 +AB11605,192 +AB04427LMP,193 +AB09040,408 +AB08693,195 +AB10324,196 +AB09794CHI,197 +AB10685,198 +BH09855,402 +AB11356,200 +AB04004BAB,404 +BH09085,202 +BH08308,203 +BH03109KIN,204 +AB11094,205 +AB03896MAJ,412 +AB07304,207 +AB07850,208 +AB05996,209 +AB00728MDS,210 +BH09289,211 +BH09508,212 +BH09864,213 +BH09024,214 +BH05894,215 +BH05771,216 +BB00560,217 +BB00522,218 +BB00015SUF,219 +AB04980HOP,220 +AB00553,221 +BH00009SER,222 +BH00009HOW,223 +AB06528MID,224 +BB00583,225 +BB00018FOR,226 +AB02000DIS,227 +AB03017CAL,228 +BH07683,229 +BH07469,230 +AB06211,231 +AB02342AWA,232 +AB00065STE,233 +BH07106,234 +BH08600FAC,235 +BH00005SEE,236 +BH05768,237 +BH08855,238 +BH00593,239 +BH00634,240 +BB00617,241 +BB00002MEN,242 +BB00485TRE,243 +ABU0030SHE,244 +AB00362LOV,245 +BH09848,248 +ABU0394GAT,187 +ABU0070GAT,418 +ABU0188TUR,419 +ABU0095KIN,420 +AB00388COM,421 +AB00397HEA,254 +ABU0003DIS,255 +BH08013,256 +BH01313NAM,257 +BH07721,258 +BH07105,259 +BH04475,260 +BH04990,261 +BH00870,262 +BH00868WIT,263 +ABU0009SER,264 +AB07124,414 +ABU0137ALL,415 +AB00787SPL,267 +AB03461MAR,268 +BH00001ABI,268 +BH03181,269 +AB05652WIS,270 +AB07158,271 +AB02596,272 +BH02777RIS,273 +BH00009SHE,274 +BH00009GRA,275 +BH00009AWA,276 +BH08264,277 +BB00556,280 +BB00018ANG,278 +BBU0015,279 +AB02866,281 +AB06012,282 +BH09401,283 +BH03111,284 +BH09960,285 +BH07180,286 +BH07661,287 +BB00018MAJ,288 +BH07113,289 +BH09872,290 +BH10578,291 +BH10688,292 +BH05801,293 +BB00147ORD,294 +BB00100EXI,295 +BB00490,296 +AB00001SHI,297 +AB07759,298 +AB00204PRO,299 +BH09498,300 +BH02848,273 +BH06296,301 +BH04421HEA,302 +BH06026,303 +BH07426FOO,304 +BH07780,305 +BH00554,306 +BH03562,307 +BH05543,308 +BH00531TRA,309 +BB00374,310 +AB07709CON,423 +AB11281,424 +AB09139,425 +AB00083RAD,426 +AB00128FEE,427 +AB02326,428 +AB00044PRO,429 +BH00053MAG,312 +BH08244,313 +BH08604,314 +BH07775,315 +BH08822,316 +BB00554,317 +BB00621,318 +AB00001FIR,319 +AB00687SEE,320 +BH08433,321 +BH08242,322 +BH00308DES,323 +BH08363,324 +BH00223MAG,325 +AB05805SER,326 +AB00189AID,327 +AB00156LOW,328 +AB05167,329 +AB00218SOU,330 +AB00049RAP,430 +AB00094WEA,431 +AB00032DAR,6475 +AB00241HIG,432 +AB00209UND,433 +AB00184KIN,434 +AB00210BIR,435 +AB00169FRA,436 +AB00169BEH,336 +BH08600TES,337 +BH02524,338 +BH09874,438 +BH03629GRI,339 +BH05071,340 +BB00623,341 +BB00001KNO,342 +BB00018ADJ,343 +BB00630,344 +BH09809,345 +BH11278RIV,346 +BH05703KEP,347 +BB00004REN,348 +BB00147GRO,349 +BB00543VIC,350 +BB00002ENA,351 +AB00065KIN,352 +AB00527,353 +BH10505,354 +ABU0023UNI,355 +BH09162,356 +BH09399,357 +BH06429,358 +BH07663,359 +BH07426DRE,360 +BH08852,361 +BH10231,362 +AB10769,363 +AB07155WOM,364 +AB00314HOR,365 +AB00949WIN,366 +AB10492,367 +AB10703RAD,368 +AB02825,369 +BH00154FIR,370 +BH10127,371 +BH01125,372 +BH07657,373 +BH01888,374 +BH00778,375 +BH10581,376 +BH01503ENJ,377 +BH09404,378 +BH01554HUQ,378 +BH02753ENT,379 +BH05849,380 +AB02024,381 +BH03908,382 +AB01023SAE,383 +AB00774SAB,384 +AB04620,385 +BH02022,386 +BH00687,387 +BH01026,388 +AB00204MAR,388 +BH02307,389 +AB03082,390 +AB08704NEW,246 +AB00963IMP,247
\ No newline at end of file diff --git a/rel/lang.csv b/rel/lang.csv new file mode 100644 index 0000000..da26e72 --- /dev/null +++ b/rel/lang.csv @@ -0,0 +1,106 @@ +id,iso,iso_type,name,english,flag_link,rtl
+1,en,language,English,English,https://BahaiPrayers.net/Content/Images/Flags/English.png,
+2,is,language,"Íslenska",Icelandic,"https://BahaiPrayers.net/Content/Images/Flags/Íslenska.png",
+3,de,language,Deutsch,German,https://BahaiPrayers.net/Content/Images/Flags/Deutsch.png,
+4,es,language,"Español",Spanish,"https://BahaiPrayers.net/Content/Images/Flags/Español.png",
+5,fa,original,"فارسی",Persian,"https://BahaiPrayers.net/Content/Images/Flags/فارسی.png",rtl
+6,ar,language,"العربية",Arabic,"https://BahaiPrayers.net/Content/Images/Flags/العربية.png",rtl
+7,fr,language,"Français",French,"https://BahaiPrayers.net/Content/Images/Flags/Français.png",
+8,pt,language,"Português (BR)",Portuguese,"https://BahaiPrayers.net/Content/Images/Flags/Português (BR).png",
+9,zh-Hans,language,"简体中文","Chinese Simplified","https://BahaiPrayers.net/Content/Images/Flags/简体中文.png",
+10,it,language,Italiano,Italian,https://BahaiPrayers.net/Content/Images/Flags/Italiano.png,
+11,nl,language,Nederlands,Dutch,https://BahaiPrayers.net/Content/Images/Flags/Nederlands.png,
+12,ro,language,"România",Romanian,"https://BahaiPrayers.net/Content/Images/Flags/România.png",
+13,lv,language,"Latviešu",Latvian,"https://BahaiPrayers.net/Content/Images/Flags/Latviešu.png",
+14,be,language,"Беларускі",Belarusian,"https://BahaiPrayers.net/Content/Images/Flags/Беларускі.png",
+15,ru,language,"Русский",Russian,"https://BahaiPrayers.net/Content/Images/Flags/Русский.png",
+16,hu,language,Magyar,Hungarian,https://BahaiPrayers.net/Content/Images/Flags/Magyar.png,
+17,sq,language,Shqip,Albanian,https://BahaiPrayers.net/Content/Images/Flags/Shqip.png,
+18,cs,language,"Česky",Czech,"https://BahaiPrayers.net/Content/Images/Flags/Česky.png",
+19,ja,language,"日本語",Japanese,"https://BahaiPrayers.net/Content/Images/Flags/日本語.png",
+20,af,language,Afrikaans,Afrikaans,https://BahaiPrayers.net/Content/Images/Flags/Afrikaans.png,
+21,ko,language,"한국어",Korean,"https://BahaiPrayers.net/Content/Images/Flags/한국어.png",
+22,bg,language,"български",Bulgarian,"https://BahaiPrayers.net/Content/Images/Flags/български.png",
+23,no,language,Norsk,Norwegian,https://BahaiPrayers.net/Content/Images/Flags/Norsk.png,
+24,sv,language,Svenska,Swedish,https://BahaiPrayers.net/Content/Images/Flags/Svenska.png,
+25,et,language,Eesti,Estonian,https://BahaiPrayers.net/Content/Images/Flags/Eesti.png,
+26,sk,language,Slovensky,Slovakian,https://BahaiPrayers.net/Content/Images/Flags/Slovensky.png,
+27,eo,language,Esperanto,Esperanto,https://BahaiPrayers.net/Content/Images/Flags/Esperanto.png,
+28,hr,language,Hrvatski,Croatian,https://BahaiPrayers.net/Content/Images/Flags/Hrvatski.png,
+29,ky,language,"Кыргыз",Kyrgyz,"https://BahaiPrayers.net/Content/Images/Flags/Кыргыз.png",
+30,sl,language,"Slovenščina",Slovene,"https://BahaiPrayers.net/Content/Images/Flags/Slovenščina.png",
+32,uk,language,"Україна",Ukranian,"https://BahaiPrayers.net/Content/Images/Flags/Україна.png",
+33,pl,language,Polski,Polish,https://BahaiPrayers.net/Content/Images/Flags/Polski.png,
+34,tl,language,Filipino,Filipino/Tagalog,https://BahaiPrayers.net/Content/Images/Flags/Filipino.png,
+35,hy,language,"հայերեն",Armenian,"https://BahaiPrayers.net/Content/Images/Flags/հայերեն.png",
+36,az,language,"Azərbaycan",Azerbaijan,"https://BahaiPrayers.net/Content/Images/Flags/Azərbaycan.png",
+37,bi,language,Vanuatu,"Vanuatu Regional",https://BahaiPrayers.net/Content/Images/Flags/Vanuatu.png,
+38,vi,language,"Tiếng Việt",Vietnamese,"https://BahaiPrayers.net/Content/Images/Flags/Tiếng Việt.png",
+39,ta,language,"தமிழ்",Tamil,"https://BahaiPrayers.net/Content/Images/Flags/தமிழ்.png",
+40,id,language,"Bahasa Indonesia",Indonesian,"https://BahaiPrayers.net/Content/Images/Flags/Bahasa Indonesia.png",
+41,bs,language,Bosanski,Bosnian,https://BahaiPrayers.net/Content/Images/Flags/Bosanski.png,
+42,cnr,language,Montenegrin,Montenegrin,https://BahaiPrayers.net/Content/Images/Flags/Montenegrin.png,
+43,th,language,"ภาษาไทย",Thai,"https://BahaiPrayers.net/Content/Images/Flags/ภาษาไทย.png",
+44,ca,language,"Català",Catalan,"https://BahaiPrayers.net/Content/Images/Flags/Català.png",
+46,hz,collection,Namibia,Namibia,https://BahaiPrayers.net/Content/Images/Flags/Namibia.png,
+47,ga,language,Irish,Irish,https://BahaiPrayers.net/Content/Images/Flags/Irish.png,
+48,fy,language,Frysk,Frisian,https://BahaiPrayers.net/Content/Images/Flags/Frysk.png,
+50,fo,language,"Føroyar","Faroe Islands","https://BahaiPrayers.net/Content/Images/Flags/Føroyar.png",
+51,srn,language,"Sranan Tongo",Suriname,"https://BahaiPrayers.net/Content/Images/Flags/Sranan Tongo.png",
+52,ch,language,Chamorro,"Guam/Marshall Is.",https://BahaiPrayers.net/Content/Images/Flags/Chamorro.png,
+53,eu,language,Euskara,"Basque (Spain)",https://BahaiPrayers.net/Content/Images/Flags/Euskara.png,
+54,gil,language,Kiribati,Kiribati,https://BahaiPrayers.net/Content/Images/Flags/Kiribati.png,
+55,mh,language,Marshallese,"Marshall Is.",https://BahaiPrayers.net/Content/Images/Flags/Marshallese.png,
+56,haw,language,Hawaiian,Hawaiian,https://BahaiPrayers.net/Content/Images/Flags/Hawaiian.png,
+57,lg,language,Luganda,"Ugandin Regional",https://BahaiPrayers.net/Content/Images/Flags/Luganda.png,
+58,da,language,Dansk,Danish,https://BahaiPrayers.net/Content/Images/Flags/Dansk.png,
+59,mi,language,"Māori","Maori / New Zealand","https://BahaiPrayers.net/Content/Images/Flags/Māori.png",
+60,cy,language,Cymraeg,Welsh,https://BahaiPrayers.net/Content/Images/Flags/Cymraeg.png,
+61,st,language,Sesotho,Lesotho,https://BahaiPrayers.net/Content/Images/Flags/Sesotho.png,
+62,kl,language,Kalaallisut,"Greenlandic (Inuit)",https://BahaiPrayers.net/Content/Images/Flags/Kalaallisut.png,
+63,hi,language,"हिंदी",Hindi,"https://BahaiPrayers.net/Content/Images/Flags/हिंदी.png",
+64,pap,language,Papiamentu,"Lesser Antilles",https://BahaiPrayers.net/Content/Images/Flags/Papiamentu.png,
+65,fj,language,Fiji,"Fiji Islands",https://BahaiPrayers.net/Content/Images/Flags/Fiji.png,
+66,ne,language,"नेपाली",Nepali,"https://BahaiPrayers.net/Content/Images/Flags/नेपाली.png",
+67,fi,language,Suomi,Finnish,https://BahaiPrayers.net/Content/Images/Flags/Suomi.png,
+68,el,language,"ελληνικά",Greek,"https://BahaiPrayers.net/Content/Images/Flags/ελληνικά.png",
+69,mt,language,Malti,Maltese,https://BahaiPrayers.net/Content/Images/Flags/Malti.png,
+70,ht,language,"Kreyol Ayisyen","Haitian Creole","https://BahaiPrayers.net/Content/Images/Flags/Kreyol Ayisyen.png",
+71,lt,language,"Lietuvių",Lithuanian,"https://BahaiPrayers.net/Content/Images/Flags/Lietuvių.png",
+72,lb,language,"Lëtzebuergesch",Luxembourg,"https://BahaiPrayers.net/Content/Images/Flags/Lëtzebuergesch.png",
+75,bn,language,"বাংলা",Bengali,"https://BahaiPrayers.net/Content/Images/Flags/বাংলা.png",
+76,ur,language,"اُردُو",Urdu,"https://BahaiPrayers.net/Content/Images/Flags/اُردُو.png",rtl
+78,zh-Hant,language,"繁體中文","Chinese Traditional","https://BahaiPrayers.net/Content/Images/Flags/繁體中文.png",
+80,ik,collection,"Alaska Native","Alaska Native","https://BahaiPrayers.net/Content/Images/Flags/Alaska Native.png",
+81,km,language,"ភាសាខ្មែរ",Khmer/Cambodia,"https://BahaiPrayers.net/Content/Images/Flags/ភាសាខ្មែរ.png",
+82,mg,language,Malagasy,Malagasy,https://BahaiPrayers.net/Content/Images/Flags/Malagasy.png,
+83,co,language,Corsica,Carsica,https://BahaiPrayers.net/Content/Images/Flags/Corsica.png,
+84,kn,language,"ಕನ್ನಡ",Kannada,"https://BahaiPrayers.net/Content/Images/Flags/ಕನ್ನಡ.png",
+85,nai-CA,collection,"Canadian Indigenous","Canadian Indigenous","https://BahaiPrayers.net/Content/Images/Flags/Canadian Indigenous.png",
+86,nai-US,collection,"American Indian","American Indian","https://BahaiPrayers.net/Content/Images/Flags/American Indian.png",
+87,ml,language,"മലയാളം",Malayalam,"https://BahaiPrayers.net/Content/Images/Flags/മലയാളം.png",
+90,am,language,"አማርኛ.",Ethiopian/Amharic,"https://BahaiPrayers.net/Content/Images/Flags/አማርኛ..png",
+91,iba,language,"Iban","Iban / Sarawak","https://BahaiPrayers.net/Content/Images/Flags/Iban.png",
+92,mn,language,"Монгол хэл","Mongolian","https://BahaiPrayers.net/Content/Images/Flags/Монгол хэл.png",
+93,sr,language,"Srpski српски","Serbian","https://BahaiPrayers.net/Content/Images/Flags/Srpski српски.png",
+94,ny,language,"Chichewa","Chichewa; Nyanja","https://BahaiPrayers.net/Content/Images/Flags/Chichewa.png",
+95,tvl,language,"Tuvalu","Tuvalu","https://BahaiPrayers.net/Content/Images/Flags/Tuvalu.png",
+96,te,language,"తెలుగు","Telugu","https://BahaiPrayers.net/Content/Images/Flags/తెలుగు.png",
+97,gu,language,"ગુજરાતી","Gujarati","https://BahaiPrayers.net/Content/Images/Flags/ગુજરાતી.png",
+98,se,language,"Sámi","Sami","https://BahaiPrayers.net/Content/Images/Flags/Sámi.png",
+99,sw,language,"Kiswahili","Swahili","https://BahaiPrayers.net/Content/Images/Flags/Kiswahili.png",
+100,ha,language,"Hausa","Hausa Nigeria","https://BahaiPrayers.net/Content/Images/Flags/Hausa.png",
+101,sne,language,"Bidayuh","Bidayuh","https://BahaiPrayers.net/Content/Images/Flags/Bidayuh.png",
+102,tk,language,"Türkmençe","Turkmen","https://BahaiPrayers.net/Content/Images/Flags/Türkmençe.png",
+103,sm,language,"Samoan","Samoan","https://BahaiPrayers.net/Content/Images/Flags/Samoan.png",
+104,ms,language,"Bahasa Melayu","Malay","https://BahaiPrayers.net/Content/Images/Flags/Bahasa Malaysia.png",
+106,mr,language,"मराठी","Marathi","https://BahaiPrayers.net/Content/Images/Flags/मराठी.png",
+107,tet,language,"Tetum","Tetum E. Timor","https://BahaiPrayers.net/Content/Images/Flags/Tetum.png",
+108,lo,language,"ພາສາລາວ","Lao","https://BahaiPrayers.net/Content/Images/Flags/ພາສາລາວ.png",
+110,tpi,language,"Tok Pisin","Pidgin English - PNG","https://BahaiPrayers.net/Content/Images/Flags/Tok Pisin.png",
+111,ksd,language,"Kuanua","Kuanua - PNG","https://BahaiPrayers.net/Content/Images/Flags/Kuanua.png",
+112,dgz,language,"Daga","Daga - PNG","https://BahaiPrayers.net/Content/Images/Flags/Daga.png",
+113,nal,language,"Nalik","Nalik - PNG","https://BahaiPrayers.net/Content/Images/Flags/Nalik.png",
+114,med,language,"Melpa","Melpa - PNG","https://BahaiPrayers.net/Content/Images/Flags/Melpa.png",
+115,kgf,language,"Kube","Kube - PNG","https://BahaiPrayers.net/Content/Images/Flags/Kube.png",
+116,ho,language,"Hiri Motu","Hiri Motu - PNG","https://BahaiPrayers.net/Content/Images/Flags/Hiri Motu.png",
|