112 lines
3.7 KiB
Python
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())
|