How to configure my Python 2.7 to use the correct Babel installation on my OSX Mavericks system?

2.8k views Asked by At

This is the follow up on my previous question.

I have an OSX Mavericks machine where I installed Python 2.7 and Babel 1.3 using MacPorts. The problem is that it seems I have at least two versions of babel on that machine and except for the one I installed using MacPort, the other does not have the CLDR locale data files installed, so when I execute the following command in my application directory :

pybabel extract -o ./locale/messages.pot ./

I get this error message :

[...]
writing PO template file to ./locale/messages.pot
Traceback (most recent call last):
  File "/usr/local/bin/pybabel", line 8, in <module>
    load_entry_point('Babel==2.0-dev-20131218', 'console_scripts', 'pybabel')()
  File "/Library/Python/2.7/site-packages/Babel-2.0_dev_20131218-py2.7.egg/babel/messages/frontend.py", line 1151, in main
    return CommandLineInterface().run(sys.argv)
  File "/Library/Python/2.7/site-packages/Babel-2.0_dev_20131218-py2.7.egg/babel/messages/frontend.py", line 665, in run
    return getattr(self, cmdname)(args[1:])
  File "/Library/Python/2.7/site-packages/Babel-2.0_dev_20131218-py2.7.egg/babel/messages/frontend.py", line 947, in extract
    sort_by_file=options.sort_by_file)
  File "/Library/Python/2.7/site-packages/Babel-2.0_dev_20131218-py2.7.egg/babel/messages/pofile.py", line 427, in write_po
    messages = list(catalog)
  File "/Library/Python/2.7/site-packages/Babel-2.0_dev_20131218-py2.7.egg/babel/messages/catalog.py", line 552, in __iter__
    for name, value in self.mime_headers:
  File "/Library/Python/2.7/site-packages/Babel-2.0_dev_20131218-py2.7.egg/babel/messages/catalog.py", line 337, in _get_mime_headers
    locale='en')))
  File "/Library/Python/2.7/site-packages/Babel-2.0_dev_20131218-py2.7.egg/babel/dates.py", line 609, in format_datetime
    locale = Locale.parse(locale)
  File "/Library/Python/2.7/site-packages/Babel-2.0_dev_20131218-py2.7.egg/babel/core.py", line 284, in parse
    language = get_global('language_aliases').get(language, language)
  File "/Library/Python/2.7/site-packages/Babel-2.0_dev_20131218-py2.7.egg/babel/core.py", line 53, in get_global
    _raise_no_data_error()
  File "/Library/Python/2.7/site-packages/Babel-2.0_dev_20131218-py2.7.egg/babel/core.py", line 25, in _raise_no_data_error
  raise RuntimeError('The babel data files are not available. '
RuntimeError: The babel data files are not available. This usually happens because you are using a source checkout from Babel and you did not build the data files.  Just make sure to run "python setup.py import_cldr" before installing the library.

I found Babel installed at these locations on my machine :

> cd /Library/Python/2.7/site-packages/Babel-2.0_dev_20131218-py2.7.egg/
> ls
EGG-INFO    babel
> cd babel
> ls
__init__.py     core.py     localedata.py   numbers.py  support.py
__init__.pyc    core.pyc    localedata.pyc  numbers.pyc support.pyc
_compat.py      dates.py    localtime       plural.py   util.py
_compat.pyc     dates.pyc   messages        plural.pyc  util.pyc

> cd /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/babel
> ls
__init__.py     core.py     localedata      numbers.py  support.py
__init__.pyc    core.pyc    localedata.py   numbers.pyc support.pyc
_compat.py      dates.py    localedata.pyc  plural.py   util.py
_compat.pyc     dates.pyc   localtime       plural.pyc  util.pyc
                global.dat  messages

These are the various paths defined in my environment :

> echo $PATH
/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/Users/XXXXX/.rvm/bin
> echo $PYTHONPATH

> echo $DYLD_FALLBACK_LIBRARY_PATH

> echo $DYLD_LIBRARY_PATH

> echo $DYLD_FALLBACK_FRAMEWORK_PATH

> echo $DYLD_FRAMEWORK_PATH

>

pybabel is an alias i created using the following command :

> alias pybabel='pybabel-2.7'

How can I make babel see the Babel version in /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/babel?

1

There are 1 answers

0
Ailete619 On BEST ANSWER

I tried setting the PYTHONPATH but made a mistake ...

I created a symbolic link in the egg archive pybabel was using to the localedata/ in the MacPorts version and it seems to have worked :

> cd /Library/Python/2.7/site-packages/Babel-2.0_dev_20131218-py2.7.egg/babel
> ln -s /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/babel/localedata localedata
ln: localedata: Permission denied
> sudo ln -s /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/babel/localedata localedata
Password:
>

If someone has better suggestions or advices, please leave a comment or another answer. Thank you.

[follow-up 2014-01-09]--------------------------------------------------------------------------------------------------------------

I still could not get the "{% trans %}" tags translated, I found here that you need to explicitly use the -F option on pybabel like that (even if the babel.cfg file is in the current directory!):

> pybabel -v extract -F babel.cfg -o ./locale/messages.pot ./

And to help here is the content of my babel.cfg file :

[jinja2: **/templates/**.html]
encoding = utf-8
[python: python/*.py]
[extractors] 
jinja2 = jinja2.ext:babel_extract

But I got "ImportError: No module named ..." error messages because I did not have jinja2 and markupsafe properly configured. So, I added two symlinks :

> sudo ln -s /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/jinja2 /Library/Python/2.7/site-packages/jinja2
> sudo ln -s /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/markupsafe /Library/Python/2.7/site-packages/markupsafe

And it finally worked! I got the content of the "{% trans %}" tags in my messages.pot file!

Yet, I wonder if it is he best solution ...