import 'dart:async'; import 'dart:convert'; import 'dart:io'; Future> dump(String host, String? locale) async { final ws = await WebSocket.connect('ws://$host:4444'); var id = 0; final pending = >>{}; ws.listen((raw) { final m = jsonDecode(raw as String) as Map; final rid = m['id']; if (rid is int && pending.containsKey(rid)) pending.remove(rid)!.complete(m); }); Future> call(String m, [Map p = const {}]) { final i = ++id; final c = Completer>(); pending[i] = c; ws.add(jsonEncode({'id': i, 'method': m, 'params': p})); return c.future.timeout(const Duration(seconds: 20)); } await call('JSONRPC.Hello', locale == null ? {} : {'locale': locale}); final tc = await call('Integrations.GetThingClasses', {}); final vd = await call('Integrations.GetVendors', {}); final pl = await call('Integrations.GetPlugins', {}); await ws.close(); return {'tc': tc['params'], 'vd': vd['params'], 'pl': pl['params']}; } /// Aplatit TOUTES les chaînes affichables en chemin -> valeur. void flatten(dynamic node, String path, Map out) { if (node is Map) { for (final e in node.entries) { final k = e.key.toString(); if (k == 'displayName' || k == 'displayNames' || k == 'displayMessage') { if (e.value is String) out['$path.$k'] = e.value as String; } flatten(e.value, '$path.$k', out); } } else if (node is List) { for (var i = 0; i < node.length; i++) { flatten(node[i], '$path[$i]', out); } } } Future main(List args) async { final host = args.isNotEmpty ? args[0] : '192.168.1.75'; final locales = ['en_US', 'de_DE', 'fr_FR', 'it_IT', 'es_ES', 'nl_NL']; final maps = >{}; for (final l in locales) { final d = await dump(host, l); final f = {}; flatten(d, 'root', f); maps[l] = f; print('$l : ${f.length} chaînes affichables'); } final ref = maps['en_US']!; print('\n--- différences par rapport à en_US ---'); for (final l in locales.where((e) => e != 'en_US')) { final m = maps[l]!; final diffs = []; for (final k in ref.keys) { if (m.containsKey(k) && m[k] != ref[k]) diffs.add('$k : "${ref[k]}" -> "${m[k]}"'); } print('$l : ${diffs.length} chaîne(s) différente(s)'); for (final d in diffs.take(12)) print(' $d'); } }