diff --git a/modules/ebonics/__init__.py b/modules/ebonics/__init__.py
new file mode 100644
index 00000000..12efd3bf
--- /dev/null
+++ b/modules/ebonics/__init__.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+
+# Copyright(C) 2012 Romain Bignon
+#
+# This file is part of weboob.
+#
+# weboob is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# weboob is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with weboob. If not, see .
+
+from .backend import EbonicsBackend
+
+
+__all__ = ['EbonicsBackend']
diff --git a/modules/ebonics/backend.py b/modules/ebonics/backend.py
new file mode 100644
index 00000000..8271c201
--- /dev/null
+++ b/modules/ebonics/backend.py
@@ -0,0 +1,60 @@
+# -*- coding: utf-8 -*-
+
+# Copyright(C) 2012 Romain Bignon
+#
+# This file is part of weboob.
+#
+# weboob is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# weboob is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with weboob. If not, see .
+
+
+import urllib
+
+from weboob.capabilities.translate import ICapTranslate, Translation, TranslationFail, LanguageNotSupported
+from weboob.tools.backend import BaseBackend
+from weboob.tools.browser import StandardBrowser
+
+
+__all__ = ['EbonicsBackend']
+
+
+class EbonicsBackend(BaseBackend, ICapTranslate):
+ NAME = 'ebonics'
+ MAINTAINER = 'Romain Bignon'
+ EMAIL = 'romain@weboob.org'
+ VERSION = '0.d'
+ LICENSE = 'AGPLv3+'
+ DESCRIPTION = u'English to Ebonics translation service'
+ BROWSER = StandardBrowser
+
+ def translate(self, lan_from, lan_to, text):
+ if lan_from != 'English' or lan_to != 'Nigger!':
+ raise LanguageNotSupported()
+
+ with self.browser:
+ data = {'English': text.encode('utf-8')}
+ doc = self.browser.location('http://joel.net/EBONICS/Translator', urllib.urlencode(data))
+ try:
+ text = doc.getroot().cssselect('div.translateform div.bubble1 div.bubblemid')[0].text
+ except IndexError:
+ raise TranslationFail()
+
+ if text is None:
+ raise TranslationFail()
+
+ translation = Translation(0)
+ translation.lang_src = unicode(lan_from)
+ translation.lang_dst = unicode(lan_to)
+ translation.text = unicode(text).strip()
+
+ return translation
diff --git a/modules/ebonics/test.py b/modules/ebonics/test.py
new file mode 100644
index 00000000..4ff9e07b
--- /dev/null
+++ b/modules/ebonics/test.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+
+# Copyright(C) 2012 Romain Bignon
+#
+# This file is part of weboob.
+#
+# weboob is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# weboob is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with weboob. If not, see .
+
+
+from weboob.tools.test import BackendTest
+
+
+__all__ = ['EbonicsTest']
+
+
+class EbonicsTest(BackendTest):
+ BACKEND = 'ebonics'
+
+ def test_translate(self):
+ self.backend.translate('English', 'Nigger!', 'I like penis.')