Quick Notes: I had to setup a dev rig for 2.1.7 for something. So I installed this on that setup and it tested out very well.
## Highlights
- Preview → Confirm flow with CSV logging of changes
 
- Variable/placeholder protection modes:
 
- Auto (default): protects everything inside 
{...} — both {$vars} and {placeholders} 
- List: protects only the names you specify (one per line, without 
$) 
- Printf token protection: 
%s, %1$s, %02d, %.2f, %%, etc. 
- Find options: plain replace (case‑sensitive or insensitive) or regex
 
## Configuration
Options (ACP → Options → [AIXF] Batch Phrase Replace):
- Variable protection mode
 
- Auto: protects anything matching 
{...} where the name starts with $ or a letter. Examples protected: {forumTitle}, {$forumTitle}, {$user.name}, {count}. 
- List: protects only names you enter (one per line). Enter the base name, e.g. 
forumTitle, username, user. 
- Entering 
user protects {$user}, {$user.name}, {$user['name']} and {user}. 
- Protected variables (one per line) — used only when the mode is List.
 
Tip: To 
disable protection for a run, switch to 
List mode and leave the list 
empty.
## Usage
1. Open 
Batch Phrase Replace in the ACP (search for it or use your admin navigation).
2. Enter 
Find / 
Replace. For regex, include delimiters (e.g. 
/\bTitle\b/iu).
3. Pick language, add-on, or scope (admin/public/all) to narrow targets.
4. Click 
Preview to see per-phrase diffs.
5. Click 
Confirm to apply changes. A 
CSV log of updates is saved and can be downloaded.
### Example
Phrase text (before):
	
	
	
		Code:
	
	
		Hello {$forumTitle}, welcome to {forumTitle}. You have %1$d new alerts.
	 
 Find: Title → 
Replace: Name (case-insensitive)
After: Only the word “Title” 
outside braces changes. 
{forumTitle}, 
{$forumTitle}, and 
%1$d remain intact.
## What’s protected
{$variables} in templates 
{placeholders} in phrases (including dotted or indexed forms) 
- Printf tokens: 
%s, %1$s, %02d, %.2f, %%, etc. 
## Known limits
- Nested 
{ ... { ... } ... } is not supported; the inner } ends the match. 
- Protection is brace-based; if a value is not inside 
{...}, it can be replaced. 
- Regex: invalid patterns are auto-wrapped as UTF‑8 (
/pattern/u). Provide full delimiters if you need flags. 
## Troubleshooting
“Please enter a valid option ID.” during upgrade
Ensure 
_data/options.xml is present and 
addon.json lists:
	
	
	
		Code:
	
	
		aixfBprVarProtectMode
aixfBprSkipVars
	 
 Then run 
Tools → Rebuild caches → Rebuild add‑on data for this add‑on and retry the upgrade.
Nothing changed in Preview/Confirm
- The word is probably inside 
{...} and protected. Switch to List mode and leave the list empty for that run, or adjust your target. 
- If using regex, verify your pattern matches outside braces (tokenization already guards inside braces).
 
CSV log location
A CSV is written under XenForo’s internal data path. The UI shows the file name and provides a download action after Confirm.
