This is an automated email from the ASF dual-hosted git repository.
asf-ci-deploy pushed a commit to branch asf-site-production
in repository https://gitbox.apache.org/repos/asf/grails-website.git
The following commit(s) were added to refs/heads/asf-site-production by this
push:
new 7d7ada9276a Deploying to documentation branch - 14:25:27
7d7ada9276a is described below
commit 7d7ada9276a75928a53048f3f399bb4b9bbb0760
Author: jdaugherty <[email protected]>
AuthorDate: Fri Jul 10 14:25:30 2026 +0000
Deploying to documentation branch - 14:25:27
---
docs/snapshot/api/allclasses-frame.html | 1 +
docs/snapshot/api/index-all.html | 23 +++
...ilsPlugin.html => AvailableLocaleResolver.html} | 202 +++++++++------------
.../grails/plugins/i18n/I18nAutoConfiguration.html | 35 +++-
.../org/grails/plugins/i18n/I18nGrailsPlugin.html | 36 +++-
.../api/org/grails/plugins/i18n/package-frame.html | 2 +-
.../org/grails/plugins/i18n/package-summary.html | 9 +
.../org/grails/plugins/web/taglib/FormTagLib.html | 4 +-
.../grails/web/errors/GrailsExceptionResolver.html | 40 ++--
docs/snapshot/guide/commandLine.html | 43 ++---
docs/snapshot/guide/conf.html | 3 +-
docs/snapshot/guide/i18n.html | 25 +++
docs/snapshot/guide/introduction.html | 17 ++
docs/snapshot/guide/single.html | 88 ++++++---
docs/snapshot/ref/Command Line/create-app.html | 12 +-
docs/snapshot/ref/Command Line/create-plugin.html | 12 +-
docs/snapshot/ref/Command Line/create-restapi.html | 4 +-
.../ref/Command Line/create-web-plugin.html | 4 +-
docs/snapshot/ref/Command Line/help.html | 10 +-
docs/snapshot/ref/Command Line/list-features.html | 5 +-
.../ref/Configuration/Application Properties.html | 6 +-
docs/snapshot/ref/Tags - GSP/localeSelect.html | 8 +-
22 files changed, 385 insertions(+), 204 deletions(-)
diff --git a/docs/snapshot/api/allclasses-frame.html
b/docs/snapshot/api/allclasses-frame.html
index d91867f9130..02c2c3f4847 100644
--- a/docs/snapshot/api/allclasses-frame.html
+++ b/docs/snapshot/api/allclasses-frame.html
@@ -288,6 +288,7 @@
<li><a href="org/grails/datastore/gorm/events/AutoTimestampEventListener.html"
title="class in org.grails.datastore.gorm.events"
target="classFrame">AutoTimestampEventListener</a></li>
<li><a href="org/grails/testing/spock/AutowiredInterceptor.html" title="class
in org.grails.testing.spock" target="classFrame">AutowiredInterceptor</a></li>
<li><a href="grails/testing/spring/AutowiredTest.html" title="trait in
grails.testing.spring" target="classFrame"><I>AutowiredTest</I></a></li>
+<li><a href="org/grails/plugins/i18n/AvailableLocaleResolver.html"
title="class in org.grails.plugins.i18n"
target="classFrame">AvailableLocaleResolver</a></li>
<li><a
href="org/grails/orm/hibernate/cfg/domainbinding/util/BackticksRemover.html"
title="class in org.grails.orm.hibernate.cfg.domainbinding.util"
target="classFrame">BackticksRemover</a></li>
<li><a
href="org/grails/orm/hibernate/cfg/domainbinding/collectionType/BagCollectionType.html"
title="class in org.grails.orm.hibernate.cfg.domainbinding.collectionType"
target="classFrame">BagCollectionType</a></li>
<li><a
href="org/grails/web/converters/marshaller/xml/Base64ByteArrayMarshaller.html"
title="class in org.grails.web.converters.marshaller.xml"
target="classFrame">Base64ByteArrayMarshaller</a></li>
diff --git a/docs/snapshot/api/index-all.html b/docs/snapshot/api/index-all.html
index 49228d0ee82..912e8baf13c 100644
--- a/docs/snapshot/api/index-all.html
+++ b/docs/snapshot/api/index-all.html
@@ -3382,8 +3382,20 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd><div class="block"></div></dd>
<dt><span class="strong"><a
href="org/grails/test/support/GrailsTestInterceptor.html#autowireIfNecessary()"
title="Method in GrailsTestInterceptor">autowireIfNecessary()</a></span> -
Method in <a
href="org/grails/test/support/GrailsTestInterceptor.html">GrailsTestInterceptor</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a
href="org/grails/plugins/i18n/I18nGrailsPlugin.html#AVAILABLE_LOCALES_ATTRIBUTE"
title="Property in I18nGrailsPlugin">AVAILABLE_LOCALES_ATTRIBUTE</a></span> -
Property in <a
href="org/grails/plugins/i18n/I18nGrailsPlugin.html">I18nGrailsPlugin</a>
+</dt><dd> <div class="block">Publishes the discovered available locales to the
servlet context so that views and the
+ <CODE>g:localeSelect available="true"</CODE> tag can render a language
selector. </div></dd>
<dt><span class="strong"><a
href="org/grails/datastore/gorm/mongo/MongoEntityTraitProvider.html#available"
title="Property in MongoEntityTraitProvider">available</a></span> - Property in
<a
href="org/grails/datastore/gorm/mongo/MongoEntityTraitProvider.html">MongoEntityTraitProvider</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a
href="org/grails/plugins/i18n/AvailableLocaleResolver.html" title="Class in
org.grails.plugins.i18n">AvailableLocaleResolver</a></span> - Class in <a
href="./org/grails/plugins/i18n/package-summary.html">org.grails.plugins.i18n</a>
+</dt><dd><div class="block">Discovers the locales an application is actually
translated into by scanning the
+ classpath for <CODE><basename>_<locale>.properties</CODE>
resource bundles.</div></dd>
+<dt><span class="strong"><a
href="org/grails/plugins/i18n/AvailableLocaleResolver.html#AvailableLocaleResolver(java.lang.ClassLoader,
java.util.Locale, boolean)" title="Constructor in
AvailableLocaleResolver">AvailableLocaleResolver(java.lang.ClassLoader,
java.util.Locale, boolean)</a></span> - Constructor in <a
href="org/grails/plugins/i18n/AvailableLocaleResolver.html">AvailableLocaleResolver</a>
+</dt><dd> <div class="block">
<DL><DT><B>Parameters:</B></DT><DD><code>classLoader</code> - the class loader
whose classpath is scanned for message bundles</DD></DL></div></dd>
+<dt><span class="strong"><a
href="org/grails/plugins/i18n/I18nAutoConfiguration.html#availableLocaleResolver(grails.core.GrailsApplication,
boolean)" title="Method in
I18nAutoConfiguration">availableLocaleResolver(grails.core.GrailsApplication,
boolean)</a></span> - Method in <a
href="org/grails/plugins/i18n/I18nAutoConfiguration.html">I18nAutoConfiguration</a>
+</dt><dd> <div class="block">Discovers the locales the application is
translated into (from <CODE><basename>_<locale>.properties</CODE>
+ bundles on the classpath) so that a language selector can list only real
translations rather
+ than every JVM locale. </div></dd>
<dt><span class="strong"><a
href="org/grails/datastore/bson/query/BsonQuery.html#AVERAGE_OPERATOR"
title="Field in BsonQuery">AVERAGE_OPERATOR</a></span> - Field in <a
href="org/grails/datastore/bson/query/BsonQuery.html">BsonQuery</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a
href="org/grails/datastore/gorm/query/criteria/AbstractCriteriaBuilder.html#avg(java.lang.String)"
title="Method in AbstractCriteriaBuilder">avg(java.lang.String)</a></span> -
Method in <a
href="org/grails/datastore/gorm/query/criteria/AbstractCriteriaBuilder.html">AbstractCriteriaBuilder</a>
@@ -6037,6 +6049,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a
href="org/grails/gsp/jsp/JspWriterDelegate.html#clearBuffer()" title="Method in
JspWriterDelegate">clearBuffer()</a></span> - Method in <a
href="org/grails/gsp/jsp/JspWriterDelegate.html">JspWriterDelegate</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a
href="org/grails/plugins/i18n/AvailableLocaleResolver.html#clearCache()"
title="Method in AvailableLocaleResolver">clearCache()</a></span> - Method in
<a
href="org/grails/plugins/i18n/AvailableLocaleResolver.html">AvailableLocaleResolver</a>
+</dt><dd> <div class="block">Discards the cached list so the next <a
href='#getAvailableLocales()'>getAvailableLocales()</a> re-scans the
classpath.</div></dd>
<dt><span class="strong"><a
href="org/grails/web/mapping/CachingLinkGenerator.html#clearCache()"
title="Method in CachingLinkGenerator">clearCache()</a></span> - Method in <a
href="org/grails/web/mapping/CachingLinkGenerator.html">CachingLinkGenerator</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a
href="org/grails/datastore/mapping/reflect/ClassPropertyFetcher.html#clearCache()"
title="Method in ClassPropertyFetcher">clearCache()</a></span> - Method in <a
href="org/grails/datastore/mapping/reflect/ClassPropertyFetcher.html">ClassPropertyFetcher</a>
@@ -10790,6 +10804,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a
href="grails/rest/render/atom/AtomRenderer.html#DEFAULT_ATOM_MIME_TYPES"
title="Field in AtomRenderer">DEFAULT_ATOM_MIME_TYPES</a></span> - Field in <a
href="grails/rest/render/atom/AtomRenderer.html">AtomRenderer</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a
href="org/grails/plugins/i18n/AvailableLocaleResolver.html#DEFAULT_BASE_NAME"
title="Field in AvailableLocaleResolver">DEFAULT_BASE_NAME</a></span> - Field
in <a
href="org/grails/plugins/i18n/AvailableLocaleResolver.html">AvailableLocaleResolver</a>
+</dt><dd> <div class="block">The base name of an application's own message
bundles (<CODE>messages.properties</CODE>).</div></dd>
<dt><span class="strong"><a
href="grails/gorm/validation/ConstrainedProperty.html#DEFAULT_BLANK_MESSAGE_CODE"
title="Field in ConstrainedProperty">DEFAULT_BLANK_MESSAGE_CODE</a></span> -
Field in <a
href="grails/gorm/validation/ConstrainedProperty.html">ConstrainedProperty</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a
href="grails/gorm/validation/ConstrainedProperty.html#DEFAULT_BLANK_MESSAGE"
title="Field in ConstrainedProperty">DEFAULT_BLANK_MESSAGE</a></span> - Field
in <a
href="grails/gorm/validation/ConstrainedProperty.html">ConstrainedProperty</a>
@@ -13290,6 +13306,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a
href="org/grails/plugins/web/GroovyPagesGrailsPlugin.html#doWithApplicationContext()"
title="Method in
GroovyPagesGrailsPlugin">doWithApplicationContext()</a></span> - Method in <a
href="org/grails/plugins/web/GroovyPagesGrailsPlugin.html">GroovyPagesGrailsPlugin</a>
</dt><dd> <div class="block">Clear the page cache with the ApplicationContext
is loaded</div></dd>
+<dt><span class="strong"><a
href="org/grails/plugins/i18n/I18nGrailsPlugin.html#doWithApplicationContext()"
title="Method in I18nGrailsPlugin">doWithApplicationContext()</a></span> -
Method in <a
href="org/grails/plugins/i18n/I18nGrailsPlugin.html">I18nGrailsPlugin</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a
href="org/grails/plugins/web/interceptors/InterceptorsGrailsPlugin.html#doWithApplicationContext()"
title="Method in
InterceptorsGrailsPlugin">doWithApplicationContext()</a></span> - Method in <a
href="org/grails/plugins/web/interceptors/InterceptorsGrailsPlugin.html">InterceptorsGrailsPlugin</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a
href="grails/plugins/Plugin.html#doWithApplicationContext()" title="Method in
Plugin">doWithApplicationContext()</a></span> - Method in <a
href="grails/plugins/Plugin.html">Plugin</a>
@@ -18053,6 +18071,9 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a
href="grails/core/InjectableGrailsClass.html#getAvailable()" title="Method in
InjectableGrailsClass">getAvailable()</a></span> - Method in <a
href="grails/core/InjectableGrailsClass.html">InjectableGrailsClass</a>
</dt><dd> <div class="block">If class should be configured for dependency
injection.</div></dd>
+<dt><span class="strong"><a
href="org/grails/plugins/i18n/AvailableLocaleResolver.html#getAvailableLocales()"
title="Method in AvailableLocaleResolver">getAvailableLocales()</a></span> -
Method in <a
href="org/grails/plugins/i18n/AvailableLocaleResolver.html">AvailableLocaleResolver</a>
+</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>an
unmodifiable, display-name-sorted list of the locales the application is
+ translated into.</DD></DL></div></dd>
<dt><span class="strong"><a
href="org/grails/taglib/TagLibraryLookup.html#getAvailableNamespaces()"
title="Method in TagLibraryLookup">getAvailableNamespaces()</a></span> - Method
in <a href="org/grails/taglib/TagLibraryLookup.html">TagLibraryLookup</a>
</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>The namespaces
available</DD></DL></div></dd>
<dt><span class="strong"><a
href="org/grails/taglib/TagLibraryLookup.html#getAvailableTags(java.lang.String)"
title="Method in
TagLibraryLookup">getAvailableTags(java.lang.String)</a></span> - Method in <a
href="org/grails/taglib/TagLibraryLookup.html">TagLibraryLookup</a>
@@ -31957,6 +31978,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a
href="org/grails/datastore/mapping/model/config/GormMappingConfigurationStrategy.html#isExcludedProperty(java.lang.String,
org.grails.datastore.mapping.model.ClassMapping, java.util.Collection,
boolean)" title="Method in
GormMappingConfigurationStrategy">isExcludedProperty(java.lang.String,
org.grails.datastore.mapping.model.ClassMapping, java.util.Collection,
boolean)</a></span> - Method in <a
href="org/grails/datastore/mapping/model/config/GormMappingConfigu [...]
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a
href="org/grails/web/errors/GrailsExceptionResolver.html#isExcludedRequestParameter(java.lang.String,
List<String>)" title="Method in
GrailsExceptionResolver">isExcludedRequestParameter(java.lang.String,
List<String>)</a></span> - Method in <a
href="org/grails/web/errors/GrailsExceptionResolver.html">GrailsExceptionResolver</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a
href="org/apache/grails/data/testing/tck/tests/TestSaveOrUpdateEventListener.html#isExecuted"
title="Property in TestSaveOrUpdateEventListener">isExecuted</a></span> -
Property in <a
href="org/apache/grails/data/testing/tck/tests/TestSaveOrUpdateEventListener.html">TestSaveOrUpdateEventListener</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a
href="org/grails/web/servlet/view/GroovyPageView.html#isExpired()"
title="Method in GroovyPageView">isExpired()</a></span> - Method in <a
href="org/grails/web/servlet/view/GroovyPageView.html">GroovyPageView</a>
diff --git a/docs/snapshot/api/org/grails/plugins/i18n/I18nGrailsPlugin.html
b/docs/snapshot/api/org/grails/plugins/i18n/AvailableLocaleResolver.html
similarity index 56%
copy from docs/snapshot/api/org/grails/plugins/i18n/I18nGrailsPlugin.html
copy to docs/snapshot/api/org/grails/plugins/i18n/AvailableLocaleResolver.html
index d0db8422860..2abb1befce2 100644
--- a/docs/snapshot/api/org/grails/plugins/i18n/I18nGrailsPlugin.html
+++ b/docs/snapshot/api/org/grails/plugins/i18n/AvailableLocaleResolver.html
@@ -27,7 +27,7 @@
<html>
<head>
<!-- Generated by groovydoc (5.0.7) -->
- <title>I18nGrailsPlugin (Grails 8.0.0-SNAPSHOT)</title>
+ <title>AvailableLocaleResolver (Grails 8.0.0-SNAPSHOT)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut
icon">
@@ -37,7 +37,7 @@
<body class="center">
<script type="text/javascript"><!--
if (location.href.indexOf('is-external=true') == -1) {
- parent.document.title="I18nGrailsPlugin (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="AvailableLocaleResolver (Grails 8.0.0-SNAPSHOT)";
}
//-->
</script>
@@ -63,18 +63,18 @@ if (location.href.indexOf('is-external=true') == -1) {
<div class="subNav">
<div>
<ul class="navList">
- <li><a
href="../../../../index.html?org/grails/plugins/i18n/I18nGrailsPlugin"
target="_top">Frames</a></li>
- <li><a href="I18nGrailsPlugin.html" target="_top">No
Frames</a></li>
+ <li><a
href="../../../../index.html?org/grails/plugins/i18n/AvailableLocaleResolver"
target="_top">Frames</a></li>
+ <li><a href="AvailableLocaleResolver.html" target="_top">No
Frames</a></li>
</ul>
</div>
<div>
<ul class="subNavList">
<li>Summary: </li>
- Nested Field <li><a
href="#property_summary">Property</a></li> <li><a
href="#constructor_summary">Constructor</a></li> <li><a
href="#method_summary">Method</a></li>
+ Nested <li><a
href="#field_summary">Field</a></li> <li><a
href="#constructor_summary">Constructor</a></li> <li><a
href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- Field <li><a
href="#prop_detail">Property</a></li> <li><a
href="#constructor_detail">Constructor</a></li> <li><a
href="#method_detail">Method</a></li>
+ <li><a
href="#field_detail">Field</a></li> <li><a
href="#constructor_detail">Constructor</a></li> <li><a
href="#method_detail">Method</a></li>
</ul>
</div>
<a name="skip-navbar_top">
@@ -87,11 +87,11 @@ if (location.href.indexOf('is-external=true') == -1) {
<div class="subTitle">Package:
<strong>org.grails.plugins.i18n</strong></div>
- <h2 title="[Groovy] Class I18nGrailsPlugin" class="title">[Groovy] Class
I18nGrailsPlugin</h2>
+ <h2 title="[Java] Class AvailableLocaleResolver" class="title">[Java]
Class AvailableLocaleResolver</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li><ul
class="inheritance"></ul></li><li>org.grails.plugins.i18n.I18nGrailsPlugin
+<li><ul
class="inheritance"></ul></li><li>org.grails.plugins.i18n.AvailableLocaleResolver
</ul>
<div class="description">
<ul class="blockList">
@@ -101,11 +101,27 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- todo: direct known subclasses -->
<hr>
-<pre>@groovy.util.logging.Slf4j
-class I18nGrailsPlugin
-extends <a href='../../../../grails/plugins/Plugin.html'>Plugin</a></pre>
+<pre>public class AvailableLocaleResolver
+extends java.lang.Object</pre>
- <p> Configures Grails' internationalisation support.
<DL><DT><B>Authors:</B></DT><DD>Graeme
Rocher</DD></DL><DL><DT><B>Since:</B></DT><DD>0.4</DD></DL></p>
+ <p> Discovers the locales an application is actually translated into by
scanning the
+ classpath for <CODE><basename>_<locale>.properties</CODE>
resource bundles.
+
+ <p>Unlike java.util.Locale#getAvailableLocales() (which returns every locale
+ the JVM knows about), this returns only the locales that have a matching
message
+ bundle plus the configured default locale, making it suitable for driving a
language
+ selector. The result is sorted by each locale's display name in its own
language and
+ cached; <a href='#clearCache()'>clearCache()</a> forces a re-scan (used when
bundles change in development).
+
+ <p>By default only the application's own <CODE>messages_*.properties</CODE>
bundles are
+ scanned. When <CODE>includePluginBundles</CODE> is enabled, every
<CODE>*.properties</CODE>
+ bundle on the classpath is considered, so locales contributed by plugins
— whose
+ bundles are namespaced (e.g. <CODE>spring-security-core_fr.properties</CODE>)
— are
+ included too. Candidate suffixes are validated against the ISO language codes
(and the ISO
+ country codes when a country is present), so non-i18n properties files (e.g.
+ <CODE>application.properties</CODE> or <CODE>foo_en_prod.properties</CODE>)
are ignored. See
+ <CODE>grails.i18n.availableLocales.includePlugins</CODE>.
+ <DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
</li>
</ul>
@@ -123,77 +139,32 @@ extends <a
href='../../../../grails/plugins/Plugin.html'>Plugin</a></pre>
<ul class="blockList">
<li class="blockList"><a name="field_summary"><!-- --></a>
+ <h3>Field Summary</h3>
<ul class="blockList">
- <table class="overviewSummary" border="0" cellpadding="3"
cellspacing="0" summary="Inherited fields summary table">
- <caption><span>Inherited fields</span><span
class="tabEnd"> </span></caption>
+ <table class="overviewSummary" border="0" cellpadding="3"
cellspacing="0" summary="Enum constants summary table">
+ <caption><span>Fields</span><span
class="tabEnd"> </span></caption>
<tr>
- <th class="colFirst" scope="col">Fields inherited
from class</th>
- <th class="colLast" scope="col">Fields</th>
- </tr>
- <tr class="altColor">
- <td class="colFirst"><strong><code>class <a
href='../../../../grails/plugins/Plugin.html'>Plugin</a></code></strong></td>
- <td class="colLast"><code><a
href='../../../../grails/plugins/Plugin.html#enabled'>enabled</a></code></td>
- </tr>
-
- </table>
- </ul>
- </li>
-
- </ul>
-
-
- <!-- =========== PROPERTY SUMMARY =========== -->
-
- <ul class="blockList">
- <li class="blockList"><a name="property_summary"><!-- --></a>
- <h3>Properties Summary</h3>
- <ul class="blockList">
- <table class="overviewSummary" border="0" cellpadding="3"
cellspacing="0" summary="Properties Summary table, listing nested classes, and
an explanation">
- <caption><span>Properties</span><span
class="tabEnd"> </span></caption>
- <tr>
- <th class="colFirst" scope="col">Type</th>
- <th class="colLast" scope="col">Name and
description</th>
- </tr>
-
- <tr class="altColor">
- <td
class="colFirst"><code><strong>java.lang.String</strong></code> </td>
- <td class="colLast"><code><a
href="#baseDir">baseDir</a></code><br></td>
- </tr>
-
- <tr class="rowColor">
- <td
class="colFirst"><code><strong>java.lang.String</strong></code> </td>
- <td class="colLast"><code><a
href="#version">version</a></code><br></td>
+ <th class="colFirst" scope="col">Modifiers</th>
+ <th class="colLast" scope="col">Name</th>
+ <th class="colLast" scope="col">Description</th>
</tr>
<tr class="altColor">
- <td
class="colFirst"><code><strong>java.lang.String</strong></code> </td>
- <td class="colLast"><code><a
href="#watchedResources">watchedResources</a></code><br></td>
+ <td
class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a
href="#DEFAULT_BASE_NAME">DEFAULT_BASE_NAME</a></code></td>
+ <td class="colLast">The base name of an
application's own message bundles (<CODE>messages.properties</CODE>).</td>
</tr>
</table>
</ul>
</li>
- <li class="blockList"><a name="properties_summary"><!--
--></a>
- <ul class="blockList">
- <table class="overviewSummary" border="0"
cellpadding="3" cellspacing="0" summary="Inherited properties summary table">
- <caption><span>Inherited properties</span><span
class="tabEnd"> </span></caption>
- <tr>
- <th class="colFirst" scope="col">Properties
inherited from class</th>
- <th class="colLast"
scope="col">Properties</th>
- </tr>
- <tr class="altColor">
- <td class="colFirst"><strong><code>class <a
href='../../../../grails/plugins/Plugin.html'>Plugin</a></code></strong></td>
- <td class="colLast"><code>applicationContext,
artefacts, environment, grailsApplication, plugin, pluginManager</code></td>
- </tr>
-
- </table>
- </ul>
- </li>
-
</ul>
+ <!-- =========== PROPERTY SUMMARY =========== -->
+
+
<!-- =========== ELEMENT SUMMARY =========== -->
@@ -211,7 +182,12 @@ extends <a
href='../../../../grails/plugins/Plugin.html'>Plugin</a></pre>
<tr class="altColor">
<td class="colFirst">
- <code><strong><a
href="#I18nGrailsPlugin()">I18nGrailsPlugin</a></strong>()</code><br></td>
+ <code><strong><a
href="#AvailableLocaleResolver(java.lang.ClassLoader,
java.util.Locale)">AvailableLocaleResolver</a></strong>(java.lang.ClassLoader
classLoader, java.util.Locale defaultLocale)</code><br>Scans only the
application's own <CODE>messages_*.properties</CODE> bundles.</td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst">
+ <code><strong><a
href="#AvailableLocaleResolver(java.lang.ClassLoader, java.util.Locale,
boolean)">AvailableLocaleResolver</a></strong>(java.lang.ClassLoader
classLoader, java.util.Locale defaultLocale, boolean
includePluginBundles)</code><br>
<DL><DT><B>Parameters:</B></DT><DD><code>classLoader</code> - the class loader
whose classpath is scanned for message bundles</DD></DL></td>
</tr>
</table>
@@ -237,14 +213,15 @@ extends <a
href='../../../../grails/plugins/Plugin.html'>Plugin</a></pre>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td
class="colLast"><code>protected boolean</code></td>
- <td class="colLast"><code><strong><a
href="#isChildOfFile(java.io.File,
java.io.File)">isChildOfFile</a></strong>(java.io.File child, java.io.File
parent)</code><br></td>
+ <td
class="colLast"><code>public void</code></td>
+ <td class="colLast"><code><strong><a
href="#clearCache()">clearCache</a></strong>()</code><br>Discards the cached
list so the next <a href='#getAvailableLocales()'>getAvailableLocales()</a>
re-scans the classpath.</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>void</code></td>
- <td class="colLast"><code><strong><a
href="#onChange(Map)">onChange</a></strong>(java.util.Map<java.lang.String,
java.lang.Object> event)</code><br></td>
+ <td
class="colLast"><code>public java.util.List<java.util.Locale></code></td>
+ <td class="colLast"><code><strong><a
href="#getAvailableLocales()">getAvailableLocales</a></strong>()</code><br>
<DL><DT><B>Returns:</B></DT><DD>an unmodifiable, display-name-sorted list of
the locales the application is
+ translated into.</DD></DL></td>
</tr>
</table>
@@ -262,8 +239,8 @@ extends <a
href='../../../../grails/plugins/Plugin.html'>Plugin</a></pre>
</tr>
<tr class="altColor">
- <td class="colFirst"><code>class <a
href='../../../../grails/plugins/Plugin.html'>Plugin</a></code></td>
- <td class="colLast"><code><a
href='../../../../grails/plugins/Plugin.html#beanRegistrar()'>beanRegistrar</a>,
<a
href='../../../../grails/plugins/Plugin.html#beans(groovy.lang.Closure)'>beans</a>,
<a
href='../../../../grails/plugins/Plugin.html#doWithApplicationContext()'>doWithApplicationContext</a>,
<a
href='../../../../grails/plugins/Plugin.html#doWithDynamicMethods()'>doWithDynamicMethods</a>,
<a href='../../../../grails/plugins/Plugin.html#doWithSpring()' [...]
+ <td class="colFirst"><code>class
java.lang.Object</code></td>
+ <td
class="colLast"><code>java.lang.Object#equals(java.lang.Object),
java.lang.Object#getClass(), java.lang.Object#hashCode(),
java.lang.Object#notify(), java.lang.Object#notifyAll(),
java.lang.Object#toString(), java.lang.Object#wait(),
java.lang.Object#wait(long), java.lang.Object#wait(long, int)</code></td>
</tr>
</table>
</ul>
@@ -281,36 +258,18 @@ extends <a
href='../../../../grails/plugins/Plugin.html'>Plugin</a></pre>
-
-
- <!-- =========== PROPERTY DETAIL =========== -->
+ <!-- =========== FIELD DETAIL =========== -->
<ul class="blockList">
- <li class="blockList"><a name="prop_detail">
+ <li class="blockList"><a name="field_detail">
<!-- -->
</a>
- <h3>Property Detail</h3>
-
- <a name="baseDir"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>java.lang.String
<strong>baseDir</strong></h4>
- <p></p>
- </li>
- </ul>
+ <h3>Field Detail</h3>
- <a name="version"><!-- --></a>
+ <a name="DEFAULT_BASE_NAME"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>java.lang.String
<strong>version</strong></h4>
- <p></p>
- </li>
- </ul>
-
- <a name="watchedResources"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>java.lang.String
<strong>watchedResources</strong></h4>
- <p></p>
+
<h4>public static final java.lang.String
<strong>DEFAULT_BASE_NAME</strong></h4>
+ <p> The base name of an application's own
message bundles (<CODE>messages.properties</CODE>). </p>
</li>
</ul>
@@ -321,6 +280,8 @@ extends <a
href='../../../../grails/plugins/Plugin.html'>Plugin</a></pre>
+
+
<!-- =========== CONSTRUCTOR DETAIL =========== -->
<ul class="blockList">
<li class="blockList"><a name="constructor_detail">
@@ -328,11 +289,23 @@ extends <a
href='../../../../grails/plugins/Plugin.html'>Plugin</a></pre>
</a>
<h3>Constructor Detail</h3>
- <a name="I18nGrailsPlugin()"><!-- --></a>
+ <a
name="AvailableLocaleResolver(java.lang.ClassLoader, java.util.Locale)"><!--
--></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+
<h4>public <strong>AvailableLocaleResolver</strong>(java.lang.ClassLoader
classLoader, java.util.Locale defaultLocale)</h4>
+ <p> Scans only the application's own
<CODE>messages_*.properties</CODE> bundles.
+ <DL><DT><B>Parameters:</B></DT><DD><code>classLoader</code> - the class
loader whose classpath is scanned for message
bundles</DD><DD><code>defaultLocale</code> - the locale of the base
<CODE>messages.properties</CODE> bundle,
+ always included in the result (may be <CODE>null</CODE> to include
none)</DD></DL></p>
+ </li>
+ </ul>
+
+ <a
name="AvailableLocaleResolver(java.lang.ClassLoader, java.util.Locale,
boolean)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4><strong>I18nGrailsPlugin</strong>()</h4>
- <p></p>
+
<h4>public <strong>AvailableLocaleResolver</strong>(java.lang.ClassLoader
classLoader, java.util.Locale defaultLocale, boolean includePluginBundles)</h4>
+ <p>
+ <DL><DT><B>Parameters:</B></DT><DD><code>classLoader</code> - the class
loader whose classpath is scanned for message
bundles</DD><DD><code>defaultLocale</code> - the locale of the base bundle,
always included (may be
<CODE>null</CODE>)</DD><DD><code>includePluginBundles</code> - whether to also
consider plugin-contributed bundles (every
+ <CODE>*.properties</CODE> on the classpath) rather than only the
application's <CODE>messages</CODE></DD></DL></p>
</li>
</ul>
@@ -349,19 +322,22 @@ extends <a
href='../../../../grails/plugins/Plugin.html'>Plugin</a></pre>
</a>
<h3>Method Detail</h3>
- <a name="isChildOfFile(java.io.File,
java.io.File)"><!-- --></a>
+ <a name="clearCache()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>protected boolean
<strong>isChildOfFile</strong>(java.io.File child, java.io.File parent)</h4>
- <p></p>
+ <h4>public void
<strong>clearCache</strong>()</h4>
+ <p> Discards the cached list so the next <a
href='#getAvailableLocales()'>getAvailableLocales()</a> re-scans the classpath.
+ </p>
</li>
</ul>
- <a name="onChange(Map)"><!-- --></a>
+ <a name="getAvailableLocales()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@java.lang.Override<br>void
<strong>onChange</strong>(java.util.Map<java.lang.String,
java.lang.Object> event)</h4>
- <p></p>
+
<h4>public java.util.List<java.util.Locale>
<strong>getAvailableLocales</strong>()</h4>
+ <p>
+ <DL><DT><B>Returns:</B></DT><DD>an unmodifiable, display-name-sorted
list of the locales the application is
+ translated into. Computed once and cached until <a
href='#clearCache()'>clearCache()</a> is called.</DD></DL></p>
</li>
</ul>
@@ -392,18 +368,18 @@ extends <a
href='../../../../grails/plugins/Plugin.html'>Plugin</a></pre>
<div class="subNav">
<div>
<ul class="navList">
- <li><a
href="../../../../index.html?org/grails/plugins/i18n/I18nGrailsPlugin"
target="_top">Frames</a></li>
- <li><a href="I18nGrailsPlugin.html" target="_top">No
Frames</a></li>
+ <li><a
href="../../../../index.html?org/grails/plugins/i18n/AvailableLocaleResolver"
target="_top">Frames</a></li>
+ <li><a href="AvailableLocaleResolver.html" target="_top">No
Frames</a></li>
</ul>
</div>
<div>
<ul class="subNavList">
<li>Summary: </li>
- Nested Field <li><a
href="#property_summary">Property</a></li> <li><a
href="#constructor_summary">Constructor</a></li> <li><a
href="#method_summary">Method</a></li>
+ Nested <li><a
href="#field_summary">Field</a></li> <li><a
href="#constructor_summary">Constructor</a></li> <li><a
href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- Field <li><a
href="#prop_detail">Property</a></li> <li><a
href="#constructor_detail">Constructor</a></li> <li><a
href="#method_detail">Method</a></li>
+ <li><a
href="#field_detail">Field</a></li> <li><a
href="#constructor_detail">Constructor</a></li> <li><a
href="#method_detail">Method</a></li>
</ul>
</div>
<p><!-- Matomo -->
diff --git
a/docs/snapshot/api/org/grails/plugins/i18n/I18nAutoConfiguration.html
b/docs/snapshot/api/org/grails/plugins/i18n/I18nAutoConfiguration.html
index 6433de44869..f20dddbce48 100644
--- a/docs/snapshot/api/org/grails/plugins/i18n/I18nAutoConfiguration.html
+++ b/docs/snapshot/api/org/grails/plugins/i18n/I18nAutoConfiguration.html
@@ -145,18 +145,26 @@ extends java.lang.Object</pre>
</tr>
<tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public <a
href='../../../../org/grails/plugins/i18n/AvailableLocaleResolver.html'>AvailableLocaleResolver</a></code></td>
+ <td class="colLast"><code><strong><a
href="#availableLocaleResolver(grails.core.GrailsApplication,
boolean)">availableLocaleResolver</a></strong>(<a
href='../../../../grails/core/GrailsApplication.html'>GrailsApplication</a>
grailsApplication, boolean includePlugins)</code><br>Discovers the locales the
application is translated into (from
<CODE><basename>_<locale>.properties</CODE>
+ bundles on the classpath) so that a language selector can list only real
translations rather
+ than every JVM locale. </td>
+ </tr>
+
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public <a
href='../../../../org.springframework.web.servlet.i18n.LocaleChangeInterceptor.html'>LocaleChangeInterceptor</a></code></td>
<td class="colLast"><code><strong><a
href="#localeChangeInterceptor()">localeChangeInterceptor</a></strong>()</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public <a
href='../../../../org.springframework.web.servlet.LocaleResolver.html'>LocaleResolver</a></code></td>
<td class="colLast"><code><strong><a
href="#localeResolver()">localeResolver</a></strong>()</code><br></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public <a
href='../../../../org.springframework.context.MessageSource.html'>MessageSource</a></code></td>
<td class="colLast"><code><strong><a
href="#messageSource(grails.core.GrailsApplication,
grails.plugins.GrailsPluginManager)">messageSource</a></strong>(<a
href='../../../../grails/core/GrailsApplication.html'>GrailsApplication</a>
grailsApplication, <a
href='../../../../grails/plugins/GrailsPluginManager.html'>GrailsPluginManager</a>
pluginManager)</code><br></td>
@@ -212,6 +220,29 @@ extends java.lang.Object</pre>
</a>
<h3>Method Detail</h3>
+ <a
name="availableLocaleResolver(grails.core.GrailsApplication, boolean)"><!--
--></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+
<h4>@org.springframework.context.annotation.Bean<br>@org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean(AvailableLocaleResolver.class)<br>public <a
href='../../../../org/grails/plugins/i18n/AvailableLocaleResolver.html'>AvailableLocaleResolver</a>
<strong>availableLocaleResolver</strong>(<a
href='../../../../grails/core/GrailsApplication.html'>GrailsApplication</a>
grailsApplication, @org.springframework.beans.factory.annotation [...]
+ <p> Discovers the locales the application is
translated into (from <CODE><basename>_<locale>.properties</CODE>
+ bundles on the classpath) so that a language selector can list only real
translations rather
+ than every JVM locale. Published to the servlet context by <a
href='../../../../org/grails/plugins/i18n/I18nGrailsPlugin.html'
title='I18nGrailsPlugin'>I18nGrailsPlugin</a> and
+ consumed by the <CODE>g:localeSelect available="true"</CODE> tag.
+
+ <p>By default every <CODE>*.properties</CODE> bundle on the classpath is
considered, so locales
+ contributed by plugins — whose bundles are namespaced (e.g.
+ <CODE>spring-security-core_*.properties</CODE>) — are included
alongside the application's own.
+ Set <CODE>grails.i18n.availableLocales.includePlugins=false</CODE> to
restrict discovery to the
+ application's own <CODE>messages_*.properties</CODE> bundles.
+
+ <p>The base <CODE>messages.properties</CODE> locale is always included,
resolved from
+ <CODE>grails.i18n.default.locale</CODE> exactly like the rest of this class
(falling back to the
+ JVM default locale when the property is not set).
+ <DL><DT><B>Parameters:</B></DT><DD><code>includePlugins</code> -
whether to also scan plugin-contributed message bundles
+ (<CODE>grails.i18n.availableLocales.includePlugins</CODE>, defaults to
<CODE>true</CODE>)</DD></DL></p>
+ </li>
+ </ul>
+
<a name="localeChangeInterceptor()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
diff --git a/docs/snapshot/api/org/grails/plugins/i18n/I18nGrailsPlugin.html
b/docs/snapshot/api/org/grails/plugins/i18n/I18nGrailsPlugin.html
index d0db8422860..6db8a6397f2 100644
--- a/docs/snapshot/api/org/grails/plugins/i18n/I18nGrailsPlugin.html
+++ b/docs/snapshot/api/org/grails/plugins/i18n/I18nGrailsPlugin.html
@@ -156,16 +156,22 @@ extends <a
href='../../../../grails/plugins/Plugin.html'>Plugin</a></pre>
</tr>
<tr class="altColor">
+ <td
class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a
href="#AVAILABLE_LOCALES_ATTRIBUTE">AVAILABLE_LOCALES_ATTRIBUTE</a></code><br>Publishes
the discovered available locales to the servlet context so that views and the
+ <CODE>g:localeSelect available="true"</CODE> tag can render a language
selector. </td>
+ </tr>
+
+ <tr class="rowColor">
<td
class="colFirst"><code><strong>java.lang.String</strong></code> </td>
<td class="colLast"><code><a
href="#baseDir">baseDir</a></code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td
class="colFirst"><code><strong>java.lang.String</strong></code> </td>
<td class="colLast"><code><a
href="#version">version</a></code><br></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td
class="colFirst"><code><strong>java.lang.String</strong></code> </td>
<td class="colLast"><code><a
href="#watchedResources">watchedResources</a></code><br></td>
</tr>
@@ -236,12 +242,18 @@ extends <a
href='../../../../grails/plugins/Plugin.html'>Plugin</a></pre>
</tr>
<tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>void</code></td>
+ <td class="colLast"><code><strong><a
href="#doWithApplicationContext()">doWithApplicationContext</a></strong>()</code><br></td>
+ </tr>
+
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>protected boolean</code></td>
<td class="colLast"><code><strong><a
href="#isChildOfFile(java.io.File,
java.io.File)">isChildOfFile</a></strong>(java.io.File child, java.io.File
parent)</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>void</code></td>
<td class="colLast"><code><strong><a
href="#onChange(Map)">onChange</a></strong>(java.util.Map<java.lang.String,
java.lang.Object> event)</code><br></td>
@@ -290,6 +302,16 @@ extends <a
href='../../../../grails/plugins/Plugin.html'>Plugin</a></pre>
</a>
<h3>Property Detail</h3>
+ <a name="AVAILABLE_LOCALES_ATTRIBUTE"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>static final java.lang.String
<strong>AVAILABLE_LOCALES_ATTRIBUTE</strong></h4>
+ <p> Publishes the discovered available locales
to the servlet context so that views and the
+ <CODE>g:localeSelect available="true"</CODE> tag can render a language
selector. Reading a servlet
+ context attribute keeps consumers decoupled from this module.</p>
+ </li>
+ </ul>
+
<a name="baseDir"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
@@ -349,6 +371,14 @@ extends <a
href='../../../../grails/plugins/Plugin.html'>Plugin</a></pre>
</a>
<h3>Method Detail</h3>
+ <a name="doWithApplicationContext()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@java.lang.Override<br>void
<strong>doWithApplicationContext</strong>()</h4>
+ <p></p>
+ </li>
+ </ul>
+
<a name="isChildOfFile(java.io.File,
java.io.File)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
diff --git a/docs/snapshot/api/org/grails/plugins/i18n/package-frame.html
b/docs/snapshot/api/org/grails/plugins/i18n/package-frame.html
index 013144eb48d..a249c8d719b 100644
--- a/docs/snapshot/api/org/grails/plugins/i18n/package-frame.html
+++ b/docs/snapshot/api/org/grails/plugins/i18n/package-frame.html
@@ -43,7 +43,7 @@
<div class="indexContainer">
<h2>Classes</h2>
<ul>
- <li><a href="GrailsLocaleResolverAutoConfiguration.html" title="class
in org.grails.plugins.i18n"
target="classFrame">GrailsLocaleResolverAutoConfiguration</a></li><li><a
href="I18nAutoConfiguration.html" title="class in org.grails.plugins.i18n"
target="classFrame">I18nAutoConfiguration</a></li><li><a
href="I18nGrailsPlugin.html" title="class in org.grails.plugins.i18n"
target="classFrame">I18nGrailsPlugin</a></li>
+ <li><a href="AvailableLocaleResolver.html" title="class in
org.grails.plugins.i18n"
target="classFrame">AvailableLocaleResolver</a></li><li><a
href="GrailsLocaleResolverAutoConfiguration.html" title="class in
org.grails.plugins.i18n"
target="classFrame">GrailsLocaleResolverAutoConfiguration</a></li><li><a
href="I18nAutoConfiguration.html" title="class in org.grails.plugins.i18n"
target="classFrame">I18nAutoConfiguration</a></li><li><a
href="I18nGrailsPlugin.html" title="class in [...]
</ul>
</div>
diff --git a/docs/snapshot/api/org/grails/plugins/i18n/package-summary.html
b/docs/snapshot/api/org/grails/plugins/i18n/package-summary.html
index caba3b217ac..ef47bda917e 100644
--- a/docs/snapshot/api/org/grails/plugins/i18n/package-summary.html
+++ b/docs/snapshot/api/org/grails/plugins/i18n/package-summary.html
@@ -88,6 +88,15 @@ function windowTitle()
<th class="colFirst" scope="col">Class</th>
<th class="colLast" scope="col">Description</th>
</tr>
+<tr class="altColor">
+ <td class="colOne">
+ <strong><a href="AvailableLocaleResolver.html"
title="class in org/grails/plugins/i18n">
+ AvailableLocaleResolver
+ </a></strong>
+ </td>
+ <td>Discovers the locales an application is
actually translated into by scanning the
+ classpath for <CODE><basename>_<locale>.properties</CODE>
resource bundles.</td>
+ </tr>
<tr class="altColor">
<td class="colOne">
<strong><a
href="GrailsLocaleResolverAutoConfiguration.html" title="class in
org/grails/plugins/i18n">
diff --git a/docs/snapshot/api/org/grails/plugins/web/taglib/FormTagLib.html
b/docs/snapshot/api/org/grails/plugins/web/taglib/FormTagLib.html
index 4c62f06b74f..4c7cc2c845e 100644
--- a/docs/snapshot/api/org/grails/plugins/web/taglib/FormTagLib.html
+++ b/docs/snapshot/api/org/grails/plugins/web/taglib/FormTagLib.html
@@ -563,7 +563,9 @@ implements <a
href='../../../../../org.springframework.context.ApplicationContex
<h4>java.lang.Object
<strong>localeSelect</strong>(java.util.Map attrs)</h4>
<p> A helper tag for creating locale
selects.<br/>
- eg. <g:localeSelect name="myLocale" value="${locale}"
/><DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED The name of the
select</DD></DL><DL><DT><B>attr:</B></DT><DD>value The set locale, defaults to
the current request locale if not
specified</DD></DL><DL><DT><B>attr:</B></DT><DD>locale The locale to use for
formatting the locale names. Defaults to the current request locale and then
the system default locale if not specified</DD></DL> </p>
+ eg. <g:localeSelect name="myLocale" value="${locale}"
/><DL><DT><B>emptyTag:</B></DT><DD>@attr name REQUIRED The name of the
select</DD></DL><DL><DT><B>attr:</B></DT><DD>value The set locale, defaults to
the current request locale if not
specified</DD></DL><DL><DT><B>attr:</B></DT><DD>locale The locale to use for
formatting the locale names. Defaults to the current request locale and then
the system default locale if not
specified</DD></DL><DL><DT><B>attr:</B></DT><DD>available If [...]
+ (those with a <code>messages_*.properties</code> bundle, as published to the
servlet context by
+ the i18n plugin) instead of every locale the JVM knows about. Defaults to
<code>false</code>.</DD></DL> </p>
</li>
</ul>
diff --git
a/docs/snapshot/api/org/grails/web/errors/GrailsExceptionResolver.html
b/docs/snapshot/api/org/grails/web/errors/GrailsExceptionResolver.html
index b23597bb22c..ade2963e6dc 100644
--- a/docs/snapshot/api/org/grails/web/errors/GrailsExceptionResolver.html
+++ b/docs/snapshot/api/org/grails/web/errors/GrailsExceptionResolver.html
@@ -293,6 +293,12 @@ implements <a
href='../../../../grails/core/support/GrailsApplicationAware.html'
</tr>
<tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td
class="colLast"><code>protected boolean</code></td>
+ <td class="colLast"><code><strong><a
href="#isExcludedRequestParameter(java.lang.String,
List)">isExcludedRequestParameter</a></strong>(java.lang.String parameterName,
java.util.List<java.lang.String> excludedParameterNames)</code><br></td>
+ </tr>
+
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>protected void</code></td>
<td class="colLast"><code><strong><a
href="#logFullStackTraceIfEnabled(java.lang.Exception)">logFullStackTraceIfEnabled</a></strong>(java.lang.Exception
e)</code><br>When the <CODE>grails.exceptionresolver.logFullStackTrace</CODE>
property is enabled,
@@ -300,79 +306,79 @@ implements <a
href='../../../../grails/core/support/GrailsApplicationAware.html'
</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>protected void</code></td>
<td class="colLast"><code><strong><a
href="#logStackTrace(java.lang.Exception,
jakarta.servlet.http.HttpServletRequest)">logStackTrace</a></strong>(java.lang.Exception
e, <a
href='../../../../jakarta.servlet.http.HttpServletRequest.html'>HttpServletRequest</a>
request)</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>protected <a
href='../../../../grails/web/mapping/UrlMappingsHolder.html'>UrlMappingsHolder</a></code></td>
<td class="colLast"><code><strong><a
href="#lookupUrlMappings()">lookupUrlMappings</a></strong>()</code><br></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>protected <a
href='../../../../grails/web/mapping/UrlMappingInfo.html'>UrlMappingInfo</a></code></td>
<td class="colLast"><code><strong><a
href="#matchStatusCode(java.lang.Exception,
grails.web.mapping.UrlMappingsHolder)">matchStatusCode</a></strong>(java.lang.Exception
ex, <a
href='../../../../grails/web/mapping/UrlMappingsHolder.html'>UrlMappingsHolder</a>
urlMappings)</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public <a
href='../../../../org.springframework.web.servlet.ModelAndView.html'>ModelAndView</a></code></td>
<td class="colLast"><code><strong><a
href="#resolveException(jakarta.servlet.http.HttpServletRequest,
jakarta.servlet.http.HttpServletResponse, java.lang.Object,
java.lang.Exception)">resolveException</a></strong>(<a
href='../../../../jakarta.servlet.http.HttpServletRequest.html'>HttpServletRequest</a>
request, <a
href='../../../../jakarta.servlet.http.HttpServletResponse.html'>HttpServletResponse</a>
response, java.lang.Object handler, java.lang.Exception ex) [...]
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>protected java.lang.String</code></td>
<td class="colLast"><code><strong><a
href="#resolveRemoteAddr(jakarta.servlet.http.HttpServletRequest)">resolveRemoteAddr</a></strong>(<a
href='../../../../jakarta.servlet.http.HttpServletRequest.html'>HttpServletRequest</a>
request)</code><br>Resolves the client address to include in the exception log
headline. </td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>protected void</code></td>
<td class="colLast"><code><strong><a
href="#resolveView(jakarta.servlet.http.HttpServletRequest,
grails.web.mapping.UrlMappingInfo,
org.springframework.web.servlet.ModelAndView)">resolveView</a></strong>(<a
href='../../../../jakarta.servlet.http.HttpServletRequest.html'>HttpServletRequest</a>
request, <a
href='../../../../grails/web/mapping/UrlMappingInfo.html'>UrlMappingInfo</a>
info, <a
href='../../../../org.springframework.web.servlet.ModelAndView.html'>Mod [...]
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>protected <a
href='../../../../org.springframework.web.servlet.ModelAndView.html'>ModelAndView</a></code></td>
<td class="colLast"><code><strong><a
href="#resolveViewOrForward(java.lang.Exception,
grails.web.mapping.UrlMappingsHolder, jakarta.servlet.http.HttpServletRequest,
jakarta.servlet.http.HttpServletResponse,
org.springframework.web.servlet.ModelAndView)">resolveViewOrForward</a></strong>(java.lang.Exception
ex, <a
href='../../../../grails/web/mapping/UrlMappingsHolder.html'>UrlMappingsHolder</a>
urlMappings, <a href='../../../../jakarta.servlet.http.HttpServlet [...]
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
<td class="colLast"><code><strong><a
href="#setGrailsApplication(grails.core.GrailsApplication)">setGrailsApplication</a></strong>(<a
href='../../../../grails/core/GrailsApplication.html'>GrailsApplication</a>
grailsApplication)</code><br></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
<td class="colLast"><code><strong><a
href="#setServletContext(jakarta.servlet.ServletContext)">setServletContext</a></strong>(<a
href='../../../../jakarta.servlet.ServletContext.html'>ServletContext</a>
servletContext)</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>protected void</code></td>
<td class="colLast"><code><strong><a
href="#setStatus(jakarta.servlet.http.HttpServletRequest,
jakarta.servlet.http.HttpServletResponse,
org.springframework.web.servlet.ModelAndView,
java.lang.Exception)">setStatus</a></strong>(<a
href='../../../../jakarta.servlet.http.HttpServletRequest.html'>HttpServletRequest</a>
request, <a
href='../../../../jakarta.servlet.http.HttpServletResponse.html'>HttpServletResponse</a>
response, <a href='../../../../org.springfram [...]
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>protected boolean</code></td>
<td class="colLast"><code><strong><a
href="#shouldLogAuditor()">shouldLogAuditor</a></strong>()</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>protected boolean</code></td>
<td class="colLast"><code><strong><a
href="#shouldLogFullStackTrace()">shouldLogFullStackTrace</a></strong>()</code><br></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>protected boolean</code></td>
<td class="colLast"><code><strong><a
href="#shouldLogRemoteAddr()">shouldLogRemoteAddr</a></strong>()</code><br></td>
@@ -588,6 +594,14 @@ implements <a
href='../../../../grails/core/support/GrailsApplicationAware.html'
</li>
</ul>
+ <a name="isExcludedRequestParameter(java.lang.String,
List)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>protected boolean
<strong>isExcludedRequestParameter</strong>(java.lang.String parameterName,
java.util.List<java.lang.String> excludedParameterNames)</h4>
+ <p></p>
+ </li>
+ </ul>
+
<a
name="logFullStackTraceIfEnabled(java.lang.Exception)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
diff --git a/docs/snapshot/guide/commandLine.html
b/docs/snapshot/guide/commandLine.html
index 98e80909086..e6917f2fc9f 100644
--- a/docs/snapshot/guide/commandLine.html
+++ b/docs/snapshot/guide/commandLine.html
@@ -623,13 +623,13 @@ Here’s an example of the available options in
interactive mode:</p>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">grails> create-app -h
-Usage: grails create-app [-hivVx] [--list-features] [-g=GORM Implementation]
[--jdk=<javaVersion>]
+Usage: grails create-app [-hivVx] [--list-features] [-d=Grails Data
Implementation] [--jdk=<javaVersion>]
[-s=Servlet Implementation] [-t=TEST]
[-f=FEATURE[,FEATURE...]]... [NAME]
Creates an application
[NAME] The name of the application to create.
-f, --features=FEATURE[,FEATURE...]
The features to use. Possible values: h2, scaffolding,
gorm-hibernate5,
- spring-boot-starter-jetty,
spring-boot-starter-tomcat,
+ gorm-hibernate7, spring-boot-starter-jetty,
spring-boot-starter-tomcat,
micronaut-http-client, cache-ehcache,
hibernate-validator, postgres,
mysql, cache, database-migration, grails-gsp,
hamcrest, gorm-mongodb,
assertj, mockito, spring-boot-starter-undertow,
@@ -637,9 +637,9 @@ Creates an application
grails-console, views-markup, asset-pipeline-grails,
views-json,
gorm-neo4j, asciidoctor, grails-web-console,
logbackGroovy, mongo-sync, shade, geb, properties
- -g, --gorm=GORM Implementation
- Which GORM Implementation to configure. Possible
values: hibernate,
- mongodb, neo4j.
+ -d, --data, -g, --gorm=Grails Data Implementation
+ Which Grails Data implementation to configure (-g,
--gorm are legacy
+ aliases). Possible values: hibernate5, hibernate7,
mongodb.
-h, --help Show this help message and exit.
-i, --inplace Create a service using the current directory
--jdk, --java-version=<javaVersion>
@@ -679,8 +679,9 @@ Available Features
Database
database-migration Adds support for Liquibase database
migrations. The Database Migration plugin helps you manage database changes
while developing Grails applications.
- gorm-hibernate5 (+) Adds support for Hibernate5 using GORM
- gorm-mongodb Configures GORM for MongoDB for Groovy
applications
+ gorm-hibernate5 (+) Configure Grails Data for using
Hibernate 5.
+ gorm-hibernate7 Configure Grails Data for using
Hibernate 7.
+ gorm-mongodb Configure Grails Data for using MongoDB.
gorm-neo4j Configures GORM for Neo4j for Groovy
applications
h2 (+) Adds the H2 driver and default config
mongo-sync Adds support for the MongoDB Synchronous
Driver
@@ -1373,7 +1374,7 @@ Commands defined this way still have access to the
execution context via a varia
<p>-s, --servlet</p>
</li>
<li>
-<p>-g, --gorm</p>
+<p>-d, --data (-g, --gorm are legacy aliases)</p>
</li>
<li>
<p>-t, --test</p>
@@ -1391,7 +1392,7 @@ Commands defined this way still have access to the
execution context via a varia
<pre class="CodeRay highlight"><code data-lang="console">./grails -t forge
create-app \
--servlet=tomcat \
--jdk=11 \
- --gorm=hibernate \
+ --data=hibernate5 \
--test=spock \
--features=github-workflow-java-ci \
com.example.demo</code></pre>
@@ -1410,7 +1411,7 @@ Commands defined this way still have access to the
execution context via a varia
<p>-s, --servlet</p>
</li>
<li>
-<p>-g, --gorm</p>
+<p>-d, --data (-g, --gorm are legacy aliases)</p>
</li>
<li>
<p>-t, --test</p>
@@ -1428,7 +1429,7 @@ Commands defined this way still have access to the
execution context via a varia
<pre class="CodeRay highlight"><code data-lang="console">./grails -t forge
create-restapi \
--servlet=tomcat \
--jdk=11 \
- --gorm=hibernate \
+ --data=hibernate5 \
--test=spock \
--features=github-workflow-java-ci \
com.example.demo</code></pre>
@@ -1447,7 +1448,7 @@ Commands defined this way still have access to the
execution context via a varia
<p>-s, --servlet</p>
</li>
<li>
-<p>-g, --gorm</p>
+<p>-d, --data (-g, --gorm are legacy aliases)</p>
</li>
<li>
<p>-t, --test</p>
@@ -1465,7 +1466,7 @@ Commands defined this way still have access to the
execution context via a varia
<pre class="CodeRay highlight"><code data-lang="console">./grails -t forge
create-plugin \
--servlet=tomcat \
--jdk=11 \
- --gorm=hibernate \
+ --data=hibernate5 \
--test=spock \
--features=github-workflow-java-ci \
com.example.demo</code></pre>
@@ -1484,7 +1485,7 @@ Commands defined this way still have access to the
execution context via a varia
<p>-s, --servlet</p>
</li>
<li>
-<p>-g, --gorm</p>
+<p>-d, --data (-g, --gorm are legacy aliases)</p>
</li>
<li>
<p>-t, --test</p>
@@ -1502,7 +1503,7 @@ Commands defined this way still have access to the
execution context via a varia
<pre class="CodeRay highlight"><code data-lang="console">./grails -t forge
create-web-plugin \
--servlet=tomcat \
--jdk=11 \
- --gorm=hibernate \
+ --data=hibernate5 \
--test=spock \
--features=github-workflow-java-ci \
com.example.demo</code></pre>
@@ -1514,7 +1515,7 @@ Commands defined this way still have access to the
execution context via a varia
<div class="sect2">
<h3 id="_the_create_command_flags">The <code>create-</code> command flags</h3>
<div class="paragraph">
-<p>The "create-*" commands are used to produce a fundamental Grails project,
allowing for the inclusion of optional flags to select additional features, to
customize GORM settings, an embedded servlet, the test framework, and the Java
version.</p>
+<p>The "create-*" commands are used to produce a fundamental Grails project,
allowing for the inclusion of optional flags to select additional features, to
customize Grails Data settings, an embedded servlet, the test framework, and
the Java version.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
@@ -1549,11 +1550,11 @@ Commands defined this way still have access to the
execution context via a varia
</div></div></td>
</tr>
<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">-g,
--gorm</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Which GORM
Implementation to configure. Possible values: hibernate, mongodb,
neo4j.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">-d, --data
(-g, --gorm are legacy aliases)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Which
Grails Data implementation to configure. Possible values: hibernate5,
hibernate7, mongodb. The value hibernate is accepted as a legacy alias for
hibernate5.</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div
class="listingblock">
<div class="content">
-<pre class="CodeRay highlight"><code data-lang="shell">--gorm
hibernate</code></pre>
+<pre class="CodeRay highlight"><code data-lang="shell">--data
hibernate5</code></pre>
</div>
</div></div></td>
</tr>
@@ -1568,7 +1569,7 @@ Commands defined this way still have access to the
execution context via a varia
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">-f,
--features</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The
features to use. Possible values: h2, gorm-hibernate5,
spring-boot-starter-jetty, micronaut-http-client, cache-ehcache,
hibernate-validator, postgres, mysql, cache, database-migration, grails-gsp,
hamcrest, gorm-mongodb, assertj, mockito, spring-boot-starter-undertow,
github-workflow-java-ci, jrebel, testcontainers, sqlserver, grails-console,
views-markup, views-json, gorm-neo4j, asciidoctor, grails-web-console, logb
[...]
+<td class="tableblock halign-left valign-top"><p class="tableblock">The
features to use. Possible values: h2, gorm-hibernate5, gorm-hibernate7,
spring-boot-starter-jetty, micronaut-http-client, cache-ehcache,
hibernate-validator, postgres, mysql, cache, database-migration, grails-gsp,
hamcrest, gorm-mongodb, assertj, mockito, spring-boot-starter-undertow,
github-workflow-java-ci, jrebel, testcontainers, sqlserver, grails-console,
views-markup, views-json, gorm-neo4j, asciidoctor, grails- [...]
<td class="tableblock halign-left valign-top"><div class="content"><div
class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">--features
github-workflow-java-ci,micronaut-http-client</code></pre>
@@ -1949,7 +1950,7 @@ ext[<span class="string"><span
class="delimiter">'</span><span class="content">s
<p>Use <code>grails create-app myapp</code> to generate a default project
using the Grails Shell CLI. This is the most common usage.</p>
</li>
<li>
-<p>Use <code>grails -t forge create-app myapp</code> to access advanced
application generation options such as <code>--jdk</code>, <code>--gorm</code>,
and other Forge-only flags.</p>
+<p>Use <code>grails -t forge create-app myapp</code> to access advanced
application generation options such as <code>--jdk</code>, <code>--data</code>,
and other Forge-only flags.</p>
</li>
</ul>
</div>
diff --git a/docs/snapshot/guide/conf.html b/docs/snapshot/guide/conf.html
index 8ba914c6069..bc926cb4dcb 100644
--- a/docs/snapshot/guide/conf.html
+++ b/docs/snapshot/guide/conf.html
@@ -915,7 +915,8 @@ qualified name of the artifact.</p>
<div class="paragraph">
<p>When Grails logs a stacktrace, the log message may include the names and
values of all of the request parameters for the current request.
-To mask out the values of secure request parameters, specify the parameter
names in the <code>grails.exceptionresolver.params.exclude</code> config
property:</p>
+To mask out the values of secure request parameters, specify the parameter
names in the <code>grails.exceptionresolver.params.exclude</code> config
property:
+Parameter names are matched case-insensitively.</p>
</div>
<div class="listingblock">
<div class="title">grails-app/conf/application.yml</div>
diff --git a/docs/snapshot/guide/i18n.html b/docs/snapshot/guide/i18n.html
index 19e354687f2..8bcb28bcdf8 100644
--- a/docs/snapshot/guide/i18n.html
+++ b/docs/snapshot/guide/i18n.html
@@ -289,6 +289,31 @@ Companies deploy assistants like this [](https://kapa.ai)
on docs via [website w
<p>Grails will automatically switch the user’s locale and subsequent
requests will use the switched locale.</p>
</div>
<div class="paragraph">
+<p>To offer a language selector, the i18n plugin discovers the locales your
application is actually translated into by scanning the classpath for
<code>messages_*.properties</code> bundles (plus the default locale,
configurable via <code>grails.i18n.default.locale</code>). This list is exposed
as the <code>AvailableLocaleResolver</code> bean and published to the servlet
context under the <code>availableLocales</code> attribute. The
<code><g:localeSelect available="true"/></code [...]
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span
class="tag"><g:each</span> <span class="attribute-name">in</span>=<span
class="string"><span class="delimiter">"</span><span
class="content">${application.getAttribute('availableLocales')}</span><span
class="delimiter">"</span></span> <span
class="attribute-name">var</span>=<span class="string"><span
class="delimiter">"</span><span class="content">locale</span><span
class="delimiter">"</span></span><span cl [...]
+ <span class="tag"><a</span> <span
class="attribute-name">href</span>=<span class="string"><span
class="delimiter">"</span><span
class="content">?lang=${locale.toLanguageTag()}</span><span
class="delimiter">"</span></span><span
class="tag">></span>${locale.getDisplayName(locale)}<span
class="tag"></a></span>
+<span class="tag"></g:each></span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>By default every <code>*.properties</code> bundle on the classpath is
considered, so locales contributed by plugins — whose bundles are
namespaced (for example <code>spring-security-core_fr.properties</code>)
— are listed alongside your application’s own. Candidate suffixes
are validated against the ISO language codes (and the ISO country codes when a
country is present), so non-i18n properties files (such as
<code>application.properties</code>) are ignored. To r [...]
+</div>
+<div class="listingblock">
+<div class="title">grails-app/conf/application.yml</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="yaml"><span
class="key">grails</span>:
+ <span class="key">i18n</span>:
+ <span class="key">availableLocales</span>:
+ <span class="key">includePlugins</span>: <span
class="string"><span class="content">false</span></span> <span
class="comment"># list only the application's own
translations</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Applications created with <code>grails create-app</code> include a
ready-made language dropdown in the default layout that uses exactly this
mechanism.</p>
+</div>
+<div class="paragraph">
<p>By default, Grails uses <a
href="https://docs.spring.io/spring-framework/docs/7.0.8/javadoc-api/org/springframework/web/servlet/i18n/SessionLocaleResolver.html">SessionLocaleResolver</a>
as the <code>localeResolver</code> bean.</p>
</div>
<div class="paragraph">
diff --git a/docs/snapshot/guide/introduction.html
b/docs/snapshot/guide/introduction.html
index cdfc3ebaf9d..533f306041f 100644
--- a/docs/snapshot/guide/introduction.html
+++ b/docs/snapshot/guide/introduction.html
@@ -330,6 +330,23 @@ This brings the Spring Boot 4 modular artifact layout,
Spring Framework 7 API re
</div>
</div>
<div class="sect3">
+<h4 id="_hibernate_7_application_generation">Hibernate 7 Application
Generation</h4>
+<div class="paragraph">
+<p>Grails Forge can now generate applications configured for Grails Data with
Hibernate 7.
+The <code>create-*</code> commands also accept a new <code>-d, --data</code>
option (the previous <code>-g</code> and <code>--gorm</code> flags remain
supported as legacy aliases) with the values <code>hibernate5</code>,
<code>hibernate7</code>, and <code>mongodb</code>; the legacy value
<code>hibernate</code> is still accepted and selects Hibernate 5:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">grails -t forge
create-app --data=hibernate7 com.example.demo</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Applications generated for Hibernate 7 consume
<code>grails-hibernate7-bom</code> — or
<code>grails-hibernate7-micronaut-bom</code> when combined with the
<code>grails-micronaut</code> feature — consistently across the application
dependencies, the buildscript classpath, and <code>buildSrc</code>.
+This avoids the dependency resolution conflicts that occur when an application
generated for Hibernate 5 is manually switched to
<code>grails-data-hibernate7</code> while the default <code>grails-bom</code>
remains on the build classpath.
+The <code>database-migration</code> feature also selects the matching
<code>grails-data-hibernate7-dbmigration</code> plugin automatically.</p>
+</div>
+</div>
+<div class="sect3">
<h4 id="_plugin_beans_register_before_spring_boot_auto_configuration">Plugin
Beans Register Before Spring Boot Auto-Configuration</h4>
<div class="paragraph">
<p>Grails 8 unifies and retimes the plugin lifecycle so that the beans a
plugin contributes are registered before Spring Boot processes its
auto-configurations.
diff --git a/docs/snapshot/guide/single.html b/docs/snapshot/guide/single.html
index 23c43fd71fd..2fab8b863e4 100644
--- a/docs/snapshot/guide/single.html
+++ b/docs/snapshot/guide/single.html
@@ -931,6 +931,23 @@ This brings the Spring Boot 4 modular artifact layout,
Spring Framework 7 API re
</div>
</div>
<div class="sect3">
+<h4 id="_hibernate_7_application_generation">Hibernate 7 Application
Generation</h4>
+<div class="paragraph">
+<p>Grails Forge can now generate applications configured for Grails Data with
Hibernate 7.
+The <code>create-*</code> commands also accept a new <code>-d, --data</code>
option (the previous <code>-g</code> and <code>--gorm</code> flags remain
supported as legacy aliases) with the values <code>hibernate5</code>,
<code>hibernate7</code>, and <code>mongodb</code>; the legacy value
<code>hibernate</code> is still accepted and selects Hibernate 5:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">grails -t forge
create-app --data=hibernate7 com.example.demo</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Applications generated for Hibernate 7 consume
<code>grails-hibernate7-bom</code> — or
<code>grails-hibernate7-micronaut-bom</code> when combined with the
<code>grails-micronaut</code> feature — consistently across the application
dependencies, the buildscript classpath, and <code>buildSrc</code>.
+This avoids the dependency resolution conflicts that occur when an application
generated for Hibernate 5 is manually switched to
<code>grails-data-hibernate7</code> while the default <code>grails-bom</code>
remains on the build classpath.
+The <code>database-migration</code> feature also selects the matching
<code>grails-data-hibernate7-dbmigration</code> plugin automatically.</p>
+</div>
+</div>
+<div class="sect3">
<h4 id="_plugin_beans_register_before_spring_boot_auto_configuration">Plugin
Beans Register Before Spring Boot Auto-Configuration</h4>
<div class="paragraph">
<p>Grails 8 unifies and retimes the plugin lifecycle so that the beans a
plugin contributes are registered before Spring Boot processes its
auto-configurations.
@@ -9595,7 +9612,8 @@ qualified name of the artifact.</p>
<div class="paragraph">
<p>When Grails logs a stacktrace, the log message may include the names and
values of all of the request parameters for the current request.
-To mask out the values of secure request parameters, specify the parameter
names in the <code>grails.exceptionresolver.params.exclude</code> config
property:</p>
+To mask out the values of secure request parameters, specify the parameter
names in the <code>grails.exceptionresolver.params.exclude</code> config
property:
+Parameter names are matched case-insensitively.</p>
</div>
<div class="listingblock">
<div class="title">grails-app/conf/application.yml</div>
@@ -12063,13 +12081,13 @@ Here’s an example of the available options in
interactive mode:</p>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">grails> create-app -h
-Usage: grails create-app [-hivVx] [--list-features] [-g=GORM Implementation]
[--jdk=<javaVersion>]
+Usage: grails create-app [-hivVx] [--list-features] [-d=Grails Data
Implementation] [--jdk=<javaVersion>]
[-s=Servlet Implementation] [-t=TEST]
[-f=FEATURE[,FEATURE...]]... [NAME]
Creates an application
[NAME] The name of the application to create.
-f, --features=FEATURE[,FEATURE...]
The features to use. Possible values: h2, scaffolding,
gorm-hibernate5,
- spring-boot-starter-jetty,
spring-boot-starter-tomcat,
+ gorm-hibernate7, spring-boot-starter-jetty,
spring-boot-starter-tomcat,
micronaut-http-client, cache-ehcache,
hibernate-validator, postgres,
mysql, cache, database-migration, grails-gsp,
hamcrest, gorm-mongodb,
assertj, mockito, spring-boot-starter-undertow,
@@ -12077,9 +12095,9 @@ Creates an application
grails-console, views-markup, asset-pipeline-grails,
views-json,
gorm-neo4j, asciidoctor, grails-web-console,
logbackGroovy, mongo-sync, shade, geb, properties
- -g, --gorm=GORM Implementation
- Which GORM Implementation to configure. Possible
values: hibernate,
- mongodb, neo4j.
+ -d, --data, -g, --gorm=Grails Data Implementation
+ Which Grails Data implementation to configure (-g,
--gorm are legacy
+ aliases). Possible values: hibernate5, hibernate7,
mongodb.
-h, --help Show this help message and exit.
-i, --inplace Create a service using the current directory
--jdk, --java-version=<javaVersion>
@@ -12119,8 +12137,9 @@ Available Features
Database
database-migration Adds support for Liquibase database
migrations. The Database Migration plugin helps you manage database changes
while developing Grails applications.
- gorm-hibernate5 (+) Adds support for Hibernate5 using GORM
- gorm-mongodb Configures GORM for MongoDB for Groovy
applications
+ gorm-hibernate5 (+) Configure Grails Data for using
Hibernate 5.
+ gorm-hibernate7 Configure Grails Data for using
Hibernate 7.
+ gorm-mongodb Configure Grails Data for using MongoDB.
gorm-neo4j Configures GORM for Neo4j for Groovy
applications
h2 (+) Adds the H2 driver and default config
mongo-sync Adds support for the MongoDB Synchronous
Driver
@@ -12813,7 +12832,7 @@ Commands defined this way still have access to the
execution context via a varia
<p>-s, --servlet</p>
</li>
<li>
-<p>-g, --gorm</p>
+<p>-d, --data (-g, --gorm are legacy aliases)</p>
</li>
<li>
<p>-t, --test</p>
@@ -12831,7 +12850,7 @@ Commands defined this way still have access to the
execution context via a varia
<pre class="CodeRay highlight"><code data-lang="console">./grails -t forge
create-app \
--servlet=tomcat \
--jdk=11 \
- --gorm=hibernate \
+ --data=hibernate5 \
--test=spock \
--features=github-workflow-java-ci \
com.example.demo</code></pre>
@@ -12850,7 +12869,7 @@ Commands defined this way still have access to the
execution context via a varia
<p>-s, --servlet</p>
</li>
<li>
-<p>-g, --gorm</p>
+<p>-d, --data (-g, --gorm are legacy aliases)</p>
</li>
<li>
<p>-t, --test</p>
@@ -12868,7 +12887,7 @@ Commands defined this way still have access to the
execution context via a varia
<pre class="CodeRay highlight"><code data-lang="console">./grails -t forge
create-restapi \
--servlet=tomcat \
--jdk=11 \
- --gorm=hibernate \
+ --data=hibernate5 \
--test=spock \
--features=github-workflow-java-ci \
com.example.demo</code></pre>
@@ -12887,7 +12906,7 @@ Commands defined this way still have access to the
execution context via a varia
<p>-s, --servlet</p>
</li>
<li>
-<p>-g, --gorm</p>
+<p>-d, --data (-g, --gorm are legacy aliases)</p>
</li>
<li>
<p>-t, --test</p>
@@ -12905,7 +12924,7 @@ Commands defined this way still have access to the
execution context via a varia
<pre class="CodeRay highlight"><code data-lang="console">./grails -t forge
create-plugin \
--servlet=tomcat \
--jdk=11 \
- --gorm=hibernate \
+ --data=hibernate5 \
--test=spock \
--features=github-workflow-java-ci \
com.example.demo</code></pre>
@@ -12924,7 +12943,7 @@ Commands defined this way still have access to the
execution context via a varia
<p>-s, --servlet</p>
</li>
<li>
-<p>-g, --gorm</p>
+<p>-d, --data (-g, --gorm are legacy aliases)</p>
</li>
<li>
<p>-t, --test</p>
@@ -12942,7 +12961,7 @@ Commands defined this way still have access to the
execution context via a varia
<pre class="CodeRay highlight"><code data-lang="console">./grails -t forge
create-web-plugin \
--servlet=tomcat \
--jdk=11 \
- --gorm=hibernate \
+ --data=hibernate5 \
--test=spock \
--features=github-workflow-java-ci \
com.example.demo</code></pre>
@@ -12954,7 +12973,7 @@ Commands defined this way still have access to the
execution context via a varia
<div class="sect2">
<h3 id="_the_create_command_flags">The <code>create-</code> command flags</h3>
<div class="paragraph">
-<p>The "create-*" commands are used to produce a fundamental Grails project,
allowing for the inclusion of optional flags to select additional features, to
customize GORM settings, an embedded servlet, the test framework, and the Java
version.</p>
+<p>The "create-*" commands are used to produce a fundamental Grails project,
allowing for the inclusion of optional flags to select additional features, to
customize Grails Data settings, an embedded servlet, the test framework, and
the Java version.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
@@ -12989,11 +13008,11 @@ Commands defined this way still have access to the
execution context via a varia
</div></div></td>
</tr>
<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">-g,
--gorm</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Which GORM
Implementation to configure. Possible values: hibernate, mongodb,
neo4j.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">-d, --data
(-g, --gorm are legacy aliases)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Which
Grails Data implementation to configure. Possible values: hibernate5,
hibernate7, mongodb. The value hibernate is accepted as a legacy alias for
hibernate5.</p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div
class="listingblock">
<div class="content">
-<pre class="CodeRay highlight"><code data-lang="shell">--gorm
hibernate</code></pre>
+<pre class="CodeRay highlight"><code data-lang="shell">--data
hibernate5</code></pre>
</div>
</div></div></td>
</tr>
@@ -13008,7 +13027,7 @@ Commands defined this way still have access to the
execution context via a varia
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">-f,
--features</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">The
features to use. Possible values: h2, gorm-hibernate5,
spring-boot-starter-jetty, micronaut-http-client, cache-ehcache,
hibernate-validator, postgres, mysql, cache, database-migration, grails-gsp,
hamcrest, gorm-mongodb, assertj, mockito, spring-boot-starter-undertow,
github-workflow-java-ci, jrebel, testcontainers, sqlserver, grails-console,
views-markup, views-json, gorm-neo4j, asciidoctor, grails-web-console, logb
[...]
+<td class="tableblock halign-left valign-top"><p class="tableblock">The
features to use. Possible values: h2, gorm-hibernate5, gorm-hibernate7,
spring-boot-starter-jetty, micronaut-http-client, cache-ehcache,
hibernate-validator, postgres, mysql, cache, database-migration, grails-gsp,
hamcrest, gorm-mongodb, assertj, mockito, spring-boot-starter-undertow,
github-workflow-java-ci, jrebel, testcontainers, sqlserver, grails-console,
views-markup, views-json, gorm-neo4j, asciidoctor, grails- [...]
<td class="tableblock halign-left valign-top"><div class="content"><div
class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">--features
github-workflow-java-ci,micronaut-http-client</code></pre>
@@ -13389,7 +13408,7 @@ ext[<span class="string"><span
class="delimiter">'</span><span class="content">s
<p>Use <code>grails create-app myapp</code> to generate a default project
using the Grails Shell CLI. This is the most common usage.</p>
</li>
<li>
-<p>Use <code>grails -t forge create-app myapp</code> to access advanced
application generation options such as <code>--jdk</code>, <code>--gorm</code>,
and other Forge-only flags.</p>
+<p>Use <code>grails -t forge create-app myapp</code> to access advanced
application generation options such as <code>--jdk</code>, <code>--data</code>,
and other Forge-only flags.</p>
</li>
</ul>
</div>
@@ -35431,6 +35450,31 @@ You can find the full list of available CodeNarc rules
at <a href="https://coden
<p>Grails will automatically switch the user’s locale and subsequent
requests will use the switched locale.</p>
</div>
<div class="paragraph">
+<p>To offer a language selector, the i18n plugin discovers the locales your
application is actually translated into by scanning the classpath for
<code>messages_*.properties</code> bundles (plus the default locale,
configurable via <code>grails.i18n.default.locale</code>). This list is exposed
as the <code>AvailableLocaleResolver</code> bean and published to the servlet
context under the <code>availableLocales</code> attribute. The
<code><g:localeSelect available="true"/></code [...]
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span
class="tag"><g:each</span> <span class="attribute-name">in</span>=<span
class="string"><span class="delimiter">"</span><span
class="content">${application.getAttribute('availableLocales')}</span><span
class="delimiter">"</span></span> <span
class="attribute-name">var</span>=<span class="string"><span
class="delimiter">"</span><span class="content">locale</span><span
class="delimiter">"</span></span><span cl [...]
+ <span class="tag"><a</span> <span
class="attribute-name">href</span>=<span class="string"><span
class="delimiter">"</span><span
class="content">?lang=${locale.toLanguageTag()}</span><span
class="delimiter">"</span></span><span
class="tag">></span>${locale.getDisplayName(locale)}<span
class="tag"></a></span>
+<span class="tag"></g:each></span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>By default every <code>*.properties</code> bundle on the classpath is
considered, so locales contributed by plugins — whose bundles are
namespaced (for example <code>spring-security-core_fr.properties</code>)
— are listed alongside your application’s own. Candidate suffixes
are validated against the ISO language codes (and the ISO country codes when a
country is present), so non-i18n properties files (such as
<code>application.properties</code>) are ignored. To r [...]
+</div>
+<div class="listingblock">
+<div class="title">grails-app/conf/application.yml</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="yaml"><span
class="key">grails</span>:
+ <span class="key">i18n</span>:
+ <span class="key">availableLocales</span>:
+ <span class="key">includePlugins</span>: <span
class="string"><span class="content">false</span></span> <span
class="comment"># list only the application's own
translations</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Applications created with <code>grails create-app</code> include a
ready-made language dropdown in the default layout that uses exactly this
mechanism.</p>
+</div>
+<div class="paragraph">
<p>By default, Grails uses <a
href="https://docs.spring.io/spring-framework/docs/7.0.8/javadoc-api/org/springframework/web/servlet/i18n/SessionLocaleResolver.html">SessionLocaleResolver</a>
as the <code>localeResolver</code> bean.</p>
</div>
<div class="paragraph">
diff --git a/docs/snapshot/ref/Command Line/create-app.html
b/docs/snapshot/ref/Command Line/create-app.html
index fd9bd8447e3..1ca4f3307c4 100644
--- a/docs/snapshot/ref/Command Line/create-app.html
+++ b/docs/snapshot/ref/Command Line/create-app.html
@@ -203,7 +203,7 @@ Companies deploy assistants like this [](https://kapa.ai)
on docs via [website w
<p>Most users should use the <strong>Grails Shell CLI</strong> by default
(<code>grails create-app bookstore</code>). This version supports core
development commands and project lifecycle management, and includes basic
<code>create-*</code> flags like <code>--inplace</code>,
<code>--features</code>, and <code>--profile</code>.</p>
</li>
<li>
-<p>The <strong>Forge CLI</strong> (<code>grails -t forge create-app
bookstore</code>) is intended solely for <strong>application
generation</strong> with extended configuration flags such as
<code>--jdk</code>, <code>--gorm</code>, and <code>--servlet</code>.</p>
+<p>The <strong>Forge CLI</strong> (<code>grails -t forge create-app
bookstore</code>) is intended solely for <strong>application
generation</strong> with extended configuration flags such as
<code>--jdk</code>, <code>--data</code>, and <code>--servlet</code>.</p>
</li>
</ul>
</div>
@@ -233,7 +233,7 @@ $ cd bookstore</code></pre>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="console">$ grails -t forge
create-app bookstore \
--jdk=17 \
- --gorm=hibernate \
+ --data=hibernate5 \
--servlet=tomcat \
--test=spock \
--features=asciidoctor,github-workflow-java-ci</code></pre>
@@ -251,10 +251,10 @@ $ cd bookstore</code></pre>
<p><code>NAME</code>: The desired name for the application.</p>
</li>
<li>
-<p><code>-f, --features=FEATURE[,FEATURE…​]</code>: Enable
features like <code>gorm-hibernate5</code>, <code>postgres</code>,
<code>asciidoctor</code>, <code>grails-gsp</code>, etc.</p>
+<p><code>-f, --features=FEATURE[,FEATURE…​]</code>: Enable
features like <code>gorm-hibernate5</code>, <code>gorm-hibernate7</code>,
<code>postgres</code>, <code>asciidoctor</code>, <code>grails-gsp</code>,
etc.</p>
</li>
<li>
-<p><code>-g, --gorm=GORM Implementation</code>: Choose GORM implementation:
<code>hibernate</code>, <code>mongodb</code>, <code>neo4j</code>.</p>
+<p><code>-d, --data=Grails Data Implementation</code> (<code>-g</code>,
<code>--gorm</code> are legacy aliases): Choose the Grails Data implementation:
<code>hibernate5</code>, <code>hibernate7</code>, <code>mongodb</code>.</p>
</li>
<li>
<p><code>--jdk=<javaVersion></code>: Target JDK version (e.g., 11 or
17).</p>
@@ -289,7 +289,7 @@ $ grails create-app --inplace</code></pre>
- <code>--profile</code></p>
</div>
<div class="paragraph">
-<p>Forge-only options such as <code>--jdk</code>, <code>--gorm</code>, or
<code>--servlet</code> are <strong>not supported</strong> in the Shell CLI.</p>
+<p>Forge-only options such as <code>--jdk</code>, <code>--data</code>, or
<code>--servlet</code> are <strong>not supported</strong> in the Shell CLI.</p>
</div>
</div>
<div class="sect2">
@@ -311,7 +311,7 @@ $ cd bookstore</code></pre>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="console">$ grails -t forge
create-app bookstore \
--jdk=17 \
- --gorm=hibernate \
+ --data=hibernate5 \
--features=asciidoctor,grails-gsp</code></pre>
</div>
</div>
diff --git a/docs/snapshot/ref/Command Line/create-plugin.html
b/docs/snapshot/ref/Command Line/create-plugin.html
index 330eca76b35..50f4205b1a6 100644
--- a/docs/snapshot/ref/Command Line/create-plugin.html
+++ b/docs/snapshot/ref/Command Line/create-plugin.html
@@ -245,7 +245,7 @@ Companies deploy assistants like this [](https://kapa.ai)
on docs via [website w
</ul>
</div>
<div class="paragraph">
-<p>Options include specifying features, configuring the GORM implementation,
selecting a servlet implementation, choosing a test framework, setting the JDK
version, and more. You can tailor your Grails plugin to your specific
requirements using these options.</p>
+<p>Options include specifying features, configuring the Grails Data
implementation, selecting a servlet implementation, choosing a test framework,
setting the JDK version, and more. You can tailor your Grails plugin to your
specific requirements using these options.</p>
</div>
</div>
<div class="sect2">
@@ -256,10 +256,10 @@ Companies deploy assistants like this [](https://kapa.ai)
on docs via [website w
<div class="ulist">
<ul>
<li>
-<p>-f, --features=FEATURE[,FEATURE…​]: Specifies the features to
include in the plugin. Available options include h2, gorm-hibernate5,
spring-boot-starter-jetty, micronaut-http-client, cache-ehcache,
hibernate-validator, postgres, mysql, cache, database-migration, grails-gsp,
hamcrest, gorm-mongodb, assertj, mockito, spring-boot-starter-undertow,
github-workflow-java-ci, jrebel, testcontainers, sqlserver, grails-console,
views-markup, views-json, gorm-neo4j, asciidoctor, gra [...]
+<p>-f, --features=FEATURE[,FEATURE…​]: Specifies the features to
include in the plugin. Available options include h2, gorm-hibernate5,
gorm-hibernate7, spring-boot-starter-jetty, micronaut-http-client,
cache-ehcache, hibernate-validator, postgres, mysql, cache, database-migration,
grails-gsp, hamcrest, gorm-mongodb, assertj, mockito,
spring-boot-starter-undertow, github-workflow-java-ci, jrebel, testcontainers,
sqlserver, grails-console, views-markup, views-json, gorm-neo4j, [...]
</li>
<li>
-<p>-g, --gorm=GORM Implementation: Specifies the GORM Implementation to
configure for the plugin. Possible values are hibernate, mongodb, neo4j.</p>
+<p>-d, --data=Grails Data Implementation (-g, --gorm are legacy aliases):
Specifies the Grails Data implementation to configure for the plugin. Possible
values are hibernate5, hibernate7, mongodb.</p>
</li>
<li>
<p>-h, --help: Displays the help message and exits.</p>
@@ -312,11 +312,11 @@ Companies deploy assistants like this [](https://kapa.ai)
on docs via [website w
<p>Create a plugin with MongoDB support:</p>
<div class="listingblock">
<div class="content">
-<pre class="CodeRay highlight"><code data-lang="shell">grails create-plugin
mongodb-plugin --gorm=mongodb</code></pre>
+<pre class="CodeRay highlight"><code data-lang="shell">grails create-plugin
mongodb-plugin --data=mongodb</code></pre>
</div>
</div>
<div class="paragraph">
-<p>This command will generate a Grails plugin project named "mongodb-plugin"
configured to use MongoDB as the GORM implementation.</p>
+<p>This command will generate a Grails plugin project named "mongodb-plugin"
configured to use MongoDB as the Grails Data implementation.</p>
</div>
</li>
<li>
@@ -333,7 +333,7 @@ Companies deploy assistants like this [](https://kapa.ai)
on docs via [website w
</ol>
</div>
<div class="paragraph">
-<p>These additional examples showcase different use cases for the
<code>create-plugin</code> command, such as creating minimal plugins,
customizing GORM implementations, and enabling specific features to meet
project requirements.</p>
+<p>These additional examples showcase different use cases for the
<code>create-plugin</code> command, such as creating minimal plugins,
customizing Grails Data implementations, and enabling specific features to meet
project requirements.</p>
</div>
</div>
</div>
diff --git a/docs/snapshot/ref/Command Line/create-restapi.html
b/docs/snapshot/ref/Command Line/create-restapi.html
index 145a0c3f4fb..f029ad6d356 100644
--- a/docs/snapshot/ref/Command Line/create-restapi.html
+++ b/docs/snapshot/ref/Command Line/create-restapi.html
@@ -217,10 +217,10 @@ Companies deploy assistants like this [](https://kapa.ai)
on docs via [website w
<p><code>NAME</code>: The desired name for the REST API application.</p>
</li>
<li>
-<p><code>-f, --features=FEATURE[,FEATURE…​]</code>: Specifies the
features to include. Available options include h2, scaffolding,
gorm-hibernate5, spring-boot-starter-jetty, spring-boot-starter-tomcat,
micronaut-http-client, cache-ehcache, hibernate-validator, postgres, mysql,
cache, database-migration, grails-gsp, hamcrest, gorm-mongodb, assertj,
mockito, spring-boot-starter-undertow, github-workflow-java-ci, jrebel,
testcontainers, sqlserver, grails-console, views-markup, a [...]
+<p><code>-f, --features=FEATURE[,FEATURE…​]</code>: Specifies the
features to include. Available options include h2, scaffolding,
gorm-hibernate5, gorm-hibernate7, spring-boot-starter-jetty,
spring-boot-starter-tomcat, micronaut-http-client, cache-ehcache,
hibernate-validator, postgres, mysql, cache, database-migration, grails-gsp,
hamcrest, gorm-mongodb, assertj, mockito, spring-boot-starter-undertow,
github-workflow-java-ci, jrebel, testcontainers, sqlserver, grails-console [...]
</li>
<li>
-<p><code>-g, --gorm=GORM Implementation</code>: Specifies the GORM
Implementation to configure, with options like hibernate, mongodb, neo4j.</p>
+<p><code>-d, --data=Grails Data Implementation</code> (<code>-g</code>,
<code>--gorm</code> are legacy aliases): Specifies the Grails Data
implementation to configure, with options hibernate5, hibernate7, mongodb.</p>
</li>
<li>
<p><code>-h, --help</code>: Displays the help message and exits.</p>
diff --git a/docs/snapshot/ref/Command Line/create-web-plugin.html
b/docs/snapshot/ref/Command Line/create-web-plugin.html
index 7201ac2e28b..339358e2d7b 100644
--- a/docs/snapshot/ref/Command Line/create-web-plugin.html
+++ b/docs/snapshot/ref/Command Line/create-web-plugin.html
@@ -214,10 +214,10 @@ Companies deploy assistants like this [](https://kapa.ai)
on docs via [website w
<div class="ulist">
<ul>
<li>
-<p><code>-f, --features=FEATURE[,FEATURE…​]</code>: Specifies the
features to include in the plugin. Available options include h2,
gorm-hibernate5, spring-boot-starter-jetty, micronaut-http-client,
cache-ehcache, hibernate-validator, postgres, mysql, cache, database-migration,
grails-gsp, hamcrest, gorm-mongodb, assertj, mockito,
spring-boot-starter-undertow, github-workflow-java-ci, jrebel, testcontainers,
sqlserver, grails-console, views-markup, views-json, gorm-neo4j, asci [...]
+<p><code>-f, --features=FEATURE[,FEATURE…​]</code>: Specifies the
features to include in the plugin. Available options include h2,
gorm-hibernate5, gorm-hibernate7, spring-boot-starter-jetty,
micronaut-http-client, cache-ehcache, hibernate-validator, postgres, mysql,
cache, database-migration, grails-gsp, hamcrest, gorm-mongodb, assertj,
mockito, spring-boot-starter-undertow, github-workflow-java-ci, jrebel,
testcontainers, sqlserver, grails-console, views-markup, views-json, [...]
</li>
<li>
-<p><code>-g, --gorm=GORM Implementation</code>: Specifies the GORM
Implementation to configure for the plugin. Possible values are hibernate,
mongodb, neo4j.</p>
+<p><code>-d, --data=Grails Data Implementation</code> (<code>-g</code>,
<code>--gorm</code> are legacy aliases): Specifies the Grails Data
implementation to configure for the plugin. Possible values are hibernate5,
hibernate7, mongodb.</p>
</li>
<li>
<p><code>-h, --help</code>: Displays the help message and exits.</p>
diff --git a/docs/snapshot/ref/Command Line/help.html
b/docs/snapshot/ref/Command Line/help.html
index e9f273ef1e8..bcb2bea2b3d 100644
--- a/docs/snapshot/ref/Command Line/help.html
+++ b/docs/snapshot/ref/Command Line/help.html
@@ -329,13 +329,13 @@ To access help for Forge-only options such as
<code>--features</code>, <code>--j
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="shell">grails> create-app
--help
-Usage: grails create-app [-hivVx] [--list-features] [-g=GORM Implementation]
[--jdk=<javaVersion>]
+Usage: grails create-app [-hivVx] [--list-features] [-d=Grails Data
Implementation] [--jdk=<javaVersion>]
[-s=Servlet Implementation] [-t=TEST]
[-f=FEATURE[,FEATURE...]]... [NAME]
Creates an application
[NAME] The name of the application to create.
-f, --features=FEATURE[,FEATURE...]
The features to use. Possible values: h2, scaffolding,
gorm-hibernate5,
- spring-boot-starter-jetty,
spring-boot-starter-tomcat,
+ gorm-hibernate7, spring-boot-starter-jetty,
spring-boot-starter-tomcat,
micronaut-http-client, cache-ehcache,
hibernate-validator, postgres,
mysql, cache, database-migration, grails-gsp,
hamcrest, gorm-mongodb,
assertj, mockito, spring-boot-starter-undertow,
@@ -343,9 +343,9 @@ Creates an application
grails-console, views-markup, asset-pipeline-grails,
views-json,
gorm-neo4j, asciidoctor, grails-web-console,
logbackGroovy, mongo-sync, shade, geb, properties
- -g, --gorm=GORM Implementation
- Which GORM Implementation to configure. Possible
values: hibernate,
- mongodb, neo4j.
+ -d, --data, -g, --gorm=Grails Data Implementation
+ Which Grails Data implementation to configure (-g,
--gorm are legacy
+ aliases). Possible values: hibernate5, hibernate7,
mongodb.
-h, --help Show this help message and exit.
-i, --inplace Create a service using the current directory
--jdk, --java-version=<javaVersion>
diff --git a/docs/snapshot/ref/Command Line/list-features.html
b/docs/snapshot/ref/Command Line/list-features.html
index dd794d732a1..251ab28e492 100644
--- a/docs/snapshot/ref/Command Line/list-features.html
+++ b/docs/snapshot/ref/Command Line/list-features.html
@@ -244,8 +244,9 @@ Available Features
Database
database-migration Adds support for Liquibase database
migrations. The Database Migration plugin helps you manage database changes
while developing Grails applications.
- gorm-hibernate5 (+) Adds support for Hibernate5 using GORM
- gorm-mongodb Configures GORM for MongoDB for Groovy
applications
+ gorm-hibernate5 (+) Configure Grails Data for using
Hibernate 5.
+ gorm-hibernate7 Configure Grails Data for using
Hibernate 7.
+ gorm-mongodb Configure Grails Data for using MongoDB.
gorm-neo4j Configures GORM for Neo4j for Groovy
applications
h2 (+) Adds the H2 driver and default config
mongo-sync Adds support for the MongoDB Synchronous
Driver
diff --git a/docs/snapshot/ref/Configuration/Application Properties.html
b/docs/snapshot/ref/Configuration/Application Properties.html
index d5e14dd21aa..467c4b31b74 100644
--- a/docs/snapshot/ref/Configuration/Application Properties.html
+++ b/docs/snapshot/ref/Configuration/Application Properties.html
@@ -350,12 +350,12 @@ environments {
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>grails.exceptionresolver.logRequestParameters</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Whether to
log request parameters in exception stack traces.</p></td>
-<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>true</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Whether to
log request parameters in exception stack traces. Defaults to true in
development and false otherwise.</p></td>
+<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>grails.exceptionresolver.params.exclude</code></p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">List of
parameter names to mask (replace with [<strong>*</strong>]) in exception stack
traces, typically used for password and creditCard.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">List of
parameter names to mask (replace with <strong>*</strong>) in exception stack
traces, typically used for password and creditCard. Parameter names are matched
case-insensitively.</p></td>
<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>[]</code></p></td>
</tr>
<tr>
diff --git a/docs/snapshot/ref/Tags - GSP/localeSelect.html
b/docs/snapshot/ref/Tags - GSP/localeSelect.html
index 1852455f4d0..63b1a1aa56a 100644
--- a/docs/snapshot/ref/Tags - GSP/localeSelect.html
+++ b/docs/snapshot/ref/Tags - GSP/localeSelect.html
@@ -193,7 +193,10 @@ Companies deploy assistants like this [](https://kapa.ai)
on docs via [website w
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="xml"><span
class="comment"><!-- create a locale select --></span>
-<span class="tag"><g:localeSelect</span> <span
class="attribute-name">name</span>=<span class="string"><span
class="delimiter">"</span><span class="content">myLocale</span><span
class="delimiter">"</span></span> <span
class="attribute-name">value</span>=<span class="string"><span
class="delimiter">"</span><span class="content">${locale}</span><span
class="delimiter">"</span></span> <span
class="tag">/></span></code></pre>
+<span class="tag"><g:localeSelect</span> <span
class="attribute-name">name</span>=<span class="string"><span
class="delimiter">"</span><span class="content">myLocale</span><span
class="delimiter">"</span></span> <span
class="attribute-name">value</span>=<span class="string"><span
class="delimiter">"</span><span class="content">${locale}</span><span
class="delimiter">"</span></span> <span class="tag">/></span>
+
+<span class="comment"><!-- list only the locales the application is
translated into --></span>
+<span class="tag"><g:localeSelect</span> <span
class="attribute-name">name</span>=<span class="string"><span
class="delimiter">"</span><span class="content">myLocale</span><span
class="delimiter">"</span></span> <span
class="attribute-name">available</span>=<span class="string"><span
class="delimiter">"</span><span class="content">true</span><span
class="delimiter">"</span></span> <span
class="tag">/></span></code></pre>
</div>
</div>
</div>
@@ -213,6 +216,9 @@ Companies deploy assistants like this [](https://kapa.ai)
on docs via [website w
<li>
<p><code>locale</code> (optional) - The <a
href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Locale.html">Locale</a>
to use for formatting the locale names. Defaults to the current request locale
and then the system default locale if not specified</p>
</li>
+<li>
+<p><code>available</code> (optional) - If <code>true</code>, lists only the
locales the application is actually translated into (those with a
<code>messages_*.properties</code> bundle on the classpath, as discovered
by the i18n plugin) rather than every locale the JVM knows about. Defaults to
<code>false</code>.</p>
+</li>
</ul>
</div>
</div>