Détecter la langue de NSString
Quelqu'un m'a parlé d'un cours de reconnaissance linguistique dans Cocoa. Quelqu'un sait qui c'est?
C'est pas travailler:
NSSpellChecker *spellChecker = [NSSpellChecker sharedSpellChecker];
[spellChecker setAutomaticallyIdentifiesLanguages:YES];
NSString *spellCheckText = @"Guten Tag Herr Mustermann. Dies ist ein deutscher Text. Bitte löschen Sie diesen nicht.";
[spellChecker checkSpellingOfString:spellCheckText startingAt:0];
NSLog(@"%@", [spellChecker language]);
Le résultat est 'fr', mais devrait être 'de'.
5 réponses
Il y a une API dans cocoa disponible pour vérifier le langage d'une chaîne, et il est toujours préférable d'utiliser Foundation sur CoreFoundation chaque fois que possible.
NSArray *tagschemes = [NSArray arrayWithObjects:NSLinguisticTagSchemeLanguage, nil];
NSLinguisticTagger *tagger = [[NSLinguisticTagger alloc] initWithTagSchemes:tagschemes options:0];
[tagger setString:@"Das ist ein bisschen deutscher Text. Bitte löschen Sie diesen nicht."];
NSString *language = [tagger tagAtIndex:0 scheme:NSLinguisticTagSchemeLanguage tokenRange:NULL sentenceRange:NULL];
Sinon, si vous avez un texte en langue mixte, vous pouvez utiliser l'API enumerateLinguisticTagsInRange pour obtenir la langue de chaque mot dans le texte.
C'est le résultat:
- (NSString *)languageForString:(NSString *) text{
if (text.length < 100) {
return (NSString *) CFStringTokenizerCopyBestStringLanguage((CFStringRef)text, CFRangeMake(0, text.length));
} else {
return (NSString *)CFStringTokenizerCopyBestStringLanguage((CFStringRef)text, CFRangeMake(0, 100));
}
}
, Vous pouvez utiliser -requestCheckingOfString:…
à la place. NSTextCheckingTypeOrthography
tente d'identifier la langue utilisée dans la chaîne, et le gestionnaire d'achèvement reçoit un paramètre NSOrthography
qui peut être utilisé pour obtenir des informations sur l'orthographe dans la chaîne, y compris sa langue dominante.
L'exemple suivant génère dominant language = de
:
NSSpellChecker *spellChecker = [NSSpellChecker sharedSpellChecker];
[spellChecker setAutomaticallyIdentifiesLanguages:YES];
NSString *spellCheckText = @"Guten Herr Mustermann. Dies ist ein deutscher Text. Bitte löschen Sie diesen nicht.";
[spellChecker requestCheckingOfString:spellCheckText
range:(NSRange){0, [spellCheckText length]}
types:NSTextCheckingTypeOrthography
options:nil
inSpellDocumentWithTag:0
completionHandler:^(NSInteger sequenceNumber, NSArray *results, NSOrthography *orthography, NSInteger wordCount) {
NSLog(@"dominant language = %@", orthography.dominantLanguage);
}];
Une extension de Chaîne swift pour la réponse de Jennifer:
extension String {
func language() -> String? {
let tagger = NSLinguisticTagger(tagSchemes: [NSLinguisticTagSchemeLanguage], options: 0)
tagger.string = self
return tagger.tagAtIndex(0, scheme: NSLinguisticTagSchemeLanguage, tokenRange: nil, sentenceRange: nil)
}
}
Utilisation:
let language = "What language is this?".language()
, Comme d'iOS 11, vous pouvez utiliser le dominantLanguage(for:)
/dominantLanguageForString:
méthode de la classe de NSLinguisticTagger
.
Swift:
extension String {
var language: String? {
return NSLinguisticTagger.dominantLanguage(for: self)
}
}
print("Good morning".language)
print("Buenos días".language)
Objectif-C:
@interface NSString (Tagger)
@property (nonatomic, readonly, nullable) NSString *language;
@end
@implementation NSString (Tagger)
- (NSString *)language {
return [NSLinguisticTagger dominantLanguageForString:self];
}
@end
NSLog(@"%@", @"Good morning".language);
NSLog(@"%@", @"Buenos días".language);
Sortie (pour les deux):
Fr
es