Skip to content

Commit

Permalink
Rise error if setting name contains “:”
Browse files Browse the repository at this point in the history
  • Loading branch information
1024jp committed May 20, 2024
1 parent 7d16ec7 commit 96a4268
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 47 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

### Improvements

- Display a warning if custom setting names contain “:”.
- [dev] Update the build environment to Xcode 15.4.


Expand Down
85 changes: 43 additions & 42 deletions CotEditor/Localizables/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -3190,251 +3190,252 @@
}
}
},
"InvalidNameError.containSlash.description" : {
"InvalidNameError.duplicated.description" : {
"extractionState" : "extracted_with_value",
"localizations" : {
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Název nesmí obsahovat znak „/“."
"value" : "Název „%@“ je již používán."
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Name darf kein „/“ enthalten."
"value" : "„%@“ wird bereits verwendet."
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Name can’t contain “/”."
"value" : "The name “%@” is already taken."
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Name can’t contain “/”."
"value" : "The name “%@” is already taken."
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "El nombre no puede contener “/”."
"value" : "El nombre “%@” ya está tomado."
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Le nom ne peut pas contenir « / »."
"value" : "Le nom « %@ » est déjà utilisé."
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Il nome non può contenere “/”."
"value" : "Il nome “%@” è già utilizzato."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "名前に“/”を含めることはできません。"
"value" : "“%@”はすでに使用されています。"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Naam mag geen '/' bevatten."
"value" : "De naam '%@' is al in gebruik."
}
},
"pt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nome não pode conter “/”."
"value" : "O nome “%@” já está sendo usado."
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ad “/” içeremez."
"value" : "“%@” adı halihazırda kullanılıyor."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "名称不能含有“/”。"
"value" : "“%@”已经在使用中。"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "名稱不能含有「/」。"
"value" : "「%@」已經在使用中。"
}
}
}
},
"InvalidNameError.duplicated.description" : {
"InvalidNameError.empty.description" : {
"extractionState" : "extracted_with_value",
"localizations" : {
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Název „%@“ je již používán."
"value" : "Název nemůže být prázdný."
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "„%@“ wird bereits verwendet."
"value" : "Name darf nicht leer sein."
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "The name “%@” is already taken."
"value" : "Name can’t be empty."
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "The name “%@” is already taken."
"value" : "Name can’t be empty."
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "El nombre “%@” ya está tomado."
"value" : "El nombre no puede estar vacío."
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Le nom « %@ » est déjà utilisé."
"value" : "Le nom ne peut pas être vide."
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Il nome “%@” è già utilizzato."
"value" : "Il nome non può essere vuoto."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "“%@”はすでに使用されています。"
"value" : "名前は空にできません。"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "De naam '%@' is al in gebruik."
"value" : "Naam mag niet leeg zijn."
}
},
"pt" : {
"stringUnit" : {
"state" : "translated",
"value" : "O nome “%@” já está sendo usado."
"value" : "Nome não pode estar vazio."
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "“%@” adı halihazırda kullanılıyor."
"value" : "Ad boş bırakılamaz."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "“%@”已经在使用中。"
"value" : "名称不能为空。"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "「%@」已經在使用中。"
"value" : "名稱不能為空。"
}
}
}
},
"InvalidNameError.empty.description" : {
"InvalidNameError.invalidCharacter.description" : {
"comment" : "%@ is an invalid character for filename",
"extractionState" : "extracted_with_value",
"localizations" : {
"cs" : {
"stringUnit" : {
"state" : "translated",
"value" : "Název nemůže být prázdný."
"value" : "Název nesmí obsahovat znak „%@“."
}
},
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Name darf nicht leer sein."
"value" : "Name darf kein „%@“ enthalten."
}
},
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "Name can’t be empty."
"value" : "Name can’t contain “%@”."
}
},
"en-GB" : {
"stringUnit" : {
"state" : "translated",
"value" : "Name can’t be empty."
"value" : "Name can’t contain “%@”."
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "El nombre no puede estar vacío."
"value" : "El nombre no puede contener “%@”."
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Le nom ne peut pas être vide."
"value" : "Le nom ne peut pas contenir « %@ »."
}
},
"it" : {
"stringUnit" : {
"state" : "translated",
"value" : "Il nome non può essere vuoto."
"value" : "Il nome non può contenere “%@”."
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "名前は空にできません。"
"value" : "名前に“%@”を含めることはできません。"
}
},
"nl" : {
"stringUnit" : {
"state" : "translated",
"value" : "Naam mag niet leeg zijn."
"value" : "Naam mag geen '%@' bevatten."
}
},
"pt" : {
"stringUnit" : {
"state" : "translated",
"value" : "Nome não pode estar vazio."
"value" : "Nome não pode conter “%@”."
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ad boş bırakılamaz."
"value" : "Ad “%@” içeremez."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "名称不能为空。"
"value" : "名称不能含有“%@”。"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "名稱不能為空。"
"value" : "名稱不能含有「%@」。"
}
}
}
Expand Down
15 changes: 10 additions & 5 deletions CotEditor/Sources/SettingFileManaging.swift
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,11 @@ extension SettingFileManaging {
}

if settingName.contains("/") { // invalid for filename
throw InvalidNameError.containSlash
throw InvalidNameError.invalidCharacter("/")
}

if settingName.contains(":") { // invalid for filename
throw InvalidNameError.invalidCharacter(":")
}

if settingName.hasPrefix(".") { // invalid for filename
Expand Down Expand Up @@ -477,7 +481,7 @@ extension SettingFileManaging {
enum InvalidNameError: LocalizedError {

case empty
case containSlash
case invalidCharacter(String)
case startWithDot
case duplicated(name: String)
case reserved(name: String)
Expand All @@ -489,9 +493,10 @@ enum InvalidNameError: LocalizedError {
case .empty:
String(localized: "InvalidNameError.empty.description",
defaultValue: "Name can’t be empty.")
case .containSlash:
String(localized: "InvalidNameError.containSlash.description",
defaultValue: "Name can’t contain “/”.")
case .invalidCharacter(let string):
String(localized: "InvalidNameError.invalidCharacter.description",
defaultValue: "Name can’t contain “\(string)”.",
comment: "%@ is an invalid character for filename")
case .startWithDot:
String(localized: "InvalidNameError.startWithDot.description",
defaultValue: "Name can’t begin with “.”.")
Expand Down

0 comments on commit 96a4268

Please sign in to comment.