2012-06-30 14 views
13

Quiero internacionalizar mi proyecto. Seguí cómo se describe en la documentación oficial, pero la localización aún no funciona. Aquí es cómo lo intente conseguir regional del usuario:Determinar el idioma del usuario en Pyramid

def get_locale_name(request): 
    """ Return the :term:`locale name` associated with the current 
    request (possibly cached).""" 
    locale_name = getattr(request, 'locale_name', None) 
    if locale_name is None: 
     locale_name = negotiate_locale_name(request) 
     request.locale_name = locale_name 
    return locale_name 

Pero request no tiene attr "local_name", pero tiene "Accept-Language", y así cuando la función get_local_name no encuentra "local_name" en la solicitud , que llama a otra función:

def negotiate_locale_name(request): 
    """ Negotiate and return the :term:`locale name` associated with 
    the current request (never cached).""" 
    try: 
     registry = request.registry 
    except AttributeError: 
     registry = get_current_registry() 
    negotiator = registry.queryUtility(ILocaleNegotiator, 
             default=default_locale_negotiator) 
    locale_name = negotiator(request) 

    if locale_name is None: 
     settings = registry.settings or {} 
     locale_name = settings.get('default_locale_name', 'en') 

    return locale_name 

Como puedo ver negotiator intenta conseguir locales de medio ambiente global, pero si peralte hacer que su valor de ajuste de configuración. ¿Y no puedo entender por qué Pyramid no obtiene la configuración regional directamente desde el campo de solicitud "Accept-Language"?

Y, ¿cómo puedo hacer una determinación correcta de la configuración regional?

Respuesta

14

Pyramid no dicta cómo se debe negociar una configuración regional. Basar el idioma de su sitio en el encabezado "Accept-Language" puede causar problemas ya que la mayoría de los usuarios no saben cómo configurar sus idiomas de navegador preferidos. Asegúrese de que los usuarios puedan cambiar de idioma fácilmente y usar una cookie para almacenar esa preferencia para futuras visitas.

O bien debe establecer un _LOCALE_ key on the request (mediante un controlador de eventos, por ejemplo), o proporcionar su propio custom locale negotiator.

Aquí hay un ejemplo usando el NewRequest event y la accept_language header, que es una instancia de la webob Accept class:

from pyramid.events import NewRequest 
from pyramid.events import subscriber 

@subscriber(NewRequest) 
def setAcceptedLanguagesLocale(event): 
    if not event.request.accept_language: 
     return 
    accepted = event.request.accept_language 
    event.request._LOCALE_ = accepted.best_match(('en', 'fr', 'de'), 'en') 
+0

Pero no hay necesidad de crear el objeto aceptado de accept_language causa accept_language es una instancia ya existente de Accept() y tiene el método best_match() por sí mismo. Es try para la versión 1.2 de la pirámide muchas gracias – Denis

+1

@Denis: Estás en verdad correcto; 'accept_language' ya es una instancia de' Accept'. Corregido –

+0

@Martijin Pieters De todos modos, gracias, todo funciona bien)) – Denis

2

tenga en cuenta que los request._LOCALE_ funciona sólo porque por defecto el negociador local es una default_locale_negotiator. Si tiene comprobaciones muy complejas, por ejemplo, tiene que buscar al usuario desde DB si no existe una cookie, el controlador NewRequest tiene una sobrecarga para las solicitudes que no necesitan ninguna traducción. Para ellos también se puede utilizar un negociador local a medida, como:

def my_locale_negotiator(request): 
    if not hasattr(request, '_LOCALE_'): 
     request._LOCALE_ = request.accept_language.best_match(
      ('en', 'fr', 'de'), 'en') 

    return request._LOCALE_ 


from pyramid.config import Configurator 
config = Configurator() 
config.set_locale_negotiator(my_locale_negotiator) 
0

A partir de pirámide 1.5, puede utilizar estas propiedades de la solicitud para acceder a la localización actual:

request.localizer una instancia de Localizer

request.locale Igual que request.localizer.locale_name

Cuestiones relacionadas