i18n-po-sheet-sync
Version:
A Node.js library that facilitates synchronization between multilingual PO files and Google Spreadsheets.
9 lines • 12.8 kB
JavaScript
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));const l=c(require(`google-auth-library`)),u=c(require(`google-spreadsheet`)),d=c(require(`node:path`)),f=c(require(`pofile`)),p=c(require(`node:fs`));var m=o((exports,t)=>{function n(e){"@babel/helpers - typeof";return t.exports=n=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},t.exports.__esModule=!0,t.exports.default=t.exports,n(e)}t.exports=n,t.exports.__esModule=!0,t.exports.default=t.exports}),h=o((exports,t)=>{var n=m().default;function r(e,t){if(n(e)!=`object`||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var i=r.call(e,t||`default`);if(n(i)!=`object`)return i;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}t.exports=r,t.exports.__esModule=!0,t.exports.default=t.exports}),g=o((exports,t)=>{var n=m().default,r=h();function i(e){var t=r(e,`string`);return n(t)==`symbol`?t:t+``}t.exports=i,t.exports.__esModule=!0,t.exports.default=t.exports}),_=o((exports,t)=>{var n=g();function r(e,t,r){return(t=n(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}t.exports=r,t.exports.__esModule=!0,t.exports.default=t.exports}),v=o((exports,t)=>{var n=_();function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var i=arguments[t]==null?{}:arguments[t];t%2?r(Object(i),!0).forEach(function(t){n(e,t,i[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):r(Object(i)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))})}return e}t.exports=i,t.exports.__esModule=!0,t.exports.default=t.exports}),y=o((exports,t)=>{function n(e,t,n,r,i,a,o){try{var s=e[a](o),c=s.value}catch(e){return void n(e)}s.done?t(c):Promise.resolve(c).then(r,i)}function r(e){return function(){var t=this,r=arguments;return new Promise(function(i,a){var o=e.apply(t,r);function s(e){n(o,i,a,s,c,`next`,e)}function c(e){n(o,i,a,s,c,`throw`,e)}s(void 0)})}}t.exports=r,t.exports.__esModule=!0,t.exports.default=t.exports}),b=c(v()),x=c(y());function S(e,t){return C.apply(this,arguments)}function C(){return C=(0,x.default)(function*(e,t){try{let n=new l.JWT((0,b.default)((0,b.default)({},t),{},{scopes:[`https://www.googleapis.com/auth/spreadsheets`]})),r=new u.GoogleSpreadsheet(e,n);return yield r.loadInfo(),r}catch(e){throw e instanceof Error?Error(`Failed to authenticate and load spreadsheet: ${e.message}`):Error(`Failed to authenticate and load spreadsheet`)}}),C.apply(this,arguments)}const w={msgid:`messageId`,msgctxt:`context`,references:`references`,comments:`comments`,extractedComments:`extractedComments`};var T=c(v());function E(e,t,n){if(!p.existsSync(e))return D(t,n);try{let t=p.readFileSync(e,`utf8`),n=f.default.parse(t);return n.headers=(0,T.default)((0,T.default)({},n.headers),{},{"PO-Revision-Date":new Date().toISOString()}),n}catch(t){throw t instanceof Error?Error(`Failed to load PO file at ${e}: ${t.message}`):Error(`Failed to load PO file at ${e}`)}}function D(e,t){var n;let r=new f.default,i=(t==null||(n=t.pluralFormsByLanguage)==null?void 0:n[e])||(e===`ko`?`nplurals=1; plural=0;`:`nplurals=2; plural=(n != 1);`);return r.headers={"POT-Creation-Date":new Date().toISOString(),"MIME-Version":`1.0`,"Content-Type":`text/plain; charset=utf-8`,"Content-Transfer-Encoding":`8bit`,"X-Generator":`i18n-po-sheet-sync`,Language:e,"Project-Id-Version":``,"Report-Msgid-Bugs-To":``,"PO-Revision-Date":new Date().toISOString(),"Last-Translator":``,"Language-Team":``,"Plural-Forms":i},r}function O(e){let t=d.default.dirname(e);p.existsSync(t)||p.mkdirSync(t,{recursive:!0})}function k(e,t){return new Promise((n,r)=>{O(t),e.save(t,e=>{e?r(Error(`Failed to save PO file at ${t}: ${e.message}`)):n()})})}var A=c(_()),j=c(y()),M=class{constructor(e,t=w){(0,A.default)(this,`config`,void 0),(0,A.default)(this,`headerMapping`,void 0),this.config=e,this.headerMapping=t}exportToPOFiles(e){var t=this;return(0,j.default)(function*(e,n={filterMissingTranslations:!1,preserveExistingItems:!1}){let r=t.config.sheetIndex||0,i=e.sheetsByIndex[r];if(!i)throw Error(`Sheet with index ${r} not found in the spreadsheet`);yield i.loadHeaderRow();let a=i.headerValues,o=a.filter(e=>t.config.languages.includes(e));if(o.length===0)throw Error(`No configured languages found in spreadsheet headers`);let s=yield i.getRows();if(s.length===0)throw Error(`No data found in spreadsheet`);let c=[];for(let e of o)try{let r=yield t.processLanguage(e,s,n);c.push(r)}catch(t){throw console.error(`Error processing language ${e}:`,t),t}return c}).apply(this,arguments)}processLanguage(e,t,n){var r=this;return(0,j.default)(function*(){let i=d.join(r.config.poFilesBasePath,e,`messages.po`),a=E(i,e,n),o={};for(let e of a.items)o[e.msgid]=e;let s=new Set,c=a.items.length,l=0,u=n.preserveExistingItems?[...a.items]:[];for(let i of t){let t=i.toObject(),a=t[r.headerMapping.msgid];if(!a)continue;s.add(a);let c=t[e];if(n.filterMissingTranslations&&!c)continue;let d,p=!1;if(o[a]){if(d=o[a],d.msgstr[0]!==c||r.headerMapping.msgctxt&&d.msgctxt!==t[r.headerMapping.msgctxt]||r.referencesChanged(d,t,r.headerMapping.references)||r.commentsChanged(d,t,r.headerMapping.comments,`comments`)||r.commentsChanged(d,t,r.headerMapping.extractedComments,`extractedComments`))l++;else if(n.preserveExistingItems)continue}else d=new f.default.Item,p=!0,l++;d.msgid=a,d.msgstr=[c||``],r.updateOptionalFields(d,t),n.preserveExistingItems||u.push(d)}n.preserveExistingItems||(a.items=u.filter(e=>s.has(e.msgid)));let p=n.preserveExistingItems?0:c-a.items.length;return yield k(a,i),{language:e,totalItems:a.items.length,updatedItems:l,removedItems:p,filePath:i}})()}updateOptionalFields(e,t){if(this.headerMapping.msgctxt&&t[this.headerMapping.msgctxt]&&(e.msgctxt=t[this.headerMapping.msgctxt]),this.headerMapping.references&&t[this.headerMapping.references]){var n,r;let i=(n=(r=t[this.headerMapping.references])==null?void 0:r.split(`
`))==null?[]:n;e.references=i}if(this.headerMapping.comments&&t[this.headerMapping.comments]){var i,a;let n=(i=(a=t[this.headerMapping.comments])==null?void 0:a.split(`
`))==null?[]:i;e.comments=n}if(this.headerMapping.extractedComments&&t[this.headerMapping.extractedComments]){var o,s;let n=(o=(s=t[this.headerMapping.extractedComments])==null?void 0:s.split(`
`))==null?[]:o;e.extractedComments=n}}referencesChanged(e,t,n){if(!n||!t[n])return!1;let r=t[n].split(`
`);return JSON.stringify(e.references)!==JSON.stringify(r)}commentsChanged(e,t,n,r=`comments`){if(!n||!t[n])return!1;let i=t[n].split(`
`);return JSON.stringify(e[r])!==JSON.stringify(i)}},N=c(_()),P=c(y()),F=c(v()),I=class{constructor(e,t=w){(0,N.default)(this,`config`,void 0),(0,N.default)(this,`headerMapping`,void 0),(0,N.default)(this,`reverseMapping`,void 0),this.config=e,this.headerMapping=t,this.reverseMapping={};for(let[e,n]of Object.entries(t))n&&(this.reverseMapping[n]=e)}uploadFromPOFiles(e){var t=this;return(0,P.default)(function*(e,n={applyConditionalFormatting:!0,emptyColor:`#FFEBEE`}){let r=t.config.sheetIndex||0,i=e.sheetsByIndex[r];if(!i)throw Error(`Sheet with index ${r} not found in the spreadsheet`);console.time(`Total upload time`);try{let r={};if(n.preserveExistingTranslations)try{let e=yield i.getRows();r=t.buildExistingDataMap(e)}catch(e){let t=e instanceof Error?e.message:String(e);if(t.includes(`No values in the header row`))console.log(`No header row found, will create new headers`),r={};else throw e}let a=yield t.collectTranslationsFromPOFiles(r);yield i.clear();let o=Object.values(t.headerMapping),s=o.filter(e=>e===t.headerMapping.msgid),c=o.filter(e=>e!==t.headerMapping.msgid),l=[...s,...t.config.languages,...c];yield i.setHeaderRow(l);let u=t.prepareRowsToAdd(a);return u.length>0&&(yield i.addRows(u)),n.applyConditionalFormatting&&(yield t.applyConditionalFormatting(i,e.spreadsheetId,t.config.serviceAccount,n.emptyColor||`#FFEBEE`)),console.timeEnd(`Total upload time`),{totalItems:u.length,addedItems:u.length,updatedItems:0,status:`success`}}catch(e){throw console.error(`Error uploading translations:`,e),e}}).apply(this,arguments)}collectTranslationsFromPOFiles(){var e=this;return(0,P.default)(function*(t={}){let n={};for(let s of e.config.languages){console.time(`Processing time for ${s}`);try{let c=d.join(e.config.poFilesBasePath,s,`messages.po`);if(!p.existsSync(c)){console.warn(`PO file not found: ${c}`);continue}let l=p.readFileSync(c,`utf8`),u=f.default.parse(l);for(let e of u.items){var r,i,a,o;if(!e.msgid)continue;n[e.msgid]||(n[e.msgid]={msgid:e.msgid});let c=(r=t[e.msgid])==null?void 0:r[s],l=e.msgstr[0]||``;n[e.msgid][s]=c||l||``,e.msgctxt&&(n[e.msgid].context=e.msgctxt),((i=e.references)==null?void 0:i.length)>0&&(n[e.msgid].reference=e.references.join(`
`)),((a=e.comments)==null?void 0:a.length)>0&&(n[e.msgid].comments=e.comments.join(`
`)),((o=e.extractedComments)==null?void 0:o.length)>0&&(n[e.msgid].extractedComments=e.extractedComments.join(`
`))}console.timeEnd(`Processing time for ${s}`)}catch(e){console.warn(`Could not process ${s} PO file:`,e==null?void 0:e.message)}}return n}).apply(this,arguments)}buildExistingDataMap(e){let t={};for(let n of e){let e=n.get(this.headerMapping.msgid);if(e){let r=n.toObject();t[e]={};for(let[n,i]of Object.entries(r)){let r=this.reverseMapping[n]||n;t[e][r]=i||``}}}return t}prepareRowsToAdd(e){return Object.values(e).map(e=>{let t={};t[this.headerMapping.msgid]=e.msgid||``;for(let n of this.config.languages)this.isValidHeader(n)&&(t[n]=e[n]||``);return this.headerMapping.msgctxt&&e.context&&(t[this.headerMapping.msgctxt]=e.context),this.headerMapping.references&&e.reference&&(t[this.headerMapping.references]=e.reference),this.headerMapping.comments&&e.comments&&(t[this.headerMapping.comments]=e.comments),this.headerMapping.extractedComments&&e.extractedComments&&(t[this.headerMapping.extractedComments]=e.extractedComments),t})}isValidHeader(e){return!!e}applyConditionalFormatting(e,t,n,r=`#FFEBEE`){var i=this;return(0,P.default)(function*(){try{let a=new l.JWT((0,F.default)((0,F.default)({},n),{},{scopes:[`https://www.googleapis.com/auth/spreadsheets`]})),o=e.headerValues,s=[];for(let t of i.config.languages){let n=o.indexOf(t);n!==-1&&s.push({addConditionalFormatRule:{rule:{ranges:[{sheetId:e.sheetId,startRowIndex:1,startColumnIndex:n,endColumnIndex:n+1}],booleanRule:{condition:{type:`BLANK`},format:{backgroundColor:i.hexToGoogleColor(r)}}},index:0}})}if(s.length>0){let e={spreadsheetId:t,resource:{requests:s}};yield a.request({url:`https://sheets.googleapis.com/v4/spreadsheets/${t}:batchUpdate`,method:`POST`,data:e.resource}),console.log(`조건부 서식이 성공적으로 적용되었습니다.`)}}catch(e){console.error(`조건부 서식 적용 중 오류 발생:`,e)}})()}hexToGoogleColor(e){let t=this.hexToRgb(e);return{red:t.r/255,green:t.g/255,blue:t.b/255}}hexToRgb(e){let t=RegExp(`^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$`,`i`).exec(e);return t?{r:Number.parseInt(t[1],16),g:Number.parseInt(t[2],16),b:Number.parseInt(t[3],16)}:{r:0,g:0,b:0}}},L=c(_()),R=c(y()),z=class{constructor(e,t){(0,L.default)(this,`config`,void 0),(0,L.default)(this,`headerMapping`,void 0),this.config=e,this.headerMapping=t||w}exportToPO(e){var t=this;return(0,R.default)(function*(){let n=yield S(t.config.spreadsheetId,t.config.serviceAccount),r=new M(t.config,t.headerMapping);return r.exportToPOFiles(n,e)})()}uploadFromPO(e){var t=this;return(0,R.default)(function*(){let n=yield S(t.config.spreadsheetId,t.config.serviceAccount),r=new I(t.config,t.headerMapping);return r.uploadFromPOFiles(n,e)})()}applyConditionalFormatting(e=`#FFEBEE`){var t=this;return(0,R.default)(function*(){let n=yield S(t.config.spreadsheetId,t.config.serviceAccount),r=n.sheetsByIndex[t.config.sheetIndex||0];if(!r)throw Error(`Sheet with index ${t.config.sheetIndex||0} not found`);let i=new I(t.config,t.headerMapping);yield i.applyConditionalFormatting(r,n.spreadsheetId,t.config.serviceAccount,e)})()}},B=z;module.exports=B;