Devi guardare le regole grammaticali per articoli indefiniti (ci sono solo due articoli indefiniti nella grammatica inglese - "a" e "an). Potresti non essere d'accordo che queste sembrano corrette, ma le regole della grammatica inglese sono molto chiare :
"Le parole a e an sono articoli indefiniti. Usiamo l'articolo indefinito an prima di parole che iniziano con un suono vocale (a, e, i, o, u) e l'articolo indefinito a prima di parole che iniziano con un suono consonante (tutto altre lettere). "
Nota che questo significa un suono vocale e non una lettera vocale . Ad esempio, le parole che iniziano con una "h" silenziosa, come "onore" o "erede" sono trattate come vocali e quindi procedono con "una" - ad esempio, "È un onore conoscerti". Le parole che iniziano con un suono di consonante sono precedute da un - motivo per cui dici "un'auto usata" piuttosto che "un'auto usata" - perché "usato" ha un suono "tu" piuttosto che un suono "uhh".
Quindi, come programmatore, queste sono le regole da seguire. Hai solo bisogno di trovare un modo per determinare con quale suono inizia una parola, piuttosto che con quale lettera. Ho visto esempi di questo, come questo in PHP di Jaimie Sirovich:
function aOrAn($next_word)
{
$_an = array('hour', 'honest', 'heir', 'heirloom');
$_a = array('use', 'useless', 'user');
$_vowels = array('a','e','i','o','u');
$_endings = array('ly', 'ness', 'less', 'lessly', 'ing', 'ally', 'ially');
$_endings_regex = implode('|', $_endings);
$tmp = preg_match('#(.*?)(-| |$)#', $next_word, $captures);
$the_word = trim($captures[1]);
//$the_word = Format::trimString(Utils::pregGet('#(.*?)(-| |$)#', $next_word, 1));
$_an_regex = implode('|', $_an);
if (preg_match("#($_an_regex)($_endings_regex)#i", $the_word)) {
return 'an';
}
$_a_regex = implode('|', $_a);
if (preg_match("#($_a_regex)($_endings_regex)#i", $the_word)) {
return 'a';
}
if (in_array(strtolower($the_word{0}), $_vowels)) {
return 'an';
}
return 'a';
}
Probabilmente è più semplice creare la regola, quindi creare un elenco di eccezioni e utilizzarlo. Non immagino che ce ne saranno così tanti.