
Research
Supply Chain Attack on Axios Pulls Malicious Dependency from npm
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.
apostrophe-localization
Advanced tools
Internationalion, translation and localization of content on sites powered by the Apostrophe 2 CMS
Please use apostrophe-workflow for localization, translation and internationalization of Apostrophe 2.x projects. This OLD module was exclusively for Apostrophe 0.5.x.
Allows internationalization, translation and localization of content on an Apostrophe site.
First make sure you have an Apostrophe project!
Then:
npm install --save apostrophe-localization
In app.js, add the module to your configuration. Specify the default locale (generally the native language of the primary content creators) and an array of additional locales to be supported:
... other modules ...
'apostrophe-localization': {
defaultLocale: 'en',
locales: { 'en': 'English', 'es': 'Español'}
}
The keys in the locales object should be standard international language and/or culture codes. The values should be labels, written in the language in question, suitable for display by a locale picker. The default locale should be included, typically as the first choice.
Optionally, add the locale picker to outerLayout.html wherever you see fit:
{{ aposLocalePicker() }}
The locale picker markup is deliberately easy to style, but you may also ignore it in favor of writing your own, as long as you generate the same links.
That's it!
To translate content, just log in as you normally would and use the locale picker. At first you will continue to see content for the default locale. However, any edits to content areas and singletons that you make while you are switched to an alternate locale will be saved as a separate version for that locale only.
If you wish, you can specify that certain area and singleton names should not be translatable. Any edits made to these are shared by all locales:
... other modules ...
'apostrophe-localization': {
...
universal: [ 'banner', 'thumbnail' ]
}
If you need to, you can lock these down to a specific page or snippet type:
... other modules ...
'apostrophe-localization': {
...
universal: [ 'home:banner', 'event:thumbnail' ]
}
By default, only areas, singletons, and the title property of each document are internationalized.
Sometimes it is appropriate to internationalize other schema fields too, particularly fields of type string, but it's not safe for us to assume that.
So, spell out the additional document properties you want to internationalize:
... other modules ...
'apostrophe-localization': {
...
localized: [ 'summary', 'teaser' ]
}
Again, you can lock these down to specific document type names:
... other modules ...
'apostrophe-localization': {
...
localized: [ 'event:summary', 'blogPost:teaser' ]
}
You can also specify that internationalization should never be performed at all for a particular page type or snippet type:
... other modules ...
'apostrophe-localization': {
...
neverTypes: [ 'school', 'teaser' ]
}
Any document with its type property set to school or teaser will not be internationalized.
Your users can view a report of documents that need to be localized.
This report includes both documents that have never been localized and documents that have been updated for the default locale more recently than in the current locale.
For instance, if "English" is the default locale and you switch to "Spanish" and then open the localization report, you'll see a list of pages that have never been translated to Spanish or have a newer version in English.
Once you update those pages in Spanish, they no longer appear in the report until the next time an update is needed.
The documents that have gone the longest without attention appear first in the report.
To add the report, just add this code to outerLayout.html along with the other menus:
{{ aposLocalizationMenu(permissions) }}
All localized properties are replicated inside a localized object (please pardon my bad Spanish):
{
title: 'About Us',
localized: {
en: {
title: 'About Us',
},
es: {
title: 'Sobre Nosotros'
}
}
}
However, Apostrophe automatically swaps the locale you really wanted to and from title and body when you fetch or store content. So code that relies on title and body still works normally.
In the database, title and body are a copy of the default locale's content. This provides reasonable fallback behavior for code that does not use apos.get and apos.putPage in a typical manner. It also allows a site to work immediately when localization is added later.
This simple approach to storing internationalized content allows the module to be implemented as straightforward enhancements to apos.get and apos.putPage.
If you need access to the content for the default locale, you can access it like so:
page.localized.en.title
However, for performance reasons, widget loaders are NOT called for content in other locales. Otherwise the performance of the site would drop quickly as locales are added.
If you wish, you can access the current locale string, such as es or en, in a Nunjucks template by invoking getLocale().
{% if getLocale() == 'es' %}
{# Something special for Spanish #}
{% endif %}
See the github issues for limitations of this module.
0.5.11: inadvertently published typo with very short-lived 0.5.10.
0.5.10: requests such as area edits now carry their intended locale with them. This ensures that a race condition between a locale switch and an area edit does not result in the accidental crushing of content for one locale by content from another.
0.5.9: added apostrophe:populate-default-locale task to be run just once when this module is added to an existing site; without this you'll see strange behavior on an existing site that wasn't always storing its default locale in a localized way. Touched up code formatting.
0.5.8: the locale choice objects provided to aposLocalePicker now have a locale property with the actual locale, so you can write custom logic around that. Thanks to Fotis Paraskevopoulos.
0.5.7: aposLocalePicker now accepts an optional argument, which is passed on to the template as args. You can take advantage of this feature in your override of the localePicker.html template to distinguish different styles.
0.5.6: support for the new localization report. Pages translated before this report was invented will all show as needing localization until they are edited for the first time for each locale.
0.5.5: documentation covers how to fetch the current locale name.
0.5.4: the neverTypes option completely excludes certain page types and/or snippet types from being localized.
0.5.3: use the new apos.beforeLoadWidgets method rather than apos.afterGet to avoid chicken and egg problems. Make a shallow clone of each area so that its slug property can be set distinctly.
0.5.2: don't mess up non-page queries.
0.5.1: populate the default locale in page.localized properly.
0.5.0: initial release.
FAQs
Internationalion, translation and localization of content on sites powered by the Apostrophe 2 CMS
The npm package apostrophe-localization receives a total of 11 weekly downloads. As such, apostrophe-localization popularity was classified as not popular.
We found that apostrophe-localization demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 11 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.

Research
Malicious versions of the Telnyx Python SDK on PyPI delivered credential-stealing malware via a multi-stage supply chain attack.

Security News
TeamPCP is partnering with ransomware group Vect to turn open source supply chain attacks on tools like Trivy and LiteLLM into large-scale ransomware operations.