# -*- coding: utf-8 -*- import json import os import re BASE = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) RECYCLABLE = "牛奶盒、塑料、玻璃瓶、玻璃、纸、衣服、碎玻璃、易拉罐、塑料盒、泡沫板、充电宝、鞋子、纸盒、泡沫箱、玻璃杯、报纸、塑料杯、电线、数据线、矿泉水瓶、枕头、刀片、螺丝、泡沫塑料、酸奶利乐包装盒、纸袋、化妆品塑料空瓶、皮鞋、化妆品玻璃空瓶、酒瓶、充电线、广告单、废塑料、烟盒、充电器、书本、啤酒瓶、纸板箱、木筷子、毛绒玩具、被单、剪刀、饮料塑料瓶、布、除湿盒、吸铁石、塑料包装纸、被子、利乐包装、篮球、铝箔、插座、铁、钥匙、打印纸、金属、白纸、包装纸盒、塑料盖、信封".split("、") HAZARDOUS = "药品包装、药瓶、灯泡、油漆桶、药品、过期药、充电电池、指甲油、蓄电池、空药瓶、有害垃圾、过期药品、废药品、灯管、荧光灯管、镍镉电池、照片、荧光灯、染发剂壳、眼药水、节能灯、杀虫剂、药片、药片盒、口服液药瓶、废药瓶、油漆、纽扣电池、避孕药、眼药水瓶、胶片、胶囊、水银温度计、老鼠药、胶囊药片底板、染发剂罐、节能灯泡、各类过期药品、白炽灯泡、手机电池、消毒液瓶、过期药片、感冒药、84消毒液空瓶、指甲油瓶、杀毒喷雾罐、相片底片、中成药、胶卷、药品壳子、水银、相片、废油漆桶、过期药物、药品铝塑板、蟑螂药、蟑螂丸、胶囊药片、消毒药片、节能灯管".split("、") WET = "瓜子壳、鸡蛋壳、玉米棒、蛋壳、玉米、核桃、花生壳、茶叶、龙虾壳、小龙虾、蟹壳、鸡骨头、瓜子、螃蟹壳、熟玉米棒、开心果壳、小龙虾壳、毛豆壳、霞壳、香蕉皮、西瓜皮、栗子壳、鱼骨头、龙虾、玉米芯、瓜子片、花、咖啡渣、排骨、粽子、中药渣、鸡蛋、螃蟹、荔枝壳、桃子、话梅核、枣核、鸡骨、过期食品、鱼骨、苹果、荔枝核、杨梅、西瓜籽、板栗壳、蟑螂、果皮、芒果核、花生、干花生壳、饼干、西瓜、鲜花、红枣核、芦稷、苹果核、茭白皮、面包、香蕉、茶叶渣".split("、") DRY = "塑料袋、粽叶、核桃壳、头发、贝壳、卫生巾、避孕套、口香糖、打火机、椰子壳、猫砂、面膜、餐巾纸、大骨头、奶茶杯、纸巾、蛤蜊壳、粽子叶、玉米皮、吸管、茶包、甘蔗皮、干燥剂、一次性筷子、玉米壳、烟蒂、湿纸巾、榴莲壳、卫生纸、大核桃壳、指甲、包装袋、口红、一次性杯子、螺蛳壳、牙刷、外卖餐盒、榴莲、尿不湿、垃圾袋、牙膏皮、冰袋、袜子、笔、纸尿裤、榴莲核、一次性餐盒、茶叶包、口罩、内裤、毛巾、尿布、陶瓷碗、笔芯、肮脏塑料袋、回形针、牙签、食品包装袋、水彩笔、棉签".split("、") # key_suffix -> (zh, en, ko, ja) TRANSLATIONS = { "milkBox": ("牛奶盒", "Milk Carton", "우유팩", "牛乳パック"), "plastic": ("塑料", "Plastic", "플라스틱", "プラスチック"), "glassBottle": ("玻璃瓶", "Glass Bottle", "유리병", "ガラス瓶"), "glass": ("玻璃", "Glass", "유리", "ガラス"), "paper": ("纸", "Paper", "종이", "紙"), "clothes": ("衣服", "Clothes", "옷", "衣類"), "brokenGlass": ("碎玻璃", "Broken Glass", "깨진 유리", "割れたガラス"), "can": ("易拉罐", "Aluminum Can", "알루미늄 캔", "アルミ缶"), "plasticBox": ("塑料盒", "Plastic Box", "플라스틱 상자", "プラスチック箱"), "foamBoard": ("泡沫板", "Foam Board", "스티로폼 판", "発泡ボード"), "powerBank": ("充电宝", "Power Bank", "보조배터리", "モバイルバッテリー"), "shoes": ("鞋子", "Shoes", "신발", "靴"), "paperBox": ("纸盒", "Paper Box", "종이상자", "紙箱"), "foamBox": ("泡沫箱", "Foam Box", "스티로폼 상자", "発泡スチロール箱"), "glassCup": ("玻璃杯", "Glass Cup", "유리컵", "ガラスコップ"), "newspaper": ("报纸", "Newspaper", "신문", "新聞紙"), "plasticCup": ("塑料杯", "Plastic Cup", "플라스틱 컵", "プラスチックカップ"), "wire": ("电线", "Electric Wire", "전선", "電線"), "dataCable": ("数据线", "Data Cable", "데이터 케이블", "データケーブル"), "waterBottle": ("矿泉水瓶", "Water Bottle", "생수병", "ミネラルウォーターボトル"), "pillow": ("枕头", "Pillow", "베개", "枕"), "blade": ("刀片", "Blade", "칼날", "刃物"), "screw": ("螺丝", "Screw", "나사", "ネジ"), "foamPlastic": ("泡沫塑料", "Foam Plastic", "발포 플라스틱", "発泡プラスチック"), "yogurtTetraPak": ("酸奶利乐包装盒", "Yogurt Tetra Pak", "요구르트 테트라팩", "ヨーグルトテトラパック"), "paperBag": ("纸袋", "Paper Bag", "종이봉투", "紙袋"), "cosmeticPlasticBottle": ("化妆品塑料空瓶", "Empty Cosmetic Plastic Bottle", "화장품 플라스틱 빈병", "化粧品プラスチック空瓶"), "leatherShoes": ("皮鞋", "Leather Shoes", "가죽신", "革靴"), "cosmeticGlassBottle": ("化妆品玻璃空瓶", "Empty Cosmetic Glass Bottle", "화장품 유리 빈병", "化粧品ガラス空瓶"), "wineBottle": ("酒瓶", "Wine Bottle", "술병", "酒瓶"), "chargingCable": ("充电线", "Charging Cable", "충전 케이블", "充電ケーブル"), "flyer": ("广告单", "Flyer", "광고 전단", "チラシ"), "wastePlastic": ("废塑料", "Waste Plastic", "폐플라스틱", "廃プラスチック"), "cigaretteBox": ("烟盒", "Cigarette Box", "담배갑", "タバコの箱"), "charger": ("充电器", "Charger", "충전기", "充電器"), "book": ("书本", "Books", "책", "書籍"), "beerBottle": ("啤酒瓶", "Beer Bottle", "맥주병", "ビール瓶"), "cardboardBox": ("纸板箱", "Cardboard Box", "골판지 상자", "段ボール箱"), "woodChopsticks": ("木筷子", "Wooden Chopsticks", "나무 젓가락", "木製箸"), "plushToy": ("毛绒玩具", "Plush Toy", "봉제 인형", "ぬいぐるみ"), "bedSheet": ("被单", "Bed Sheet", "침대 시트", "シーツ"), "scissors": ("剪刀", "Scissors", "가위", "はさみ"), "drinkPlasticBottle": ("饮料塑料瓶", "Drink Plastic Bottle", "음료 플라스틱병", "飲料プラスチックボトル"), "fabric": ("布", "Fabric", "천", "布"), "dehumidifierBox": ("除湿盒", "Dehumidifier Box", "제습제 상자", "除湿剤ボックス"), "magnet": ("吸铁石", "Magnet", "자석", "磁石"), "plasticWrap": ("塑料包装纸", "Plastic Wrap", "플라스틱 포장지", "プラスチック包装紙"), "quilt": ("被子", "Quilt", "이불", "布団"), "tetraPak": ("利乐包装", "Tetra Pak", "테트라팩", "テトラパック"), "basketball": ("篮球", "Basketball", "농구공", "バスケットボール"), "aluminumFoil": ("铝箔", "Aluminum Foil", "알루미늄 호일", "アルミホイル"), "socket": ("插座", "Socket", "콘센트", "コンセント"), "iron": ("铁", "Iron", "철", "鉄"), "key": ("钥匙", "Key", "열쇠", "鍵"), "printingPaper": ("打印纸", "Printing Paper", "인쇄용지", "印刷用紙"), "metal": ("金属", "Metal", "금속", "金属"), "whitePaper": ("白纸", "White Paper", "흰 종이", "白紙"), "packagingBox": ("包装纸盒", "Packaging Paper Box", "포장 종이상자", "包装紙箱"), "plasticLid": ("塑料盖", "Plastic Lid", "플라스틱 뚜껑", "プラスチック蓋"), "envelope": ("信封", "Envelope", "봉투", "封筒"), "medicinePackaging": ("药品包装", "Medicine Packaging", "약 포장", "薬の包装"), "medicineBottle": ("药瓶", "Medicine Bottle", "약병", "薬瓶"), "lightBulb": ("灯泡", "Light Bulb", "전구", "電球"), "paintBucket": ("油漆桶", "Paint Bucket", "페인트 통", "ペンキ缶"), "medicine": ("药品", "Medicine", "약품", "薬品"), "expiredMedicine": ("过期药", "Expired Medicine", "유통기한 지난 약", "期限切れの薬"), "rechargeableBattery": ("充电电池", "Rechargeable Battery", "충전 배터리", "充電式電池"), "nailPolish": ("指甲油", "Nail Polish", "매니큐어", "マニキュア"), "storageBattery": ("蓄电池", "Storage Battery", "축전지", "蓄電池"), "emptyMedicineBottle": ("空药瓶", "Empty Medicine Bottle", "빈 약병", "空の薬瓶"), "hazardousWaste": ("有害垃圾", "Hazardous Waste", "유해 쓰레기", "有害ごみ"), "expiredMedicine2": ("过期药品", "Expired Medicine", "유통기한 지난 의약품", "期限切れ医薬品"), "wasteMedicine": ("废药品", "Waste Medicine", "폐의약품", "廃薬品"), "lightTube": ("灯管", "Light Tube", "형광등", "蛍光灯管"), "fluorescentTube": ("荧光灯管", "Fluorescent Tube", "형광등관", "蛍光管"), "niCdBattery": ("镍镉电池", "Ni-Cd Battery", "니켈카드뮴 배터리", "ニッケルカドミウム電池"), "photo": ("照片", "Photo", "사진", "写真"), "fluorescentLamp": ("荧光灯", "Fluorescent Lamp", "형광등", "蛍光灯"), "hairDyeShell": ("染发剂壳", "Hair Dye Shell", "염색제 용기", "ヘアカラー容器"), "eyeDrops": ("眼药水", "Eye Drops", "안약", "目薬"), "energySavingLamp": ("节能灯", "Energy-saving Lamp", "절전등", "省エネランプ"), "insecticide": ("杀虫剂", "Insecticide", "살충제", "殺虫剤"), "medicineTablet": ("药片", "Medicine Tablet", "약정", "錠剤"), "medicineTabletBox": ("药片盒", "Medicine Tablet Box", "약정 상자", "錠剤の箱"), "oralLiquidBottle": ("口服液药瓶", "Oral Liquid Medicine Bottle", "시럽 약병", "内服液薬瓶"), "wasteMedicineBottle": ("废药瓶", "Waste Medicine Bottle", "폐약병", "廃薬瓶"), "paint": ("油漆", "Paint", "페인트", "ペンキ"), "buttonBattery": ("纽扣电池", "Button Battery", "단추전지", "ボタン電池"), "contraceptive": ("避孕药", "Contraceptive", "피임약", "避妊薬"), "eyeDropsBottle": ("眼药水瓶", "Eye Drops Bottle", "안약병", "目薬瓶"), "film": ("胶片", "Film", "필름", "フィルム"), "capsule": ("胶囊", "Capsule", "캡슐", "カプセル"), "mercuryThermometer": ("水银温度计", "Mercury Thermometer", "수은 온도계", "水銀体温計"), "ratPoison": ("老鼠药", "Rat Poison", "쥐약", "ネズミ薬"), "capsuleBlister": ("胶囊药片底板", "Capsule Blister Pack", "캡슐 알약 팩", "カプセル・錠剤シート"), "hairDyeCan": ("染发剂罐", "Hair Dye Can", "염색제 캔", "ヘアカラー缶"), "energySavingBulb": ("节能灯泡", "Energy-saving Bulb", "절전 전구", "省エネ電球"), "allExpiredMedicine": ("各类过期药品", "All Types of Expired Medicine", "각종 유통기한 지난 의약품", "各種期限切れ医薬品"), "incandescentBulb": ("白炽灯泡", "Incandescent Bulb", "백열전구", "白熱電球"), "phoneBattery": ("手机电池", "Phone Battery", "휴대폰 배터리", "携帯電話バッテリー"), "disinfectantBottle": ("消毒液瓶", "Disinfectant Bottle", "소독액병", "消毒液瓶"), "expiredTablets": ("过期药片", "Expired Tablets", "유통기한 지난 약정", "期限切れ錠剤"), "coldMedicine": ("感冒药", "Cold Medicine", "감기약", "風邪薬"), "disinfectant84Bottle": ("84消毒液空瓶", "Empty 84 Disinfectant Bottle", "84 소독액 빈병", "84消毒液空瓶"), "nailPolishBottle": ("指甲油瓶", "Nail Polish Bottle", "매니큐어 병", "マニキュア瓶"), "sprayCan": ("杀毒喷雾罐", "Spray Can", "살충 스프레이 캔", "殺虫スプレー缶"), "photoNegative": ("相片底片", "Photo Negative", "사진 필름", "写真フィルム"), "chinesePatentMedicine": ("中成药", "Chinese Patent Medicine", "중성 한약", "中成薬"), "filmRoll": ("胶卷", "Film Roll", "필름 롤", "フィルムロール"), "medicineShell": ("药品壳子", "Medicine Shell", "약 포장 껍데기", "薬の包装殻"), "mercury": ("水银", "Mercury", "수은", "水銀"), "photo2": ("相片", "Photo", "사진", "写真"), "wastePaintBucket": ("废油漆桶", "Waste Paint Bucket", "폐페인트 통", "廃ペンキ缶"), "expiredDrug": ("过期药物", "Expired Drug", "유통기한 지난 약물", "期限切れ薬物"), "medicineBlister": ("药品铝塑板", "Medicine Blister Pack", "약 알루미늄 팩", "薬のアルミプラスチック板"), "cockroachMedicine": ("蟑螂药", "Cockroach Medicine", "바퀴벌레 약", "ゴキブリ薬"), "cockroachBall": ("蟑螂丸", "Cockroach Ball", "바퀴벌레 알약", "ゴキブリ丸"), "capsuleTablet": ("胶囊药片", "Capsule and Tablet", "캡슐 알약", "カプセル・錠剤"), "disinfectantTablet": ("消毒药片", "Disinfectant Tablet", "소독 정제", "消毒錠"), "energySavingTube": ("节能灯管", "Energy-saving Tube", "절전 형광등관", "省エネ蛍光管"), "melonSeedShell": ("瓜子壳", "Melon Seed Shell", "해바라기씨 껍질", "瓜子の殻"), "eggShell": ("鸡蛋壳", "Egg Shell", "달걀껍질", "卵の殻"), "cornCob": ("玉米棒", "Corn Cob", "옥수수대", "とうもろこしの芯"), "eggshell": ("蛋壳", "Eggshell", "계란 껍질", "卵殻"), "corn": ("玉米", "Corn", "옥수수", "とうもろこし"), "walnut": ("核桃", "Walnut", "호두", "クルミ"), "peanutShell": ("花生壳", "Peanut Shell", "땅콩 껍질", "ピーナッツの殻"), "tea": ("茶叶", "Tea Leaves", "찻잎", "茶葉"), "lobsterShell": ("龙虾壳", "Lobster Shell", "랍스터 껍질", "ロブスターの殻"), "crayfish": ("小龙虾", "Crayfish", "가재", "ザリガニ"), "crabShell": ("蟹壳", "Crab Shell", "게 껍질", "カニの殻"), "chickenBone": ("鸡骨头", "Chicken Bone", "닭뼈", "鶏の骨"), "melonSeed": ("瓜子", "Melon Seed", "해바라기씨", "瓜子"), "crabShell2": ("螃蟹壳", "Crab Shell", "게 껍데기", "カニの殻"), "cookedCornCob": ("熟玉米棒", "Cooked Corn Cob", "익힌 옥수수대", "茹でたとうもろこしの芯"), "pistachioShell": ("开心果壳", "Pistachio Shell", "피스타치오 껍질", "ピスタチオの殻"), "crayfishShell": ("小龙虾壳", "Crayfish Shell", "가재 껍질", "ザリガニの殻"), "edamameShell": ("毛豆壳", "Edamame Shell", "완두콩 껍질", "枝豆の殻"), "shrimpShell": ("霞壳", "Shrimp Shell", "새우 껍질", "エビの殻"), "bananaPeel": ("香蕉皮", "Banana Peel", "바나나 껍질", "バナナの皮"), "watermelonRind": ("西瓜皮", "Watermelon Rind", "수박 껍질", "スイカの皮"), "chestnutShell": ("栗子壳", "Chestnut Shell", "밤 껍질", "栗の殻"), "fishBone": ("鱼骨头", "Fish Bone", "생선 뼈", "魚の骨"), "lobster": ("龙虾", "Lobster", "랍스터", "ロブスター"), "cornCore": ("玉米芯", "Corn Core", "옥수수 심", "とうもろこし芯"), "melonSeedPiece": ("瓜子片", "Melon Seed Piece", "해바라기씨 조각", "瓜子の破片"), "flower": ("花", "Flower", "꽃", "花"), "coffeeGrounds": ("咖啡渣", "Coffee Grounds", "커피 찌꺼기", "コーヒーかす"), "porkRibs": ("排骨", "Pork Ribs", "갈비", "スペアリブ"), "zongzi": ("粽子", "Zongzi", "종자", "ちまき"), "herbalDregs": ("中药渣", "Herbal Medicine Dregs", "한약 찌꺼기", "漢方薬のかす"), "egg": ("鸡蛋", "Egg", "달걀", "卵"), "crab": ("螃蟹", "Crab", "게", "カニ"), "lycheeShell": ("荔枝壳", "Lychee Shell", "리치 껍질", "ライチの殻"), "peach": ("桃子", "Peach", "복숭아", "桃"), "plumPit": ("话梅核", "Preserved Plum Pit", "화매 씨", "梅干しの核"), "jujubePit": ("枣核", "Jujube Pit", "대추 씨", "ナツメの核"), "chickenBone2": ("鸡骨", "Chicken Bone", "닭뼈", "鶏骨"), "expiredFood": ("过期食品", "Expired Food", "유통기한 지난 식품", "期限切れ食品"), "fishBone2": ("鱼骨", "Fish Bone", "생선 가시", "魚骨"), "apple": ("苹果", "Apple", "사과", "りんご"), "lycheePit": ("荔枝核", "Lychee Pit", "리치 씨", "ライチの核"), "bayberry": ("杨梅", "Bayberry", "양매", "ヤマモモ"), "watermelonSeed": ("西瓜籽", "Watermelon Seed", "수박씨", "スイカの種"), "chestnutShell2": ("板栗壳", "Chestnut Shell", "밤 껍질", "栗の殻"), "cockroach2": ("蟑螂", "Cockroach", "바퀴벌레", "ゴキブリ"), "fruitPeel": ("果皮", "Fruit Peel", "과일 껍질", "果物の皮"), "mangoPit": ("芒果核", "Mango Pit", "망고 씨", "マンゴーの核"), "peanut": ("花生", "Peanut", "땅콩", "ピーナッツ"), "driedPeanutShell": ("干花生壳", "Dried Peanut Shell", "말린 땅콩 껍질", "干したピーナッツの殻"), "biscuit": ("饼干", "Biscuit", "비스킷", "ビスケット"), "watermelon": ("西瓜", "Watermelon", "수박", "スイカ"), "freshFlower": ("鲜花", "Fresh Flower", "생화", "生花"), "redJujubePit": ("红枣核", "Red Jujube Pit", "대추 씨", "赤ナツメの核"), "lusuji": ("芦稷", "Sorghum", "수수", "芦稷"), "appleCore": ("苹果核", "Apple Core", "사과 씨", "りんごの芯"), "waterBambooPeel": ("茭白皮", "Water Bamboo Peel", "교백피", "ザーサイの皮"), "bread": ("面包", "Bread", "빵", "パン"), "banana": ("香蕉", "Banana", "바나나", "バナナ"), "teaResidue": ("茶叶渣", "Tea Residue", "찻잎 찌꺼기", "茶葉かす"), "plasticBag": ("塑料袋", "Plastic Bag", "비닐봉지", "ビニール袋"), "zongziLeaf": ("粽叶", "Zongzi Leaf", "종자 잎", "ちまきの葉"), "walnutShell": ("核桃壳", "Walnut Shell", "호두 껍질", "クルミの殻"), "hair": ("头发", "Hair", "머리카락", "髪の毛"), "shell": ("贝壳", "Shell", "조개껍질", "貝殻"), "sanitaryPad": ("卫生巾", "Sanitary Pad", "생리대", "生理用ナプキン"), "condom": ("避孕套", "Condom", "콘돔", "コンドーム"), "chewingGum": ("口香糖", "Chewing Gum", "껌", "ガム"), "lighter": ("打火机", "Lighter", "라이터", "ライター"), "coconutShell": ("椰子壳", "Coconut Shell", "코코넛 껍질", "ココナッツの殻"), "catLitter": ("猫砂", "Cat Litter", "고양이 모래", "猫砂"), "faceMask": ("面膜", "Face Mask", "마스크팩", "フェイスマスク"), "tissue": ("餐巾纸", "Tissue Paper", "냅킨", "ナプキン"), "bigBone": ("大骨头", "Big Bone", "큰 뼈", "大きな骨"), "milkTeaCup": ("奶茶杯", "Milk Tea Cup", "밀크티 컵", "タピオカティーカップ"), "paperTowel": ("纸巾", "Paper Towel", "휴지", "ティッシュ"), "clamShell": ("蛤蜊壳", "Clam Shell", "조개 껍질", "アサリの殻"), "zongziLeaf2": ("粽子叶", "Zongzi Leaf", "종자 잎", "ちまきの葉"), "cornHusk": ("玉米皮", "Corn Husk", "옥수수 껍질", "とうもろこしの皮"), "straw": ("吸管", "Straw", "빨대", "ストロー"), "teaBag": ("茶包", "Tea Bag", "티백", "ティーバッグ"), "sugarcanePeel": ("甘蔗皮", "Sugarcane Peel", "사탕수수 껍질", "サトウキビの皮"), "desiccant": ("干燥剂", "Desiccant", "건조제", "乾燥剤"), "disposableChopsticks": ("一次性筷子", "Disposable Chopsticks", "일회용 젓가락", "使い捨て箸"), "cornShell": ("玉米壳", "Corn Shell", "옥수수 껍데기", "とうもろこしの殻"), "cigarette": ("烟蒂", "Cigarette Butt", "담배꽁초", "吸い殻"), "wetWipe": ("湿纸巾", "Wet Wipe", "물티슈", "ウェットティッシュ"), "durianShell": ("榴莲壳", "Durian Shell", "두리안 껍질", "ドリアンの殻"), "toiletPaper": ("卫生纸", "Toilet Paper", "화장지", "トイレットペーパー"), "bigWalnutShell": ("大核桃壳", "Big Walnut Shell", "큰 호두 껍질", "大きなクルミの殻"), "nail": ("指甲", "Nail", "손톱", "爪"), "packagingBag": ("包装袋", "Packaging Bag", "포장봉지", "包装袋"), "lipstick": ("口红", "Lipstick", "립스틱", "口紅"), "disposableCup": ("一次性杯子", "Disposable Cup", "일회용 컵", "使い捨てカップ"), "snailShell": ("螺蛳壳", "Snail Shell", "골뱅이 껍질", "巻き貝の殻"), "toothbrush": ("牙刷", "Toothbrush", "칫솔", "歯ブラシ"), "takeoutBox": ("外卖餐盒", "Takeout Box", "배달 용기", "テイクアウト容器"), "durian": ("榴莲", "Durian", "두리안", "ドリアン"), "diaper": ("尿不湿", "Diaper", "기저귀", "おむつ"), "trashBag": ("垃圾袋", "Trash Bag", "쓰레기봉지", "ゴミ袋"), "toothpasteTube": ("牙膏皮", "Toothpaste Tube", "치약 튜브", "歯磨きチューブ"), "icePack": ("冰袋", "Ice Pack", "아이스팩", "保冷剤"), "sock": ("袜子", "Sock", "양말", "靴下"), "pen": ("笔", "Pen", "펜", "ペン"), "diaper2": ("纸尿裤", "Diaper", "기저귀", "紙おむつ"), "durianPit": ("榴莲核", "Durian Pit", "두리안 씨", "ドリアンの種"), "disposableLunchBox": ("一次性餐盒", "Disposable Lunch Box", "일회용 도시락통", "使い捨て弁当箱"), "teaBag2": ("茶叶包", "Tea Bag", "찻잎 티백", "茶葉パック"), "mask": ("口罩", "Mask", "마스크", "マスク"), "underwear": ("内裤", "Underwear", "속옷", "下着"), "towel": ("毛巾", "Towel", "수건", "タオル"), "diaper3": ("尿布", "Diaper", "기저귀", "おむつ"), "ceramicBowl": ("陶瓷碗", "Ceramic Bowl", "도자기 그릇", "陶器の碗"), "penRefill": ("笔芯", "Pen Refill", "펜심", "ペン芯"), "dirtyPlasticBag": ("肮脏塑料袋", "Dirty Plastic Bag", "더러운 비닐봉지", "汚れたビニール袋"), "paperClip": ("回形针", "Paper Clip", "클립", "クリップ"), "toothpick": ("牙签", "Toothpick", "이쑤시개", "爪楊枝"), "foodPackagingBag": ("食品包装袋", "Food Packaging Bag", "식품 포장봉지", "食品包装袋"), "watercolorPen": ("水彩笔", "Watercolor Pen", "물감펜", "水彩ペン"), "cottonSwab": ("棉签", "Cotton Swab", "면봉", "綿棒"), } # Map Chinese name -> key_suffix ZH_TO_KEY = {v[0]: k for k, v in TRANSLATIONS.items()} def slug_from_zh(zh, category, index): if zh in ZH_TO_KEY: return ZH_TO_KEY[zh] # fallback: category prefix + index return f"{category}{index:03d}" def build_items(): items = [] for category_id, names in [ ("recyclable", RECYCLABLE), ("hazardous", HAZARDOUS), ("wet", WET), ("dry", DRY), ]: for i, zh in enumerate(names): key_suffix = slug_from_zh(zh, category_id, i) if key_suffix not in TRANSLATIONS: TRANSLATIONS[key_suffix] = (zh, zh, zh, zh) # placeholder key = f"item.{key_suffix}" item_id = re.sub(r'(?