Files
vaultnord-brand/locale/sprak.py
T
2026-08-31 21:12:36 +00:00

112 lines
3.7 KiB
Python

"""Norske tekster og vårt navn inn i web-klientens språkfiler.
Erstatter en `sed 's/Bitwarden/Vaultnord/g'` over hele fila. Den byttet navn
også i JSON-nøklene, og da slutter klienten å finne strengen - atten tekster
forsvant i stillhet, blant dem hele onboardingen. Samtidig slapp atten andre
unna, fordi de skriver navnet med liten forbokstav midt i en setning.
Reglene her:
* Nøkler røres aldri. De er klientens oppslagsord.
* Bare verdier byttes, og bare som helt ord.
* URL-er står urørt. bitwarden.com er deres adresse, ikke vår.
* Noen tekster handler faktisk om Bitwarden sine egne produkter - nettleser-
utvidelsen, Authenticator, Families. Å kalle dem våre ville vært å påstå at
vi eier noe andre har laget.
"""
import json
import re
import sys
# Tekster som virkelig handler om Bitwarden, og som skal fortsette å gjøre det.
BEHOLD = {
"twoStepContinueToBitwardenUrlTitle",
"twoStepContinueToBitwardenUrlDesc",
"openBitwardenExtension",
"contactBitwardenSupport",
"moreProductsFromBitwarden",
"moreFromBitwarden",
"sponsoredBitwardenFamilies",
"sponsorshipFreeBitwardenFamilies",
"acceptBitwardenFamiliesHelp",
"youHaveBitwardenPremium",
"startYour7DayFreeTrialOfBitwarden",
"startYour7DayFreeTrialOfBitwardenFor",
"startYour7DayFreeTrialOfBitwardenSecretsManagerFor",
"toHostBitwardenOnYourOwnServer",
}
URL = re.compile(r"https?://[^\s\"<>]+|[\w.-]+@[\w.-]+|bitwarden\.com", re.I)
ORD = re.compile(r"\bbitwarden\b", re.I)
def bytt(tekst: str, navn: str) -> str:
"""Bytter navnet i en tekst, men lar adresser stå."""
vern = []
def gjem(m):
vern.append(m.group(0))
return f"\x00{len(vern) - 1}\x00"
trygg = URL.sub(gjem, tekst)
trygg = ORD.sub(navn, trygg)
return re.sub(r"\x00(\d+)\x00", lambda m: vern[int(m.group(1))], trygg)
def rebrand(data: dict, navn: str) -> dict:
ut = {}
for nokkel, verdi in data.items():
if nokkel in BEHOLD or not isinstance(verdi, dict):
ut[nokkel] = verdi
continue
ny = dict(verdi)
if isinstance(ny.get("message"), str):
ny["message"] = bytt(ny["message"], navn)
ut[nokkel] = ny # nøkkelen selv står urørt
return ut
# Det bygget skal stoppe på. Hver linje er en feil vi har hatt.
KONTROLLER = [
("vaultWelcomeDialogTitle", "Velkommen", True, "norsk velkomsttekst mangler"),
("logInToBitwarden", "Vaultnord", True, "verdien er ikke byttet"),
("turnOnNewDeviceLoginProtectionModalDesc", "bitwarden", False,
"liten forbokstav slapp unna"),
("openBitwardenExtension", "Bitwarden", True, "unntaket ble overkjørt"),
]
def sjekk(sti: str) -> int:
data = json.load(open(sti))
feil = []
for nokkel, ord_, skal_finnes, hvorfor in KONTROLLER:
if nokkel not in data:
feil.append(f"{nokkel}: nøkkelen er borte - er den døpt om?")
continue
har = ord_.lower() in data[nokkel].get("message", "").lower()
if har != skal_finnes:
feil.append(f"{nokkel}: {hvorfor}")
if "bitwarden.com" not in json.dumps(data):
feil.append("adressene til bitwarden.com skal stå urørt")
for f in feil:
print(f" FEIL {f}", file=sys.stderr)
if not feil:
print(" språkfilene ser riktige ut")
return 1 if feil else 0
def main() -> int:
if sys.argv[1] == "--sjekk":
return sjekk(sys.argv[2])
sti, navn = sys.argv[1], sys.argv[2]
over = json.load(open(sys.argv[3])) if len(sys.argv) > 3 else {}
data = json.load(open(sti))
data.update(over) # våre egne tekster først
json.dump(rebrand(data, navn), open(sti, "w"), ensure_ascii=False, indent=1)
return 0
if __name__ == "__main__":
sys.exit(main())