parseAcceptLanguage function

List<AcceptLanguageEntry> parseAcceptLanguage(
  1. String? header
)

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:

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;
}