def flag(context, addon): """experimental/recommended flag heading.""" status = statusflags(context, addon) msg = {'experimental': _('Experimental'), 'recommended': _('Recommended')} if status: return jinja2.Markup(u'<h5 class="flag">%s</h5>' % msg[status]) else: return ''
def stars(num): if num is None: return _('Not yet rated') else: stars = int(math.ceil(num)) msg = _('Rated %s out of 5 stars') % stars s = (u'<span class="stars stars-{num}" title="{msg}">{msg}</span>' .format(num=stars, msg=msg)) return jinja2.Markup(s)
def topmenu(): menu = [] menu.append({"href": "/", "title": _("Overview")}) if request.user.has_perm("hwdebug.demo"): menu.append({"href": "/hwdebug/demo/", "title": _("Demo")}) if request.user.has_perm("is_staff"): menu.append({"href": "/admin/", "title": _("Admin")}) menu.append({"href": "/homeauto/logout/", "title": _("Logout")}) return menu
def get_search_groups(app): sub = [] for type_ in (amo.ADDON_DICT, amo.ADDON_SEARCH, amo.ADDON_THEME): sub.append(_Cat(0, amo.ADDON_TYPES[type_], 0, type_)) sub.extend(helpers.sidebar(app)[0]) sub = [('%s,%s' % (a.type_id, a.id), a.name) for a in sorted(sub, key=lambda x: (x.weight, x.name))] top_level = [('all', _('all add-ons')), ('collections', _('all collections')), ('personas', _('all personas'))] return top_level[:1] + sub + top_level[1:], top_level
def test_ugettext(): # No context a_text = " this\t\r\n\nis a\ntest \n\n\n" p_text = "you ran a test!" eq_(p_text, _(a_text)) # With a context a_text = "\n\tWhat time \r\nis it? \n" p_text_1 = "What time is it? (context=1)" p_text_2 = "What time is it? (context=2)" eq_(p_text_1, _(a_text, 'context_one')) eq_(p_text_2, _(a_text, 'context_two'))
def links(self): rv = [] for file in self.version.files.all(): platform = file.platform_id url = file.latest_xpi_url() if platform == amo.PLATFORM_ALL.id: text, os = _('Download Now'), None else: text, os = _('Download'), amo.PLATFORMS[platform] if self.show_eula: text, url = _('Continue to Download →'), file.eula_url() rv.append(Link(text, url, os, file)) return rv
def sidebar(app): """Populates the sidebar with (categories, types).""" if app is None: return [], [] # We muck with query to make order_by and extra_order_by play nice. q = Category.objects.filter(application=app.id, weight__gte=0, type=amo.ADDON_EXTENSION) categories = order_by_translation(q, 'name') categories.query.extra_order_by.insert(0, 'weight') # TODO(jbalogh): real reverse Type = collections.namedtuple('Type', 'name url') base = urlresolvers.reverse('home') types = [Type(_('Collections'), base + 'collections/')] shown_types = { amo.ADDON_PERSONA: base + 'personas/', amo.ADDON_DICT: urlresolvers.reverse('browse.language_tools'), amo.ADDON_SEARCH: base + 'browse/type:4', amo.ADDON_PLUGIN: base + 'browse/type:7', amo.ADDON_THEME: urlresolvers.reverse('browse.themes'), } for type_, url in shown_types.items(): if type_ in app.types: name = amo.ADDON_TYPES[type_] types.append(Type(name, url)) return categories, sorted(types, key=lambda x: x.name)
def themes(request, category=None): APP, THEME = request.APP, amo.ADDON_THEME status = [amo.STATUS_PUBLIC] experimental = 'on' if request.GET.get('experimental', False) else None if experimental: status.append(amo.STATUS_SANDBOX) q = Category.objects.filter(application=APP.id, type=THEME) categories = order_by_translation(q, 'name') addons = Addon.objects.listed(APP, *status).filter(type=THEME).distinct() total_count = addons.count() sorting, sort_opts, addons = AddonSorter(request, addons, 'downloads') if category is None: selected = _Category(_('All'), total_count, '') else: selected = dict((c.slug, c) for c in categories)[category] addons = addons.filter(categories__slug=category) themes = amo.utils.paginate(request, addons) return jingo.render(request, 'browse/themes.html', {'categories': categories, 'total_count': total_count, 'themes': themes, 'selected': selected, 'sorting': sorting, 'sort_opts': sort_opts, 'experimental': experimental})
def test_activate(): l10n.deactivate_all() l10n.activate('fr') # This string is from the AMO .po file a_text = "My Account" p_text = "Mon compte" eq_(p_text, _(a_text)) l10n.deactivate_all()
def render_msg(self, msg, error_level=None, *args, **kwargs): """ Renders a simple message. """ if self.format == "xml": return render_xml( self.request, "api/message.xml", {"error_level": error_level, "msg": msg}, *args, **kwargs ) else: return HttpResponse(json.dumps({"msg": _(msg)}), *args, **kwargs)
def get_app_versions(): rv = {} for id, app in amo.APP_IDS.items(): min_ver, skip = min_version[app], skip_versions[app] versions = [(a.major, a.minor1) for a in AppVersion.objects.filter(application=id)] groups = itertools.groupby(sorted(versions)) strings = ['%s.%s' % v for v, group in groups if v >= min_ver and v not in skip] rv[id] = [(s, s) for s in strings] + [(_('Any'), 'any')] return rv
def global_settings(request): """ Storing standard AMO-wide information used in global headers, such as account links and settings. """ account_links = [] tools_links = [] if request.user.is_authenticated(): # TODO(jbalogh): reverse links account_links.append({ 'text': _('View Profile'), 'href': request.user.get_profile().get_url_path(), }) account_links.append({'text': _('Edit Profile'), 'href': '/users/edit'}) if request.amo_user.is_developer: account_links.append({'text': 'My Add-ons', 'href': '/developers/addons'}) # TODO(jbalogh): - add collections /collections/mine account_links.append({ 'text': _('Log out'), 'href': '/users/logout?to=' + urlquote(request.path), }) tools_links.append({'text': _('Developer Hub'), 'href': '/developers'}) if acl.action_allowed(request, 'Editors', '%'): tools_links.append({'text': _('Editor Tools'), 'href': '/editors'}) if acl.action_allowed(request, 'Localizers', '%'): tools_links.append({'text': _('Localizer Tools'), 'href': '/localizers'}) if acl.action_allowed(request, 'Admin', '%'): tools_links.append({'text': _('Admin Tools'), 'href': reverse('admin.home')}) return {'account_links': account_links, 'settings': settings, 'amo': amo, 'tools_links': tools_links}
def _page_name(app=None): """Determine the correct page name for the given app (or no app).""" if app: return _(u'Add-ons for {0}').format(app.pretty) else: return _('Add-ons')
def test_ugettext_not_found(): eq_('yo', _('yo')) eq_('yo yo', _(' yo yo ')) eq_('yo', _('yo', 'context')) eq_('yo yo', _(' yo yo ', 'context'))
# %d is the number of dogs #: some/file.py:157 #, python-format msgctxt "context_two" msgid "%d poodle please" msgid_plural "%d poodles please" msgstr[0] "%d poodle (context=2)" msgstr[1] "%d poodles (context=2)" #, python-format msgid "Hello %(user)s" msgstr "Hola %(user)s" ''' TEST_PO_INPUT = """ # Make sure multiple contexts stay separate _('fligtar') _('fligtar', 'atwork') _('fligtar', 'athome') # Test regular plural form, no context ngettext('a fligtar', 'many fligtars', 3) # Make sure several uses collapses to one ngettext('a fligtar', 'many fligtars', 1, 'aticecreamshop') ngettext('a fligtar', 'many fligtars', 3, 'aticecreamshop') ngettext('a fligtar', 'many fligtars', 5, 'aticecreamshop') # Test comments # L10n: Turn up the volume
def mail_thankyou(self, request=None): """ Mail a thankyou note for a completed contribution. Raises a ``ContributionError`` exception when the contribution is not complete or email addresses are not found. """ # Setup l10n before loading addon. if self.source_locale: lang = self.source_locale else: lang = self.addon.default_locale l10n.activate(lang) # Thankyous must be enabled. if not self.addon.enable_thankyou: # Not an error condition, just return. return # Contribution must be complete. if not self.transaction_id: raise ContributionError('Transaction not complete') # Send from support_email, developer's email, or default. if self.addon.support_email: from_email = str(self.addon.support_email) else: try: author = self.addon.listed_authors[0] if not author.emailhidden: from_email = author.email except IndexError: from_email = None if not from_email: from_email = settings.EMAIL_FROM_DEFAULT # We need the contributor's email. to_email = self.post_data['payer_email'] if not to_email: raise ContributionError('Empty payer email') # Make sure the url uses the right language. # Setting a prefixer would be nicer, but that requires a request. url_parts = self.addon.meet_developers_url.split('/') url_parts[1] = lang # Buildup the email components. t = loader.get_template('stats/contribution-thankyou-email.ltxt') c = { 'thankyou_note': self.addon.thankyou_note, 'addon_name': self.addon.name, 'learn_url': settings.SITE_URL + '/'.join(url_parts), 'hostname': settings.HOSTNAME, } body = t.render(Context(c)) subject = _('Thanks for contributing to {addon_name}').format( addon_name=self.addon.name) # Send the email if amo_send_mail(subject, body, from_email, [to_email], fail_silently=True): # Clear out contributor identifying information. del(self.post_data['payer_email']) self.save()
# Addon types ADDON_ANY = 0 ADDON_EXTENSION = 1 ADDON_THEME = 2 ADDON_DICT = 3 ADDON_SEARCH = 4 ADDON_LPAPP = 5 ADDON_LPADDON = 6 ADDON_PLUGIN = 7 ADDON_API = 8 # not actually a type but used to identify extensions + themes ADDON_PERSONA = 9 # Singular ADDON_TYPE = { ADDON_ANY: _(u'Any'), ADDON_EXTENSION: _(u'Extension'), ADDON_THEME: _(u'Theme'), ADDON_DICT: _(u'Dictionary'), ADDON_SEARCH: _(u'Search Engine'), ADDON_PLUGIN: _(u'Plugin'), ADDON_LPAPP: _(u'Language Pack (Application)'), ADDON_PERSONA: _(u'Persona'), } # Plural ADDON_TYPES = { ADDON_ANY: _(u'Any'), ADDON_EXTENSION: _(u'Extensions'), ADDON_THEME: _(u'Themes'), ADDON_DICT: _(u'Dictionaries & Language Packs'),
def links(self): return [Link(_('Continue to Website →'), self.addon.homepage)]