diff --git a/lib/localization/locales/manifest.json b/lib/localization/locales/manifest.json
index fb3527b..7596c85 100644
--- a/lib/localization/locales/manifest.json
+++ b/lib/localization/locales/manifest.json
@@ -9,6 +9,8 @@
"is",
"it",
"ja",
+ "nb",
+ "nn",
"pt-BR",
"tr",
"zh-CN",
diff --git a/lib/localization/locales/nb.json b/lib/localization/locales/nb.json
new file mode 100644
index 0000000..eb9da19
--- /dev/null
+++ b/lib/localization/locales/nb.json
@@ -0,0 +1,64 @@
+{
+ "loading": "Laster inn…",
+ "why_am_i_seeing": "Hvorfor ser jeg dette?",
+ "protected_by": "Beskyttet av",
+ "protected_from": "Fra",
+ "made_with": "Laget med ❤️ i 🇨🇦",
+ "mascot_design": "Maskotdesign av",
+ "ai_companies_explanation": "Du ser dette fordi administratoren av dette nettstedet har satt opp Anubis for å beskytte sørveren mot plagen av KI-selskaper som aggressivt skraper nettsteder. Dette kan, og fortsetter med å, forårsake driftstans for nettstedene, som gjør ressursene deres utilgjengelige for alle.",
+ "anubis_compromise": "Anubis er et kompromiss. Anubis bruker et «Proof-of-Work»-skjema som ligner på Hashcash, et lignende skjema for å redusere søppel-e-post. Idéen er at ved småstilte tilfeller er den ytterligere belastningen ignorerbar, men ved storstilt skraping samler den på seg fart og gjør det å skrape mye mer dyrt.",
+ "hack_purpose": "Til syvende og sist er dette en hack som har som formål å gi en «god nok» plassholderløsning slik at mer tid kan brukes på å fingeravtrykke og gjenkjenne hodeløse nettlesere (f.eks. hvordan de gjengir skrifttyper) slik at utfordringssiden ikke må bli vist til brukere som er mer sannsynligvis ekte.",
+ "jshelter_note": "NB: Anubis krever bruk av moderne JavaScript-funksjoner som tillegg som JShelter slår av. Vennligst slå av JShelter eller lignende tillegg for dette domenet.",
+ "version_info": "Dette nettstedet kjører Anubis-utgave",
+ "try_again": "Prøv igjen",
+ "go_home": "Gå hjem",
+ "contact_webmaster": "eller om du synes at du ikke burde være blokkert, vennligst ta kontakt med administratoren på",
+ "connection_security": "Vennligst vent mens vi bekrefter tryggheten av tilkoblingen din.",
+ "javascript_required": "Du må dessverre slå på JavaScript for å komme deg forbi denne utfordringen. Dette kreves fordi KI-selskaper har endret sosialkontrakten om hvordan nettstedsverting fungerer. En ikke-JS-løsning er i gang med å skapes.",
+ "benchmark_requires_js": "JavaScript må være påslått for å kjøre sammenligningsverktøyet.",
+ "difficulty": "Vanskelighetsnivå:",
+ "algorithm": "Algoritme:",
+ "compare": "Jevnfør:",
+ "time": "Tid",
+ "iters": "Gjentakelser",
+ "time_a": "Tid A",
+ "iters_a": "Gjentakelser A",
+ "time_b": "Tid B",
+ "iters_b": "Gjentakelser B",
+ "static_check_endpoint": "Dette er bare et sjekkeendepunkt for din omvendte proxy å bruke.",
+ "authorization_required": "Legitimasjon kreves",
+ "cookies_disabled": "Nettleseren din er konfigurert for å avslå informasjonskapsler. Anubis krever informasjonskapsler for å bekrefte at du er en ekte bruker. Vennligst slå på informasjonskapsler på dette domenet.",
+ "access_denied": "Adgang nektet: feilkode",
+ "dronebl_entry": "DroneBL rapporterte em oppføring.",
+ "see_dronebl_lookup": "se",
+ "internal_server_error": "Intern serverfeil: administratoren har feilkonfigurert Anubis. Vennligst ta kontakt med hen og spør hen om å se gjennom loggene om",
+ "invalid_redirect": "Ugyldig omdirigering",
+ "redirect_not_parseable": "Omdirigerings-URL-en kunne ikkj tolkes",
+ "redirect_domain_not_allowed": "Omdirigeringsdomenet er ikke tillatt",
+ "failed_to_sign_jwt": "mislyktes i å signere JWT",
+ "invalid_invocation": "Ugyldig fremkalling av MakeChallenge",
+ "client_error_browser": "Klientfeil: Vennligst sørg for at at nettleseren din er oppdatert og prøv igjen senere.",
+ "oh_noes": "Å nei!",
+ "benchmarking_anubis": "Sammenligner Anubis!",
+ "you_are_not_a_bot": "Du er ikke en bot!",
+ "making_sure_not_bot": "Bekrefter at du ikke er en bot!",
+ "celphase": "CELPHASE",
+ "js_web_crypto_error": "Nettleseren din har ikke et fungerande web.crypto-element. Ser du dette med ei sikker tilkopling?",
+ "js_web_workers_error": "Nettleseren din støtter ikke nettarbeidere (Anubis bruker dette for å unngå å fryse nettleseren din). Har du et tillegg som JShelter installert?",
+ "js_cookies_error": "Nettleseren lagrer ikke informasjonskapsler. Anubis bruker informasjonskapsler for å avgjøre hvilke klienter har lyktes i utfordringen ved å lagre en signert token i en informasjonskapsel. Vennligst slå på informasjonskapsler på dette domenet. Navnene på informasjonskapslene Anubis lagrer, kan variere uten varsel. Informasjonskapselnavn og -verdier er ikke en del av det offentlege API-et.",
+ "js_context_not_secure": "Du bruker ikke en sikker tilkobling!",
+ "js_context_not_secure_msg": "Prøv å koble til over HTTPS eller fortell administratoren å opprette HTTPS. Se MDN for mer informasjon.",
+ "js_calculating": "Beregner…",
+ "js_missing_feature": "Mangler funksjon",
+ "js_challenge_error": "Utfordringsfeil!",
+ "js_challenge_error_msg": "Mislyktes i å tolke sjekkalgoritmen. Du burde laste inn denne siden på nytt.",
+ "js_calculating_difficulty": "Beregner…
Vanskelighetsnivå:",
+ "js_speed": "Hastighet:",
+ "js_verification_longer": "Verifisering tar lengre enn forventet. Vennligst ikke last inn denne siden på nytt.",
+ "js_success": "Vellykket!",
+ "js_done_took": "Ferdig! Tok",
+ "js_iterations": "gjentakelser",
+ "js_finished_reading": "Jeg har sluttet å lese, fortsett →",
+ "js_calculation_error": "Beregningsfeil!",
+ "js_calculation_error_msg": "Mislyktes i å beregne utfordring:"
+}
\ No newline at end of file
diff --git a/lib/localization/locales/nn.json b/lib/localization/locales/nn.json
new file mode 100644
index 0000000..1698e6e
--- /dev/null
+++ b/lib/localization/locales/nn.json
@@ -0,0 +1,64 @@
+{
+ "loading": "Lastar inn…",
+ "why_am_i_seeing": "Kvifor ser eg dette?",
+ "protected_by": "Verna av",
+ "protected_from": "Frå",
+ "made_with": "Laga med ❤️ i 🇨🇦",
+ "mascot_design": "Maskotdesign av",
+ "ai_companies_explanation": "Du ser dette av di administratoren av denne nettstaden har sett opp Anubis for å verne sørvaren mot plaga av KI-selskap som aggressivt skrapar nettstader. Dette kan, og held frem med å, forårsake driftstans for nettstadene, som gjer ressursane deira utilgjengelege for alle.",
+ "anubis_compromise": "Anubis er eit kompromiss. Anubis brukar eit «Proof-of-Work»-skjema som liknar på Hashcash, eit liknande skjema for å redusere søppel-e-post. Idéen er at ved småstilte tilfelle er den ytterlegare lastinga ignorerbar, men ved storstilt skraping samlar ho på seg fart og gjer det å skrapa mykje meir dyrt.",
+ "hack_purpose": "Til sjuande og sist er dette ein hack som har som formål å gje ei «god nok» plasshaldarløysing slik at meir tid kan brukast på å fingeravtrykkje og attkjenne hovudlause nettlesarar (f.eks. korleis dei attgjev skrifttypar) slik at utfordringssida ikkje må verte synt til brukarar som er meir sannsynlegvis ekte.",
+ "jshelter_note": "NB: Anubis krev bruk av moderne JavaScript-funksjonar som tillegg som JShelter slår av. Venlegast slå av JShelter eller liknande tillegg for dette domenet.",
+ "version_info": "Denne nettstaden køyrer Anubis-utgåve",
+ "try_again": "Prøv att",
+ "go_home": "Gå heim",
+ "contact_webmaster": "eller om du synest at du ikkje burde vera blokkert, venlegast tak kontakt med administratoren på",
+ "connection_security": "Venlegast vent medan vi stadfestar tryggleiken av tilkoplinga di.",
+ "javascript_required": "Du lyt diverre slå på JavaScript for å koma deg forbi denne utfordringa. Dette krevst av di KI-selskap har endra sosialkontrakten om korleis nettstadsverting fungerer. Ei ikkje-JS-løysing er i gang med å skapast.",
+ "benchmark_requires_js": "JavaScript må vera slegen på for å køyre samanlikningsverktøyet.",
+ "difficulty": "Vanskenivå:",
+ "algorithm": "Algoritme:",
+ "compare": "Jamfør:",
+ "time": "Tid",
+ "iters": "Oppattakingar",
+ "time_a": "Tid A",
+ "iters_a": "Oppattakingar A",
+ "time_b": "Tid B",
+ "iters_b": "Oppattakingar B",
+ "static_check_endpoint": "Dette er berre eit sjekkeendepunkt for din omvende proxy å bruke.",
+ "authorization_required": "Legitimasjon krevst",
+ "cookies_disabled": "Nettlesaren din er konfigurert for å avslå informasjonskapslar. Anubis krev informasjonskapslar for å stadfeste at du er ein ekte brukar. Venlegast slå på informasjonskapslar på dette domenet.",
+ "access_denied": "Tilgang nekta: feilkode",
+ "dronebl_entry": "DroneBL rapporterte ei oppføring.",
+ "see_dronebl_lookup": "sjå",
+ "internal_server_error": "Intern serverfeil: administratoren har feilkonfigurert Anubis. Venlegast tak kontakt med hen og spør hen om å sjå gjennom loggane om",
+ "invalid_redirect": "Ugyldig omdirigering",
+ "redirect_not_parseable": "Omdirigerings-URL-en kunne ikkje tolkast",
+ "redirect_domain_not_allowed": "Omdirigeringsdomenet er ikkje tillate",
+ "failed_to_sign_jwt": "mislukkast i å signere JWT",
+ "invalid_invocation": "Ugyldig framkalling av MakeChallenge",
+ "client_error_browser": "Klientfeil: Venlegast stadfest at nettlesaren din er oppdatert og prøv att seinare.",
+ "oh_noes": "Å nei!",
+ "benchmarking_anubis": "Samanliknar Anubis!",
+ "you_are_not_a_bot": "Du er ikkje ein bot!",
+ "making_sure_not_bot": "Stadfestar at du ikkje er ein bot!",
+ "celphase": "CELPHASE",
+ "js_web_crypto_error": "Nettlesaren din har ikkje eit fungerande web.crypto-element. Ser du dette med ei sikker tilkopling?",
+ "js_web_workers_error": "Nettlesaren din støttar ikkje nettarbeidarar (Anubis brukar dette for å unngå å fryse nettlesaren din). Har du eit tillegg som JShelter installert?",
+ "js_cookies_error": "Nettlesaren lagrar ikkje informasjonskapslar. Anubis brukar informasjonskapslar for å avgjera kva klientar har lukkast i utfordringa ved å lagra ein signert token i ein informasjonskapsel. Venlegast slå på informasjonskapslar på dette domenet. Namna på informasjonskapslane Anubis lagrar, kan variere utan varsel. Informasjonskapselnamn og -verdiar er ikkje ein del av det offentlege API-et.",
+ "js_context_not_secure": "Du brukar ikkje ei sikker tilkopling!",
+ "js_context_not_secure_msg": "Prøv å kople til over HTTPS eller fortel administratoren å opprette HTTPS. Sjå MDN for fleire opplysingar.",
+ "js_calculating": "Reknar…",
+ "js_missing_feature": "Manglar funksjon",
+ "js_challenge_error": "Utfordringsfeil!",
+ "js_challenge_error_msg": "Mislukkast i å tolke sjekkalgoritmen. Du burde laste inn denne sida på nytt.",
+ "js_calculating_difficulty": "Reknar…
Vanskenivå:",
+ "js_speed": "Fart:",
+ "js_verification_longer": "Verifisering tek lengre enn forventa. Venlegast ikkje last inn denne sida på nytt.",
+ "js_success": "Vellykka!",
+ "js_done_took": "Ferdig! Tok",
+ "js_iterations": "oppattakingar",
+ "js_finished_reading": "Eg har slutta å lesa, hald fram →",
+ "js_calculation_error": "Rekningsfeil!",
+ "js_calculation_error_msg": "Mislukkast i å rekne utfordring:"
+}
\ No newline at end of file