UNPKG

i18n-po-sheet-sync

Version:

A Node.js library that facilitates synchronization between multilingual PO files and Google Spreadsheets.

9 lines 12.9 kB
import{JWT as e}from"google-auth-library";import{GoogleSpreadsheet as t}from"google-spreadsheet";import*as n from"node:path";import*as r from"node:path";import i from"node:path";import a from"pofile";import*as o from"node:fs";import*as s from"node:fs";var c=Object.create,l=Object.defineProperty,u=Object.getOwnPropertyDescriptor,d=Object.getOwnPropertyNames,f=Object.getPrototypeOf,p=Object.prototype.hasOwnProperty,m=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),h=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=d(t),a=0,o=i.length,s;a<o;a++)s=i[a],!p.call(e,s)&&s!==n&&l(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=u(t,s))||r.enumerable});return e},g=(e,t,n)=>(n=e==null?{}:c(f(e)),h(t||!e||!e.__esModule?l(n,`default`,{value:e,enumerable:!0}):n,e)),_=m((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}),v=m((exports,t)=>{var n=_().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}),y=m((exports,t)=>{var n=_().default,r=v();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}),b=m((exports,t)=>{var n=y();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}),x=m((exports,t)=>{var n=b();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}),S=m((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}),C=g(x()),w=g(S());function T(e,t){return E.apply(this,arguments)}function E(){return E=(0,w.default)(function*(n,r){try{let i=new e((0,C.default)((0,C.default)({},r),{},{scopes:[`https://www.googleapis.com/auth/spreadsheets`]})),a=new t(n,i);return yield a.loadInfo(),a}catch(e){throw e instanceof Error?Error(`Failed to authenticate and load spreadsheet: ${e.message}`):Error(`Failed to authenticate and load spreadsheet`)}}),E.apply(this,arguments)}const D={msgid:`messageId`,msgctxt:`context`,references:`references`,comments:`comments`,extractedComments:`extractedComments`};var O=g(x());function k(e,t,n){if(!o.existsSync(e))return A(t,n);try{let t=o.readFileSync(e,`utf8`),n=a.parse(t);return n.headers=(0,O.default)((0,O.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 A(e,t){var n;let r=new a,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 j(e){let t=i.dirname(e);o.existsSync(t)||o.mkdirSync(t,{recursive:!0})}function M(e,t){return new Promise((n,r)=>{j(t),e.save(t,e=>{e?r(Error(`Failed to save PO file at ${t}: ${e.message}`)):n()})})}var N=g(b()),P=g(S()),F=class{constructor(e,t=D){(0,N.default)(this,`config`,void 0),(0,N.default)(this,`headerMapping`,void 0),this.config=e,this.headerMapping=t}exportToPOFiles(e){var t=this;return(0,P.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,r){var i=this;return(0,P.default)(function*(){let o=n.join(i.config.poFilesBasePath,e,`messages.po`),s=k(o,e,r),c={};for(let e of s.items)c[e.msgid]=e;let l=new Set,u=s.items.length,d=0,f=r.preserveExistingItems?[...s.items]:[];for(let n of t){let t=n.toObject(),o=t[i.headerMapping.msgid];if(!o)continue;l.add(o);let s=t[e];if(r.filterMissingTranslations&&!s)continue;let u,p=!1;if(c[o]){if(u=c[o],u.msgstr[0]!==s||i.headerMapping.msgctxt&&u.msgctxt!==t[i.headerMapping.msgctxt]||i.referencesChanged(u,t,i.headerMapping.references)||i.commentsChanged(u,t,i.headerMapping.comments,`comments`)||i.commentsChanged(u,t,i.headerMapping.extractedComments,`extractedComments`))d++;else if(r.preserveExistingItems)continue}else u=new a.Item,p=!0,d++;u.msgid=o,u.msgstr=[s||``],i.updateOptionalFields(u,t),r.preserveExistingItems||f.push(u)}r.preserveExistingItems||(s.items=f.filter(e=>l.has(e.msgid)));let p=r.preserveExistingItems?0:u-s.items.length;return yield M(s,o),{language:e,totalItems:s.items.length,updatedItems:d,removedItems:p,filePath:o}})()}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)}},I=g(b()),L=g(S()),R=g(x()),z=class{constructor(e,t=D){(0,I.default)(this,`config`,void 0),(0,I.default)(this,`headerMapping`,void 0),(0,I.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,L.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,L.default)(function*(t={}){let n={};for(let u of e.config.languages){console.time(`Processing time for ${u}`);try{let d=r.join(e.config.poFilesBasePath,u,`messages.po`);if(!s.existsSync(d)){console.warn(`PO file not found: ${d}`);continue}let f=s.readFileSync(d,`utf8`),p=a.parse(f);for(let e of p.items){var i,o,c,l;if(!e.msgid)continue;n[e.msgid]||(n[e.msgid]={msgid:e.msgid});let r=(i=t[e.msgid])==null?void 0:i[u],a=e.msgstr[0]||``;n[e.msgid][u]=r||a||``,e.msgctxt&&(n[e.msgid].context=e.msgctxt),((o=e.references)==null?void 0:o.length)>0&&(n[e.msgid].reference=e.references.join(` `)),((c=e.comments)==null?void 0:c.length)>0&&(n[e.msgid].comments=e.comments.join(` `)),((l=e.extractedComments)==null?void 0:l.length)>0&&(n[e.msgid].extractedComments=e.extractedComments.join(` `))}console.timeEnd(`Processing time for ${u}`)}catch(e){console.warn(`Could not process ${u} 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(t,n,r,i=`#FFEBEE`){var a=this;return(0,L.default)(function*(){try{let o=new e((0,R.default)((0,R.default)({},r),{},{scopes:[`https://www.googleapis.com/auth/spreadsheets`]})),s=t.headerValues,c=[];for(let e of a.config.languages){let n=s.indexOf(e);n!==-1&&c.push({addConditionalFormatRule:{rule:{ranges:[{sheetId:t.sheetId,startRowIndex:1,startColumnIndex:n,endColumnIndex:n+1}],booleanRule:{condition:{type:`BLANK`},format:{backgroundColor:a.hexToGoogleColor(i)}}},index:0}})}if(c.length>0){let e={spreadsheetId:n,resource:{requests:c}};yield o.request({url:`https://sheets.googleapis.com/v4/spreadsheets/${n}: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}}},B=g(b()),V=g(S()),H=class{constructor(e,t){(0,B.default)(this,`config`,void 0),(0,B.default)(this,`headerMapping`,void 0),this.config=e,this.headerMapping=t||D}exportToPO(e){var t=this;return(0,V.default)(function*(){let n=yield T(t.config.spreadsheetId,t.config.serviceAccount),r=new F(t.config,t.headerMapping);return r.exportToPOFiles(n,e)})()}uploadFromPO(e){var t=this;return(0,V.default)(function*(){let n=yield T(t.config.spreadsheetId,t.config.serviceAccount),r=new z(t.config,t.headerMapping);return r.uploadFromPOFiles(n,e)})()}applyConditionalFormatting(e=`#FFEBEE`){var t=this;return(0,V.default)(function*(){let n=yield T(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 z(t.config,t.headerMapping);yield i.applyConditionalFormatting(r,n.spreadsheetId,t.config.serviceAccount,e)})()}},U=H;export{U as default};