2011-06-12 16 views
35

alguien me contó acerca de una clase para reconocimiento de idioma en Cocoa. ¿Alguien sabe cuál es?Detectar idioma de NSString

Ésta es no de trabajo:

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]); 

El resultado es 'es', pero debe ser 'de'.

Gracias ...

+0

Mi alemán no es muy bueno, pero no debería ser "einen Deutscher texto"? Disculpe si me equivoco sin embargo. –

+1

+1 gran pregunta! con la cantidad de tiempo que paso trabajando con los frameworks, me sorprende que nunca antes haya oído hablar de detección de lenguaje como este. –

+2

@WTP: No, es "ein". Sin embargo, dices "Ich lese * einen * deutschen Text". ;) El alemán es una perra desagradable. Lleno de entropía ;) #native – Regexident

Respuesta

13

Eso es el resultado:

- (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)); 
    } 
} 
+4

return (NSString *) CFStringTokenizerCopyBestStringLanguage ((CFStringRef) text, CFRangeMake (0, MIN (text.length, 100))); debería ser más claro y menos propenso a la introducción de errores si posteriormente modifica la llamada a CFStringTokenizerCopyBestStringLanguage – Guillaume

+1

Para una palabra corta como "hola", devolverá "it". Italiano ? –

+0

Bueno, su trabajo es un poco más grande, pero "ich bin Umair" salió pero era "nl" en lugar de "de" – umairhhhs

7

Puede utilizar -requestCheckingOfString:… lugar. NSTextCheckingTypeOrthography intenta identificar el lenguaje utilizado en la cadena, y el controlador de finalización recibe un parámetro NSOrthography que se puede utilizar para obtener información sobre la ortografía en la cadena, incluido su idioma dominante.

da el siguiente ejemplo 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); 
}]; 
+0

Este código funciona perfectamente. ¿Alguien puede saber el rápido 2.1 equivalente – user226372

39

Hay API en el cacao disponible para revisar el lenguaje de una cadena, y siempre es mejor usar Fundación sobre CoreFoundation siempre que sea posible.

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]; 

Alternativamente, si le sucede que tiene texto en lenguaje mixto, puede utilizar la API de enumerateLinguisticTagsInRange para obtener el idioma de cada palabra en el texto.

+1

¡Esto funciona genial! Incluso puede crear 'NSOrthography' simplemente llamando' [tagger orthographyAtIndex: 0 effectiveRange: nil] '. Definitivamente la mejor respuesta. Gracias. –

5

Una extensión de cadena rápida la respuesta 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) 
    } 
} 

Uso:

let language = "What language is this?".language() 
+0

let language = "%". Language() // ---> esto es un bloqueo! –

+0

No sabía que esto era compatible con iOS: impresionante – RJH

+0

#Tim FriedLand que no lo envolvía con fuerza. solo déjalo opcional. mostrará valor nulo cuando no entienda el idioma. – MRizwan33

Cuestiones relacionadas