const fs = require('fs'); const path = require('path'); const dir = path.join(__dirname, '..', 'public', 'intl', 'messages'); const enUS = JSON.parse(fs.readFileSync(path.join(dir, 'en-US.json'), 'utf8')); const translations = { 'ta-IN': { label: { // Keys where ta-IN value === en-US value (untranslated) 'access-code': 'அணுகல் குறியீடு', 'account': 'கணக்கு', 'action': 'செயல்', 'activity': 'செயல்பாடு', 'add': 'சேர்', 'add-board': 'பலகையைச் சேர்', 'add-description': 'விளக்கத்தைச் சேர்', 'add-link': 'இணைப்பைச் சேர்', 'add-member': 'உறுப்பினரைச் சேர்', 'add-pixel': 'பிக்சலைச் சேர்', 'add-step': 'படியைச் சேர்', 'affiliate': 'இணைத்திட்டம்', 'after': 'பிறகு', 'all-time': 'எல்லா நேரமும்', 'analysis': 'பகுப்பாய்வு', 'analytics': 'பகுப்பாய்வு', 'application': 'பயன்பாடு', 'apply': 'பயன்படுத்து', 'attribution': 'காரணிப்பு', 'attribution-description': 'பயனர்கள் உங்கள் சந்தைப்படுத்தலுடன் எவ்வாறு ஈடுபடுகிறார்கள் மற்றும் மாற்றங்களை எது ஊக்குவிக்கிறது என்பதைப் பாருங்கள்.', 'audience': 'பார்வையாளர்', 'average': 'சராசரி', 'before': 'முன்', 'boards': 'பலகைகள்', 'breakdown': 'விரிவாக்கம்', 'browser': 'உலாவி', 'campaign': 'பிரச்சாரம்', 'campaigns': 'பிரச்சாரங்கள்', 'channel': 'சேனல்', 'channels': 'சேனல்கள்', 'chart': 'வரைபடம்', 'cities': 'நகரங்கள்', 'city': 'நகரம்', 'clear-all': 'அனைத்தையும் அழி', 'cohort': 'குழு', 'cohorts': 'குழுக்கள்', 'compare': 'ஒப்பிடு', 'compare-dates': 'தேதிகளை ஒப்பிடு', 'confirm': 'உறுதிப்படுத்து', 'contains': 'உள்ளடக்கியது', 'content': 'உள்ளடக்கம்', 'continue': 'தொடர்', 'conversion': 'மாற்றம்', 'conversion-rate': 'மாற்ற விகிதம்', 'conversion-step': 'மாற்றப் படி', 'count': 'எண்ணிக்கை', 'country': 'நாடு', 'create': 'உருவாக்கு', 'create-report': 'அறிக்கையை உருவாக்கு', 'create-team': 'குழுவை உருவாக்கு', 'create-user': 'பயனரை உருவாக்கு', 'created': 'உருவாக்கப்பட்டது', 'created-by': 'உருவாக்கியவர்', 'criteria': 'அளவுகோல்', 'currency': 'நாணயம்', 'current': 'தற்போதைய', 'data': 'தரவு', 'date': 'தேதி', 'day': 'நாள்', 'delete-report': 'அறிக்கையை நீக்கு', 'delete-team': 'குழுவை நீக்கு', 'delete-user': 'பயனரை நீக்கு', 'description': 'விளக்கம்', 'destination-url': 'இலக்கு URL', 'details': 'விவரங்கள்', 'device': 'சாதனம்', 'direct': 'நேரடி', 'distinct-id': 'தனித்துவ ID', 'documentation': 'ஆவணங்கள்', 'does-not-contain': 'உள்ளடக்கவில்லை', 'does-not-include': 'சேர்க்கவில்லை', 'doest-not-exist': 'இல்லை', 'download': 'பதிவிறக்கு', 'dropoff': 'விலகல்', 'edit-dashboard': 'முகப்பைத் திருத்து', 'edit-member': 'உறுப்பினரைத் திருத்து', 'email': 'மின்னஞ்சல்', 'end-step': 'இறுதிப் படி', 'environment': 'சூழல்', 'event': 'நிகழ்வு', 'event-data': 'நிகழ்வுத் தரவு', 'event-name': 'நிகழ்வு பெயர்', 'exclude-bounce': 'துள்ளலை விலக்கு', 'exists': 'உள்ளது', 'false': 'தவறு', 'field': 'புலம்', 'fields': 'புலங்கள்', 'filter': 'வடிகட்டி', 'filters': 'வடிகட்டிகள்', 'first-click': 'முதல் கிளிக்', 'first-seen': 'முதலில் பார்த்தது', 'funnel': 'புனல்', 'funnel-description': 'பயனர்களின் மாற்ற மற்றும் விலகல் விகிதத்தைப் புரிந்துகொள்ளுங்கள்.', 'funnels': 'புனல்கள்', 'goal': 'இலக்கு', 'goals': 'இலக்குகள்', 'goals-description': 'பக்க காட்சிகள் மற்றும் நிகழ்வுகளுக்கான உங்கள் இலக்குகளைக் கண்காணிக்கவும்.', 'greater-than': 'பெரியது', 'greater-than-equals': 'பெரியது அல்லது சமம்', 'grouped': 'தொகுக்கப்பட்டது', 'growth': 'வளர்ச்சி', 'hostname': 'புரவலன் பெயர்', 'hour': 'மணி', 'includes': 'சேர்க்கிறது', 'insight': 'நுண்ணறிவு', 'insights': 'நுண்ணறிவுகள்', 'insights-description': 'பிரிவுகள் மற்றும் வடிகட்டிகளைப் பயன்படுத்தி உங்கள் தரவில் ஆழமாக முழுகுங்கள்.', 'invalid-url': 'தவறான URL', 'is': 'ஆகும்', 'is-false': 'தவறு', 'is-not': 'அல்ல', 'is-not-set': 'அமைக்கப்படவில்லை', 'is-set': 'அமைக்கப்பட்டுள்ளது', 'is-true': 'உண்மை', 'join': 'சேர்', 'join-team': 'குழுவில் சேர்', 'journey': 'பயணம்', 'journey-description': 'பயனர்கள் உங்கள் வலைத்தளத்தில் எவ்வாறு வழிசெல்கிறார்கள் என்பதைப் புரிந்துகொள்ளுங்கள்.', 'journeys': 'பயணங்கள்', 'language': 'மொழி', 'languages': 'மொழிகள்', 'last-click': 'கடைசி கிளிக்', 'last-months': 'முந்தைய {x} மாதங்கள்', 'last-seen': 'கடைசியாகப் பார்த்தது', 'leave': 'வெளியேறு', 'leave-team': 'குழுவை விட்டு வெளியேறு', 'less-than': 'சிறியது', 'less-than-equals': 'சிறியது அல்லது சமம்', 'link': 'இணைப்பு', 'links': 'இணைப்புகள்', 'location': 'இடம்', 'manage': 'நிர்வகி', 'manager': 'மேலாளர்', 'max': 'அதிகபட்சம்', 'medium': 'ஊடகம்', 'member': 'உறுப்பினர்', 'members': 'உறுப்பினர்கள்', 'min': 'குறைந்தபட்சம்', 'minute': 'நிமிடம்', 'model': 'மாதிரி', 'month': 'மாதம்', 'my-account': 'எனது கணக்கு', 'my-websites': 'எனது வலைத்தளங்கள்', 'none': 'எதுவுமில்லை', 'number-of-records': '{x} {x, plural, one {பதிவு} other {பதிவுகள்}}', 'online': 'நிகழ்நிலை', 'organic-search': 'இயற்கையான தேடல்', 'organic-shopping': 'இயற்கையான ஷாப்பிங்', 'organic-social': 'இயற்கையான சமூக ஊடகம்', 'organic-video': 'இயற்கையான வீடியோ', 'other': 'பிற', 'overview': 'மேலோட்டம்', 'owner': 'உரிமையாளர்', 'page': 'பக்கம்', 'page-of': 'பக்கம் {current} / {total}', 'pageTitle': 'பக்கத் தலைப்பு', 'paid-ads': 'கட்டண விளம்பரங்கள்', 'paid-search': 'கட்டணத் தேடல்', 'paid-shopping': 'கட்டண ஷாப்பிங்', 'paid-social': 'கட்டண சமூக ஊடகம்', 'paid-video': 'கட்டண வீடியோ', 'path': 'பாதை', 'paths': 'பாதைகள்', 'pixel': 'பிக்சல்', 'pixels': 'பிக்சல்கள்', 'preferences': 'விருப்பத்தேர்வுகள்', 'previous': 'முந்தைய', 'previous-period': 'முந்தைய காலம்', 'previous-year': 'முந்தைய ஆண்டு', 'profiles': 'சுயவிவரங்கள்', 'properties': 'பண்புகள்', 'property': 'பண்பு', 'queries': 'வினவல்கள்', 'query': 'வினவல்', 'query-parameters': 'வினவல் அளவுருக்கள்', 'referral': 'பரிந்துரை', 'referrer': 'பரிந்துரையாளர்', 'regenerate': 'மீண்டும் உருவாக்கு', 'region': 'பிராந்தியம்', 'regions': 'பிராந்தியங்கள்', 'remaining': 'மீதம்', 'remove': 'நீக்கு', 'remove-member': 'உறுப்பினரை நீக்கு', 'reports': 'அறிக்கைகள்', 'retention': 'தக்கவைப்பு', 'retention-description': 'பயனர்கள் எவ்வளவு அடிக்கடி திரும்பி வருகிறார்கள் என்பதைக் கண்காணித்து உங்கள் வலைத்தளத்தின் ஒட்டுதலை அளவிடுங்கள்.', 'revenue': 'வருவாய்', 'revenue-description': 'உங்கள் வருவாய் தரவையும் பயனர்கள் எவ்வாறு செலவிடுகிறார்கள் என்பதையும் ஆராயுங்கள்.', 'role': 'பங்கு', 'run-query': 'வினவலை இயக்கு', 'save-cohort': 'குழுவைச் சேமி', 'save-segment': 'பிரிவைச் சேமி', 'screen': 'திரை', 'screens': 'திரைகள்', 'search': 'தேடு', 'segment': 'பிரிவு', 'segments': 'பிரிவுகள்', 'select': 'தேர்ந்தெடு', 'select-date': 'தேதியைத் தேர்ந்தெடு', 'select-filter': 'வடிகட்டியைத் தேர்ந்தெடு', 'select-role': 'பங்கைத் தேர்ந்தெடு', 'select-website': 'வலைத்தளத்தைத் தேர்ந்தெடு', 'session': 'அமர்வு', 'session-data': 'அமர்வுத் தரவு', 'sessions': 'அமர்வுகள்', 'share': 'பகிர்', 'source': 'மூலம்', 'sources': 'மூலங்கள்', 'start-step': 'தொடக்கப் படி', 'steps': 'படிகள்', 'sum': 'கூட்டுத்தொகை', 'support': 'ஆதரவு', 'switch-account': 'கணக்கை மாற்று', 'table': 'அட்டவணை', 'tag': 'குறிச்சொல்', 'tags': 'குறிச்சொற்கள்', 'team': 'குழு', 'team-id': 'குழு ID', 'team-manager': 'குழு மேலாளர்', 'team-member': 'குழு உறுப்பினர்', 'team-name': 'குழுவின் பெயர்', 'team-owner': 'குழு உரிமையாளர்', 'team-settings': 'குழு அமைப்புகள்', 'team-view-only': 'குழு பார்வை மட்டும்', 'team-websites': 'குழு வலைத்தளங்கள்', 'teams': 'குழுக்கள்', 'term': 'சொல்', 'terms': 'விதிமுறைகள்', 'theme': 'தீம்', 'title': 'தலைப்பு', 'toggle-charts': 'வரைபடங்களை மாற்று', 'total': 'மொத்தம்', 'total-records': 'மொத்தப் பதிவுகள்', 'traffic': 'பார்வையாளர் போக்குவரத்து', 'transactions': 'பரிவர்த்தனைகள்', 'transfer': 'மாற்றம்', 'transfer-website': 'வலைத்தளத்தை மாற்று', 'true': 'உண்மை', 'type': 'வகை', 'unique': 'தனித்துவ', 'unique-events': 'தனித்துவ நிகழ்வுகள்', 'uniqueCustomers': 'தனித்துவ வாடிக்கையாளர்கள்', 'untitled': 'தலைப்பில்லாத', 'update': 'புதுப்பி', 'user': 'பயனர்', 'users': 'பயனர்கள்', 'utm-description': 'UTM அளவுருக்கள் மூலம் உங்கள் பிரச்சாரங்களைக் கண்காணிக்கவும்.', 'value': 'மதிப்பு', 'version': 'பதிப்பு', 'view': 'பார்', 'view-only': 'பார்வை மட்டும்', 'views-per-visit': 'ஒரு வருகைக்கான பார்வைகள்', 'visits': 'வருகைகள்', 'website': 'வலைத்தளம்', 'website-id': 'வலைத்தள ID', 'window': 'சாளரம்', 'yesterday': 'நேற்று' }, message: { 'action-confirmation': 'உறுதிப்படுத்த கீழே உள்ள பெட்டியில் {confirmation} என்று தட்டச்சு செய்யவும்.', 'bad-request': 'தவறான கோரிக்கை', 'collected-data': 'சேகரிக்கப்பட்ட தரவு', 'confirm-leave': '{target} விட்டு வெளியேற விரும்புகிறீர்களா?', 'confirm-remove': '{target} நீக்க விரும்புகிறீர்களா?', 'delete-team-warning': 'ஒரு குழுவை நீக்கினால் அனைத்து குழு வலைத்தளங்களும் நீக்கப்படும்.', 'event-log': '{event} {url} இல்', 'forbidden': 'தடைசெய்யப்பட்டது', 'min-password-length': 'குறைந்தபட்சம் {n} எழுத்துகள் தேவை', 'new-version-available': 'Umami {version} புதிய பதிப்பு கிடைக்கிறது!', 'no-event-data': 'நிகழ்வுத் தரவு எதுவும் கிடைக்கவில்லை.', 'no-results-found': 'முடிவுகள் எதுவும் கிடைக்கவில்லை.', 'no-team-websites': 'இந்தக் குழுவில் வலைத்தளங்கள் எதுவும் இல்லை.', 'no-teams': 'நீங்கள் எந்தக் குழுவையும் உருவாக்கவில்லை.', 'no-users': 'பயனர்கள் யாரும் இல்லை.', 'not-found': 'கிடைக்கவில்லை', 'nothing-selected': 'எதுவும் தேர்ந்தெடுக்கப்படவில்லை.', 'reset-website': 'இந்த வலைத்தளத்தை மீட்டமைக்க, கீழே உள்ள பெட்டியில் {confirmation} என்று தட்டச்சு செய்து உறுதிப்படுத்தவும்.', 'reset-website-warning': 'இந்த வலைத்தளத்தின் அனைத்து புள்ளிவிவரங்களும் நீக்கப்படும், ஆனால் உங்கள் அமைப்புகள் அப்படியே இருக்கும்.', 'sever-error': 'சேவையக பிழை', 'share-url': 'உங்கள் வலைத்தள புள்ளிவிவரங்கள் பின்வரும் URL இல் பொதுவாகக் கிடைக்கும்:', 'team-already-member': 'நீங்கள் ஏற்கனவே இந்தக் குழுவின் உறுப்பினர்.', 'team-not-found': 'குழு கிடைக்கவில்லை.', 'team-websites-info': 'குழுவில் உள்ள எவரும் வலைத்தளங்களைப் பார்க்கலாம்.', 'tracking-code': 'இந்த வலைத்தளத்தின் புள்ளிவிவரங்களைக் கண்காணிக்க, பின்வரும் குறியீட்டை உங்கள் HTML இன் ... பகுதியில் வைக்கவும்.', 'transfer-team-website-to-user': 'இந்த வலைத்தளத்தை உங்கள் கணக்கிற்கு மாற்ற விரும்புகிறீர்களா?', 'transfer-user-website-to-team': 'இந்த வலைத்தளத்தை மாற்ற குழுவைத் தேர்ந்தெடுக்கவும்.', 'transfer-website': 'வலைத்தள உரிமையை உங்கள் கணக்கிற்கு அல்லது மற்றொரு குழுவிற்கு மாற்றவும்.', 'triggered-event': 'தூண்டப்பட்ட நிகழ்வு', 'unauthorized': 'அங்கீகரிக்கப்படவில்லை', 'user-deleted': 'பயனர் நீக்கப்பட்டார்.', 'viewed-page': 'பார்வையிட்ட பக்கம்' } } }; for (const [locale, trans] of Object.entries(translations)) { const filePath = path.join(dir, locale + '.json'); const data = JSON.parse(fs.readFileSync(filePath, 'utf8')); let count = 0; for (const [section, keys] of Object.entries(trans)) { for (const [key, value] of Object.entries(keys)) { if (data[section] && key in data[section]) { data[section][key] = value; count++; } } } const sorted = {}; for (const section of Object.keys(enUS)) { if (data[section]) { sorted[section] = {}; for (const key of Object.keys(enUS[section])) { if (key in data[section]) sorted[section][key] = data[section][key]; } for (const key of Object.keys(data[section])) { if (!(key in sorted[section])) sorted[section][key] = data[section][key]; } } } fs.writeFileSync(filePath, JSON.stringify(sorted, null, 2) + '\n', 'utf8'); console.log('Updated ' + locale + ': ' + count + ' keys'); }