Transform Framework

From Lingoport Wiki
Revision as of 17:19, 27 June 2024 by Olibouban (talk | contribs) (transform_files_list.sh)
Jump to: navigation, search

LRM supports a number of file types out of the box (See Supported Resource Bundles). However, other file types may represent user facing strings to be translated. In that case, some customization is required to on-board those projects. The bash script transform framework facilitates the customization.

Analyze the file types

If the file types fall into a category not supported by LRM out of the box, the first thing to do is to see what is the closest file types supported by LRM.

Use the transform framework

The transform framework needs three scripts. The three scripts need to be in a repository, under a directory whose name will be used to identify the transform.

The three scripts to write are:

  • transform_from_repo.sh: How to transform the files from the repository so they fit into an LRM supported file type
  • transform_to_repo.sh: How to transform translated/pseudo-localized files in an LRM supported file type into the repository file type
  • transform_files_list.sh: How to transform the file names from the LRM supported file naming into the repository file naming

Each script can in turn call other scripts as necessary.

For example, under

a number of transform directories indicate what transform are available, in other words, what directories have those three scripts.

For example, for the txt2prop transform, the directory is located :


Bash Variables

A few Bash variables are available when called from the Lingoport Jenkins jobs that use the transform framework. They are set before calling the transform framework.

  • TRANSFORM_DIR : The transform scripts directory where the scripts are executed from.
  • PROJECT_TMP_DIR : Where temporary files can be stashed for this project during the script execution
  • FULL_LIST_PATH : The list of all the files to be transformed from the translated files back to the repository

Example: txt2propfiles

Say the repository contains resource files like the following strings.txt file:

# Strings for use in GUI
#################################################
PushIfCommits,Push if commits
CloseButtonText,Close
ApplyButtonText,Apply
CancelButtonText,Cancel

The file may not be in ASCII, UTF format, etc.; For instance this file is in UTF-8

A supported file format that is close to this one is properties. So the transform script will change the file name, extension, and content, so as to be a standard resource file:

strings.properties

# Strings for use in GUI
#################################################
PushIfCommits=Push if commits
CloseButtonText=Close
ApplyButtonText=Apply
CancelButtonText=Cancel

transform_from_repo.sh

An example snippet of bash code for this type of file may be something like:

#!/bin/bash
find . -name "string*\.txt" -type f > "${PROJECT_TMP_DIR}/input_files.txt"

cat "${PROJECT_TMP_DIR}/input_files.txt" | while read -r FILEPATH
do
  FILENAME=`basename $FILEPATH`
  DIRNAME=`dirname $FILEPATH`
  SUFFIX=".txt"
  ROOTNAME=${FILENAME%$SUFFIX}
  TARGET_NAME="${ROOTNAME//-/_}.properties"
  TARGET_PATH="${DIRNAME}/${TARGET_NAME}"
  echo "    Transform [$FILENAME] -> [$TARGET_NAME]"

  rm $TARGET_PATH 2> /dev/null
  touch $TARGET_PATH

  sed -i 's/,,/, ,/' $FILEPATH 
  cat $FILEPATH | while read -r LINE
  do
      IFS=',' tokens=( $LINE )

      if [ -z "${tokens[1]}" ]
      then
        echo "${LINE}" >> $TARGET_PATH
      else
        KEY=${tokens[0]}
        VALUE=${LINE#"${KEY},"}
        echo "${KEY}=${VALUE}" >> $TARGET_PATH
      fi
  done
IFS=' '

done 

transform_to_repo.sh

An example snippet of bash code for this type of file may be something like:

#!/bin/bash
find . -name "string*\.txt" -type f > "${PROJECT_TMP_DIR}/input_files.txt"

cat "${PROJECT_TMP_DIR}/input_files.txt" | while read -r FILEPATH
do
  FILENAME=`basename $FILEPATH`
  DIRNAME=`dirname $FILEPATH`
  SUFFIX=".txt"
  ROOTNAME=${FILENAME%$SUFFIX}
  TARGET_NAME="${ROOTNAME//-/_}.properties"
  TARGET_PATH="${DIRNAME}/${TARGET_NAME}"
  echo "    Transform [$FILENAME] -> [$TARGET_NAME]"

  rm $TARGET_PATH 2> /dev/null
  touch $TARGET_PATH

  sed -i 's/,,/, ,/' $FILEPATH 
  cat $FILEPATH | while read -r LINE
  do
      IFS=',' tokens=( $LINE )

      if [ -z "${tokens[1]}" ]
      then
        echo "${LINE}" >> $TARGET_PATH
      else
        KEY=${tokens[0]}
        VALUE=${LINE#"${KEY},"}
        echo "${KEY}=${VALUE}" >> $TARGET_PATH
      fi
  done
IFS=' '

done 

transform_files_list.sh

An example snippet of bash code for this type of file may be something like:

#!/bin/bash
if [ -z "$1" ]
  then
    echo "Error: Missing the argument like /<path>/pseudo_files.txt"
    exit 1
fi

if [ -f "$1" ]; then
    echo " File to rewrite: $1"
else
    echo " $1 not found"
    exit 1
fi


echo " "
echo " --------------------------------------------"
echo " Files to Modify:  $1"
echo " for repository formatted files, not LRM OOTB ones"

# strings<locale>.properties -> strings<locale>.txt
echo "   >>  strings<locale>.properties to strings<locale>.txt"
sed -i 's/\.properties/.txt/' "$1"
sed -i 's/strings_/strings-/' "$1"
sed -i 's/strings-zh_Hans/strings-zh-Hans/' "$1"
sed -i 's/strings-zh_Hant/strings-zh-Hant/' "$1"
sed -i 's/_/-/g' "$1"

echo " " 
ls -l "$1"
cat "$1"
echo " --------------------------------------------"