parseAcceptLanguage function
Parses an entire Accept-Language header string into a list of entries sorted by quality.
Splits comma-separated language tags, extracts explicit q= quality parameters
(clamping values between 0.0 and 1.0, defaulting to 1.0), filters out invalid
tokens and wildcards, and sorts results in descending preference order.
final entries = parseAcceptLanguage('en-US,en;q=0.8,fr;q=0.9');
// entries: [en-US;q=1.0, fr;q=0.9, en;q=0.8]
See also:
- firstLocaleTag, for extracting only the first valid tag.
- resolveLocale, for matching preference lists against supported locales.
Implementation
List<AcceptLanguageEntry> parseAcceptLanguage(String? header) {
if (header == null || header.trim().isEmpty) return const [];
final entries = <AcceptLanguageEntry>[];
final items = header.split(',');
for (final item in items) {
final trimmed = item.trim();
if (trimmed.isEmpty) continue;
final parts = trimmed.split(';');
final tag = parts[0].trim();
if (tag.isEmpty || tag == '*' || !_isValidLanguageTag(tag)) continue;
double quality = 1.0;
if (parts.length > 1) {
for (int i = 1; i < parts.length; i++) {
final param = parts[i].trim();
if (param.startsWith('q=') || param.startsWith('Q=')) {
final parsedQ = double.tryParse(param.substring(2).trim());
if (parsedQ != null) {
quality = parsedQ.clamp(0.0, 1.0);
}
}
}
}
if (quality > 0.0) {
entries.add(AcceptLanguageEntry(tag, quality));
}
}
entries.sort();
return entries;
}