drime

French rhyme dictionary with web and CLI interface
git clone https://a3nm.net/git/drime/
Log | Files | Refs | README

commit b471dbdd7b0946d8cd09d033f5e1f622ef029595
parent 880aa553ab1301a7d08145c7da81bc755f326fff
Author: Antoine Amarilli <a3nm@a3nm.net>
Date:   Tue, 27 Dec 2011 16:13:17 +0100

french localization

Diffstat:
TODO | 8++++----
drime.py | 11+++++++++--
templates/about.html | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
templates/disambig.html | 4++++
templates/error.html | 5+++++
templates/index.html | 44++++++++++++++++++++++++++++++++++++++------
templates/notfound.html | 5+++++
templates/page.html | 37++++++++++++++++++++++++++++++-------
templates/results.html | 53+++++++++++++++++++++++++++++++++++++++++++++--------
9 files changed, 218 insertions(+), 33 deletions(-)

diff --git a/TODO b/TODO @@ -1,4 +1,4 @@ -TODO: dos2unix -TODO: placement in rhymes for enlacement? -TODO: group multiple derivations for each word,phon -TODO: query.sh and db_sqlite.py +dos2unix +placement in rhymes for enlacement? +group multiple derivations for each word,phon +query.sh and db_sqlite.py diff --git a/drime.py b/drime.py @@ -5,13 +5,18 @@ from flask import Flask, render_template, request, jsonify app = Flask(__name__) +def get_locale(): + return request.accept_languages.best_match(['en', 'fr']) + @app.route('/') def root(): - return render_template('index.html', title="drime", noform=True) + return render_template('index.html', title="drime", noform=True, + lang=get_locale()) @app.route('/about') def about(): - return render_template('about.html', title="drime") + return render_template('about.html', title="drime", pagesize=query.PAGESIZE, + lang=get_locale()) @app.route('/query') def q(): @@ -29,6 +34,7 @@ def q(): d['page'] = 0 try: r, count = query.query(**d) + d['lang'] = get_locale() d['pagesize'] = query.PAGESIZE d['mode'] = 'query' d['title'] = 'drime' @@ -54,6 +60,7 @@ def q(): return render_template('results.html', **d) except query.BadValues: d['mode'] = 'query' + d['lang'] = get_locale() if request.args.get('json'): return jsonify(d) return render_template('error.html', **d) diff --git a/templates/about.html b/templates/about.html @@ -1,6 +1,78 @@ {% extends "page.html" %} {% block body %} +{% if lang == 'fr' %} +<p>Bienvenue sur <strong>drime</strong>&nbsp;!</p> + +<h2 id="info">Qu'est-ce que c'est&nbsp;?</h2> +<p>C'est un dictionnaire de rimes (par <a href="http://a3nm.net">a3nm</a>). Il +utilise la base de données <a href="http://www.lexique.org/">Lexique</a> avec +quelques changements, et utilise également <a + href="http://python.org">Python</a>, <a href="http://mysql.com">MySQL</a> et +<a href="http://flask.pocoo.org">Flask</a>. Vous pouvez téléchager le code sur +le <a href="http://gitorious.org/drime">dépôt gitorious de drime</a> si vous +voulez le faire fonctionner sur votre machine.</p> + +<h2 id="help">Comment je m'en sers&nbsp;?</h2> +<p>Dans le champ <strong>mot</strong>, entrez le mot pour lequel vous voulez +obtenir des rimes. Le système ne sait pas (encore) inférer la prononciation de +mots inconnus&nbsp;; abstenez-vous donc d'utiliser des noms propres ou des mots +trop rares. Vous pouvez également fournir une prononcation <a + href="#pron">X-SAMPA</a> entre crochets pour choisir entre plusieurs +prononciations possibles. Par exemple&nbsp;: <a + href="/query?query=fils%20[fis]">fils [fis]</a>.</p> + +<p>Dans le champ <strong>n_syllabes</strong>, vous pouvez indiquer un nombre de +syllabes pour limiter les résultats retournés. Vous pouvez spécifier un nombre +exact ou un intervalle (par exemple "1-3"). Vous pouvez ajouter "+" à la fin +pour indiquer que vous autorisez une syllabe supplémentaire à condition que le +mot commence par une voyelle ou un "h" non-aspiré, ce qui est peut être utile +dans le cas où le mot précédent dans votre poème se termine par un "e" qui +serait alors élidé. Le comptage des syllabes est approximatif&nbsp;: si le +système a un doute sur un mot, il l'incluera à tort plutôt que de le rejeter à +tort.</p> + +<p>En cochant la case <strong>genre</strong>, vous forcez les résultats à +fournir une rime de même genre que votre requête. Si vous ne savez pas ce que +sont les rimes masculines ou féminines, vous pouvez regarder. <a + href="https://fr.wikipedia.org/wiki/Rime#Genre_des_rimes_:_rimes_f.C3.A9minines_et_masculines">la +page Wikipédia à ce propos</a>.</p> + +<h2>Quels sont les résultats manquants&nbsp;? (faux négatifs)</h2> +<ul> +<li>Le système ne fournira que des mots de son dictionnaire comme rimes. En +particulier, il ne fournira pas de noms propres.</li> +<li>Le système ne fournira que des mots qui riment (ie. tous les sons jusqu'à la +dernière voyelle incluse correspondent exactement) ou dont les trois derniers +caratères au moins sont les mêmes (pour les rimes normandes).</li> +<li>Le système peut se tromper si la prononciation qu'il connaît pour un mot est +mauvaise, ou s'il manque des variantes. Du reste, le système exige des +correspondances exactes (par exemple, il fait la distinction "brun/brin", +c'est-à-dire la distinction entre "9~" et "E~").</li> +<li>Le système éliminera les résultats qu'il considère comme redondants, ie. des +résultats dérivés d'un autre résultat mieux classé.</li> +<li>Le système ne renvoie que les {{ pagesize }} meilleurs résulats.</li> +</ul> + +<h2>Comment les résultats sont-ils triés&nbsp;?</h2> +<p>Les critères appliqués, dans l'ordre, sont&nbsp;: le nombre de phonèmes +communs, le nombre de caractères communs, et la fréquence du mot dans un +corpus.</p> + +<h2 id="pron">Comment la prononciation est-elle indiquée&nbsp;?</h2> +<p>Avec <a href="http://en.wikipedia.org/wiki/X-SAMPA">X-SAMPA</a>. Voyez aussi <a + href="https://fr.wiktionary.org/wiki/Annexe:Prononciation/fran%C3%A7ais">l'annexe + de Wiktionnaire sur la prononciation du français</a>. Notez qu'en raison de +limitations de Lexique, la prononciation indiquée est une prononciation orale et +non une prononciation poétique. Par exemple, "placement" est référencé comme +"plasmA~" but serait "plas@mA~"). Des heuristiques sont utilisées afin de +compenser ça lorsque les résultats sont filtrés sur le nombre de syllabes.</p> + +<h2>D'où vient le nom&nbsp;?</h2> + +<p>Ça se prononce [dRim]. C'est une abréviation de "dictionnaire de rimes", et +un jeu de mots avec l'anglais "dream".</p> +{% else %} <p>Welcome to <strong>drime</strong>!</p> <h2 id="info">Wait, what is this?</h2> <p>This is <a href="http://a3nm.net">a3nm</a>'s attempt to build a better French @@ -27,29 +99,28 @@ estimation is always done to overapproximate the results of a given query.</p> gender. If you're unsure about what this is, see <a href="https://fr.wikipedia.org/wiki/Rime#Genre_des_rimes_:_rimes_f.C3.A9minines_et_masculines">the relevant Wikipedia page (in French)</a>.</p> -<p>The system will ask you to select the exact word and pronunciation in case of -doubt. Results will then be provided.</p> <h2>Which results are missing? (false negatives)</h2> <ul> <li>The system will only provide words from its dictionary. No proper nouns, for instance.</li> <li>The system will only provide words which either rhyme (ie. all sounds up to -the last vowel match exactly) or which share the last three characters (for -visual rhymes).</li> +and including the last vowel match exactly) or which share the last three +characters (for visual rhymes).</li> <li>The system might be fooled because its pronunciation for a word is mistaken or does not include all variants. Besides, the system is picky about phonemic distinctions (notably "brun/brin", ie. "9~/E~").</li> <li>The system will eliminate results that it considers redundant, ie. results derived from a previous result.</li> +<li>The system will only return the {{ pagesize }} best results.</li> </ul> <h2>Which results are unnecessary? (false positives)</h2> <ul> <li>The system will provide words which are too similar to the query word to -make a decent rhyme with it.</li> +make a decent rhyme with it (eg. "reprendre" for "prendre").</li> <li>The system will provide results with a wrong syllable count.</li> -<li>The system will provide abusive visual rhymes.</li> +<li>The system will provide abusive visual rhymes (at the end of the results).</li> </ul> <h2>How are results sorted?</h2> @@ -70,5 +141,6 @@ number of syllables.</p> <p>It's pronounced [dRim], as a pun with "dream" (the dream rhyme dictionary) but also because it is short for "dictionnaire de rimes" in French.</p> +{% endif %} {% endblock %} diff --git a/templates/disambig.html b/templates/disambig.html @@ -1,7 +1,11 @@ {% extends "page.html" %} {% block body %} +{% if lang == 'fr' %} +<p>Que vouliez-vous dire&nbsp;?</p> +{% else %} <p>Did you mean:</p> +{% endif %} <ul id="disambig"> {% for k in keys %} <li class="{{ loop.cycle('odd', 'even') }}"> diff --git a/templates/error.html b/templates/error.html @@ -1,6 +1,11 @@ {% extends "page.html" %} {% block body %} +{% if lang == 'fr' %} +<p>Les valeurs fournies sont incorrectes. <a href="/about#help">Besoin + d'aide&nbsp;?</a></p> +{% else %} <p>Invalid values supplied. Need some <a href="/about#help">help</a>?</p> +{% endif %} {% endblock %} diff --git a/templates/index.html b/templates/index.html @@ -1,15 +1,36 @@ {% extends "page.html" %} {% block body %} - <form method="GET" action="query" id="bigform"> - <label for="query">French word to get rhymes for:</label><br /> +<form method="GET" action="query" id="bigform"> + <label for="query"> + {% if lang == 'fr' %} + Mot pour lequel vous voulez des rimes&nbsp;: + {% else %} + French word to get rhymes for: + {% endif %} + </label><br /> <input id="query" name="query" + {% if lang == 'fr' %} + placeholder="mot" + {% else %} placeholder="word" + {% endif %} value="{{ q }}"/><br /> - <label for="nsyl">Number of syllables of the rhymes:<br /> - (Leave blank to get all rhymes.)</label><br /> + <label for="nsyl"> + {% if lang == 'fr' %} + Nombre de syllabes pour les rimes&nbsp;:<br /> + (Laissez vide pour obtenir toutes les rimes.) + {% else %} + Number of syllables of the rhymes:<br /> + (Leave blank to get all rhymes.) + {% endif %} + </label><br /> <input id="nsyl" name="nsyl" + {% if lang == 'fr' %} + placeholder="n_syllabes" + {% else %} placeholder="n_syllables" + {% endif %} value="{{ nsyl }}"/><br /> <label id="gender_label"> <input type="checkbox" id="gender" name="gender" @@ -17,8 +38,19 @@ checked="{{ gender }}" {% endif %} /> - Only rhymes of matching gender?</label><br /> - <input id="submit" type="submit" value="Search" /> + {% if lang == 'fr' %} + Respecter le genre des rimes&nbsp;? + {% else %} + Only rhymes of matching gender? + {% endif %} + </label><br /> + <input id="submit" type="submit" + {% if lang == 'fr' %} + value="Chercher" + {% else %} + value="Search" + {% endif %} + /> </form> {% endblock %} diff --git a/templates/notfound.html b/templates/notfound.html @@ -1,7 +1,12 @@ {% extends "page.html" %} {% block body %} +{% if lang == 'fr' %} +<p>Aucun mot connu ne correspond à cette requête. Assurez-vous que vous utilisez +bien un mot du dictionnaire. <a href="/about#help">Besoin d'aide&nbsp;?</a></p> +{% else %} <p>No known word matches this query. Make sure you're using a word from the dictionary. Need some <a href="/about#help">help</a>?</p> +{% endif %} {% endblock %} diff --git a/templates/page.html b/templates/page.html @@ -9,16 +9,28 @@ <body> <header> <h1><a href="/">drime</a></h1> - <sup><a id="about" href="/about">about</a></sup> + <sup><a id="about" href="/about"> + {% if lang == 'fr' %} + aide + {% else %} + help + {% endif %} + </a></sup> {% if not noform %} <form method="GET" action="query"> - <label class="redundant" for="query">Word</label> <input id="query" name="query" - placeholder="word" + {% if lang == 'fr' %} + placeholder="mot" + {% else %} + placeholder="word" + {% endif %} value="{{ q }}"/> - <label class="redundant" for="nsyl">Number of syllables</label> <input id="nsyl" name="nsyl" - placeholder="n_syllables" + {% if lang == 'fr' %} + placeholder="n_syllabes" + {% else %} + placeholder="n_syllables" + {% endif %} value="{{ nsyl }}"/> <label id="gender_label"> <input type="checkbox" id="gender" name="gender" @@ -26,8 +38,19 @@ checked="{{ gender }}" {% endif %} /> - gender?</label> - <input type="submit" value="Search" /> + {% if lang == 'fr' %} + genre&nbsp;? + {% else %} + gender? + {% endif %} + </label> + <input type="submit" + {% if lang == 'fr' %} + value="Chercher" + {% else %} + value="Search" + {% endif %} + /> </form> {% endif %} </header> diff --git a/templates/results.html b/templates/results.html @@ -2,23 +2,60 @@ {% block body %} <div> -<p id="result_header">Displaying -{{ displayed }} result{% if displayed != 1 %}s{% endif %} +<p id="result_header"> +{% if lang == 'fr' %} +Affichage de +{% else %} +Displaying +{% endif %} +{{ displayed }} +{% if lang == 'fr' %} +résultat{% if displayed > 1 %}s{% endif %} +{% else %} +result{% if displayed != 1 %}s{% endif %} +{% endif %} {# results {{ page * pagesize + 1 }} to {{ (page+1) * pagesize }} #} {% if displayed < count %} -of {{ count }} -total result{% if count != 1 %}s{% endif %} +{% if lang == 'fr' %} +sur +{% else %} +of +{% endif %} +of +{{ count }} +{% if lang == 'fr' %} +sur +{% else %} +{% if count != 1 %}résultats totaux{% else %}résultat total{% endif %} +{% endif %} +{% endif %} +{% if lang == 'fr' %} +pour&nbsp;: +{% else %} +for: {% endif %} -for: <strong>{{ keys[0][-1] }}</strong></p> +<strong>{{ keys[0][-1] }}</strong></p> <table> <tr> - <th id="col_word">word</th> - <th id="col_pron">pron<a href="/about/#pron" class="help">?</a></th> + <th id="col_word">{% if lang == 'fr' %}mot{% else %}word{% endif %}</th> + <th id="col_pron"> + {% if lang == 'fr' %} + prononciation<a href="/about/#pron" class="help">?</a> + {% else %} + pronunciation<a href="/about/#pron" class="help">?</a> + {% endif %} + </th> <th id="col_phon">phon</th> <th id="col_eye">eye</th> <th id="col_freq">freq</th> - <th id="col_deriations">derivations</th> + <th id="col_deriations"> + {% if lang == 'fr' %} + dérivations + {% else %} + derivations + {% endif %} + </th> {% for r in result %} <tr class="{{ loop.cycle('odd', 'even') }}"> <td>{{ r.word }}</td>