Translation Pruner v1
This commit is contained in:
		
							parent
							
								
									a7a7fd0efe
								
							
						
					
					
						commit
						1ff416fc5a
					
				@ -0,0 +1,84 @@
 | 
				
			|||||||
 | 
					package org.thingsboard.client.tools.i18n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.databind.JsonNode;
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.databind.ObjectMapper;
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.databind.node.ObjectNode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.File;
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					import java.util.HashSet;
 | 
				
			||||||
 | 
					import java.util.Iterator;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					import java.util.Set;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class TranslationPruner {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Recursively collect all JSON keys in dot notation from the given node.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private static void collectKeys(JsonNode node, String prefix, Set<String> keys) {
 | 
				
			||||||
 | 
					        if (!node.isObject()) return;
 | 
				
			||||||
 | 
					        Iterator<Map.Entry<String, JsonNode>> fields = node.fields();
 | 
				
			||||||
 | 
					        while (fields.hasNext()) {
 | 
				
			||||||
 | 
					            Map.Entry<String, JsonNode> entry = fields.next();
 | 
				
			||||||
 | 
					            String key = entry.getKey();
 | 
				
			||||||
 | 
					            String fullKey = prefix.isEmpty() ? key : prefix + "." + key;
 | 
				
			||||||
 | 
					            keys.add(fullKey);
 | 
				
			||||||
 | 
					            collectKeys(entry.getValue(), fullKey, keys);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Prune the translation ObjectNode, keeping only fields whose dot-keys are in the valid set.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private static ObjectNode pruneNode(ObjectNode node, Set<String> keys, String prefix, ObjectMapper mapper) {
 | 
				
			||||||
 | 
					        ObjectNode pruned = mapper.createObjectNode();
 | 
				
			||||||
 | 
					        Iterator<Map.Entry<String, JsonNode>> fields = node.fields();
 | 
				
			||||||
 | 
					        while (fields.hasNext()) {
 | 
				
			||||||
 | 
					            Map.Entry<String, JsonNode> entry = fields.next();
 | 
				
			||||||
 | 
					            String key = entry.getKey();
 | 
				
			||||||
 | 
					            JsonNode value = entry.getValue();
 | 
				
			||||||
 | 
					            String fullKey = prefix.isEmpty() ? key : prefix + "." + key;
 | 
				
			||||||
 | 
					            if (keys.contains(fullKey)) {
 | 
				
			||||||
 | 
					                if (value.isObject()) {
 | 
				
			||||||
 | 
					                    ObjectNode child = pruneNode((ObjectNode) value, keys, fullKey, mapper);
 | 
				
			||||||
 | 
					                    pruned.set(key, child);
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    pruned.set(key, value);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return pruned;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
 | 
					        if (args.length < 3) {
 | 
				
			||||||
 | 
					            System.err.println("Usage: java TranslationPruner <source.json> <reference.json> [output.json]");
 | 
				
			||||||
 | 
					            System.exit(1);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            File sourceFile = new File(args[0]);
 | 
				
			||||||
 | 
					            File referenceFile = new File(args[1]);
 | 
				
			||||||
 | 
					            File outputFile = new File(args[2]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ObjectMapper mapper = new ObjectMapper();
 | 
				
			||||||
 | 
					            JsonNode usRoot = mapper.readTree(referenceFile);
 | 
				
			||||||
 | 
					            Set<String> validKeys = new HashSet<>();
 | 
				
			||||||
 | 
					            collectKeys(usRoot, "", validKeys);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            JsonNode sourceRoot = mapper.readTree(sourceFile);
 | 
				
			||||||
 | 
					            if (!sourceRoot.isObject()) {
 | 
				
			||||||
 | 
					                throw new IllegalArgumentException("Source JSON must be an object at root");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            ObjectNode pruned = pruneNode((ObjectNode) sourceRoot, validKeys, "", mapper);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            mapper.writerWithDefaultPrettyPrinter().writeValue(outputFile, pruned);
 | 
				
			||||||
 | 
					            System.out.println("Pruned translation written to " + outputFile.getPath());
 | 
				
			||||||
 | 
					        } catch (IOException e) {
 | 
				
			||||||
 | 
					            e.printStackTrace();
 | 
				
			||||||
 | 
					            System.exit(2);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user